static int vrf_dev_init(struct net_device *dev) { struct net_vrf *vrf = netdev_priv(dev); dev->dstats = netdev_alloc_pcpu_stats(struct pcpu_dstats); if (!dev->dstats) goto out_nomem; /* create the default dst which points back to us */ vrf->rth = vrf_rtable_create(dev); if (!vrf->rth) goto out_stats; if (vrf_rt6_create(dev) != 0) goto out_rth; dev->flags = IFF_MASTER | IFF_NOARP; return 0; out_rth: vrf_rtable_destroy(vrf); out_stats: free_percpu(dev->dstats); dev->dstats = NULL; out_nomem: return -ENOMEM; }
static void vrf_dev_uninit(struct net_device *dev) { struct net_vrf *vrf = netdev_priv(dev); struct net_device *port_dev; struct list_head *iter; vrf_rtable_destroy(vrf); vrf_rt6_destroy(vrf); netdev_for_each_lower_dev(dev, port_dev, iter) vrf_del_slave(dev, port_dev); free_percpu(dev->dstats); dev->dstats = NULL; }
static void vrf_dev_uninit(struct net_device *dev) { struct net_vrf *vrf = netdev_priv(dev); struct slave_queue *queue = &vrf->queue; struct list_head *head = &queue->all_slaves; struct slave *slave, *next; vrf_rtable_destroy(vrf); vrf_rt6_destroy(vrf); list_for_each_entry_safe(slave, next, head, list) vrf_del_slave(dev, slave->dev); free_percpu(dev->dstats); dev->dstats = NULL; }