Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nlmon: use standard rtnetlink link api for add/del devices

It is not nice when netdev is created right after module load and with
some implicit name. So rather change nlmon to use standard rtnl link API.

Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Acked-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
7e6d4da8 75a493e6

+29 -22
+29 -22
drivers/net/nlmon.c
··· 4 4 #include <linux/netlink.h> 5 5 #include <net/net_namespace.h> 6 6 #include <linux/if_arp.h> 7 + #include <net/rtnetlink.h> 7 8 8 9 struct pcpu_lstats { 9 10 u64 packets; ··· 57 56 free_percpu(dev->lstats); 58 57 } 59 58 60 - static struct netlink_tap nlmon_tap; 59 + struct nlmon { 60 + struct netlink_tap nt; 61 + }; 61 62 62 63 static int nlmon_open(struct net_device *dev) 63 64 { 64 - return netlink_add_tap(&nlmon_tap); 65 + struct nlmon *nlmon = netdev_priv(dev); 66 + 67 + nlmon->nt.dev = dev; 68 + nlmon->nt.module = THIS_MODULE; 69 + return netlink_add_tap(&nlmon->nt); 65 70 } 66 71 67 72 static int nlmon_close(struct net_device *dev) 68 73 { 69 - return netlink_remove_tap(&nlmon_tap); 74 + struct nlmon *nlmon = netdev_priv(dev); 75 + 76 + return netlink_remove_tap(&nlmon->nt); 70 77 } 71 78 72 79 static struct rtnl_link_stats64 * ··· 128 119 .ndo_change_mtu = nlmon_change_mtu, 129 120 }; 130 121 131 - static struct netlink_tap nlmon_tap __read_mostly = { 132 - .module = THIS_MODULE, 133 - }; 134 - 135 122 static void nlmon_setup(struct net_device *dev) 136 123 { 137 124 dev->type = ARPHRD_NETLINK; ··· 147 142 dev->mtu = NLMSG_GOODSIZE; 148 143 } 149 144 145 + static int nlmon_validate(struct nlattr *tb[], struct nlattr *data[]) 146 + { 147 + if (tb[IFLA_ADDRESS]) 148 + return -EINVAL; 149 + return 0; 150 + } 151 + 152 + static struct rtnl_link_ops nlmon_link_ops __read_mostly = { 153 + .kind = "nlmon", 154 + .priv_size = sizeof(struct nlmon), 155 + .setup = nlmon_setup, 156 + .validate = nlmon_validate, 157 + }; 158 + 150 159 static __init int nlmon_register(void) 151 160 { 152 - int err; 153 - struct net_device *nldev; 154 - 155 - nldev = nlmon_tap.dev = alloc_netdev(0, "netlink", nlmon_setup); 156 - if (unlikely(nldev == NULL)) 157 - return -ENOMEM; 158 - 159 - err = register_netdev(nldev); 160 - if (unlikely(err)) 161 - free_netdev(nldev); 162 - 163 - return err; 161 + return rtnl_link_register(&nlmon_link_ops); 164 162 } 165 163 166 164 static __exit void nlmon_unregister(void) 167 165 { 168 - struct net_device *nldev = nlmon_tap.dev; 169 - 170 - unregister_netdev(nldev); 166 + rtnl_link_unregister(&nlmon_link_ops); 171 167 } 172 168 173 169 module_init(nlmon_register); ··· 178 172 MODULE_AUTHOR("Daniel Borkmann <dborkman@redhat.com>"); 179 173 MODULE_AUTHOR("Mathieu Geli <geli@enseirb.fr>"); 180 174 MODULE_DESCRIPTION("Netlink monitoring device"); 175 + MODULE_ALIAS_RTNL_LINK("nlmon");