ip: bridge: add mcast to unicast config flag
This adds configuration for the IFLA_BRPORT_MCAST_TO_UCAST flag that allows multicast packets to be replicated as unicast packets. Signed-off-by: Tobias Jungel <tobias.jungel@bisdn.de> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
dd4a2b6833
commit
b5a754b1db
|
|
@ -146,6 +146,9 @@ static void print_protinfo(FILE *fp, struct rtattr *attr)
|
||||||
if (prtb[IFLA_BRPORT_MCAST_FLOOD])
|
if (prtb[IFLA_BRPORT_MCAST_FLOOD])
|
||||||
print_onoff(fp, "mcast_flood",
|
print_onoff(fp, "mcast_flood",
|
||||||
rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_FLOOD]));
|
rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_FLOOD]));
|
||||||
|
if (prtb[IFLA_BRPORT_MCAST_TO_UCAST])
|
||||||
|
print_onoff(fp, "mcast_to_unicast",
|
||||||
|
rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_TO_UCAST]));
|
||||||
if (prtb[IFLA_BRPORT_NEIGH_SUPPRESS])
|
if (prtb[IFLA_BRPORT_NEIGH_SUPPRESS])
|
||||||
print_onoff(fp, "neigh_suppress",
|
print_onoff(fp, "neigh_suppress",
|
||||||
rta_getattr_u8(prtb[IFLA_BRPORT_NEIGH_SUPPRESS]));
|
rta_getattr_u8(prtb[IFLA_BRPORT_NEIGH_SUPPRESS]));
|
||||||
|
|
@ -260,6 +263,7 @@ static void usage(void)
|
||||||
fprintf(stderr, " [ learning_sync {on | off} ]\n");
|
fprintf(stderr, " [ learning_sync {on | off} ]\n");
|
||||||
fprintf(stderr, " [ flood {on | off} ]\n");
|
fprintf(stderr, " [ flood {on | off} ]\n");
|
||||||
fprintf(stderr, " [ mcast_flood {on | off} ]\n");
|
fprintf(stderr, " [ mcast_flood {on | off} ]\n");
|
||||||
|
fprintf(stderr, " [ mcast_to_unicast {on | off} ]\n");
|
||||||
fprintf(stderr, " [ neigh_suppress {on | off} ]\n");
|
fprintf(stderr, " [ neigh_suppress {on | off} ]\n");
|
||||||
fprintf(stderr, " [ vlan_tunnel {on | off} ]\n");
|
fprintf(stderr, " [ vlan_tunnel {on | off} ]\n");
|
||||||
fprintf(stderr, " [ isolated {on | off} ]\n");
|
fprintf(stderr, " [ isolated {on | off} ]\n");
|
||||||
|
|
@ -306,6 +310,7 @@ static int brlink_modify(int argc, char **argv)
|
||||||
__s8 flood = -1;
|
__s8 flood = -1;
|
||||||
__s8 vlan_tunnel = -1;
|
__s8 vlan_tunnel = -1;
|
||||||
__s8 mcast_flood = -1;
|
__s8 mcast_flood = -1;
|
||||||
|
__s8 mcast_to_unicast = -1;
|
||||||
__s8 isolated = -1;
|
__s8 isolated = -1;
|
||||||
__s8 hairpin = -1;
|
__s8 hairpin = -1;
|
||||||
__s8 bpdu_guard = -1;
|
__s8 bpdu_guard = -1;
|
||||||
|
|
@ -354,6 +359,10 @@ static int brlink_modify(int argc, char **argv)
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (!on_off("mcast_flood", &mcast_flood, *argv))
|
if (!on_off("mcast_flood", &mcast_flood, *argv))
|
||||||
return -1;
|
return -1;
|
||||||
|
} else if (strcmp(*argv, "mcast_to_unicast") == 0) {
|
||||||
|
NEXT_ARG();
|
||||||
|
if (!on_off("mcast_to_unicast", &mcast_to_unicast, *argv))
|
||||||
|
return -1;
|
||||||
} else if (strcmp(*argv, "cost") == 0) {
|
} else if (strcmp(*argv, "cost") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
cost = atoi(*argv);
|
cost = atoi(*argv);
|
||||||
|
|
@ -453,6 +462,9 @@ static int brlink_modify(int argc, char **argv)
|
||||||
if (mcast_flood >= 0)
|
if (mcast_flood >= 0)
|
||||||
addattr8(&req.n, sizeof(req), IFLA_BRPORT_MCAST_FLOOD,
|
addattr8(&req.n, sizeof(req), IFLA_BRPORT_MCAST_FLOOD,
|
||||||
mcast_flood);
|
mcast_flood);
|
||||||
|
if (mcast_to_unicast >= 0)
|
||||||
|
addattr8(&req.n, sizeof(req), IFLA_BRPORT_MCAST_TO_UCAST,
|
||||||
|
mcast_to_unicast);
|
||||||
if (learning >= 0)
|
if (learning >= 0)
|
||||||
addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING, learning);
|
addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING, learning);
|
||||||
if (learning_sync >= 0)
|
if (learning_sync >= 0)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ static void print_explain(FILE *f)
|
||||||
" [ mcast_router MULTICAST_ROUTER ]\n"
|
" [ mcast_router MULTICAST_ROUTER ]\n"
|
||||||
" [ mcast_fast_leave {on | off} ]\n"
|
" [ mcast_fast_leave {on | off} ]\n"
|
||||||
" [ mcast_flood {on | off} ]\n"
|
" [ mcast_flood {on | off} ]\n"
|
||||||
|
" [ mcast_to_unicast {on | off} ]\n"
|
||||||
" [ group_fwd_mask MASK ]\n"
|
" [ group_fwd_mask MASK ]\n"
|
||||||
" [ neigh_suppress {on | off} ]\n"
|
" [ neigh_suppress {on | off} ]\n"
|
||||||
" [ vlan_tunnel {on | off} ]\n"
|
" [ vlan_tunnel {on | off} ]\n"
|
||||||
|
|
@ -257,6 +258,10 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f,
|
||||||
_print_onoff(f, "mcast_flood", "mcast_flood",
|
_print_onoff(f, "mcast_flood", "mcast_flood",
|
||||||
rta_getattr_u8(tb[IFLA_BRPORT_MCAST_FLOOD]));
|
rta_getattr_u8(tb[IFLA_BRPORT_MCAST_FLOOD]));
|
||||||
|
|
||||||
|
if (tb[IFLA_BRPORT_MCAST_TO_UCAST])
|
||||||
|
_print_onoff(f, "mcast_to_unicast", "mcast_to_unicast",
|
||||||
|
rta_getattr_u8(tb[IFLA_BRPORT_MCAST_TO_UCAST]));
|
||||||
|
|
||||||
if (tb[IFLA_BRPORT_NEIGH_SUPPRESS])
|
if (tb[IFLA_BRPORT_NEIGH_SUPPRESS])
|
||||||
_print_onoff(f, "neigh_suppress", "neigh_suppress",
|
_print_onoff(f, "neigh_suppress", "neigh_suppress",
|
||||||
rta_getattr_u8(tb[IFLA_BRPORT_NEIGH_SUPPRESS]));
|
rta_getattr_u8(tb[IFLA_BRPORT_NEIGH_SUPPRESS]));
|
||||||
|
|
@ -357,6 +362,10 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
bridge_slave_parse_on_off("mcast_flood", *argv, n,
|
bridge_slave_parse_on_off("mcast_flood", *argv, n,
|
||||||
IFLA_BRPORT_MCAST_FLOOD);
|
IFLA_BRPORT_MCAST_FLOOD);
|
||||||
|
} else if (matches(*argv, "mcast_to_unicast") == 0) {
|
||||||
|
NEXT_ARG();
|
||||||
|
bridge_slave_parse_on_off("mcast_to_unicast", *argv, n,
|
||||||
|
IFLA_BRPORT_MCAST_TO_UCAST);
|
||||||
} else if (matches(*argv, "proxy_arp") == 0) {
|
} else if (matches(*argv, "proxy_arp") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
bridge_slave_parse_on_off("proxy_arp", *argv, n,
|
bridge_slave_parse_on_off("proxy_arp", *argv, n,
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ bridge \- show / manipulate bridge addresses and devices
|
||||||
.BR flood " { " on " | " off " } ] [ "
|
.BR flood " { " on " | " off " } ] [ "
|
||||||
.BR hwmode " { " vepa " | " veb " } ] [ "
|
.BR hwmode " { " vepa " | " veb " } ] [ "
|
||||||
.BR mcast_flood " { " on " | " off " } ] [ "
|
.BR mcast_flood " { " on " | " off " } ] [ "
|
||||||
|
.BR mcast_to_unicast " { " on " | " off " } ] [ "
|
||||||
.BR neigh_suppress " { " on " | " off " } ] [ "
|
.BR neigh_suppress " { " on " | " off " } ] [ "
|
||||||
.BR vlan_tunnel " { " on " | " off " } ] [ "
|
.BR vlan_tunnel " { " on " | " off " } ] [ "
|
||||||
.BR isolated " { " on " | " off " } ] [ "
|
.BR isolated " { " on " | " off " } ] [ "
|
||||||
|
|
@ -365,6 +366,10 @@ switch.
|
||||||
.BR "mcast_flood on " or " mcast_flood off "
|
.BR "mcast_flood on " or " mcast_flood off "
|
||||||
Controls whether a given port will flood multicast traffic for which there is no MDB entry. By default this flag is on.
|
Controls whether a given port will flood multicast traffic for which there is no MDB entry. By default this flag is on.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR "mcast_to_unicast on " or " mcast_to_unicast off "
|
||||||
|
Controls whether a given port will replicate packets using unicast instead of multicast. By default this flag is off.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BR "neigh_suppress on " or " neigh_suppress off "
|
.BR "neigh_suppress on " or " neigh_suppress off "
|
||||||
Controls whether neigh discovery (arp and nd) proxy and suppression is enabled on the port. By default this flag is off.
|
Controls whether neigh discovery (arp and nd) proxy and suppression is enabled on the port. By default this flag is off.
|
||||||
|
|
|
||||||
|
|
@ -2100,6 +2100,8 @@ the following additional arguments are supported:
|
||||||
] [
|
] [
|
||||||
.BR mcast_flood " { " on " | " off " }"
|
.BR mcast_flood " { " on " | " off " }"
|
||||||
] [
|
] [
|
||||||
|
.BR mcast_to_unicast " { " on " | " off " }"
|
||||||
|
] [
|
||||||
.BR group_fwd_mask " MASK"
|
.BR group_fwd_mask " MASK"
|
||||||
] [
|
] [
|
||||||
.BR neigh_suppress " { " on " | " off " }"
|
.BR neigh_suppress " { " on " | " off " }"
|
||||||
|
|
@ -2185,6 +2187,9 @@ option above.
|
||||||
.BR mcast_flood " { " on " | " off " }"
|
.BR mcast_flood " { " on " | " off " }"
|
||||||
- controls whether a given port will flood multicast traffic for which there is no MDB entry.
|
- controls whether a given port will flood multicast traffic for which there is no MDB entry.
|
||||||
|
|
||||||
|
.BR mcast_to_unicast " { " on " | " off " }"
|
||||||
|
- controls whether a given port will replicate packets using unicast instead of multicast. By default this flag is off.
|
||||||
|
|
||||||
.BI group_fwd_mask " MASK "
|
.BI group_fwd_mask " MASK "
|
||||||
- set the group forward mask. This is the bitmask that is applied to decide whether to forward incoming frames destined to link-local addresses, ie addresses of the form 01:80:C2:00:00:0X (defaults to 0, ie the bridge does not forward any link-local frames coming on this port).
|
- set the group forward mask. This is the bitmask that is applied to decide whether to forward incoming frames destined to link-local addresses, ie addresses of the form 01:80:C2:00:00:0X (defaults to 0, ie the bridge does not forward any link-local frames coming on this port).
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue