From f410d463585c29a036b530d585721b2e805c3677 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 20 May 2019 13:15:02 +0900 Subject: [PATCH] network: disable IPv4LL for ipvlan with L3 or L3S mode As L3 or L3S mode do not support ARP. --- src/network/netdev/ipvlan.c | 16 ++++++++++++++++ src/network/netdev/ipvlan.h | 2 ++ src/network/networkd-link.c | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/src/network/netdev/ipvlan.c b/src/network/netdev/ipvlan.c index 7b25176767..f48cb0231a 100644 --- a/src/network/netdev/ipvlan.c +++ b/src/network/netdev/ipvlan.c @@ -4,6 +4,7 @@ #include "conf-parser.h" #include "netdev/ipvlan.h" +#include "networkd-link.h" #include "string-table.h" static const char* const ipvlan_mode_table[_NETDEV_IPVLAN_MODE_MAX] = { @@ -85,3 +86,18 @@ const NetDevVTable ipvtap_vtable = { .fill_message_create = netdev_ipvlan_fill_message_create, .create_type = NETDEV_CREATE_STACKED, }; + +IPVlanMode link_get_ipvlan_mode(Link *link) { + NetDev *netdev; + + if (!streq_ptr(link->kind, "ipvlan")) + return _NETDEV_IPVLAN_MODE_INVALID; + + if (netdev_get(link->manager, link->ifname, &netdev) < 0) + return _NETDEV_IPVLAN_MODE_INVALID; + + if (netdev->kind != NETDEV_KIND_IPVLAN) + return _NETDEV_IPVLAN_MODE_INVALID; + + return IPVLAN(netdev)->mode; +} diff --git a/src/network/netdev/ipvlan.h b/src/network/netdev/ipvlan.h index 140cacf4fc..3bad56d500 100644 --- a/src/network/netdev/ipvlan.h +++ b/src/network/netdev/ipvlan.h @@ -42,3 +42,5 @@ IPVlanFlags ipvlan_flags_from_string(const char *d) _pure_; CONFIG_PARSER_PROTOTYPE(config_parse_ipvlan_mode); CONFIG_PARSER_PROTOTYPE(config_parse_ipvlan_flags); + +IPVlanMode link_get_ipvlan_mode(Link *link); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index ac123ddc1e..bf8afc84cd 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -14,6 +14,7 @@ #include "missing_network.h" #include "netdev/bond.h" #include "netdev/bridge.h" +#include "netdev/ipvlan.h" #include "netdev/vrf.h" #include "netlink-util.h" #include "network-internal.h" @@ -124,6 +125,10 @@ bool link_ipv4ll_enabled(Link *link) { if (STRPTR_IN_SET(link->kind, "vrf", "wireguard", "ipip", "gre", "ip6gre", "ip6tnl", "sit", "vti", "vti6")) return false; + /* L3 or L3S mode do not support ARP. */ + if (IN_SET(link_get_ipvlan_mode(link), NETDEV_IPVLAN_MODE_L3, NETDEV_IPVLAN_MODE_L3S)) + return false; + if (link->network->bond) return false; @@ -142,6 +147,10 @@ bool link_ipv4ll_fallback_enabled(Link *link) { if (STRPTR_IN_SET(link->kind, "vrf", "wireguard", "ipip", "gre", "ip6gre", "ip6tnl", "sit", "vti", "vti6")) return false; + /* L3 or L3S mode do not support ARP. */ + if (IN_SET(link_get_ipvlan_mode(link), NETDEV_IPVLAN_MODE_L3, NETDEV_IPVLAN_MODE_L3S)) + return false; + if (link->network->bond) return false; -- 2.25.1