1 /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
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.
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.
12 * RMNET configuration engine
17 #include <linux/module.h>
18 #include <linux/netlink.h>
19 #include <linux/netdevice.h>
20 #include "rmnet_config.h"
21 #include "rmnet_handlers.h"
22 #include "rmnet_vnd.h"
23 #include "rmnet_private.h"
26 * The shared resource which needs to be protected is realdev->rx_handler_data.
27 * For the writer path, this is using rtnl_lock(). The writer paths are
28 * rmnet_newlink(), rmnet_dellink() and rmnet_force_unassociate_device(). These
29 * paths are already called with rtnl_lock() acquired in. There is also an
30 * ASSERT_RTNL() to ensure that we are calling with rtnl acquired. For
31 * dereference here, we will need to use rtnl_dereference(). Dev list writing
32 * needs to happen with rtnl_lock() acquired for netdev_master_upper_dev_link().
33 * For the reader path, the real_dev->rx_handler_data is called in the TX / RX
34 * path. We only need rcu_read_lock() for these scenarios. In these cases,
35 * the rcu_read_lock() is held in __dev_queue_xmit() and
36 * netif_receive_skb_internal(), so readers need to use rcu_dereference_rtnl()
37 * to get the relevant information. For dev list reading, we again acquire
38 * rcu_read_lock() in rmnet_dellink() for netdev_master_upper_dev_get_rcu().
39 * We also use unregister_netdevice_many() to free all rmnet devices in
40 * rmnet_force_unassociate_device() so we dont lose the rtnl_lock() and free in
44 /* Local Definitions and Declarations */
46 static int rmnet_is_real_dev_registered(const struct net_device
*real_dev
)
48 return rcu_access_pointer(real_dev
->rx_handler
) == rmnet_rx_handler
;
52 static struct rmnet_port
*
53 rmnet_get_port_rtnl(const struct net_device
*real_dev
)
55 return rtnl_dereference(real_dev
->rx_handler_data
);
58 static int rmnet_unregister_real_device(struct net_device
*real_dev
,
59 struct rmnet_port
*port
)
61 if (port
->nr_rmnet_devs
)
66 netdev_rx_handler_unregister(real_dev
);
68 /* release reference on real_dev */
71 netdev_dbg(real_dev
, "Removed from rmnet\n");
75 static int rmnet_register_real_device(struct net_device
*real_dev
)
77 struct rmnet_port
*port
;
82 if (rmnet_is_real_dev_registered(real_dev
))
85 port
= kzalloc(sizeof(*port
), GFP_ATOMIC
);
90 rc
= netdev_rx_handler_register(real_dev
, rmnet_rx_handler
, port
);
96 /* hold on to real dev for MAP data */
99 for (entry
= 0; entry
< RMNET_MAX_LOGICAL_EP
; entry
++)
100 INIT_HLIST_HEAD(&port
->muxed_ep
[entry
]);
102 netdev_dbg(real_dev
, "registered with rmnet\n");
106 static void rmnet_unregister_bridge(struct net_device
*dev
,
107 struct rmnet_port
*port
)
109 struct rmnet_port
*bridge_port
;
110 struct net_device
*bridge_dev
;
112 if (port
->rmnet_mode
!= RMNET_EPMODE_BRIDGE
)
115 /* bridge slave handling */
116 if (!port
->nr_rmnet_devs
) {
117 bridge_dev
= port
->bridge_ep
;
119 bridge_port
= rmnet_get_port_rtnl(bridge_dev
);
120 bridge_port
->bridge_ep
= NULL
;
121 bridge_port
->rmnet_mode
= RMNET_EPMODE_VND
;
123 bridge_dev
= port
->bridge_ep
;
125 bridge_port
= rmnet_get_port_rtnl(bridge_dev
);
126 rmnet_unregister_real_device(bridge_dev
, bridge_port
);
130 static int rmnet_newlink(struct net
*src_net
, struct net_device
*dev
,
131 struct nlattr
*tb
[], struct nlattr
*data
[],
132 struct netlink_ext_ack
*extack
)
134 u32 data_format
= RMNET_INGRESS_FORMAT_DEAGGREGATION
;
135 struct net_device
*real_dev
;
136 int mode
= RMNET_EPMODE_VND
;
137 struct rmnet_endpoint
*ep
;
138 struct rmnet_port
*port
;
142 real_dev
= __dev_get_by_index(src_net
, nla_get_u32(tb
[IFLA_LINK
]));
143 if (!real_dev
|| !dev
)
146 if (!data
[IFLA_VLAN_ID
])
149 ep
= kzalloc(sizeof(*ep
), GFP_ATOMIC
);
153 mux_id
= nla_get_u16(data
[IFLA_VLAN_ID
]);
155 err
= rmnet_register_real_device(real_dev
);
159 port
= rmnet_get_port_rtnl(real_dev
);
160 err
= rmnet_vnd_newlink(mux_id
, dev
, port
, real_dev
, ep
);
164 port
->rmnet_mode
= mode
;
166 hlist_add_head_rcu(&ep
->hlnode
, &port
->muxed_ep
[mux_id
]);
168 if (data
[IFLA_VLAN_FLAGS
]) {
169 struct ifla_vlan_flags
*flags
;
171 flags
= nla_data(data
[IFLA_VLAN_FLAGS
]);
172 data_format
= flags
->flags
& flags
->mask
;
175 netdev_dbg(dev
, "data format [0x%08X]\n", data_format
);
176 port
->data_format
= data_format
;
181 rmnet_unregister_real_device(real_dev
, port
);
187 static void rmnet_dellink(struct net_device
*dev
, struct list_head
*head
)
189 struct rmnet_priv
*priv
= netdev_priv(dev
);
190 struct net_device
*real_dev
;
191 struct rmnet_endpoint
*ep
;
192 struct rmnet_port
*port
;
195 real_dev
= priv
->real_dev
;
197 if (!real_dev
|| !rmnet_is_real_dev_registered(real_dev
))
200 port
= rmnet_get_port_rtnl(real_dev
);
202 mux_id
= rmnet_vnd_get_mux(dev
);
204 ep
= rmnet_get_endpoint(port
, mux_id
);
206 hlist_del_init_rcu(&ep
->hlnode
);
207 rmnet_unregister_bridge(dev
, port
);
208 rmnet_vnd_dellink(mux_id
, port
, ep
);
211 rmnet_unregister_real_device(real_dev
, port
);
213 unregister_netdevice_queue(dev
, head
);
216 static void rmnet_force_unassociate_device(struct net_device
*dev
)
218 struct net_device
*real_dev
= dev
;
219 struct hlist_node
*tmp_ep
;
220 struct rmnet_endpoint
*ep
;
221 struct rmnet_port
*port
;
222 unsigned long bkt_ep
;
225 if (!rmnet_is_real_dev_registered(real_dev
))
230 port
= rmnet_get_port_rtnl(dev
);
233 rmnet_unregister_bridge(dev
, port
);
235 hash_for_each_safe(port
->muxed_ep
, bkt_ep
, tmp_ep
, ep
, hlnode
) {
236 unregister_netdevice_queue(ep
->egress_dev
, &list
);
237 rmnet_vnd_dellink(ep
->mux_id
, port
, ep
);
239 hlist_del_init_rcu(&ep
->hlnode
);
244 unregister_netdevice_many(&list
);
246 rmnet_unregister_real_device(real_dev
, port
);
249 static int rmnet_config_notify_cb(struct notifier_block
*nb
,
250 unsigned long event
, void *data
)
252 struct net_device
*dev
= netdev_notifier_info_to_dev(data
);
258 case NETDEV_UNREGISTER
:
259 netdev_dbg(dev
, "Kernel unregister\n");
260 rmnet_force_unassociate_device(dev
);
270 static struct notifier_block rmnet_dev_notifier __read_mostly
= {
271 .notifier_call
= rmnet_config_notify_cb
,
274 static int rmnet_rtnl_validate(struct nlattr
*tb
[], struct nlattr
*data
[],
275 struct netlink_ext_ack
*extack
)
279 if (!data
|| !data
[IFLA_VLAN_ID
])
282 mux_id
= nla_get_u16(data
[IFLA_VLAN_ID
]);
283 if (mux_id
> (RMNET_MAX_LOGICAL_EP
- 1))
289 static int rmnet_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
290 struct nlattr
*data
[],
291 struct netlink_ext_ack
*extack
)
293 struct rmnet_priv
*priv
= netdev_priv(dev
);
294 struct net_device
*real_dev
;
295 struct rmnet_endpoint
*ep
;
296 struct rmnet_port
*port
;
299 real_dev
= __dev_get_by_index(dev_net(dev
),
300 nla_get_u32(tb
[IFLA_LINK
]));
302 if (!real_dev
|| !dev
|| !rmnet_is_real_dev_registered(real_dev
))
305 port
= rmnet_get_port_rtnl(real_dev
);
307 if (data
[IFLA_VLAN_ID
]) {
308 mux_id
= nla_get_u16(data
[IFLA_VLAN_ID
]);
309 ep
= rmnet_get_endpoint(port
, priv
->mux_id
);
311 hlist_del_init_rcu(&ep
->hlnode
);
312 hlist_add_head_rcu(&ep
->hlnode
, &port
->muxed_ep
[mux_id
]);
315 priv
->mux_id
= mux_id
;
318 if (data
[IFLA_VLAN_FLAGS
]) {
319 struct ifla_vlan_flags
*flags
;
321 flags
= nla_data(data
[IFLA_VLAN_FLAGS
]);
322 port
->data_format
= flags
->flags
& flags
->mask
;
328 static size_t rmnet_get_size(const struct net_device
*dev
)
330 return nla_total_size(2) /* IFLA_VLAN_ID */ +
331 nla_total_size(sizeof(struct ifla_vlan_flags
)); /* IFLA_VLAN_FLAGS */
334 struct rtnl_link_ops rmnet_link_ops __read_mostly
= {
336 .maxtype
= __IFLA_VLAN_MAX
,
337 .priv_size
= sizeof(struct rmnet_priv
),
338 .setup
= rmnet_vnd_setup
,
339 .validate
= rmnet_rtnl_validate
,
340 .newlink
= rmnet_newlink
,
341 .dellink
= rmnet_dellink
,
342 .get_size
= rmnet_get_size
,
343 .changelink
= rmnet_changelink
,
346 /* Needs either rcu_read_lock() or rtnl lock */
347 struct rmnet_port
*rmnet_get_port(struct net_device
*real_dev
)
349 if (rmnet_is_real_dev_registered(real_dev
))
350 return rcu_dereference_rtnl(real_dev
->rx_handler_data
);
355 struct rmnet_endpoint
*rmnet_get_endpoint(struct rmnet_port
*port
, u8 mux_id
)
357 struct rmnet_endpoint
*ep
;
359 hlist_for_each_entry_rcu(ep
, &port
->muxed_ep
[mux_id
], hlnode
) {
360 if (ep
->mux_id
== mux_id
)
367 int rmnet_add_bridge(struct net_device
*rmnet_dev
,
368 struct net_device
*slave_dev
,
369 struct netlink_ext_ack
*extack
)
371 struct rmnet_priv
*priv
= netdev_priv(rmnet_dev
);
372 struct net_device
*real_dev
= priv
->real_dev
;
373 struct rmnet_port
*port
, *slave_port
;
376 port
= rmnet_get_port(real_dev
);
378 /* If there is more than one rmnet dev attached, its probably being
379 * used for muxing. Skip the briding in that case
381 if (port
->nr_rmnet_devs
> 1)
384 if (rmnet_is_real_dev_registered(slave_dev
))
387 err
= rmnet_register_real_device(slave_dev
);
391 slave_port
= rmnet_get_port(slave_dev
);
392 slave_port
->rmnet_mode
= RMNET_EPMODE_BRIDGE
;
393 slave_port
->bridge_ep
= real_dev
;
395 port
->rmnet_mode
= RMNET_EPMODE_BRIDGE
;
396 port
->bridge_ep
= slave_dev
;
398 netdev_dbg(slave_dev
, "registered with rmnet as slave\n");
402 int rmnet_del_bridge(struct net_device
*rmnet_dev
,
403 struct net_device
*slave_dev
)
405 struct rmnet_priv
*priv
= netdev_priv(rmnet_dev
);
406 struct net_device
*real_dev
= priv
->real_dev
;
407 struct rmnet_port
*port
, *slave_port
;
409 port
= rmnet_get_port(real_dev
);
410 port
->rmnet_mode
= RMNET_EPMODE_VND
;
411 port
->bridge_ep
= NULL
;
413 slave_port
= rmnet_get_port(slave_dev
);
414 rmnet_unregister_real_device(slave_dev
, slave_port
);
416 netdev_dbg(slave_dev
, "removed from rmnet as slave\n");
420 /* Startup/Shutdown */
422 static int __init
rmnet_init(void)
426 rc
= register_netdevice_notifier(&rmnet_dev_notifier
);
430 rc
= rtnl_link_register(&rmnet_link_ops
);
432 unregister_netdevice_notifier(&rmnet_dev_notifier
);
438 static void __exit
rmnet_exit(void)
440 unregister_netdevice_notifier(&rmnet_dev_notifier
);
441 rtnl_link_unregister(&rmnet_link_ops
);
444 module_init(rmnet_init
)
445 module_exit(rmnet_exit
)
446 MODULE_LICENSE("GPL v2");