On Wed, Dec 14, 2016 at 10:52 PM, <f...@ikuai8.com> wrote: > From: Gao Feng <gfree.w...@gmail.com> > > There are some duplicated codes in ipvlan_add_addr6/4 and > ipvlan_del_addr6/4. Now define two common functions ipvlan_add_addr > and ipvlan_del_addr to decrease the duplicated codes. > It could be helful to maintain the codes. > > Signed-off-by: Gao Feng <gfree.w...@gmail.com> > --- > drivers/net/ipvlan/ipvlan_main.c | 68 > +++++++++++++++++----------------------- > 1 file changed, 29 insertions(+), 39 deletions(-) > > diff --git a/drivers/net/ipvlan/ipvlan_main.c > b/drivers/net/ipvlan/ipvlan_main.c > index 693ec5b..5874d30 100644 > --- a/drivers/net/ipvlan/ipvlan_main.c > +++ b/drivers/net/ipvlan/ipvlan_main.c > @@ -669,23 +669,22 @@ static int ipvlan_device_event(struct notifier_block > *unused, > return NOTIFY_DONE; > } > > -static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr > *ip6_addr) > +static int ipvlan_add_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6) > { > struct ipvl_addr *addr; > > - 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); > - return -EINVAL; > - } > addr = kzalloc(sizeof(struct ipvl_addr), GFP_ATOMIC); > if (!addr) > return -ENOMEM; > > addr->master = ipvlan; > - memcpy(&addr->ip6addr, ip6_addr, sizeof(struct in6_addr)); > - addr->atype = IPVL_IPV6; > + if (is_v6) { > + memcpy(&addr->ip6addr, iaddr, sizeof(struct in6_addr)); > + addr->atype = IPVL_IPV6; > + } else { > + memcpy(&addr->ip4addr, iaddr, sizeof(struct in_addr)); > + addr->atype = IPVL_IPV4; > + } > list_add_tail(&addr->anode, &ipvlan->addrs); > > /* If the interface is not up, the address will be added to the hash > @@ -697,11 +696,11 @@ static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, > struct in6_addr *ip6_addr) > return 0; > } > > -static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, struct in6_addr > *ip6_addr) > +static void ipvlan_del_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6) > { > struct ipvl_addr *addr; > > - addr = ipvlan_find_addr(ipvlan, ip6_addr, true); > + addr = ipvlan_find_addr(ipvlan, iaddr, is_v6); > if (!addr) > return; > > @@ -712,6 +711,23 @@ static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, > struct in6_addr *ip6_addr) > return; > } > > +static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr > *ip6_addr) > +{ > + 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); > + return -EINVAL; > + } > + > + return ipvlan_add_addr(ipvlan, ip6_addr, true); > +} > + > +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) > { > @@ -745,45 +761,19 @@ static int ipvlan_addr6_event(struct notifier_block > *unused, > > static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr > *ip4_addr) > { > - struct ipvl_addr *addr; > - > 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); > return -EINVAL; > } > - addr = kzalloc(sizeof(struct ipvl_addr), GFP_KERNEL); > - if (!addr) > - return -ENOMEM; > - > - addr->master = ipvlan; > - memcpy(&addr->ip4addr, ip4_addr, sizeof(struct in_addr)); > - addr->atype = IPVL_IPV4; > - list_add_tail(&addr->anode, &ipvlan->addrs); > - > - /* If the interface is not up, the address will be added to the hash > - * list by ipvlan_open. > - */ > - if (netif_running(ipvlan->dev)) > - ipvlan_ht_addr_add(ipvlan, addr); > > - return 0; > + return ipvlan_add_addr(ipvlan, ip4_addr, false); > } > > static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr > *ip4_addr) > { > - struct ipvl_addr *addr; > - > - addr = ipvlan_find_addr(ipvlan, ip4_addr, false); > - if (!addr) > - return; > - > - ipvlan_ht_addr_del(addr); > - list_del(&addr->anode); > - kfree_rcu(addr, rcu); > - > - return; > + return ipvlan_del_addr(ipvlan, ip4_addr, false); > } > > static int ipvlan_addr4_event(struct notifier_block *unused, > -- > 1.9.1 > >
Sorry, I just remember the "net-next" cleanup is closing. Ignore this commit please, I would send a new after "net-next" is opened. Regards Feng