Loading drivers/net/dummy.c +62 −20 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <linux/init.h> #include <linux/init.h> #include <linux/moduleparam.h> #include <linux/moduleparam.h> #include <linux/rtnetlink.h> #include <linux/rtnetlink.h> #include <net/rtnetlink.h> struct dummy_priv { struct dummy_priv { struct net_device *dev; struct net_device *dev; Loading @@ -61,12 +62,13 @@ static void set_multicast_list(struct net_device *dev) { { } } static void __init dummy_setup(struct net_device *dev) static void dummy_setup(struct net_device *dev) { { /* Initialize the device structure. */ /* Initialize the device structure. */ dev->hard_start_xmit = dummy_xmit; dev->hard_start_xmit = dummy_xmit; dev->set_multicast_list = set_multicast_list; dev->set_multicast_list = set_multicast_list; dev->set_mac_address = dummy_set_address; dev->set_mac_address = dummy_set_address; dev->destructor = free_netdev; /* Fill in device structure with ethernet-generic values. */ /* Fill in device structure with ethernet-generic values. */ ether_setup(dev); ether_setup(dev); Loading @@ -89,6 +91,37 @@ static int dummy_xmit(struct sk_buff *skb, struct net_device *dev) static LIST_HEAD(dummies); static LIST_HEAD(dummies); static int dummy_newlink(struct net_device *dev, struct nlattr *tb[], struct nlattr *data[]) { struct dummy_priv *priv = netdev_priv(dev); int err; err = register_netdevice(dev); if (err < 0) return err; priv->dev = dev; list_add_tail(&priv->list, &dummies); return 0; } static void dummy_dellink(struct net_device *dev) { struct dummy_priv *priv = netdev_priv(dev); list_del(&priv->list); unregister_netdevice(dev); } static struct rtnl_link_ops dummy_link_ops __read_mostly = { .kind = "dummy", .priv_size = sizeof(struct dummy_priv), .setup = dummy_setup, .newlink = dummy_newlink, .dellink = dummy_dellink, }; /* Number of dummy devices to be set up by this module. */ /* Number of dummy devices to be set up by this module. */ module_param(numdummies, int, 0); module_param(numdummies, int, 0); MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices"); MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices"); Loading @@ -105,38 +138,42 @@ static int __init dummy_init_one(void) if (!dev_dummy) if (!dev_dummy) return -ENOMEM; return -ENOMEM; if ((err = register_netdev(dev_dummy))) { err = dev_alloc_name(dev_dummy, dev_dummy->name); free_netdev(dev_dummy); if (err < 0) dev_dummy = NULL; goto err; } else { dev_dummy->rtnl_link_ops = &dummy_link_ops; err = register_netdevice(dev_dummy); if (err < 0) goto err; priv = netdev_priv(dev_dummy); priv = netdev_priv(dev_dummy); priv->dev = dev_dummy; priv->dev = dev_dummy; list_add_tail(&priv->list, &dummies); list_add_tail(&priv->list, &dummies); } return 0; err: free_netdev(dev_dummy); return err; return err; } } static void dummy_free_one(struct net_device *dev) { struct dummy_priv *priv = netdev_priv(dev); list_del(&priv->list); unregister_netdev(dev); free_netdev(dev); } static int __init dummy_init_module(void) static int __init dummy_init_module(void) { { struct dummy_priv *priv, *next; struct dummy_priv *priv, *next; int i, err = 0; int i, err = 0; rtnl_lock(); err = __rtnl_link_register(&dummy_link_ops); for (i = 0; i < numdummies && !err; i++) for (i = 0; i < numdummies && !err; i++) err = dummy_init_one(); err = dummy_init_one(); if (err) { if (err < 0) { list_for_each_entry_safe(priv, next, &dummies, list) list_for_each_entry_safe(priv, next, &dummies, list) dummy_free_one(priv->dev); dummy_dellink(priv->dev); __rtnl_link_unregister(&dummy_link_ops); } } rtnl_unlock(); return err; return err; } } Loading @@ -144,10 +181,15 @@ static void __exit dummy_cleanup_module(void) { { struct dummy_priv *priv, *next; struct dummy_priv *priv, *next; rtnl_lock(); list_for_each_entry_safe(priv, next, &dummies, list) list_for_each_entry_safe(priv, next, &dummies, list) dummy_free_one(priv->dev); dummy_dellink(priv->dev); __rtnl_link_unregister(&dummy_link_ops); rtnl_unlock(); } } module_init(dummy_init_module); module_init(dummy_init_module); module_exit(dummy_cleanup_module); module_exit(dummy_cleanup_module); MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL"); MODULE_ALIAS_RTNL_LINK("dummy"); Loading
drivers/net/dummy.c +62 −20 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <linux/init.h> #include <linux/init.h> #include <linux/moduleparam.h> #include <linux/moduleparam.h> #include <linux/rtnetlink.h> #include <linux/rtnetlink.h> #include <net/rtnetlink.h> struct dummy_priv { struct dummy_priv { struct net_device *dev; struct net_device *dev; Loading @@ -61,12 +62,13 @@ static void set_multicast_list(struct net_device *dev) { { } } static void __init dummy_setup(struct net_device *dev) static void dummy_setup(struct net_device *dev) { { /* Initialize the device structure. */ /* Initialize the device structure. */ dev->hard_start_xmit = dummy_xmit; dev->hard_start_xmit = dummy_xmit; dev->set_multicast_list = set_multicast_list; dev->set_multicast_list = set_multicast_list; dev->set_mac_address = dummy_set_address; dev->set_mac_address = dummy_set_address; dev->destructor = free_netdev; /* Fill in device structure with ethernet-generic values. */ /* Fill in device structure with ethernet-generic values. */ ether_setup(dev); ether_setup(dev); Loading @@ -89,6 +91,37 @@ static int dummy_xmit(struct sk_buff *skb, struct net_device *dev) static LIST_HEAD(dummies); static LIST_HEAD(dummies); static int dummy_newlink(struct net_device *dev, struct nlattr *tb[], struct nlattr *data[]) { struct dummy_priv *priv = netdev_priv(dev); int err; err = register_netdevice(dev); if (err < 0) return err; priv->dev = dev; list_add_tail(&priv->list, &dummies); return 0; } static void dummy_dellink(struct net_device *dev) { struct dummy_priv *priv = netdev_priv(dev); list_del(&priv->list); unregister_netdevice(dev); } static struct rtnl_link_ops dummy_link_ops __read_mostly = { .kind = "dummy", .priv_size = sizeof(struct dummy_priv), .setup = dummy_setup, .newlink = dummy_newlink, .dellink = dummy_dellink, }; /* Number of dummy devices to be set up by this module. */ /* Number of dummy devices to be set up by this module. */ module_param(numdummies, int, 0); module_param(numdummies, int, 0); MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices"); MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices"); Loading @@ -105,38 +138,42 @@ static int __init dummy_init_one(void) if (!dev_dummy) if (!dev_dummy) return -ENOMEM; return -ENOMEM; if ((err = register_netdev(dev_dummy))) { err = dev_alloc_name(dev_dummy, dev_dummy->name); free_netdev(dev_dummy); if (err < 0) dev_dummy = NULL; goto err; } else { dev_dummy->rtnl_link_ops = &dummy_link_ops; err = register_netdevice(dev_dummy); if (err < 0) goto err; priv = netdev_priv(dev_dummy); priv = netdev_priv(dev_dummy); priv->dev = dev_dummy; priv->dev = dev_dummy; list_add_tail(&priv->list, &dummies); list_add_tail(&priv->list, &dummies); } return 0; err: free_netdev(dev_dummy); return err; return err; } } static void dummy_free_one(struct net_device *dev) { struct dummy_priv *priv = netdev_priv(dev); list_del(&priv->list); unregister_netdev(dev); free_netdev(dev); } static int __init dummy_init_module(void) static int __init dummy_init_module(void) { { struct dummy_priv *priv, *next; struct dummy_priv *priv, *next; int i, err = 0; int i, err = 0; rtnl_lock(); err = __rtnl_link_register(&dummy_link_ops); for (i = 0; i < numdummies && !err; i++) for (i = 0; i < numdummies && !err; i++) err = dummy_init_one(); err = dummy_init_one(); if (err) { if (err < 0) { list_for_each_entry_safe(priv, next, &dummies, list) list_for_each_entry_safe(priv, next, &dummies, list) dummy_free_one(priv->dev); dummy_dellink(priv->dev); __rtnl_link_unregister(&dummy_link_ops); } } rtnl_unlock(); return err; return err; } } Loading @@ -144,10 +181,15 @@ static void __exit dummy_cleanup_module(void) { { struct dummy_priv *priv, *next; struct dummy_priv *priv, *next; rtnl_lock(); list_for_each_entry_safe(priv, next, &dummies, list) list_for_each_entry_safe(priv, next, &dummies, list) dummy_free_one(priv->dev); dummy_dellink(priv->dev); __rtnl_link_unregister(&dummy_link_ops); rtnl_unlock(); } } module_init(dummy_init_module); module_init(dummy_init_module); module_exit(dummy_cleanup_module); module_exit(dummy_cleanup_module); MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL"); MODULE_ALIAS_RTNL_LINK("dummy");