mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-08-14 15:10:16 +00:00
ip: Add HSR support
Add basic support for High-Availability Seamless Redundancy (HSR) network devices. Signed-off-by: Arvid Brodin <arvid.brodin@alten.se>
This commit is contained in:
parent
e0d47aa303
commit
5c0aec93a5
@ -5,7 +5,7 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \
|
||||
iplink_vlan.o link_veth.o link_gre.o iplink_can.o \
|
||||
iplink_macvlan.o iplink_macvtap.o ipl2tp.o link_vti.o \
|
||||
iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \
|
||||
link_iptnl.o link_gre6.o iplink_bond.o
|
||||
link_iptnl.o link_gre6.o iplink_bond.o iplink_hsr.o
|
||||
|
||||
RTMONOBJ=rtmon.o
|
||||
|
||||
|
129
ip/iplink_hsr.c
Normal file
129
ip/iplink_hsr.c
Normal file
@ -0,0 +1,129 @@
|
||||
/*
|
||||
* iplink_hsr.c HSR device support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* Authors: Arvid Brodin <arvid.brodin@alten.se>
|
||||
*
|
||||
* Based on iplink_vlan.c by Patrick McHardy <kaber@trash.net>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h> /* Needed by linux/if.h for some reason */
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include "rt_names.h"
|
||||
#include "utils.h"
|
||||
#include "ip_common.h"
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage:\tip link add name NAME type hsr slave1 SLAVE1-IF slave2 SLAVE2-IF\n"
|
||||
"\t[ supervision ADDR-BYTE ]\n"
|
||||
"\n"
|
||||
"NAME\n"
|
||||
" name of new hsr device (e.g. hsr0)\n"
|
||||
"SLAVE1-IF, SLAVE2-IF\n"
|
||||
" the two slave devices bound to the HSR device\n"
|
||||
"ADDR-BYTE\n"
|
||||
" 0-255; the last byte of the multicast address used for HSR supervision\n"
|
||||
" frames (default = 0)\n");
|
||||
}
|
||||
|
||||
static int hsr_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||
struct nlmsghdr *n)
|
||||
{
|
||||
int ifindex;
|
||||
unsigned char multicast_spec;
|
||||
|
||||
while (argc > 0) {
|
||||
if (matches(*argv, "supervision") == 0) {
|
||||
NEXT_ARG();
|
||||
if (get_u8(&multicast_spec, *argv, 0))
|
||||
invarg("ADDR-BYTE is invalid", *argv);
|
||||
addattr_l(n, 1024, IFLA_HSR_MULTICAST_SPEC,
|
||||
&multicast_spec, 1);
|
||||
} else if (matches(*argv, "slave1") == 0) {
|
||||
NEXT_ARG();
|
||||
ifindex = ll_name_to_index(*argv);
|
||||
if (ifindex == 0)
|
||||
invarg("No such interface", *argv);
|
||||
addattr_l(n, 1024, IFLA_HSR_SLAVE1, &ifindex, 4);
|
||||
} else if (matches(*argv, "slave2") == 0) {
|
||||
NEXT_ARG();
|
||||
ifindex = ll_name_to_index(*argv);
|
||||
if (ifindex == 0)
|
||||
invarg("No such interface", *argv);
|
||||
addattr_l(n, 1024, IFLA_HSR_SLAVE2, &ifindex, 4);
|
||||
} else if (matches(*argv, "help") == 0) {
|
||||
usage();
|
||||
return -1;
|
||||
} else {
|
||||
fprintf(stderr, "hsr: what is \"%s\"?\n", *argv);
|
||||
usage();
|
||||
return -1;
|
||||
}
|
||||
argc--, argv++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hsr_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
||||
{
|
||||
SPRINT_BUF(b1);
|
||||
|
||||
if (!tb)
|
||||
return;
|
||||
|
||||
if (tb[IFLA_HSR_SLAVE1] &&
|
||||
RTA_PAYLOAD(tb[IFLA_HSR_SLAVE1]) < sizeof(__u32))
|
||||
return;
|
||||
if (tb[IFLA_HSR_SLAVE2] &&
|
||||
RTA_PAYLOAD(tb[IFLA_HSR_SLAVE2]) < sizeof(__u32))
|
||||
return;
|
||||
if (tb[IFLA_HSR_SEQ_NR] &&
|
||||
RTA_PAYLOAD(tb[IFLA_HSR_SEQ_NR]) < sizeof(__u16))
|
||||
return;
|
||||
if (tb[IFLA_HSR_SUPERVISION_ADDR] &&
|
||||
RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]) < ETH_ALEN)
|
||||
return;
|
||||
|
||||
fprintf(f, "slave1 ");
|
||||
if (tb[IFLA_HSR_SLAVE1])
|
||||
fprintf(f, "%s ",
|
||||
ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE1])));
|
||||
else
|
||||
fprintf(f, "<none> ");
|
||||
|
||||
fprintf(f, "slave2 ");
|
||||
if (tb[IFLA_HSR_SLAVE2])
|
||||
fprintf(f, "%s ",
|
||||
ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2])));
|
||||
else
|
||||
fprintf(f, "<none> ");
|
||||
|
||||
if (tb[IFLA_HSR_SEQ_NR])
|
||||
fprintf(f, "sequence %d ",
|
||||
rta_getattr_u16(tb[IFLA_HSR_SEQ_NR]));
|
||||
|
||||
if (tb[IFLA_HSR_SUPERVISION_ADDR])
|
||||
fprintf(f, "supervision %s ",
|
||||
ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_SUPERVISION_ADDR]),
|
||||
RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]),
|
||||
ARPHRD_VOID,
|
||||
b1, sizeof(b1)));
|
||||
}
|
||||
|
||||
struct link_util hsr_link_util = {
|
||||
.id = "hsr",
|
||||
.maxattr = IFLA_VLAN_MAX,
|
||||
.parse_opt = hsr_parse_opt,
|
||||
.print_opt = hsr_print_opt,
|
||||
};
|
@ -54,6 +54,7 @@ ip-link \- network device configuration
|
||||
.BR bond " ]"
|
||||
.BR can " | "
|
||||
.BR dummy " | "
|
||||
.BR hsr " | "
|
||||
.BR ifb " | "
|
||||
.BR ipoib " |"
|
||||
.BR macvlan " | "
|
||||
|
Loading…
Reference in New Issue
Block a user