Fix functions that accept "void *iaddr" as param to have const-specifier. Signed-off-by: Dmitry Skorodumov --- drivers/net/ipvlan/ipvlan.h | 2 +- drivers/net/ipvlan/ipvlan_core.c | 2 +- drivers/net/ipvlan/ipvlan_main.c | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/ipvlan/ipvlan.h b/drivers/net/ipvlan/ipvlan.h index 80f84fc87008..235e9218b1bb 100644 --- a/drivers/net/ipvlan/ipvlan.h +++ b/drivers/net/ipvlan/ipvlan.h @@ -159,7 +159,7 @@ int ipvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev); void ipvlan_ht_addr_add(struct ipvl_dev *ipvlan, struct ipvl_addr *addr); struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, const void *iaddr, bool is_v6); -bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6); +bool ipvlan_addr_busy(struct ipvl_port *port, const void *iaddr, bool is_v6); void ipvlan_ht_addr_del(struct ipvl_addr *addr); struct ipvl_addr *ipvlan_addr_lookup(struct ipvl_port *port, void *lyr3h, int addr_type, bool use_dest); diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c index bdb3a46b327c..6d22487010c0 100644 --- a/drivers/net/ipvlan/ipvlan_core.c +++ b/drivers/net/ipvlan/ipvlan_core.c @@ -118,7 +118,7 @@ struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan, return NULL; } -bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6) +bool ipvlan_addr_busy(struct ipvl_port *port, const void *iaddr, bool is_v6) { struct ipvl_dev *ipvlan; bool ret = false; diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index baccdad695fd..cf8c1ea78f4b 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -814,7 +814,8 @@ static int ipvlan_device_event(struct notifier_block *unused, } /* the caller must held the addrs lock */ -static int ipvlan_add_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6) +static int ipvlan_add_addr(struct ipvl_dev *ipvlan, const void *iaddr, + bool is_v6) { struct ipvl_addr *addr; @@ -846,7 +847,8 @@ static int ipvlan_add_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6) return 0; } -static void ipvlan_del_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6) +static void ipvlan_del_addr(struct ipvl_dev *ipvlan, const void *iaddr, + bool is_v6) { struct ipvl_addr *addr; -- 2.43.0 Extract commond code for ipvlan_addr4_validator_event()/ ipvlan_addr6_validator_event() to own function. Get rid of separate functions for xxx_validator_event() and check whether we are called for ipv4 or ipv6 by looking at "notifier_block *nblock" argument Signed-off-by: Dmitry Skorodumov --- v2: - Fixed warning about unused by specifying __maybe_unused for ipvlan_addr6_vtor_notifier_block (used only with CONFIG_IPV6) drivers/net/ipvlan/ipvlan_main.c | 110 +++++++++++++++---------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index cf8c1ea78f4b..d5b55876d340 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -878,6 +878,33 @@ static bool ipvlan_is_valid_dev(const struct net_device *dev) return true; } +static int ipvlan_addr_validator_event(struct net_device *dev, + unsigned long event, + struct netlink_ext_ack *extack, + const void *iaddr, + bool is_v6) +{ + struct ipvl_dev *ipvlan = netdev_priv(dev); + int ret = NOTIFY_OK; + + if (!ipvlan_is_valid_dev(dev)) + return NOTIFY_DONE; + + switch (event) { + case NETDEV_UP: + spin_lock_bh(&ipvlan->port->addrs_lock); + if (ipvlan_addr_busy(ipvlan->port, iaddr, is_v6)) { + NL_SET_ERR_MSG(extack, + "Address already assigned to an ipvlan device"); + ret = notifier_from_errno(-EADDRINUSE); + } + spin_unlock_bh(&ipvlan->port->addrs_lock); + break; + } + + return ret; +} + #if IS_ENABLED(CONFIG_IPV6) static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) { @@ -922,32 +949,6 @@ static int ipvlan_addr6_event(struct notifier_block *unused, return NOTIFY_OK; } - -static int ipvlan_addr6_validator_event(struct notifier_block *unused, - unsigned long event, void *ptr) -{ - struct in6_validator_info *i6vi = (struct in6_validator_info *)ptr; - struct net_device *dev = (struct net_device *)i6vi->i6vi_dev->dev; - struct ipvl_dev *ipvlan = netdev_priv(dev); - int ret = NOTIFY_OK; - - if (!ipvlan_is_valid_dev(dev)) - return NOTIFY_DONE; - - switch (event) { - case NETDEV_UP: - spin_lock_bh(&ipvlan->port->addrs_lock); - if (ipvlan_addr_busy(ipvlan->port, &i6vi->i6vi_addr, true)) { - NL_SET_ERR_MSG(i6vi->extack, - "Address already assigned to an ipvlan device"); - ret = notifier_from_errno(-EADDRINUSE); - } - spin_unlock_bh(&ipvlan->port->addrs_lock); - break; - } - - return ret; -} #endif static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) @@ -997,38 +998,15 @@ static int ipvlan_addr4_event(struct notifier_block *unused, return NOTIFY_OK; } -static int ipvlan_addr4_validator_event(struct notifier_block *unused, - unsigned long event, void *ptr) -{ - struct in_validator_info *ivi = (struct in_validator_info *)ptr; - struct net_device *dev = (struct net_device *)ivi->ivi_dev->dev; - struct ipvl_dev *ipvlan = netdev_priv(dev); - int ret = NOTIFY_OK; - - if (!ipvlan_is_valid_dev(dev)) - return NOTIFY_DONE; - - switch (event) { - case NETDEV_UP: - spin_lock_bh(&ipvlan->port->addrs_lock); - if (ipvlan_addr_busy(ipvlan->port, &ivi->ivi_addr, false)) { - NL_SET_ERR_MSG(ivi->extack, - "Address already assigned to an ipvlan device"); - ret = notifier_from_errno(-EADDRINUSE); - } - spin_unlock_bh(&ipvlan->port->addrs_lock); - break; - } - - return ret; -} +static int ipvlan_addr_validator_event_cb(struct notifier_block *nblock, + unsigned long event, void *ptr); static struct notifier_block ipvlan_addr4_notifier_block __read_mostly = { .notifier_call = ipvlan_addr4_event, }; static struct notifier_block ipvlan_addr4_vtor_notifier_block __read_mostly = { - .notifier_call = ipvlan_addr4_validator_event, + .notifier_call = ipvlan_addr_validator_event_cb, }; static struct notifier_block ipvlan_notifier_block __read_mostly = { @@ -1039,11 +1017,33 @@ static struct notifier_block ipvlan_notifier_block __read_mostly = { static struct notifier_block ipvlan_addr6_notifier_block __read_mostly = { .notifier_call = ipvlan_addr6_event, }; +#endif -static struct notifier_block ipvlan_addr6_vtor_notifier_block __read_mostly = { - .notifier_call = ipvlan_addr6_validator_event, +static struct notifier_block +ipvlan_addr6_vtor_notifier_block __read_mostly __maybe_unused = { + .notifier_call = ipvlan_addr_validator_event_cb, }; -#endif + +static int ipvlan_addr_validator_event_cb(struct notifier_block *nblock, + unsigned long event, void *ptr) +{ + struct in6_validator_info *i6vi; + struct net_device *dev; + + if (nblock == &ipvlan_addr4_vtor_notifier_block) { + struct in_validator_info *ivi; + + ivi = (struct in_validator_info *)ptr; + dev = ivi->ivi_dev->dev; + return ipvlan_addr_validator_event(dev, event, ivi->extack, + &ivi->ivi_addr, false); + } + + i6vi = (struct in6_validator_info *)ptr; + dev = i6vi->i6vi_dev->dev; + return ipvlan_addr_validator_event(dev, event, i6vi->extack, + &i6vi->i6vi_addr, true); +} static int __init ipvlan_init_module(void) { -- 2.43.0 Both IPv4 and IPv6 addr-event functions are very similar. Refactor to use common funcitons. Get rid of separate functions for ipvlan_addrX_event() and check whether we are called for ipv4 or ipv6 by looking at "notifier_block *nblock" argument Signed-off-by: Dmitry Skorodumov --- v2: - Fixed warning about unused by specifying __maybe_unused for ipvlan_addr6_notifier_block (used only with CONFIG_IPV6) drivers/net/ipvlan/ipvlan_main.c | 114 ++++++++++++------------------- 1 file changed, 43 insertions(+), 71 deletions(-) diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index d5b55876d340..03d0f23dbe33 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -905,93 +905,45 @@ static int ipvlan_addr_validator_event(struct net_device *dev, return ret; } -#if IS_ENABLED(CONFIG_IPV6) -static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) +static int ipvlan_add_addr_event(struct ipvl_dev *ipvlan, const void *iaddr, + bool is_v6) { int ret = -EINVAL; spin_lock_bh(&ipvlan->port->addrs_lock); - if (ipvlan_addr_busy(ipvlan->port, ip6_addr, true)) - netif_err(ipvlan, ifup, ipvlan->dev, - "Failed to add IPv6=%pI6c addr for %s intf\n", - ip6_addr, ipvlan->dev->name); - else - ret = ipvlan_add_addr(ipvlan, ip6_addr, true); - spin_unlock_bh(&ipvlan->port->addrs_lock); - return ret; -} - -static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr) -{ - return ipvlan_del_addr(ipvlan, ip6_addr, true); -} - -static int ipvlan_addr6_event(struct notifier_block *unused, - unsigned long event, void *ptr) -{ - struct inet6_ifaddr *if6 = (struct inet6_ifaddr *)ptr; - struct net_device *dev = (struct net_device *)if6->idev->dev; - struct ipvl_dev *ipvlan = netdev_priv(dev); - - if (!ipvlan_is_valid_dev(dev)) - return NOTIFY_DONE; - - switch (event) { - case NETDEV_UP: - if (ipvlan_add_addr6(ipvlan, &if6->addr)) - return NOTIFY_BAD; - break; - - case NETDEV_DOWN: - ipvlan_del_addr6(ipvlan, &if6->addr); - break; + if (ipvlan_addr_busy(ipvlan->port, iaddr, is_v6)) { + if (is_v6) { + netif_err(ipvlan, ifup, ipvlan->dev, + "Failed to add IPv6=%pI6c addr on %s intf\n", + iaddr, ipvlan->dev->name); + } else { + netif_err(ipvlan, ifup, ipvlan->dev, + "Failed to add IPv4=%pI4 on %s intf.\n", + iaddr, ipvlan->dev->name); + } + } else { + ret = ipvlan_add_addr(ipvlan, iaddr, is_v6); } - - return NOTIFY_OK; -} -#endif - -static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) -{ - int ret = -EINVAL; - - spin_lock_bh(&ipvlan->port->addrs_lock); - if (ipvlan_addr_busy(ipvlan->port, ip4_addr, false)) - netif_err(ipvlan, ifup, ipvlan->dev, - "Failed to add IPv4=%pI4 on %s intf.\n", - ip4_addr, ipvlan->dev->name); - else - ret = ipvlan_add_addr(ipvlan, ip4_addr, false); spin_unlock_bh(&ipvlan->port->addrs_lock); return ret; } -static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr) -{ - return ipvlan_del_addr(ipvlan, ip4_addr, false); -} - -static int ipvlan_addr4_event(struct notifier_block *unused, - unsigned long event, void *ptr) +static int ipvlan_addr_event(struct net_device *dev, unsigned long event, + const void *iaddr, bool is_v6) { - struct in_ifaddr *if4 = (struct in_ifaddr *)ptr; - struct net_device *dev = (struct net_device *)if4->ifa_dev->dev; struct ipvl_dev *ipvlan = netdev_priv(dev); - struct in_addr ip4_addr; if (!ipvlan_is_valid_dev(dev)) return NOTIFY_DONE; switch (event) { case NETDEV_UP: - ip4_addr.s_addr = if4->ifa_address; - if (ipvlan_add_addr4(ipvlan, &ip4_addr)) + if (ipvlan_add_addr_event(ipvlan, iaddr, is_v6)) return NOTIFY_BAD; break; case NETDEV_DOWN: - ip4_addr.s_addr = if4->ifa_address; - ipvlan_del_addr4(ipvlan, &ip4_addr); + ipvlan_del_addr(ipvlan, iaddr, is_v6); break; } @@ -1001,8 +953,11 @@ static int ipvlan_addr4_event(struct notifier_block *unused, static int ipvlan_addr_validator_event_cb(struct notifier_block *nblock, unsigned long event, void *ptr); +static int ipvlan_addr_event_cb(struct notifier_block *unused, + unsigned long event, void *ptr); + static struct notifier_block ipvlan_addr4_notifier_block __read_mostly = { - .notifier_call = ipvlan_addr4_event, + .notifier_call = ipvlan_addr_event_cb, }; static struct notifier_block ipvlan_addr4_vtor_notifier_block __read_mostly = { @@ -1013,11 +968,10 @@ static struct notifier_block ipvlan_notifier_block __read_mostly = { .notifier_call = ipvlan_device_event, }; -#if IS_ENABLED(CONFIG_IPV6) -static struct notifier_block ipvlan_addr6_notifier_block __read_mostly = { - .notifier_call = ipvlan_addr6_event, +static struct notifier_block +ipvlan_addr6_notifier_block __read_mostly __maybe_unused = { + .notifier_call = ipvlan_addr_event_cb, }; -#endif static struct notifier_block ipvlan_addr6_vtor_notifier_block __read_mostly __maybe_unused = { @@ -1045,6 +999,24 @@ static int ipvlan_addr_validator_event_cb(struct notifier_block *nblock, &i6vi->i6vi_addr, true); } +static int ipvlan_addr_event_cb(struct notifier_block *nblock, + unsigned long event, void *ptr) +{ + struct inet6_ifaddr *if6; + struct net_device *dev; + + if (nblock == &ipvlan_addr4_notifier_block) { + struct in_ifaddr *if4 = (struct in_ifaddr *)ptr; + + dev = if4->ifa_dev->dev; + return ipvlan_addr_event(dev, event, &if4->ifa_address, false); + } + + if6 = (struct inet6_ifaddr *)ptr; + dev = if6->idev->dev; + return ipvlan_addr_event(dev, event, &if6->addr, true); +} + static int __init ipvlan_init_module(void) { int err; -- 2.43.0