iplink_vxlan: take into account preferred_family creating vxlan device
Take into account the configured preferred_family if neither saddr or daddr are provided since otherwise vxlan kernel module will use IPv4 as default remote inet family neglecting the one provided by userspace. This behaviour was originally in commit97d564b90c("vxlan: use preferred address family when neither group or remote is specified"). The issue can be triggered with the following reproducer: $ip -6 link add vxlan1 type vxlan id 42 dev enp0s2 \ proxy nolearning l2miss l3miss $bridge fdb add 46:47:1f:a7:1c:25 dev vxlan1 dst 2000::2 RTNETLINK answers: Address family not supported by protocol Fixes:1e9b8072de("iplink_vxlan: Get rid of inet_get_addr()") Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
fa1e658e84
commit
c1360e3b48
|
|
@ -82,6 +82,7 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
__u64 attrs = 0;
|
||||
bool set_op = (n->nlmsg_type == RTM_NEWLINK &&
|
||||
!(n->nlmsg_flags & NLM_F_CREATE));
|
||||
bool selected_family = false;
|
||||
|
||||
saddr.family = daddr.family = AF_UNSPEC;
|
||||
|
||||
|
|
@ -356,12 +357,26 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
|||
int type = (saddr.family == AF_INET) ? IFLA_VXLAN_LOCAL
|
||||
: IFLA_VXLAN_LOCAL6;
|
||||
addattr_l(n, 1024, type, saddr.data, saddr.bytelen);
|
||||
selected_family = true;
|
||||
}
|
||||
|
||||
if (is_addrtype_inet(&daddr)) {
|
||||
int type = (daddr.family == AF_INET) ? IFLA_VXLAN_GROUP
|
||||
: IFLA_VXLAN_GROUP6;
|
||||
addattr_l(n, 1024, type, daddr.data, daddr.bytelen);
|
||||
selected_family = true;
|
||||
}
|
||||
|
||||
if (!selected_family) {
|
||||
if (preferred_family == AF_INET) {
|
||||
get_addr(&daddr, "default", AF_INET);
|
||||
addattr_l(n, 1024, IFLA_VXLAN_GROUP,
|
||||
daddr.data, daddr.bytelen);
|
||||
} else if (preferred_family == AF_INET6) {
|
||||
get_addr(&daddr, "default", AF_INET6);
|
||||
addattr_l(n, 1024, IFLA_VXLAN_GROUP6,
|
||||
daddr.data, daddr.bytelen);
|
||||
}
|
||||
}
|
||||
|
||||
if (!set_op || VXLAN_ATTRSET(attrs, IFLA_VXLAN_LEARNING))
|
||||
|
|
|
|||
Loading…
Reference in New Issue