drivers/net/wireless/virtual/virt_wifi.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/virtual/virt_wifi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/virtual/virt_wifi.c- Extension
.c- Size
- 18824 bytes
- Lines
- 717
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
net/cfg80211.hnet/rtnetlink.hlinux/etherdevice.hlinux/math64.hlinux/module.h
Detected Declarations
struct virt_wifi_wiphy_privstruct virt_wifi_netdev_privfunction virt_wifi_inform_bssfunction virt_wifi_scanfunction virt_wifi_scan_resultfunction virt_wifi_cancel_scanfunction virt_wifi_connectfunction virt_wifi_connect_completefunction virt_wifi_cancel_connectfunction virt_wifi_disconnectfunction virt_wifi_get_stationfunction virt_wifi_dump_stationfunction virt_wifi_destroy_wiphyfunction virt_wifi_start_xmitfunction virt_wifi_net_device_openfunction virt_wifi_net_device_stopfunction virt_wifi_net_device_get_iflinkfunction virt_wifi_net_device_destructorfunction virt_wifi_setupfunction virt_wifi_rx_handlerfunction virt_wifi_newlinkfunction virt_wifi_dellinkfunction netif_is_virt_wifi_devfunction virt_wifi_eventfunction virt_wifi_init_modulefunction virt_wifi_cleanup_modulemodule init virt_wifi_init_module
Annotated Snippet
static const struct net_device_ops virt_wifi_ops = {
.ndo_start_xmit = virt_wifi_start_xmit,
.ndo_open = virt_wifi_net_device_open,
.ndo_stop = virt_wifi_net_device_stop,
.ndo_get_iflink = virt_wifi_net_device_get_iflink,
};
/* Invoked as part of rtnl lock release. */
static void virt_wifi_net_device_destructor(struct net_device *dev)
{
/* Delayed past dellink to allow nl80211 to react to the device being
* deleted.
*/
kfree(dev->ieee80211_ptr);
dev->ieee80211_ptr = NULL;
}
/* No lock interaction. */
static void virt_wifi_setup(struct net_device *dev)
{
ether_setup(dev);
dev->netdev_ops = &virt_wifi_ops;
dev->needs_free_netdev = true;
}
/* Called in a RCU read critical section from netif_receive_skb */
static rx_handler_result_t virt_wifi_rx_handler(struct sk_buff **pskb)
{
struct sk_buff *skb = *pskb;
struct virt_wifi_netdev_priv *priv =
rcu_dereference(skb->dev->rx_handler_data);
if (!priv->is_connected)
return RX_HANDLER_PASS;
/* GFP_ATOMIC because this is a packet interrupt handler. */
skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb) {
dev_err(&priv->upperdev->dev, "can't skb_share_check\n");
return RX_HANDLER_CONSUMED;
}
*pskb = skb;
skb->dev = priv->upperdev;
skb->pkt_type = PACKET_HOST;
return RX_HANDLER_ANOTHER;
}
/* Called with rtnl lock held. */
static int virt_wifi_newlink(struct net_device *dev,
struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack)
{
struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **tb = params->tb;
int err;
if (!tb[IFLA_LINK])
return -EINVAL;
netif_carrier_off(dev);
priv->upperdev = dev;
priv->lowerdev = __dev_get_by_index(link_net,
nla_get_u32(tb[IFLA_LINK]));
if (!priv->lowerdev)
return -ENODEV;
if (!tb[IFLA_MTU])
dev->mtu = priv->lowerdev->mtu;
else if (dev->mtu > priv->lowerdev->mtu)
return -EINVAL;
err = netdev_rx_handler_register(priv->lowerdev, virt_wifi_rx_handler,
priv);
if (err) {
dev_err(&priv->lowerdev->dev,
"can't netdev_rx_handler_register: %d\n", err);
return err;
}
eth_hw_addr_inherit(dev, priv->lowerdev);
netif_stacked_transfer_operstate(priv->lowerdev, dev);
dev->ieee80211_ptr = kzalloc_obj(*dev->ieee80211_ptr);
if (!dev->ieee80211_ptr) {
err = -ENOMEM;
goto remove_handler;
Annotation
- Immediate include surface: `net/cfg80211.h`, `net/rtnetlink.h`, `linux/etherdevice.h`, `linux/math64.h`, `linux/module.h`.
- Detected declarations: `struct virt_wifi_wiphy_priv`, `struct virt_wifi_netdev_priv`, `function virt_wifi_inform_bss`, `function virt_wifi_scan`, `function virt_wifi_scan_result`, `function virt_wifi_cancel_scan`, `function virt_wifi_connect`, `function virt_wifi_connect_complete`, `function virt_wifi_cancel_connect`, `function virt_wifi_disconnect`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: pattern implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.