rmnet_config.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * RMNET configuration engine
  13. *
  14. */
  15. #include <net/sock.h>
  16. #include <linux/module.h>
  17. #include <linux/netlink.h>
  18. #include <linux/netdevice.h>
  19. #include "rmnet_config.h"
  20. #include "rmnet_handlers.h"
  21. #include "rmnet_vnd.h"
  22. #include "rmnet_private.h"
  23. /* Locking scheme -
  24. * The shared resource which needs to be protected is realdev->rx_handler_data.
  25. * For the writer path, this is using rtnl_lock(). The writer paths are
  26. * rmnet_newlink(), rmnet_dellink() and rmnet_force_unassociate_device(). These
  27. * paths are already called with rtnl_lock() acquired in. There is also an
  28. * ASSERT_RTNL() to ensure that we are calling with rtnl acquired. For
  29. * dereference here, we will need to use rtnl_dereference(). Dev list writing
  30. * needs to happen with rtnl_lock() acquired for netdev_master_upper_dev_link().
  31. * For the reader path, the real_dev->rx_handler_data is called in the TX / RX
  32. * path. We only need rcu_read_lock() for these scenarios. In these cases,
  33. * the rcu_read_lock() is held in __dev_queue_xmit() and
  34. * netif_receive_skb_internal(), so readers need to use rcu_dereference_rtnl()
  35. * to get the relevant information. For dev list reading, we again acquire
  36. * rcu_read_lock() in rmnet_dellink() for netdev_master_upper_dev_get_rcu().
  37. * We also use unregister_netdevice_many() to free all rmnet devices in
  38. * rmnet_force_unassociate_device() so we dont lose the rtnl_lock() and free in
  39. * same context.
  40. */
  41. /* Local Definitions and Declarations */
  42. struct rmnet_walk_data {
  43. struct net_device *real_dev;
  44. struct list_head *head;
  45. struct rmnet_port *port;
  46. };
  47. static int rmnet_is_real_dev_registered(const struct net_device *real_dev)
  48. {
  49. return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler;
  50. }
  51. /* Needs rtnl lock */
  52. static struct rmnet_port*
  53. rmnet_get_port_rtnl(const struct net_device *real_dev)
  54. {
  55. return rtnl_dereference(real_dev->rx_handler_data);
  56. }
  57. static struct rmnet_endpoint*
  58. rmnet_get_endpoint(struct net_device *dev, int config_id)
  59. {
  60. struct rmnet_endpoint *ep;
  61. struct rmnet_port *port;
  62. if (!rmnet_is_real_dev_registered(dev)) {
  63. ep = rmnet_vnd_get_endpoint(dev);
  64. } else {
  65. port = rmnet_get_port_rtnl(dev);
  66. ep = &port->muxed_ep[config_id];
  67. }
  68. return ep;
  69. }
  70. static int rmnet_unregister_real_device(struct net_device *real_dev,
  71. struct rmnet_port *port)
  72. {
  73. if (port->nr_rmnet_devs)
  74. return -EINVAL;
  75. kfree(port);
  76. netdev_rx_handler_unregister(real_dev);
  77. /* release reference on real_dev */
  78. dev_put(real_dev);
  79. netdev_dbg(real_dev, "Removed from rmnet\n");
  80. return 0;
  81. }
  82. static int rmnet_register_real_device(struct net_device *real_dev)
  83. {
  84. struct rmnet_port *port;
  85. int rc;
  86. ASSERT_RTNL();
  87. if (rmnet_is_real_dev_registered(real_dev))
  88. return 0;
  89. port = kzalloc(sizeof(*port), GFP_ATOMIC);
  90. if (!port)
  91. return -ENOMEM;
  92. port->dev = real_dev;
  93. rc = netdev_rx_handler_register(real_dev, rmnet_rx_handler, port);
  94. if (rc) {
  95. kfree(port);
  96. return -EBUSY;
  97. }
  98. /* hold on to real dev for MAP data */
  99. dev_hold(real_dev);
  100. netdev_dbg(real_dev, "registered with rmnet\n");
  101. return 0;
  102. }
  103. static void rmnet_set_endpoint_config(struct net_device *dev,
  104. u8 mux_id, u8 rmnet_mode,
  105. struct net_device *egress_dev)
  106. {
  107. struct rmnet_endpoint *ep;
  108. netdev_dbg(dev, "id %d mode %d dev %s\n",
  109. mux_id, rmnet_mode, egress_dev->name);
  110. ep = rmnet_get_endpoint(dev, mux_id);
  111. /* This config is cleared on every set, so its ok to not
  112. * clear it on a device delete.
  113. */
  114. memset(ep, 0, sizeof(struct rmnet_endpoint));
  115. ep->rmnet_mode = rmnet_mode;
  116. ep->egress_dev = egress_dev;
  117. ep->mux_id = mux_id;
  118. }
  119. static int rmnet_newlink(struct net *src_net, struct net_device *dev,
  120. struct nlattr *tb[], struct nlattr *data[],
  121. struct netlink_ext_ack *extack)
  122. {
  123. int ingress_format = RMNET_INGRESS_FORMAT_DEMUXING |
  124. RMNET_INGRESS_FORMAT_DEAGGREGATION |
  125. RMNET_INGRESS_FORMAT_MAP;
  126. int egress_format = RMNET_EGRESS_FORMAT_MUXING |
  127. RMNET_EGRESS_FORMAT_MAP;
  128. struct net_device *real_dev;
  129. int mode = RMNET_EPMODE_VND;
  130. struct rmnet_port *port;
  131. int err = 0;
  132. u16 mux_id;
  133. real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
  134. if (!real_dev || !dev)
  135. return -ENODEV;
  136. if (!data[IFLA_VLAN_ID])
  137. return -EINVAL;
  138. mux_id = nla_get_u16(data[IFLA_VLAN_ID]);
  139. err = rmnet_register_real_device(real_dev);
  140. if (err)
  141. goto err0;
  142. port = rmnet_get_port_rtnl(real_dev);
  143. err = rmnet_vnd_newlink(mux_id, dev, port, real_dev);
  144. if (err)
  145. goto err1;
  146. err = netdev_master_upper_dev_link(dev, real_dev, NULL, NULL);
  147. if (err)
  148. goto err2;
  149. netdev_dbg(dev, "data format [ingress 0x%08X] [egress 0x%08X]\n",
  150. ingress_format, egress_format);
  151. port->egress_data_format = egress_format;
  152. port->ingress_data_format = ingress_format;
  153. rmnet_set_endpoint_config(real_dev, mux_id, mode, dev);
  154. rmnet_set_endpoint_config(dev, mux_id, mode, real_dev);
  155. return 0;
  156. err2:
  157. rmnet_vnd_dellink(mux_id, port);
  158. err1:
  159. rmnet_unregister_real_device(real_dev, port);
  160. err0:
  161. return err;
  162. }
  163. static void rmnet_dellink(struct net_device *dev, struct list_head *head)
  164. {
  165. struct net_device *real_dev;
  166. struct rmnet_port *port;
  167. u8 mux_id;
  168. rcu_read_lock();
  169. real_dev = netdev_master_upper_dev_get_rcu(dev);
  170. rcu_read_unlock();
  171. if (!real_dev || !rmnet_is_real_dev_registered(real_dev))
  172. return;
  173. port = rmnet_get_port_rtnl(real_dev);
  174. mux_id = rmnet_vnd_get_mux(dev);
  175. rmnet_vnd_dellink(mux_id, port);
  176. netdev_upper_dev_unlink(dev, real_dev);
  177. rmnet_unregister_real_device(real_dev, port);
  178. unregister_netdevice_queue(dev, head);
  179. }
  180. static int rmnet_dev_walk_unreg(struct net_device *rmnet_dev, void *data)
  181. {
  182. struct rmnet_walk_data *d = data;
  183. u8 mux_id;
  184. mux_id = rmnet_vnd_get_mux(rmnet_dev);
  185. rmnet_vnd_dellink(mux_id, d->port);
  186. netdev_upper_dev_unlink(rmnet_dev, d->real_dev);
  187. unregister_netdevice_queue(rmnet_dev, d->head);
  188. return 0;
  189. }
  190. static void rmnet_force_unassociate_device(struct net_device *dev)
  191. {
  192. struct net_device *real_dev = dev;
  193. struct rmnet_walk_data d;
  194. struct rmnet_port *port;
  195. LIST_HEAD(list);
  196. if (!rmnet_is_real_dev_registered(real_dev))
  197. return;
  198. ASSERT_RTNL();
  199. d.real_dev = real_dev;
  200. d.head = &list;
  201. port = rmnet_get_port_rtnl(dev);
  202. d.port = port;
  203. rcu_read_lock();
  204. netdev_walk_all_lower_dev_rcu(real_dev, rmnet_dev_walk_unreg, &d);
  205. rcu_read_unlock();
  206. unregister_netdevice_many(&list);
  207. rmnet_unregister_real_device(real_dev, port);
  208. }
  209. static int rmnet_config_notify_cb(struct notifier_block *nb,
  210. unsigned long event, void *data)
  211. {
  212. struct net_device *dev = netdev_notifier_info_to_dev(data);
  213. if (!dev)
  214. return NOTIFY_DONE;
  215. switch (event) {
  216. case NETDEV_UNREGISTER:
  217. netdev_dbg(dev, "Kernel unregister\n");
  218. rmnet_force_unassociate_device(dev);
  219. break;
  220. default:
  221. break;
  222. }
  223. return NOTIFY_DONE;
  224. }
  225. static struct notifier_block rmnet_dev_notifier __read_mostly = {
  226. .notifier_call = rmnet_config_notify_cb,
  227. };
  228. static int rmnet_rtnl_validate(struct nlattr *tb[], struct nlattr *data[],
  229. struct netlink_ext_ack *extack)
  230. {
  231. u16 mux_id;
  232. if (!data || !data[IFLA_VLAN_ID])
  233. return -EINVAL;
  234. mux_id = nla_get_u16(data[IFLA_VLAN_ID]);
  235. if (mux_id > (RMNET_MAX_LOGICAL_EP - 1))
  236. return -ERANGE;
  237. return 0;
  238. }
  239. static size_t rmnet_get_size(const struct net_device *dev)
  240. {
  241. return nla_total_size(2); /* IFLA_VLAN_ID */
  242. }
  243. struct rtnl_link_ops rmnet_link_ops __read_mostly = {
  244. .kind = "rmnet",
  245. .maxtype = __IFLA_VLAN_MAX,
  246. .priv_size = sizeof(struct rmnet_priv),
  247. .setup = rmnet_vnd_setup,
  248. .validate = rmnet_rtnl_validate,
  249. .newlink = rmnet_newlink,
  250. .dellink = rmnet_dellink,
  251. .get_size = rmnet_get_size,
  252. };
  253. /* Needs either rcu_read_lock() or rtnl lock */
  254. struct rmnet_port *rmnet_get_port(struct net_device *real_dev)
  255. {
  256. if (rmnet_is_real_dev_registered(real_dev))
  257. return rcu_dereference_rtnl(real_dev->rx_handler_data);
  258. else
  259. return NULL;
  260. }
  261. /* Startup/Shutdown */
  262. static int __init rmnet_init(void)
  263. {
  264. int rc;
  265. rc = register_netdevice_notifier(&rmnet_dev_notifier);
  266. if (rc != 0)
  267. return rc;
  268. rc = rtnl_link_register(&rmnet_link_ops);
  269. if (rc != 0) {
  270. unregister_netdevice_notifier(&rmnet_dev_notifier);
  271. return rc;
  272. }
  273. return rc;
  274. }
  275. static void __exit rmnet_exit(void)
  276. {
  277. unregister_netdevice_notifier(&rmnet_dev_notifier);
  278. rtnl_link_unregister(&rmnet_link_ops);
  279. }
  280. module_init(rmnet_init)
  281. module_exit(rmnet_exit)
  282. MODULE_LICENSE("GPL v2");