1 // SPDX-License-Identifier: GPL-2.0
2 /* drivers/net/wireless/virt_wifi.c
4 * A fake implementation of cfg80211_ops that can be tacked on to an ethernet
5 * net_device to make it appear as a wireless connection.
7 * Copyright (C) 2018 Google, Inc.
9 * Author: schuffelen@google.com
12 #include <net/cfg80211.h>
13 #include <net/rtnetlink.h>
14 #include <linux/etherdevice.h>
15 #include <linux/math64.h>
16 #include <linux/module.h>
18 static struct wiphy
*common_wiphy
;
20 struct virt_wifi_wiphy_priv
{
21 struct delayed_work scan_result
;
22 struct cfg80211_scan_request
*scan_request
;
26 static struct ieee80211_channel channel_2ghz
= {
27 .band
= NL80211_BAND_2GHZ
,
33 static struct ieee80211_rate bitrates_2ghz
[] = {
43 static struct ieee80211_supported_band band_2ghz
= {
44 .channels
= &channel_2ghz
,
45 .bitrates
= bitrates_2ghz
,
46 .band
= NL80211_BAND_2GHZ
,
48 .n_bitrates
= ARRAY_SIZE(bitrates_2ghz
),
51 .cap
= IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
52 IEEE80211_HT_CAP_GRN_FLD
|
53 IEEE80211_HT_CAP_SGI_20
|
54 IEEE80211_HT_CAP_SGI_40
|
55 IEEE80211_HT_CAP_DSSSCCK40
,
59 .rx_mask
= {0xff, 0xff},
60 .tx_params
= IEEE80211_HT_MCS_TX_DEFINED
,
65 static struct ieee80211_channel channel_5ghz
= {
66 .band
= NL80211_BAND_5GHZ
,
72 static struct ieee80211_rate bitrates_5ghz
[] = {
78 #define RX_MCS_MAP (IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 | \
79 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 | \
80 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 | \
81 IEEE80211_VHT_MCS_SUPPORT_0_9 << 6 | \
82 IEEE80211_VHT_MCS_SUPPORT_0_9 << 8 | \
83 IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 | \
84 IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 | \
85 IEEE80211_VHT_MCS_SUPPORT_0_9 << 14)
87 #define TX_MCS_MAP (IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 | \
88 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 | \
89 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 | \
90 IEEE80211_VHT_MCS_SUPPORT_0_9 << 6 | \
91 IEEE80211_VHT_MCS_SUPPORT_0_9 << 8 | \
92 IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 | \
93 IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 | \
94 IEEE80211_VHT_MCS_SUPPORT_0_9 << 14)
96 static struct ieee80211_supported_band band_5ghz
= {
97 .channels
= &channel_5ghz
,
98 .bitrates
= bitrates_5ghz
,
99 .band
= NL80211_BAND_5GHZ
,
101 .n_bitrates
= ARRAY_SIZE(bitrates_5ghz
),
103 .ht_supported
= true,
104 .cap
= IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
105 IEEE80211_HT_CAP_GRN_FLD
|
106 IEEE80211_HT_CAP_SGI_20
|
107 IEEE80211_HT_CAP_SGI_40
|
108 IEEE80211_HT_CAP_DSSSCCK40
,
110 .ampdu_density
= 0x6,
112 .rx_mask
= {0xff, 0xff},
113 .tx_params
= IEEE80211_HT_MCS_TX_DEFINED
,
117 .vht_supported
= true,
118 .cap
= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454
|
119 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ
|
120 IEEE80211_VHT_CAP_RXLDPC
|
121 IEEE80211_VHT_CAP_SHORT_GI_80
|
122 IEEE80211_VHT_CAP_SHORT_GI_160
|
123 IEEE80211_VHT_CAP_TXSTBC
|
124 IEEE80211_VHT_CAP_RXSTBC_1
|
125 IEEE80211_VHT_CAP_RXSTBC_2
|
126 IEEE80211_VHT_CAP_RXSTBC_3
|
127 IEEE80211_VHT_CAP_RXSTBC_4
|
128 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
,
130 .rx_mcs_map
= cpu_to_le16(RX_MCS_MAP
),
131 .tx_mcs_map
= cpu_to_le16(TX_MCS_MAP
),
136 /* Assigned at module init. Guaranteed locally-administered and unicast. */
137 static u8 fake_router_bssid
[ETH_ALEN
] __ro_after_init
= {};
139 #define VIRT_WIFI_SSID "VirtWifi"
140 #define VIRT_WIFI_SSID_LEN 8
142 static void virt_wifi_inform_bss(struct wiphy
*wiphy
)
144 u64 tsf
= div_u64(ktime_get_boottime_ns(), 1000);
145 struct cfg80211_bss
*informed_bss
;
146 static const struct {
151 .tag
= WLAN_EID_SSID
,
152 .len
= VIRT_WIFI_SSID_LEN
,
153 .ssid
= VIRT_WIFI_SSID
,
156 informed_bss
= cfg80211_inform_bss(wiphy
, &channel_5ghz
,
157 CFG80211_BSS_FTYPE_PRESP
,
158 fake_router_bssid
, tsf
,
159 WLAN_CAPABILITY_ESS
, 0,
160 (void *)&ssid
, sizeof(ssid
),
161 DBM_TO_MBM(-50), GFP_KERNEL
);
162 cfg80211_put_bss(wiphy
, informed_bss
);
165 /* Called with the rtnl lock held. */
166 static int virt_wifi_scan(struct wiphy
*wiphy
,
167 struct cfg80211_scan_request
*request
)
169 struct virt_wifi_wiphy_priv
*priv
= wiphy_priv(wiphy
);
171 wiphy_debug(wiphy
, "scan\n");
173 if (priv
->scan_request
|| priv
->being_deleted
)
176 priv
->scan_request
= request
;
177 schedule_delayed_work(&priv
->scan_result
, HZ
* 2);
182 /* Acquires and releases the rdev BSS lock. */
183 static void virt_wifi_scan_result(struct work_struct
*work
)
185 struct virt_wifi_wiphy_priv
*priv
=
186 container_of(work
, struct virt_wifi_wiphy_priv
,
188 struct wiphy
*wiphy
= priv_to_wiphy(priv
);
189 struct cfg80211_scan_info scan_info
= { .aborted
= false };
191 virt_wifi_inform_bss(wiphy
);
193 /* Schedules work which acquires and releases the rtnl lock. */
194 cfg80211_scan_done(priv
->scan_request
, &scan_info
);
195 priv
->scan_request
= NULL
;
198 /* May acquire and release the rdev BSS lock. */
199 static void virt_wifi_cancel_scan(struct wiphy
*wiphy
)
201 struct virt_wifi_wiphy_priv
*priv
= wiphy_priv(wiphy
);
203 cancel_delayed_work_sync(&priv
->scan_result
);
204 /* Clean up dangling callbacks if necessary. */
205 if (priv
->scan_request
) {
206 struct cfg80211_scan_info scan_info
= { .aborted
= true };
207 /* Schedules work which acquires and releases the rtnl lock. */
208 cfg80211_scan_done(priv
->scan_request
, &scan_info
);
209 priv
->scan_request
= NULL
;
213 struct virt_wifi_netdev_priv
{
214 struct delayed_work connect
;
215 struct net_device
*lowerdev
;
216 struct net_device
*upperdev
;
219 u32 connect_requested_ssid_len
;
220 u8 connect_requested_ssid
[IEEE80211_MAX_SSID_LEN
];
221 u8 connect_requested_bss
[ETH_ALEN
];
227 /* Called with the rtnl lock held. */
228 static int virt_wifi_connect(struct wiphy
*wiphy
, struct net_device
*netdev
,
229 struct cfg80211_connect_params
*sme
)
231 struct virt_wifi_netdev_priv
*priv
= netdev_priv(netdev
);
234 if (priv
->being_deleted
|| !priv
->is_up
)
240 priv
->connect_requested_ssid_len
= sme
->ssid_len
;
241 memcpy(priv
->connect_requested_ssid
, sme
->ssid
, sme
->ssid_len
);
243 could_schedule
= schedule_delayed_work(&priv
->connect
, HZ
* 2);
248 ether_addr_copy(priv
->connect_requested_bss
, sme
->bssid
);
250 virt_wifi_inform_bss(wiphy
);
251 eth_zero_addr(priv
->connect_requested_bss
);
254 wiphy_debug(wiphy
, "connect\n");
259 /* Acquires and releases the rdev event lock. */
260 static void virt_wifi_connect_complete(struct work_struct
*work
)
262 struct virt_wifi_netdev_priv
*priv
=
263 container_of(work
, struct virt_wifi_netdev_priv
, connect
.work
);
264 u8
*requested_bss
= priv
->connect_requested_bss
;
265 bool right_addr
= ether_addr_equal(requested_bss
, fake_router_bssid
);
266 bool right_ssid
= priv
->connect_requested_ssid_len
== VIRT_WIFI_SSID_LEN
&&
267 !memcmp(priv
->connect_requested_ssid
, VIRT_WIFI_SSID
,
268 priv
->connect_requested_ssid_len
);
269 u16 status
= WLAN_STATUS_SUCCESS
;
271 if (is_zero_ether_addr(requested_bss
))
272 requested_bss
= NULL
;
274 if (!priv
->is_up
|| (requested_bss
&& !right_addr
) || !right_ssid
)
275 status
= WLAN_STATUS_UNSPECIFIED_FAILURE
;
277 priv
->is_connected
= true;
279 /* Schedules an event that acquires the rtnl lock. */
280 cfg80211_connect_result(priv
->upperdev
, requested_bss
, NULL
, 0, NULL
, 0,
282 netif_carrier_on(priv
->upperdev
);
285 /* May acquire and release the rdev event lock. */
286 static void virt_wifi_cancel_connect(struct net_device
*netdev
)
288 struct virt_wifi_netdev_priv
*priv
= netdev_priv(netdev
);
290 /* If there is work pending, clean up dangling callbacks. */
291 if (cancel_delayed_work_sync(&priv
->connect
)) {
292 /* Schedules an event that acquires the rtnl lock. */
293 cfg80211_connect_result(priv
->upperdev
,
294 priv
->connect_requested_bss
, NULL
, 0,
296 WLAN_STATUS_UNSPECIFIED_FAILURE
,
301 /* Called with the rtnl lock held. Acquires the rdev event lock. */
302 static int virt_wifi_disconnect(struct wiphy
*wiphy
, struct net_device
*netdev
,
305 struct virt_wifi_netdev_priv
*priv
= netdev_priv(netdev
);
307 if (priv
->being_deleted
)
310 wiphy_debug(wiphy
, "disconnect\n");
311 virt_wifi_cancel_connect(netdev
);
313 cfg80211_disconnected(netdev
, reason_code
, NULL
, 0, true, GFP_KERNEL
);
314 priv
->is_connected
= false;
315 netif_carrier_off(netdev
);
320 /* Called with the rtnl lock held. */
321 static int virt_wifi_get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
322 const u8
*mac
, struct station_info
*sinfo
)
324 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
326 wiphy_debug(wiphy
, "get_station\n");
328 if (!priv
->is_connected
|| !ether_addr_equal(mac
, fake_router_bssid
))
331 sinfo
->filled
= BIT_ULL(NL80211_STA_INFO_TX_PACKETS
) |
332 BIT_ULL(NL80211_STA_INFO_TX_FAILED
) |
333 BIT_ULL(NL80211_STA_INFO_SIGNAL
) |
334 BIT_ULL(NL80211_STA_INFO_TX_BITRATE
);
335 sinfo
->tx_packets
= priv
->tx_packets
;
336 sinfo
->tx_failed
= priv
->tx_failed
;
337 /* For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_ */
339 sinfo
->txrate
= (struct rate_info
) {
340 .legacy
= 10, /* units are 100kbit/s */
345 /* Called with the rtnl lock held. */
346 static int virt_wifi_dump_station(struct wiphy
*wiphy
, struct net_device
*dev
,
347 int idx
, u8
*mac
, struct station_info
*sinfo
)
349 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
351 wiphy_debug(wiphy
, "dump_station\n");
353 if (idx
!= 0 || !priv
->is_connected
)
356 ether_addr_copy(mac
, fake_router_bssid
);
357 return virt_wifi_get_station(wiphy
, dev
, fake_router_bssid
, sinfo
);
360 static const struct cfg80211_ops virt_wifi_cfg80211_ops
= {
361 .scan
= virt_wifi_scan
,
363 .connect
= virt_wifi_connect
,
364 .disconnect
= virt_wifi_disconnect
,
366 .get_station
= virt_wifi_get_station
,
367 .dump_station
= virt_wifi_dump_station
,
370 /* Acquires and releases the rtnl lock. */
371 static struct wiphy
*virt_wifi_make_wiphy(void)
374 struct virt_wifi_wiphy_priv
*priv
;
377 wiphy
= wiphy_new(&virt_wifi_cfg80211_ops
, sizeof(*priv
));
382 wiphy
->max_scan_ssids
= 4;
383 wiphy
->max_scan_ie_len
= 1000;
384 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
386 wiphy
->bands
[NL80211_BAND_2GHZ
] = &band_2ghz
;
387 wiphy
->bands
[NL80211_BAND_5GHZ
] = &band_5ghz
;
388 wiphy
->bands
[NL80211_BAND_60GHZ
] = NULL
;
390 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
);
392 priv
= wiphy_priv(wiphy
);
393 priv
->being_deleted
= false;
394 priv
->scan_request
= NULL
;
395 INIT_DELAYED_WORK(&priv
->scan_result
, virt_wifi_scan_result
);
397 err
= wiphy_register(wiphy
);
406 /* Acquires and releases the rtnl lock. */
407 static void virt_wifi_destroy_wiphy(struct wiphy
*wiphy
)
409 struct virt_wifi_wiphy_priv
*priv
;
411 WARN(!wiphy
, "%s called with null wiphy", __func__
);
415 priv
= wiphy_priv(wiphy
);
416 priv
->being_deleted
= true;
417 virt_wifi_cancel_scan(wiphy
);
419 if (wiphy
->registered
)
420 wiphy_unregister(wiphy
);
424 /* Enters and exits a RCU-bh critical section. */
425 static netdev_tx_t
virt_wifi_start_xmit(struct sk_buff
*skb
,
426 struct net_device
*dev
)
428 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
431 if (!priv
->is_connected
) {
433 return NET_XMIT_DROP
;
436 skb
->dev
= priv
->lowerdev
;
437 return dev_queue_xmit(skb
);
440 /* Called with rtnl lock held. */
441 static int virt_wifi_net_device_open(struct net_device
*dev
)
443 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
449 /* Called with rtnl lock held. */
450 static int virt_wifi_net_device_stop(struct net_device
*dev
)
452 struct virt_wifi_netdev_priv
*n_priv
= netdev_priv(dev
);
454 n_priv
->is_up
= false;
456 if (!dev
->ieee80211_ptr
)
459 virt_wifi_cancel_scan(dev
->ieee80211_ptr
->wiphy
);
460 virt_wifi_cancel_connect(dev
);
461 netif_carrier_off(dev
);
466 static int virt_wifi_net_device_get_iflink(const struct net_device
*dev
)
468 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
470 return READ_ONCE(priv
->lowerdev
->ifindex
);
473 static const struct net_device_ops virt_wifi_ops
= {
474 .ndo_start_xmit
= virt_wifi_start_xmit
,
475 .ndo_open
= virt_wifi_net_device_open
,
476 .ndo_stop
= virt_wifi_net_device_stop
,
477 .ndo_get_iflink
= virt_wifi_net_device_get_iflink
,
480 /* Invoked as part of rtnl lock release. */
481 static void virt_wifi_net_device_destructor(struct net_device
*dev
)
483 /* Delayed past dellink to allow nl80211 to react to the device being
486 kfree(dev
->ieee80211_ptr
);
487 dev
->ieee80211_ptr
= NULL
;
490 /* No lock interaction. */
491 static void virt_wifi_setup(struct net_device
*dev
)
494 dev
->netdev_ops
= &virt_wifi_ops
;
495 dev
->needs_free_netdev
= true;
498 /* Called in a RCU read critical section from netif_receive_skb */
499 static rx_handler_result_t
virt_wifi_rx_handler(struct sk_buff
**pskb
)
501 struct sk_buff
*skb
= *pskb
;
502 struct virt_wifi_netdev_priv
*priv
=
503 rcu_dereference(skb
->dev
->rx_handler_data
);
505 if (!priv
->is_connected
)
506 return RX_HANDLER_PASS
;
508 /* GFP_ATOMIC because this is a packet interrupt handler. */
509 skb
= skb_share_check(skb
, GFP_ATOMIC
);
511 dev_err(&priv
->upperdev
->dev
, "can't skb_share_check\n");
512 return RX_HANDLER_CONSUMED
;
516 skb
->dev
= priv
->upperdev
;
517 skb
->pkt_type
= PACKET_HOST
;
518 return RX_HANDLER_ANOTHER
;
521 /* Called with rtnl lock held. */
522 static int virt_wifi_newlink(struct net
*src_net
, struct net_device
*dev
,
523 struct nlattr
*tb
[], struct nlattr
*data
[],
524 struct netlink_ext_ack
*extack
)
526 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
532 netif_carrier_off(dev
);
534 priv
->upperdev
= dev
;
535 priv
->lowerdev
= __dev_get_by_index(src_net
,
536 nla_get_u32(tb
[IFLA_LINK
]));
541 dev
->mtu
= priv
->lowerdev
->mtu
;
542 else if (dev
->mtu
> priv
->lowerdev
->mtu
)
545 err
= netdev_rx_handler_register(priv
->lowerdev
, virt_wifi_rx_handler
,
548 dev_err(&priv
->lowerdev
->dev
,
549 "can't netdev_rx_handler_register: %d\n", err
);
553 eth_hw_addr_inherit(dev
, priv
->lowerdev
);
554 netif_stacked_transfer_operstate(priv
->lowerdev
, dev
);
556 SET_NETDEV_DEV(dev
, &priv
->lowerdev
->dev
);
557 dev
->ieee80211_ptr
= kzalloc(sizeof(*dev
->ieee80211_ptr
), GFP_KERNEL
);
559 if (!dev
->ieee80211_ptr
) {
564 dev
->ieee80211_ptr
->iftype
= NL80211_IFTYPE_STATION
;
565 dev
->ieee80211_ptr
->wiphy
= common_wiphy
;
567 err
= register_netdevice(dev
);
569 dev_err(&priv
->lowerdev
->dev
, "can't register_netdevice: %d\n",
571 goto free_wireless_dev
;
574 err
= netdev_upper_dev_link(priv
->lowerdev
, dev
, extack
);
576 dev_err(&priv
->lowerdev
->dev
, "can't netdev_upper_dev_link: %d\n",
578 goto unregister_netdev
;
581 dev
->priv_destructor
= virt_wifi_net_device_destructor
;
582 priv
->being_deleted
= false;
583 priv
->is_connected
= false;
585 INIT_DELAYED_WORK(&priv
->connect
, virt_wifi_connect_complete
);
586 __module_get(THIS_MODULE
);
590 unregister_netdevice(dev
);
592 kfree(dev
->ieee80211_ptr
);
593 dev
->ieee80211_ptr
= NULL
;
595 netdev_rx_handler_unregister(priv
->lowerdev
);
600 /* Called with rtnl lock held. */
601 static void virt_wifi_dellink(struct net_device
*dev
,
602 struct list_head
*head
)
604 struct virt_wifi_netdev_priv
*priv
= netdev_priv(dev
);
606 if (dev
->ieee80211_ptr
)
607 virt_wifi_cancel_scan(dev
->ieee80211_ptr
->wiphy
);
609 priv
->being_deleted
= true;
610 virt_wifi_cancel_connect(dev
);
611 netif_carrier_off(dev
);
613 netdev_rx_handler_unregister(priv
->lowerdev
);
614 netdev_upper_dev_unlink(priv
->lowerdev
, dev
);
616 unregister_netdevice_queue(dev
, head
);
617 module_put(THIS_MODULE
);
619 /* Deleting the wiphy is handled in the module destructor. */
622 static struct rtnl_link_ops virt_wifi_link_ops
= {
624 .setup
= virt_wifi_setup
,
625 .newlink
= virt_wifi_newlink
,
626 .dellink
= virt_wifi_dellink
,
627 .priv_size
= sizeof(struct virt_wifi_netdev_priv
),
630 static bool netif_is_virt_wifi_dev(const struct net_device
*dev
)
632 return rcu_access_pointer(dev
->rx_handler
) == virt_wifi_rx_handler
;
635 static int virt_wifi_event(struct notifier_block
*this, unsigned long event
,
638 struct net_device
*lower_dev
= netdev_notifier_info_to_dev(ptr
);
639 struct virt_wifi_netdev_priv
*priv
;
640 struct net_device
*upper_dev
;
641 LIST_HEAD(list_kill
);
643 if (!netif_is_virt_wifi_dev(lower_dev
))
647 case NETDEV_UNREGISTER
:
648 priv
= rtnl_dereference(lower_dev
->rx_handler_data
);
652 upper_dev
= priv
->upperdev
;
654 upper_dev
->rtnl_link_ops
->dellink(upper_dev
, &list_kill
);
655 unregister_netdevice_many(&list_kill
);
662 static struct notifier_block virt_wifi_notifier
= {
663 .notifier_call
= virt_wifi_event
,
666 /* Acquires and releases the rtnl lock. */
667 static int __init
virt_wifi_init_module(void)
671 /* Guaranteed to be locally-administered and not multicast. */
672 eth_random_addr(fake_router_bssid
);
674 err
= register_netdevice_notifier(&virt_wifi_notifier
);
679 common_wiphy
= virt_wifi_make_wiphy();
683 err
= rtnl_link_register(&virt_wifi_link_ops
);
690 virt_wifi_destroy_wiphy(common_wiphy
);
692 unregister_netdevice_notifier(&virt_wifi_notifier
);
696 /* Acquires and releases the rtnl lock. */
697 static void __exit
virt_wifi_cleanup_module(void)
699 /* Will delete any devices that depend on the wiphy. */
700 rtnl_link_unregister(&virt_wifi_link_ops
);
701 virt_wifi_destroy_wiphy(common_wiphy
);
702 unregister_netdevice_notifier(&virt_wifi_notifier
);
705 module_init(virt_wifi_init_module
);
706 module_exit(virt_wifi_cleanup_module
);
708 MODULE_LICENSE("GPL v2");
709 MODULE_AUTHOR("Cody Schuffelen <schuffelen@google.com>");
710 MODULE_DESCRIPTION("Driver for a wireless wrapper of ethernet devices");
711 MODULE_ALIAS_RTNL_LINK("virt_wifi");