| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/13 22:31 | flow | patch-triage |
6mArgs:null Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822BU",
"MAC80211",
"USB"
],
"FocusSymbols": [
"rtw_tx",
"rtw_tx_work",
"__rtw_tx_work"
],
"KMSANReasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB driver. It replaces a hardcoded queue selection with a conditional branch that checks `info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM`, where `info` is the mac80211 TX control block (`IEEE80211_SKB_CB(skb)`).\n\nWhile this introduces a new conditional branch based on a struct field, the `skb-\u003ecb` control block is guaranteed to be initialized. Network socket buffers (`struct sk_buff`) have their control block (`cb`) zeroed upon allocation in the core network stack (via `skbuff_clear()` in `__alloc_skb()`). Furthermore, the mac80211 subsystem explicitly clears or populates the `cb` fields when reusing or forwarding skbs (e.g., `memset(info, 0, sizeof(*info))`).\n\nTherefore, `info-\u003eflags` is fully initialized and does not pose an uninitialized memory risk. The patch fixes a functional/QoS bug regarding packet prioritization, rather than a memory safety issue. Standard KASAN and other bug detectors are sufficient for this code, and a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB wireless driver. This is a functional change in the packet transmission path that can be reached by sending packets over the mac80211 interface. The driver can be fuzzed using USB emulation (vhci).",
"WorthFuzzing": true
} |
| 1/1 | 2026/08/13 22:31 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit a1a92c7bc63c784f4cc3f6ba4db7353d831caa9b\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Aug 13 22:31:37 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c\nindex 64e1c3420e0a8..c0990c125b683 100644\n--- a/drivers/net/wireless/realtek/rtw88/usb.c\n+++ b/drivers/net/wireless/realtek/rtw88/usb.c\n@@ -559,6 +559,7 @@ static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n \n static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n {\n+\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\n \tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb-\u003edata;\n \t__le16 fc = hdr-\u003eframe_control;\n \tu8 qsel;\n@@ -567,7 +568,8 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n \t\tqsel = TX_DESC_QSEL_MGMT;\n \telse if (is_broadcast_ether_addr(hdr-\u003eaddr1) ||\n \t\t is_multicast_ether_addr(hdr-\u003eaddr1))\n-\t\tqsel = TX_DESC_QSEL_HIGH;\n+\t\tqsel = (info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM) ?\n+\t\t TX_DESC_QSEL_HIGH : skb-\u003epriority;\n \telse if (skb_get_queue_mapping(skb) \u003c= IEEE80211_AC_BK)\n \t\tqsel = skb-\u003epriority;\n \telse\n"
} |
| 2/1 | 2026/08/13 22:31 | agent | patch-evaluator |
3mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822BU",
"MAC80211",
"USB"
],
"FocusSymbols": [
"rtw_tx",
"rtw_tx_work",
"__rtw_tx_work"
],
"Reasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB wireless driver. This is a functional change in the packet transmission path that can be reached by sending packets over the mac80211 interface. The driver can be fuzzed using USB emulation (vhci).",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit a1a92c7bc63c784f4cc3f6ba4db7353d831caa9b
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Aug 13 22:31:37 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index 64e1c3420e0a8..c0990c125b683 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -559,6 +559,7 @@ static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)
{
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
__le16 fc = hdr->frame_control;
u8 qsel;
@@ -567,7 +568,8 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)
qsel = TX_DESC_QSEL_MGMT;
else if (is_broadcast_ether_addr(hdr->addr1) ||
is_multicast_ether_addr(hdr->addr1))
- qsel = TX_DESC_QSEL_HIGH;
+ qsel = (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) ?
+ TX_DESC_QSEL_HIGH : skb->priority;
else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK)
qsel = skb->priority;
else
|
| 3/2 | 2026/08/13 22:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2271 output: 52 thoughts: 191 Thoughts: **Analyzing a Realtek Wireless Driver Patch for Fuzzing Potential** Okay, so I've got this patch in `drivers/net/wireless/realtek/rtw88/usb.c`. It looks like it's tweaking the `rtw_usb_tx_queue_mapping_to_qsel` function, using `IEEE80211_SKB_CB(skb)` and checking for `IEEE80211_TX_CTL_SEND_AFTER_DTIM` on broadcast/multicast packets to figure out the right `qsel`. Interesting. Now, my initial thought is, can we fuzz this? `rtw88` is a Realtek 802.11ac wireless network adapter driver, and from what I know, it's a USB driver. USB drivers, in general, are good targets for fuzzing using methods like USB gadget emulation or the virtual HCD (vhci) setup. I need to confirm this assumption. First, I need to know where `rtw_usb_tx_queue_mapping_to_qsel` is being called from. That's the key to understanding the context of this patch and determining if it's a good candidate for fuzzing. If it's handling a critical part of the data flow, then we can likely craft some good fuzz cases. |
| 4/2 | 2026/08/13 22:31 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_tx_queue_mapping_to_qsel",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/usb.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/usb.c=550=static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-559-\ndrivers/net/wireless/realtek/rtw88/usb.c:560:static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\ndrivers/net/wireless/realtek/rtw88/usb.c-561-{\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=581=static int rtw_usb_tx_write(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-590-\ndrivers/net/wireless/realtek/rtw88/usb.c:591:\tpkt_info-\u003eqsel = rtw_usb_tx_queue_mapping_to_qsel(skb);\ndrivers/net/wireless/realtek/rtw88/usb.c-592-\tpkt_desc = skb_push(skb, chip-\u003etx_pkt_desc_sz);\n"
} |
| 5/2 | 2026/08/13 22:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3140 output: 45 thoughts: 48 Thoughts: Here's my take on the thought process, as if it were my own: **Investigating the Data Transmission Path** Okay, so I'm looking at `rtw_usb_tx_write` and I see that it calls `rtw_usb_tx_queue_mapping_to_qsel`. My immediate thought is, "Right, I need to understand how this function fits into the overall data transmission process." To do that, I need to trace back from `rtw_usb_tx_write`. I need to figure out the calling context - where is this thing actually being *used*? Understanding the upstream call hierarchy is critical to grasping its function and potential bottlenecks. Let's see where that `rtw_usb_tx_write` is being called from. I'll need to dig through the code to find out. |
| 6/2 | 2026/08/13 22:31 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/usb.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/usb.c=560=static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-580-\ndrivers/net/wireless/realtek/rtw88/usb.c:581:static int rtw_usb_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/usb.c-582-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=953=static const struct rtw_hci_ops rtw_usb_ops = {\ndrivers/net/wireless/realtek/rtw88/usb.c:954:\t.tx_write = rtw_usb_tx_write,\ndrivers/net/wireless/realtek/rtw88/usb.c-955-\t.tx_kick_off = rtw_usb_tx_kick_off,\n"
} |
| 7/2 | 2026/08/13 22:31 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3705 output: 38 thoughts: 30 Thoughts: Okay, here's my take on those thoughts, framed as my own: **Investigating the rtw_hci_ops Relationship** Right, so I'm digging into something that's connected to `rtw_hci_ops`. I need to figure out how this is all wired up. My next step is clear – I have to see which specific configuration options trigger the compilation of `rtw88/usb.c`. Understanding that connection is key to properly diagnose whatever's happening with the broader module. I need to trace the dependencies to see what triggers it. |
| 8/2 | 2026/08/13 22:32 | tool | grepper |
0mArgs:{
"Expression": "usb\\.o",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/Makefile"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Makefile=110=rtw88_sdio-objs\t\t\t:= sdio.o\ndrivers/net/wireless/realtek/rtw88/Makefile-111-\ndrivers/net/wireless/realtek/rtw88/Makefile:112:obj-$(CONFIG_RTW88_USB)\t\t+= rtw88_usb.o\ndrivers/net/wireless/realtek/rtw88/Makefile:113:rtw88_usb-objs\t\t\t:= usb.o\n"
} |
| 9/2 | 2026/08/13 22:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4041 output: 43 thoughts: 45 Thoughts: Okay, here's my take on those thoughts, framed as my own: **Investigating the RTW88 USB Configuration** Right, so we're dealing with `CONFIG_RTW88_USB`. The immediate question is always, "Where's the definition?" My instinct is to head straight to the source, so I'm thinking I need to find the relevant Kconfig file. Based on the name, I'm pretty sure it's buried in the `drivers/net/wireless/realtek/rtw88/` directory structure. Specifically, I'm betting that `drivers/net/wireless/realtek/rtw88/Kconfig` is the likely place to find what I need and I know I'm looking for the symbol `RTW88_USB` within that file. Let's get to it. |
| 10/2 | 2026/08/13 22:32 | tool | grepper |
0mArgs:{
"Expression": "config RTW88_USB",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/Kconfig"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Kconfig=20=config RTW88_SDIO\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-22-\ndrivers/net/wireless/realtek/rtw88/Kconfig:23:config RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-24-\ttristate\n"
} |
| 11/2 | 2026/08/13 22:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4430 output: 43 thoughts: 21 Thoughts: Here's my summary, as though I'm thinking through this process: **Diving into the Dependencies of `RTW88_USB`** Okay, time to get a handle on this `RTW88_USB` module. I need to understand its place within the broader system. The question is, what other components are directly dependent on it, and conversely, what does *it* rely on? I'll need to trace its dependencies, both upstream and downstream. This is critical for understanding the potential impact of any changes I make to it, or if it has any problems. I need to know where to start looking, and if I need to update any other modules as a result of any changes. This dependency analysis is crucial for ensuring stability and preventing regressions. Let's see how deep this rabbit hole goes. |
| 12/2 | 2026/08/13 22:32 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/Kconfig",
"FirstLine": 1,
"LineCount": 100
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\tmenuconfig RTW88\n 3:\t\ttristate \"Realtek 802.11ac wireless chips support\"\n 4:\t\tdepends on MAC80211\n 5:\t\thelp\n 6:\t\t This module adds support for mac80211-based wireless drivers that\n 7:\t\t enables Realtek IEEE 802.11ac wireless chipsets.\n 8:\t\n 9:\t\t If you choose to build a module, it'll be called rtw88.\n 10:\t\n 11:\tif RTW88\n 12:\t\n 13:\tconfig RTW88_CORE\n 14:\t\ttristate\n 15:\t\tselect WANT_DEV_COREDUMP\n 16:\t\n 17:\tconfig RTW88_PCI\n 18:\t\ttristate\n 19:\t\n 20:\tconfig RTW88_SDIO\n 21:\t\ttristate\n 22:\t\n 23:\tconfig RTW88_USB\n 24:\t\ttristate\n 25:\t\n 26:\tconfig RTW88_8822B\n 27:\t\ttristate\n 28:\t\n 29:\tconfig RTW88_8822C\n 30:\t\ttristate\n 31:\t\n 32:\tconfig RTW88_8723X\n 33:\t\ttristate\n 34:\t\n 35:\tconfig RTW88_8703B\n 36:\t\ttristate\n 37:\t\tselect RTW88_8723X\n 38:\t\n 39:\tconfig RTW88_8723D\n 40:\t\ttristate\n 41:\t\tselect RTW88_8723X\n 42:\t\n 43:\tconfig RTW88_8821C\n 44:\t\ttristate\n 45:\t\n 46:\tconfig RTW88_88XXA\n 47:\t\ttristate\n 48:\t\n 49:\tconfig RTW88_8821A\n 50:\t\ttristate\n 51:\t\tselect RTW88_88XXA\n 52:\t\n 53:\tconfig RTW88_8812A\n 54:\t\ttristate\n 55:\t\tselect RTW88_88XXA\n 56:\t\n 57:\tconfig RTW88_8814A\n 58:\t\ttristate\n 59:\t\n 60:\tconfig RTW88_8822BE\n 61:\t\ttristate \"Realtek 8822BE PCI wireless network adapter\"\n 62:\t\tdepends on PCI\n 63:\t\tselect RTW88_CORE\n 64:\t\tselect RTW88_PCI\n 65:\t\tselect RTW88_8822B\n 66:\t\thelp\n 67:\t\t Select this option will enable support for 8822BE chipset\n 68:\t\n 69:\t\t 802.11ac PCIe wireless network adapter\n 70:\t\n 71:\tconfig RTW88_8822BS\n 72:\t\ttristate \"Realtek 8822BS SDIO wireless network adapter\"\n 73:\t\tdepends on MMC\n 74:\t\tselect RTW88_CORE\n 75:\t\tselect RTW88_SDIO\n 76:\t\tselect RTW88_8822B\n 77:\t\thelp\n 78:\t\t Select this option will enable support for 8822BS chipset\n 79:\t\n 80:\t\t 802.11ac SDIO wireless network adapter\n 81:\t\n 82:\tconfig RTW88_8822BU\n 83:\t\ttristate \"Realtek 8822BU USB wireless network adapter\"\n 84:\t\tdepends on USB\n 85:\t\tselect RTW88_CORE\n 86:\t\tselect RTW88_USB\n 87:\t\tselect RTW88_8822B\n 88:\t\thelp\n 89:\t\t Select this option will enable support for 8822BU chipset\n 90:\t\n 91:\t\t 802.11ac USB wireless network adapter\n 92:\t\n 93:\tconfig RTW88_8822CE\n 94:\t\ttristate \"Realtek 8822CE PCI wireless network adapter\"\n 95:\t\tdepends on PCI\n 96:\t\tselect RTW88_CORE\n 97:\t\tselect RTW88_PCI\n 98:\t\tselect RTW88_8822C\n 99:\t\thelp\n 100:\t\t Select this option will enable support for 8822CE chipset\n"
} |
| 13/2 | 2026/08/13 22:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5936 output: 43 thoughts: 46 Thoughts: Okay, here's my interpretation of that thought process, as if it were my own: **Investigating USB Adapter Selection** Alright, it looks like `RTW88_8822BU` has triggered a selection of `RTW88_USB`. That's a reasonable starting point, but I know there are likely several other USB adapters this system might be dealing with. I need to be thorough. My next step is going to be a targeted search to confirm this specific selection process. Let's look for instances of "select RTW88_USB" within the relevant code or documentation. That should give me a clearer picture of how this adapter is being chosen and if there are any related conditional statements or alternative selections to consider. |
| 14/2 | 2026/08/13 22:32 | tool | grepper |
0mArgs:{
"Expression": "select RTW88_USB",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/Kconfig"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Kconfig=82=config RTW88_8822BU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-85-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:86:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-87-\tselect RTW88_8822B\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=115=config RTW88_8822CU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-118-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:119:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-120-\tselect RTW88_8822C\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=162=config RTW88_8723DU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-165-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:166:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-167-\tselect RTW88_8723D\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=195=config RTW88_8821CU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-198-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:199:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-200-\tselect RTW88_8821C\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=206=config RTW88_8821AU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-209-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:210:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-211-\tselect RTW88_8821A\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=217=config RTW88_8812AU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-220-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:221:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-222-\tselect RTW88_8812A\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=239=config RTW88_8814AU\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-242-\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:243:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-244-\tselect RTW88_8814A\n"
} |
| 15/2 | 2026/08/13 22:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7106 output: 38 thoughts: 249 Thoughts: **My Analysis of the Driver Enablement** Okay, so we're looking at enabling a specific set of Realtek WiFi drivers. The decision boils down to choosing between a few options: `RTW88_8822BU`, `RTW88_8822CU`, `RTW88_8723DU`, `RTW88_8821CU`, `RTW88_8821AU`, `RTW88_8812AU`, or `RTW88_8814AU`. For now, I'll go with `RTW88_8822BU` as the starting point. I know this is going to depend on the `USB` and `MAC80211` subsystems within the `RTW88` framework. This means I'll need to ensure those are present and functional. So, let's keep track of those dependencies: `RTW88`, `RTW88_8822BU`, `MAC80211`, `USB`. Now, digging deeper, the patch alters the `rtw_usb_tx_queue_mapping_to_qsel` function. This function is called from `rtw_usb_tx_write`, which is interesting. Remembering my structure knowledge, I see that `rtw_usb_tx_write` is the `.tx_write` callback function within the `rtw_hci_ops rtw_usb_ops` structure. My next step will be to quickly trace where `tx_write` is being called. That should give me a better understanding of the data flow and how this patch actually impacts the overall data transmission process. |
| 16/2 | 2026/08/13 22:32 | tool | grepper |
0mArgs:{
"Expression": "\\.tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/pci.c=1605=static const struct rtw_hci_ops rtw_pci_ops = {\ndrivers/net/wireless/realtek/rtw88/pci.c:1606:\t.tx_write = rtw_pci_tx_write,\ndrivers/net/wireless/realtek/rtw88/pci.c-1607-\t.tx_kick_off = rtw_pci_tx_kick_off,\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c=1170=static const struct rtw_hci_ops rtw_sdio_ops = {\ndrivers/net/wireless/realtek/rtw88/sdio.c:1171:\t.tx_write = rtw_sdio_tx_write,\ndrivers/net/wireless/realtek/rtw88/sdio.c-1172-\t.tx_kick_off = rtw_sdio_tx_kick_off,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=953=static const struct rtw_hci_ops rtw_usb_ops = {\ndrivers/net/wireless/realtek/rtw88/usb.c:954:\t.tx_write = rtw_usb_tx_write,\ndrivers/net/wireless/realtek/rtw88/usb.c-955-\t.tx_kick_off = rtw_usb_tx_kick_off,\n"
} |
| 17/2 | 2026/08/13 22:32 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8157 output: 38 thoughts: 16 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Tracing the `tx_write` Calls** Okay, first things first, I need to understand the call graph for `tx_write`. This isn't just about a cursory glance; I need the full picture of where this function is being invoked. I'm thinking I'll need to use my preferred static analysis tools or possibly even a dynamic instrumentation approach if the static analysis proves insufficient, depending on the complexity of the codebase and any compile-time optimizations that might be obscuring the actual call sites. I need to know the potential entry points and all the paths that could lead to `tx_write` being executed. This includes handling any conditional logic, preprocessor directives, or potential function pointers that could indirect the calls. I'm especially keen to avoid any blind spots, since any incomplete picture will result in flawed data in this analysis. |
| 18/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "-\u003etx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/hci.h=36=static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/hci.h-39-{\ndrivers/net/wireless/realtek/rtw88/hci.h:40:\treturn rtwdev-\u003ehci.ops-\u003etx_write(rtwdev, pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/hci.h-41-}\n"
} |
| 19/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8553 output: 42 thoughts: 18 Thoughts: Here's my thought process, as if I were analyzing that code: **Analyzing the Callers of `rtw_hci_tx_write`** Okay, so I need to understand where this `rtw_hci_tx_write` function is being invoked. That's the key to figuring out its role in the larger system. I need to trace its usage to understand the context in which it's operating. This will provide valuable insight into how data is being transmitted, and to what. Let's start by finding all the places in the codebase where it is called and then consider the implications of each call site. My experience tells me that by examining its callers, I will rapidly establish an accurate understanding of the role it plays within the greater architecture. |
| 20/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "rtw_hci_tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/hci.h=9=struct rtw_hci_ops {\n--\ndrivers/net/wireless/realtek/rtw88/hci.h-35-\ndrivers/net/wireless/realtek/rtw88/hci.h:36:static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/hci.h-37-\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=554=void rtw_tx(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-561-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, control-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:562:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-563-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=608=static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-618-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, txq-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:619:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-620-\tif (ret) {\n"
} |
| 21/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9268 output: 41 thoughts: 177 Thoughts: **My Initial Assessment of the USB Wireless Adapter TX Path** Alright, let's break this down. From what I'm seeing, a packet transmission on this USB wireless adapter appears to flow through a specific sequence: `rtw_tx` and `rtw_txq_push_skb` eventually end up calling `rtw_hci_tx_write`, which in turn calls `rtw_usb_tx_write`, which finally calls `rtw_usb_tx_queue_mapping_to_qsel`. Seems pretty standard, so far. Based on the call stack, those last three functions, especially `rtw_usb_tx_write`, are going to be key to examining the data path. I need to keep an eye on how these function calls manage the data packets on the USB interface. That's where I need to focus my energy. Since `rtw_usb_tx_write` is static, my initial thought is that it could introduce some complications, but I need to dive deeper into `rtw_tx` since that one is not static. Let's see what that reveals. |
| 22/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "rtw_tx",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/tx.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=11=static\ndrivers/net/wireless/realtek/rtw88/tx.c:12:void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,\ndrivers/net/wireless/realtek/rtw88/tx.c-13-\t\t struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-34-\ndrivers/net/wireless/realtek/rtw88/tx.c:35:void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:36:\t\t\t struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)\ndrivers/net/wireless/realtek/rtw88/tx.c-37-{\ndrivers/net/wireless/realtek/rtw88/tx.c:38:\tstruct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb-\u003edata;\ndrivers/net/wireless/realtek/rtw88/tx.c-39-\tbool more_data = false;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-93-}\ndrivers/net/wireless/realtek/rtw88/tx.c:94:EXPORT_SYMBOL(rtw_tx_fill_tx_desc);\ndrivers/net/wireless/realtek/rtw88/tx.c-95-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=125=static u8 get_highest_vht_tx_rate(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-165-\ndrivers/net/wireless/realtek/rtw88/tx.c:166:static void rtw_tx_report_enable(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:167:\t\t\t\t struct rtw_tx_pkt_info *pkt_info)\ndrivers/net/wireless/realtek/rtw88/tx.c-168-{\ndrivers/net/wireless/realtek/rtw88/tx.c:169:\tstruct rtw_tx_report *tx_report = \u0026rtwdev-\u003etx_report;\ndrivers/net/wireless/realtek/rtw88/tx.c-170-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-178-\ndrivers/net/wireless/realtek/rtw88/tx.c:179:void rtw_tx_report_purge_timer(struct timer_list *t)\ndrivers/net/wireless/realtek/rtw88/tx.c-180-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-182-\t\t\t\t\t\t tx_report.purge_timer);\ndrivers/net/wireless/realtek/rtw88/tx.c:183:\tstruct rtw_tx_report *tx_report = \u0026rtwdev-\u003etx_report;\ndrivers/net/wireless/realtek/rtw88/tx.c-184-\tunsigned long flags;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-195-\ndrivers/net/wireless/realtek/rtw88/tx.c:196:void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn)\ndrivers/net/wireless/realtek/rtw88/tx.c-197-{\ndrivers/net/wireless/realtek/rtw88/tx.c:198:\tstruct rtw_tx_report *tx_report = \u0026rtwdev-\u003etx_report;\ndrivers/net/wireless/realtek/rtw88/tx.c-199-\tunsigned long timeout = RTW_TX_PROBE_TIMEOUT;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-216-}\ndrivers/net/wireless/realtek/rtw88/tx.c:217:EXPORT_SYMBOL(rtw_tx_report_enqueue);\ndrivers/net/wireless/realtek/rtw88/tx.c-218-\ndrivers/net/wireless/realtek/rtw88/tx.c:219:static void rtw_tx_report_tx_status(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-220-\t\t\t\t struct sk_buff *skb, bool acked)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-233-\ndrivers/net/wireless/realtek/rtw88/tx.c:234:void rtw_tx_report_handle(struct rtw_dev *rtwdev, struct sk_buff *skb, int src)\ndrivers/net/wireless/realtek/rtw88/tx.c-235-{\ndrivers/net/wireless/realtek/rtw88/tx.c:236:\tstruct rtw_tx_report *tx_report = \u0026rtwdev-\u003etx_report;\ndrivers/net/wireless/realtek/rtw88/tx.c-237-\tstruct rtw_c2h_cmd *c2h;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-257-\t\t\t__skb_unlink(cur, \u0026tx_report-\u003equeue);\ndrivers/net/wireless/realtek/rtw88/tx.c:258:\t\t\trtw_tx_report_tx_status(rtwdev, cur, st == 0);\ndrivers/net/wireless/realtek/rtw88/tx.c-259-\t\t\tbreak;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=265=static u8 rtw_get_mgmt_rate(struct rtw_dev *rtwdev, struct sk_buff *skb,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-277-\ndrivers/net/wireless/realtek/rtw88/tx.c:278:static void rtw_tx_pkt_info_update_rate(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:279:\t\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-280-\t\t\t\t\tstruct sk_buff *skb,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-296-\ndrivers/net/wireless/realtek/rtw88/tx.c:297:static void rtw_tx_pkt_info_update_sec(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:298:\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-299-\t\t\t\t struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-323-\ndrivers/net/wireless/realtek/rtw88/tx.c:324:static void rtw_tx_mgmt_pkt_info_update(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:325:\t\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-326-\t\t\t\t\tstruct ieee80211_sta *sta,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-328-{\ndrivers/net/wireless/realtek/rtw88/tx.c:329:\trtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb, false);\ndrivers/net/wireless/realtek/rtw88/tx.c-330-\tpkt_info-\u003edis_qselseq = true;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-335-\ndrivers/net/wireless/realtek/rtw88/tx.c:336:static void rtw_tx_data_pkt_info_update(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:337:\t\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-338-\t\t\t\t\tstruct ieee80211_sta *sta,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-406-\ndrivers/net/wireless/realtek/rtw88/tx.c:407:void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:408:\t\t\t struct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-409-\t\t\t struct ieee80211_sta *sta,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-429-\tif (ieee80211_is_mgmt(fc) || ieee80211_is_any_nullfunc(fc))\ndrivers/net/wireless/realtek/rtw88/tx.c:430:\t\trtw_tx_mgmt_pkt_info_update(rtwdev, pkt_info, sta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-431-\telse if (ieee80211_is_data(fc))\ndrivers/net/wireless/realtek/rtw88/tx.c:432:\t\trtw_tx_data_pkt_info_update(rtwdev, pkt_info, sta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-433-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-437-\tif (info-\u003eflags \u0026 IEEE80211_TX_CTL_REQ_TX_STATUS)\ndrivers/net/wireless/realtek/rtw88/tx.c:438:\t\trtw_tx_report_enable(rtwdev, pkt_info);\ndrivers/net/wireless/realtek/rtw88/tx.c-439-\ndrivers/net/wireless/realtek/rtw88/tx.c-440-\tpkt_info-\u003ebmc = bmc;\ndrivers/net/wireless/realtek/rtw88/tx.c:441:\trtw_tx_pkt_info_update_sec(rtwdev, pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-442-\tpkt_info-\u003etx_pkt_size = skb-\u003elen;\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-447-\t/* maybe merge with tx status ? */\ndrivers/net/wireless/realtek/rtw88/tx.c:448:\trtw_tx_stats(rtwdev, vif, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-449-}\ndrivers/net/wireless/realtek/rtw88/tx.c-450-\ndrivers/net/wireless/realtek/rtw88/tx.c:451:void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:452:\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-453-\t\t\t\t struct sk_buff *skb,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-465-\ndrivers/net/wireless/realtek/rtw88/tx.c:466:\trtw_tx_pkt_info_update_rate(rtwdev, pkt_info, skb, true);\ndrivers/net/wireless/realtek/rtw88/tx.c-467-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-496-\ndrivers/net/wireless/realtek/rtw88/tx.c:497:\trtw_tx_pkt_info_update_sec(rtwdev, pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-498-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=502=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.c:503:rtw_tx_write_data_rsvd_page_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:504:\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-505-\t\t\t\tu8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-521-\tskb_put_data(skb, buf, size);\ndrivers/net/wireless/realtek/rtw88/tx.c:522:\trtw_tx_rsvd_page_pkt_info_update(rtwdev, pkt_info, skb, RSVD_BEACON);\ndrivers/net/wireless/realtek/rtw88/tx.c-523-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-525-}\ndrivers/net/wireless/realtek/rtw88/tx.c:526:EXPORT_SYMBOL(rtw_tx_write_data_rsvd_page_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-527-\ndrivers/net/wireless/realtek/rtw88/tx.c=528=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.c:529:rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:530:\t\t\t struct rtw_tx_pkt_info *pkt_info,\ndrivers/net/wireless/realtek/rtw88/tx.c-531-\t\t\t u8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-551-}\ndrivers/net/wireless/realtek/rtw88/tx.c:552:EXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-553-\ndrivers/net/wireless/realtek/rtw88/tx.c:554:void rtw_tx(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-555-\t struct ieee80211_tx_control *control,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-557-{\ndrivers/net/wireless/realtek/rtw88/tx.c:558:\tstruct rtw_tx_pkt_info pkt_info = {0};\ndrivers/net/wireless/realtek/rtw88/tx.c-559-\tint ret;\ndrivers/net/wireless/realtek/rtw88/tx.c-560-\ndrivers/net/wireless/realtek/rtw88/tx.c:561:\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, control-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-562-\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-575-\ndrivers/net/wireless/realtek/rtw88/tx.c:576:static void rtw_txq_check_agg(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:577:\t\t\t struct rtw_txq *rtwtxq,\ndrivers/net/wireless/realtek/rtw88/tx.c-578-\t\t\t struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-607-\ndrivers/net/wireless/realtek/rtw88/tx.c:608:static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:609:\t\t\t struct rtw_txq *rtwtxq,\ndrivers/net/wireless/realtek/rtw88/tx.c-610-\t\t\t struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-612-\tstruct ieee80211_txq *txq = rtwtxq_to_txq(rtwtxq);\ndrivers/net/wireless/realtek/rtw88/tx.c:613:\tstruct rtw_tx_pkt_info pkt_info = {0};\ndrivers/net/wireless/realtek/rtw88/tx.c-614-\tint ret;\ndrivers/net/wireless/realtek/rtw88/tx.c-615-\ndrivers/net/wireless/realtek/rtw88/tx.c:616:\trtw_txq_check_agg(rtwdev, rtwtxq, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-617-\ndrivers/net/wireless/realtek/rtw88/tx.c:618:\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, txq-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-619-\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-627-\ndrivers/net/wireless/realtek/rtw88/tx.c:628:static void rtw_txq_push(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c:629:\t\t\t struct rtw_txq *rtwtxq,\ndrivers/net/wireless/realtek/rtw88/tx.c-630-\t\t\t unsigned long frames)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-643-\ndrivers/net/wireless/realtek/rtw88/tx.c:644:\t\tret = rtw_txq_push_skb(rtwdev, rtwtxq, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-645-\t\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-653-\ndrivers/net/wireless/realtek/rtw88/tx.c:654:void __rtw_tx_work(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/tx.c-655-{\ndrivers/net/wireless/realtek/rtw88/tx.c:656:\tstruct rtw_txq *rtwtxq, *tmp;\ndrivers/net/wireless/realtek/rtw88/tx.c-657-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-664-\t\tieee80211_txq_get_depth(txq, \u0026frame_cnt, NULL);\ndrivers/net/wireless/realtek/rtw88/tx.c:665:\t\trtw_txq_push(rtwdev, rtwtxq, frame_cnt);\ndrivers/net/wireless/realtek/rtw88/tx.c-666-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-674-\ndrivers/net/wireless/realtek/rtw88/tx.c:675:void rtw_tx_work(struct work_struct *w)\ndrivers/net/wireless/realtek/rtw88/tx.c-676-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-678-\ndrivers/net/wireless/realtek/rtw88/tx.c:679:\t__rtw_tx_work(rtwdev);\ndrivers/net/wireless/realtek/rtw88/tx.c-680-}\ndrivers/net/wireless/realtek/rtw88/tx.c-681-\ndrivers/net/wireless/realtek/rtw88/tx.c:682:void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq)\ndrivers/net/wireless/realtek/rtw88/tx.c-683-{\ndrivers/net/wireless/realtek/rtw88/tx.c:684:\tstruct rtw_txq *rtwtxq;\ndrivers/net/wireless/realtek/rtw88/tx.c-685-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-688-\ndrivers/net/wireless/realtek/rtw88/tx.c:689:\trtwtxq = (struct rtw_txq *)txq-\u003edrv_priv;\ndrivers/net/wireless/realtek/rtw88/tx.c-690-\tINIT_LIST_HEAD(\u0026rtwtxq-\u003elist);\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-692-\ndrivers/net/wireless/realtek/rtw88/tx.c:693:void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq)\ndrivers/net/wireless/realtek/rtw88/tx.c-694-{\ndrivers/net/wireless/realtek/rtw88/tx.c:695:\tstruct rtw_txq *rtwtxq;\ndrivers/net/wireless/realtek/rtw88/tx.c-696-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-699-\ndrivers/net/wireless/realtek/rtw88/tx.c:700:\trtwtxq = (struct rtw_txq *)txq-\u003edrv_priv;\ndrivers/net/wireless/realtek/rtw88/tx.c-701-\tspin_lock_bh(\u0026rtwdev-\u003etxq_lock);\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-706-\ndrivers/net/wireless/realtek/rtw88/tx.c:707:static const enum rtw_tx_queue_type ac_to_hwq[] = {\ndrivers/net/wireless/realtek/rtw88/tx.c-708-\t[IEEE80211_AC_VO] = RTW_TX_QUEUE_VO,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=714=static_assert(ARRAY_SIZE(ac_to_hwq) == IEEE80211_NUM_ACS);\ndrivers/net/wireless/realtek/rtw88/tx.c-715-\ndrivers/net/wireless/realtek/rtw88/tx.c:716:enum rtw_tx_queue_type rtw_tx_ac_to_hwq(enum ieee80211_ac_numbers ac)\ndrivers/net/wireless/realtek/rtw88/tx.c-717-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-722-}\ndrivers/net/wireless/realtek/rtw88/tx.c:723:EXPORT_SYMBOL(rtw_tx_ac_to_hwq);\ndrivers/net/wireless/realtek/rtw88/tx.c-724-\ndrivers/net/wireless/realtek/rtw88/tx.c:725:enum rtw_tx_queue_type rtw_tx_queue_mapping(struct sk_buff *skb)\ndrivers/net/wireless/realtek/rtw88/tx.c-726-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-729-\tu8 q_mapping = skb_get_queue_mapping(skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:730:\tenum rtw_tx_queue_type queue;\ndrivers/net/wireless/realtek/rtw88/tx.c-731-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-745-}\ndrivers/net/wireless/realtek/rtw88/tx.c:746:EXPORT_SYMBOL(rtw_tx_queue_mapping);\n"
} |
| 23/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 16331 output: 46 thoughts: 45 Thoughts: Okay, here's my interpretation of that thought process, tailored for an expert audience: **Investigating the rtw_tx Export** Right, so `rtw_tx` is an exported symbol. That immediately flags a specific area for scrutiny. Given the name, my first thought is to dive straight into its implementation within the Realtek wireless driver, specifically within the mac80211 integration. Let's see what `drivers/net/wireless/realtek/rtw88/mac80211.c` reveals about its functionality and usage. This likely involves understanding the transmit path within that driver's context, looking for critical points where this symbol is utilized for data transmission or related operations. Let's dig in and find out what's going on. |
| 24/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "rtw_tx",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/mac80211.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/mac80211.c=18=static void rtw_ops_tx(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-28-\ndrivers/net/wireless/realtek/rtw88/mac80211.c:29:\trtw_tx(rtwdev, control, skb);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-30-}\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c=32=static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-35-\tstruct rtw_dev *rtwdev = hw-\u003epriv;\ndrivers/net/wireless/realtek/rtw88/mac80211.c:36:\tstruct rtw_txq *rtwtxq = (struct rtw_txq *)txq-\u003edrv_priv;\ndrivers/net/wireless/realtek/rtw88/mac80211.c-37-\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-47-\tif (txq-\u003eac == IEEE80211_AC_VO)\ndrivers/net/wireless/realtek/rtw88/mac80211.c:48:\t\t__rtw_tx_work(rtwdev);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-49-\telse\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c=146=static int rtw_ops_add_interface(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-164-\tmemset(\u0026rtwvif-\u003ebfee, 0, sizeof(struct rtw_bfee));\ndrivers/net/wireless/realtek/rtw88/mac80211.c:165:\trtw_txq_init(rtwdev, vif-\u003etxq);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-166-\tINIT_LIST_HEAD(\u0026rtwvif-\u003ersvd_page_list);\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c=228=static void rtw_ops_remove_interface(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-241-\ndrivers/net/wireless/realtek/rtw88/mac80211.c:242:\trtw_txq_cleanup(rtwdev, vif-\u003etxq);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-243-\trtw_remove_rsvd_page(rtwdev, rtwvif);\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c=636=static int rtw_ops_ampdu_action(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-642-\tstruct ieee80211_txq *txq = sta-\u003etxq[tid];\ndrivers/net/wireless/realtek/rtw88/mac80211.c:643:\tstruct rtw_txq *rtwtxq = (struct rtw_txq *)txq-\u003edrv_priv;\ndrivers/net/wireless/realtek/rtw88/mac80211.c-644-\n"
} |
| 25/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 17615 output: 48 thoughts: 170 Thoughts: **Analyzing the Wireless Transmission Path** Okay, so I'm tracing the data transmission process here, and it looks like `rtw_ops_tx` initiates things, calling `rtw_tx` down the line. I'm also seeing `rtw_ops_wake_tx_queue` as a key function that calls `__rtw_tx_work`, which eventually feeds into `rtw_txq_push` and then `rtw_txq_push_skb`. So the core symbols to focus on here are definitely `rtw_ops_tx`, `rtw_tx`, `rtw_txq_push_skb`, and `rtw_ops_wake_tx_queue`. Now, something's pinging in the back of my mind... are those `rtw_ops_tx` and `rtw_ops_wake_tx_queue` functions actually *static* within `mac80211.c`? They sure look like they are. If that's the case, then are these functions assigned to the `ieee80211_ops` structure? I need to verify that, because that would tell me how they are getting invoked in the wider mac80211 context. Let's check that. |
| 26/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "rtw_ops_tx",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/mac80211.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/mac80211.c-17-\ndrivers/net/wireless/realtek/rtw88/mac80211.c:18:static void rtw_ops_tx(struct ieee80211_hw *hw,\ndrivers/net/wireless/realtek/rtw88/mac80211.c-19-\t\t struct ieee80211_tx_control *control,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c=953=const struct ieee80211_ops rtw_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-957-\t.switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx,\ndrivers/net/wireless/realtek/rtw88/mac80211.c:958:\t.tx\t\t\t= rtw_ops_tx,\ndrivers/net/wireless/realtek/rtw88/mac80211.c-959-\t.wake_tx_queue\t\t= rtw_ops_wake_tx_queue,\n"
} |
| 27/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 18437 output: 44 thoughts: 81 Thoughts: Okay, here's my take on those thoughts, framed as my own mental processing: **Analyzing Symbol Visibility in a Kernel Module** Right, so we're looking at symbol visibility here. Let's start with `rtw_tx` – yeah, that seems like a good starting point for analysis. It's clearly a well-defined focus symbol for the task at hand. The static nature of `rtw_ops_tx` makes it a potential point of optimization, likely inlined, or perhaps even completely invisible to the linker outside the compilation unit it's defined in. That's common, and something I always check for. However, `rtw_tx` is `EXPORT_SYMBOL`, so it’s *definitely* going to be visible across modules, which is crucial. Now, what about `__rtw_tx_work`? Is that also `EXPORT_SYMBOL`? Need to double-check that. It will affect how the linker and symbol table handle it. |
| 28/2 | 2026/08/13 22:33 | tool | grepper |
0mArgs:{
"Expression": "__rtw_tx_work",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/tx.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=628=static void rtw_txq_push(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-653-\ndrivers/net/wireless/realtek/rtw88/tx.c:654:void __rtw_tx_work(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/tx.c-655-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=675=void rtw_tx_work(struct work_struct *w)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-678-\ndrivers/net/wireless/realtek/rtw88/tx.c:679:\t__rtw_tx_work(rtwdev);\ndrivers/net/wireless/realtek/rtw88/tx.c-680-}\n"
} |
| 29/2 | 2026/08/13 22:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 19042 output: 45 thoughts: 80 Thoughts: Here's my thinking process: **Investigating Symbol Visibility** Okay, hold on a second. I need to clarify something about these symbols. I was under the impression that `__rtw_tx_work` was exported. But after a quick check, it turns out that's not the case; it's *not* an `EXPORT_SYMBOL`. And it's also not static, which is interesting. Alright, let's confirm this by double-checking `rtw_tx_work` itself. Nope, `rtw_tx_work` is also *not* an `EXPORT_SYMBOL`, so my initial assumption was wrong. Okay, I need to make sure I'm following the correct symbols. Let me go back and re-evaluate my thinking on `rtw_tx`. That's the key one here; I must have misread it. Let me just take another look at the definition of `rtw_tx`. |
| 30/2 | 2026/08/13 22:34 | tool | grepper |
0mArgs:{
"Expression": "EXPORT_SYMBOL\\(rtw_tx",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/tx.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=35=void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-93-}\ndrivers/net/wireless/realtek/rtw88/tx.c:94:EXPORT_SYMBOL(rtw_tx_fill_tx_desc);\ndrivers/net/wireless/realtek/rtw88/tx.c-95-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=196=void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-216-}\ndrivers/net/wireless/realtek/rtw88/tx.c:217:EXPORT_SYMBOL(rtw_tx_report_enqueue);\ndrivers/net/wireless/realtek/rtw88/tx.c-218-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=503=rtw_tx_write_data_rsvd_page_get(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-525-}\ndrivers/net/wireless/realtek/rtw88/tx.c:526:EXPORT_SYMBOL(rtw_tx_write_data_rsvd_page_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-527-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=529=rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-551-}\ndrivers/net/wireless/realtek/rtw88/tx.c:552:EXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-553-\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=716=enum rtw_tx_queue_type rtw_tx_ac_to_hwq(enum ieee80211_ac_numbers ac)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-722-}\ndrivers/net/wireless/realtek/rtw88/tx.c:723:EXPORT_SYMBOL(rtw_tx_ac_to_hwq);\ndrivers/net/wireless/realtek/rtw88/tx.c-724-\ndrivers/net/wireless/realtek/rtw88/tx.c=725=enum rtw_tx_queue_type rtw_tx_queue_mapping(struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-745-}\ndrivers/net/wireless/realtek/rtw88/tx.c:746:EXPORT_SYMBOL(rtw_tx_queue_mapping);\n"
} |
| 31/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 20194 output: 40 thoughts: 96 Thoughts: **Analyzing the Symbol `rtw_tx`** Okay, so looking at this code, it seems like `rtw_tx` isn't declared with `EXPORT_SYMBOL`. That immediately means it's likely not intended to be directly accessed from kernel modules outside its intended scope. Just a plain `void rtw_tx(...)`. No special exporting. But, hold on. Even though it's not explicitly exported, it's *not* declared as `static` either. That makes it a global symbol within the kernel's scope, doesn't it? Which means other kernel components should be able to call this function. Ah, right! I remember now. `rtw_tx` is defined in `tx.c`, and I know it's being called from `mac80211.c`. So, if the call is valid and I'm not missing something in the includes, it's definitely a global symbol, reachable between these modules. Just to be absolutely certain, let me quickly double-check the header files to make sure `rtw_tx` isn't declared there. That would settle any doubt I have. Let's make sure there isn't some implicit declaration, or something that I've missed. |
| 32/2 | 2026/08/13 22:34 | tool | grepper |
0mArgs:{
"Expression": "void rtw_tx\\(",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=552=EXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-553-\ndrivers/net/wireless/realtek/rtw88/tx.c:554:void rtw_tx(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-555-\t struct ieee80211_tx_control *control,\n--\ndrivers/net/wireless/realtek/rtw88/tx.h=85=enum rtw_rsvd_packet_type;\ndrivers/net/wireless/realtek/rtw88/tx.h-86-\ndrivers/net/wireless/realtek/rtw88/tx.h:87:void rtw_tx(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.h-88-\t struct ieee80211_tx_control *control,\n"
} |
| 33/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 20890 output: 42 thoughts: 55 Thoughts: **Focusing on Transmission Symbols** Okay, yes, that's right. It's clear that `rtw_tx` is a good symbol to concentrate on. It seems like it's a key function or data structure in this area. Perhaps `rtw_tx_work`, or even `__rtw_tx_work`, could also be worthwhile. Let's see, I should check `rtw_tx_work` next. It might give some valuable insights. |
| 34/2 | 2026/08/13 22:34 | tool | grepper |
0mArgs:{
"Expression": "void rtw_tx_work\\(",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=654=void __rtw_tx_work(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-674-\ndrivers/net/wireless/realtek/rtw88/tx.c:675:void rtw_tx_work(struct work_struct *w)\ndrivers/net/wireless/realtek/rtw88/tx.c-676-{\n--\ndrivers/net/wireless/realtek/rtw88/tx.h=91=void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq);\ndrivers/net/wireless/realtek/rtw88/tx.h:92:void rtw_tx_work(struct work_struct *w);\ndrivers/net/wireless/realtek/rtw88/tx.h-93-void __rtw_tx_work(struct rtw_dev *rtwdev);\n"
} |
| 35/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 21366 output: 47 thoughts: 384 Thoughts: **My Analysis of Patch Reachability** Okay, so I'm looking at this patch and immediately, `rtw_tx_work` and `__rtw_tx_work` jump out as good starting points. They are workqueue callbacks, so they're likely central to the transmit path, which is where I need to focus. The core of the change seems to be within `rtw_usb_tx_queue_mapping_to_qsel` in `rtw88/usb.c`. I know that function is called by `rtw_usb_tx_write`, which is the `tx_write` callback in `rtw_usb_ops`. That callback gets called by `rtw_hci_tx_write`, and then we get to `rtw_tx` and `rtw_txq_push_skb`. These are all involved in transmitting packets via the mac80211 interface, so it's a clear path. Given this, I'm confident that this patch is definitely reachable through fuzzing the mac80211 interface or by injecting packets at the network stack level. Since it's a USB driver, the best approach would be to emulate USB devices via vhci. Syzkaller leverages vhci for this exact purpose, so that's the established method. The driver should get probed, the mac80211 interface should be created, and then the fun begins with sending packets. Now, I need to make sure I have the right kernel configurations. I'll need `RTW88`, `RTW88_CORE`, `RTW88_USB`, and then, since it's a USB adapter, `RTW88_8822BU` (or another USB adapter config, but let's include this one to be safe) along with `MAC80211` and `USB`. I'll verify those configs to be absolutely sure. |
| 36/2 | 2026/08/13 22:34 | tool | grepper |
0mArgs:{
"Expression": "config RTW88_8822BU",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/Kconfig"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Kconfig=71=config RTW88_8822BS\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-81-\ndrivers/net/wireless/realtek/rtw88/Kconfig:82:config RTW88_8822BU\ndrivers/net/wireless/realtek/rtw88/Kconfig-83-\ttristate \"Realtek 8822BU USB wireless network adapter\"\n"
} |
| 37/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 22354 output: 43 thoughts: 43 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Confirming and Investigating RTW88_8822BU Configuration** Alright, that `RTW88_8822BU` configuration looks solid as a starting point. Now, the real question is, are there any hidden dependencies lurking around that could impact its performance or integration? I need to dig deeper. I want to make sure I haven't missed any essential supporting modules or firmware requirements before I declare this setup fully operational. Time to check those dependency lists. |
| 38/2 | 2026/08/13 22:34 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/Kconfig",
"FirstLine": 82,
"LineCount": 15
}Results: {
"Contents": " 82:\tconfig RTW88_8822BU\n 83:\t\ttristate \"Realtek 8822BU USB wireless network adapter\"\n 84:\t\tdepends on USB\n 85:\t\tselect RTW88_CORE\n 86:\t\tselect RTW88_USB\n 87:\t\tselect RTW88_8822B\n 88:\t\thelp\n 89:\t\t Select this option will enable support for 8822BU chipset\n 90:\t\n 91:\t\t 802.11ac USB wireless network adapter\n 92:\t\n 93:\tconfig RTW88_8822CE\n 94:\t\ttristate \"Realtek 8822CE PCI wireless network adapter\"\n 95:\t\tdepends on PCI\n 96:\t\tselect RTW88_CORE\n"
} |
| 39/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 22786 output: 42 thoughts: 91 Thoughts: Okay, here's my breakdown of this. **Dependency Analysis for Configuration Options** Alright, let's see, I'm looking at these configuration options, and the dependencies are pretty clear. It hinges on how this `USB` setup works. The `RTW88` driver, that's definitely dependent on `MAC80211`. So, given that, the options themselves look to be focused on, `RTW88`, then there's the specific adapter config `RTW88_8822BU`, `MAC80211`, and, of course, `USB` itself, which is the base layer here. Now, the question is, is `RTW88_USB` something I can select directly, or is it implicitly chosen when I enable the specific adapter configurations? It's the classic question of whether it's a base module, or a 'meta-option' that gets implicitly activated. That's the key question to explore. |
| 40/2 | 2026/08/13 22:34 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/Kconfig",
"FirstLine": 23,
"LineCount": 5
}Results: {
"Contents": " 23:\tconfig RTW88_USB\n 24:\t\ttristate\n 25:\t\n 26:\tconfig RTW88_8822B\n 27:\t\ttristate\n"
} |
| 41/2 | 2026/08/13 22:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 23199 output: 47 thoughts: 341 Thoughts: **Analyzing RTW88 USB Configuration and Focus Symbols** Okay, so I'm looking at this `RTW88_USB` config, and since it's hidden, it's pretty clear it's activated by something else. Like `RTW88_8822BU`, which makes sense. I should definitely make sure `RTW88_8822BU` is explicitly included in `EnableConfigs`. Let's just quickly scan for any other USB-related configs that might need attention, just to be thorough. Hmm, `RTW88_8822CU`, `RTW88_8723DU`, `RTW88_8821CU`, `RTW88_8821AU`, `RTW88_8812AU`, `RTW88_8814AU`... yeah, I think we're good just listing `RTW88_8822BU` for now. Now, focusing on the symbols related to the transmitter (`rtw_tx` and its associated `__rtw_tx_work` and `rtw_tx_work`), I want to confirm the flow path to `rtw_usb_tx_queue_mapping_to_qsel`. Essentially, how does the transmitter interact with that queue selection function? Tracing the connections, I see `rtw_tx` calls `rtw_hci_tx_write`, which then calls `rtw_usb_tx_write`, and finally, that leads to `rtw_usb_tx_queue_mapping_to_qsel`. Excellent, that confirms the reachability I suspected. A quick check on `rtw_usb_tx_write` confirms it's a static function. That means I can't use it as a focus symbol, which means I should really move on to investigating whether `rtw_txq_push_skb` is static. |
| 42/2 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "rtw_txq_push_skb",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/tx.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=576=static void rtw_txq_check_agg(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-607-\ndrivers/net/wireless/realtek/rtw88/tx.c:608:static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-609-\t\t\t struct rtw_txq *rtwtxq,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=628=static void rtw_txq_push(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-643-\ndrivers/net/wireless/realtek/rtw88/tx.c:644:\t\tret = rtw_txq_push_skb(rtwdev, rtwtxq, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-645-\t\tif (ret) {\n"
} |
| 43/2 | 2026/08/13 22:35 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 24325 output: 153 thoughts: 920 Thoughts: **Analyzing the Transmission Path for Fuzzing Opportunities** Okay, so we're looking at a static code analysis for fuzzing targets. Yes, the code in question appears to be static. My initial assessment points to these key symbols as likely areas of interest for fuzzing: `rtw_tx`, `rtw_tx_work`, and `__rtw_tx_work`. Let's confirm they're not inlined, which would impact their visibility as distinct entry points for fuzzing. Checking `rtw_tx`, it's defined as a simple `void rtw_tx(...)` function and exported in `tx.h` without the `inline` keyword. That confirms it's a distinct symbol. Similarly, `rtw_tx_work` defined as `void rtw_tx_work(struct work_struct *w)` and `__rtw_tx_work`, defined as `void __rtw_tx_work(struct rtw_dev *rtwdev)`, are also not inlined. Are there other entry points or functions that are relevant? I checked for other potential candidates, like `rtw_ops_tx` and `rtw_ops_wake_tx_queue`, which are static in `mac80211.c`, but aren't the best candidates for our fuzzing efforts. I also looked at `rtw_usb_write_data_h2c`, but the relevant patch is in the `rtw_usb_tx_queue_mapping_to_qsel` function. So, the definitive list of focus symbols remains: `rtw_tx`, `rtw_tx_work`, and `__rtw_tx_work`. Reviewing the patch, it looks like a change to how broadcast/multicast packets are handled in the queue selection logic. This is a functional alteration within the transmission path; it's significant, and therefore it’s a good target for fuzzing. Considering the necessary configurations, we need to ensure the following are enabled for the code to compile: `RTW88`, `RTW88_8822BU`, `MAC80211`, and `USB`. I'm double-checking to confirm that `RTW88_8822BU` indeed enables `rtw88/usb.c`. Yes, it selects `RTW88_USB`, which then includes `usb.o` and, critically, `rtw_usb_tx_queue_mapping_to_qsel`. Alright, I'm confident in the target selection and configuration. I’ll call `set-results` now, with the findings. |
| 44/2 | 2026/08/13 22:35 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"RTW88",
"RTW88_8822BU",
"MAC80211",
"USB"
],
"FocusSymbols": [
"rtw_tx",
"rtw_tx_work",
"__rtw_tx_work"
],
"Reasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB wireless driver. This is a functional change in the packet transmission path that can be reached by sending packets over the mac80211 interface. The driver can be fuzzed using USB emulation (vhci).",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822BU",
"MAC80211",
"USB"
],
"FocusSymbols": [
"rtw_tx",
"rtw_tx_work",
"__rtw_tx_work"
],
"Reasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB wireless driver. This is a functional change in the packet transmission path that can be reached by sending packets over the mac80211 interface. The driver can be fuzzed using USB emulation (vhci).",
"WorthFuzzing": true
} |
| 45/1 | 2026/08/13 22:35 | action | If |
2mArgs:{
"WorthFuzzing": true
}Results: null |
| 46/2 | 2026/08/13 22:35 | agent | kmsan-evaluator |
2mModel:best-expensive Args: null Results: {
"KMSANReasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB driver. It replaces a hardcoded queue selection with a conditional branch that checks `info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM`, where `info` is the mac80211 TX control block (`IEEE80211_SKB_CB(skb)`).\n\nWhile this introduces a new conditional branch based on a struct field, the `skb-\u003ecb` control block is guaranteed to be initialized. Network socket buffers (`struct sk_buff`) have their control block (`cb`) zeroed upon allocation in the core network stack (via `skbuff_clear()` in `__alloc_skb()`). Furthermore, the mac80211 subsystem explicitly clears or populates the `cb` fields when reusing or forwarding skbs (e.g., `memset(info, 0, sizeof(*info))`).\n\nTherefore, `info-\u003eflags` is fully initialized and does not pose an uninitialized memory risk. The patch fixes a functional/QoS bug regarding packet prioritization, rather than a memory safety issue. Standard KASAN and other bug detectors are sufficient for this code, and a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
}Instruction: You are an expert Linux kernel security engineer specializing in kernel memory
error detectors (KASAN and KMSAN). Your job is to review the provided patch series and
determine if the code changes justify spawning a dedicated KMSAN (KernelMemorySanitizer)
fuzzing session in addition to standard KASAN fuzzing.
CRITICAL DISTINCTION BETWEEN KASAN AND KMSAN:
- Standard KASAN kernel builds (upstream-apparmor-kasan.config) already enable
a comprehensive suite of debugging tools and sanitizers, including KASAN
(out-of-bounds accesses, use-after-free, double free, invalid free), LOCKDEP
(locking bugs and deadlocks), UB-sanitizers, and memory corruption checks.
- KMSAN (KernelMemorySanitizer) detects reads of UNINITIALIZED memory (stack, heap,
or page allocations) and kernel-to-user memory info-leaks.
Rule: THERE IS NO SENSE IN RUNNING A KMSAN SESSION IF A BUG CAN BE CAUGHT BY KASAN,
LOCKDEP, OR OTHER STANDARD BUG DETECTORS.
A dedicated KMSAN fuzzing session incurs significant resource costs. You must ONLY
set NeedsKMSAN=true if the code changes introduce or expose UNINITIALIZED MEMORY risks
that are detected ONLY by KMSAN.
Look holistically at the patch series and surrounding code. Even if no direct
uninitialized field accesses or new buffer allocations are added in the diff itself,
a patch may alter control flow, bounds checking, or data length calculations in ways
that change how the rest of the code operates on existing buffers (e.g. allowing
uninitialized stack/heap memory to be read, copied to user space, or used in control
flow). Do not hesitate to use your code access tools to inspect the surrounding code,
called functions, and callers.
Set NeedsKMSAN=true ONLY IF the patch introduces or modifies:
1. Kernel structures sent to user space (via copy_to_user, put_user, netlink skb
attributes, ioctl output arguments, socket options, or BPF buffers) where fields
or structure padding might not be fully initialized/zeroed.
2. Conditional logic or branching that depends on potentially uninitialized variables
or struct fields.
3. Allocation or initialization of complex data structures where uninitialized fields
could be read later in reachable code paths.
4. Bounds checks, lengths, or logic in a way that allows surrounding code to access
uninitialized bytes of existing buffers.
Set NeedsKMSAN=false IF:
- The code changes primarily risk out-of-bounds access, array overflows, NULL pointer
dereferences, locking deadlocks, or use-after-free bugs (these are already caught
by KASAN, LOCKDEP, or standard bug detectors).
- All stack/heap structures touched or introduced by the patch are fully zeroed
or initialized (e.g. using = {0}, memset, kzalloc) before being read or copied.
- The patch does not introduce any risk of uninitialized memory usage or info-leaks.
Use your code access tools to inspect the surrounding code if necessary, then provide
detailed KMSANReasoning contrasting KASAN vs KMSAN applicability for this patch.
Prefer calling several tools at the same time to save round-trips.
Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.
Prompt: For your convenience, here is the diff of the changes:
commit a1a92c7bc63c784f4cc3f6ba4db7353d831caa9b
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Aug 13 22:31:37 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index 64e1c3420e0a8..c0990c125b683 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -559,6 +559,7 @@ static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)
{
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
__le16 fc = hdr->frame_control;
u8 qsel;
@@ -567,7 +568,8 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)
qsel = TX_DESC_QSEL_MGMT;
else if (is_broadcast_ether_addr(hdr->addr1) ||
is_multicast_ether_addr(hdr->addr1))
- qsel = TX_DESC_QSEL_HIGH;
+ qsel = (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) ?
+ TX_DESC_QSEL_HIGH : skb->priority;
else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK)
qsel = skb->priority;
else
|
| 47/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2268 output: 52 thoughts: 356 Thoughts: **Analyzing a Wireless Driver Patch** Okay, so I'm looking at this patch for `rtw_usb_tx_queue_mapping_to_qsel` within the Realtek wireless driver, specifically in `drivers/net/wireless/realtek/rtw88/usb.c`. The core of the change seems to be around how the transmit queue selection is handled for broadcast and multicast packets. They've introduced a local variable `info` of type `struct ieee80211_tx_info *`, which is populated using `IEEE80211_SKB_CB(skb)`. This is where it gets interesting, as they're now conditionally setting the `qsel` value based on `info->flags` and `IEEE80211_TX_CTL_SEND_AFTER_DTIM`. The previous logic just hardcoded a high priority queue. Now, it's checking this flag. The macro `IEEE80211_SKB_CB(skb)` is what's crucial here, it essentially casts `skb->cb` to a `struct ieee80211_tx_info *`. But wait a minute, `skb->cb` is just a 48-byte array, right? The question that immediately jumps to mind is: is that buffer always *initialized* before we get to this point? If not, then accessing `info->flags` could be reading uninitialized memory! That's a potential KMSAN issue staring us in the face. This would manifest as some non-deterministic behavior that would be hard to pin down. I need to trace the call paths to see where `rtw_usb_tx_queue_mapping_to_qsel` is invoked. I need to know where `skb->cb` is set up and what the data flow looks like before this function gets called. |
| 48/3 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_tx_queue_mapping_to_qsel",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/usb.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/usb.c=550=static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-559-\ndrivers/net/wireless/realtek/rtw88/usb.c:560:static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\ndrivers/net/wireless/realtek/rtw88/usb.c-561-{\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=581=static int rtw_usb_tx_write(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-590-\ndrivers/net/wireless/realtek/rtw88/usb.c:591:\tpkt_info-\u003eqsel = rtw_usb_tx_queue_mapping_to_qsel(skb);\ndrivers/net/wireless/realtek/rtw88/usb.c-592-\tpkt_desc = skb_push(skb, chip-\u003etx_pkt_desc_sz);\n"
} |
| 49/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3418 output: 45 thoughts: 51 Thoughts: Here's my take on the thought process, as if it were my own: **Investigating the USB TX Write Function** Okay, so `rtw_usb_tx_write` is calling `rtw_usb_tx_queue_mapping_to_qsel(skb)`. That's a key function call I need to understand in this transmission path. My first instinct is to trace back and see *where* `rtw_usb_tx_write` is actually invoked. Knowing the calling context is crucial. Understanding the call stack will immediately shed light on the purpose of this call and likely reveal the higher level logic involved in getting the data onto the USB bus. Let's see... |
| 50/3 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/usb.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/usb.c=560=static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-580-\ndrivers/net/wireless/realtek/rtw88/usb.c:581:static int rtw_usb_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/usb.c-582-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=953=static const struct rtw_hci_ops rtw_usb_ops = {\ndrivers/net/wireless/realtek/rtw88/usb.c:954:\t.tx_write = rtw_usb_tx_write,\ndrivers/net/wireless/realtek/rtw88/usb.c-955-\t.tx_kick_off = rtw_usb_tx_kick_off,\n"
} |
| 51/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3956 output: 37 thoughts: 36 Thoughts: Here's the summary, framed as your thought process: **Tracing the Transmission Path** Okay, so I'm digging into this `rtw88` driver, and I need to figure out how data actually gets transmitted. The entry point I'm starting with is this `rtw_hci_ops.tx_write` function. That name immediately suggests it's the core write function, the mechanism by which data gets pushed onto the hardware for transmission. The next logical step is to pinpoint *where* that function is called within the `rtw88` module. I need to trace the call graph upstream to understand the control flow and identify the initiating factors for these transmissions. This will help me understand the overall data path and pinpoint any bottlenecks or areas for optimization. Let's see where `tx_write` is called in `rtw88`. |
| 52/3 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/hci.h=9=struct rtw_hci_ops {\ndrivers/net/wireless/realtek/rtw88/hci.h:10:\tint (*tx_write)(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/hci.h-11-\t\t\tstruct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/hci.h-35-\ndrivers/net/wireless/realtek/rtw88/hci.h:36:static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/hci.h-37-\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/hci.h-39-{\ndrivers/net/wireless/realtek/rtw88/hci.h:40:\treturn rtwdev-\u003ehci.ops-\u003etx_write(rtwdev, pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/hci.h-41-}\n--\ndrivers/net/wireless/realtek/rtw88/pci.c=790=static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-799-\ndrivers/net/wireless/realtek/rtw88/pci.c:800:static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/pci.c-801-\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/pci.c=870=static int rtw_pci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-877-\ndrivers/net/wireless/realtek/rtw88/pci.c:878:\tskb = rtw_tx_write_data_rsvd_page_get(rtwdev, \u0026pkt_info, buf, size);\ndrivers/net/wireless/realtek/rtw88/pci.c-879-\tif (!skb)\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-881-\ndrivers/net/wireless/realtek/rtw88/pci.c:882:\tret = rtw_pci_tx_write_data(rtwdev, \u0026pkt_info, skb, RTW_TX_QUEUE_BCN);\ndrivers/net/wireless/realtek/rtw88/pci.c-883-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/pci.c=896=static int rtw_pci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-901-\ndrivers/net/wireless/realtek/rtw88/pci.c:902:\tskb = rtw_tx_write_data_h2c_get(rtwdev, \u0026pkt_info, buf, size);\ndrivers/net/wireless/realtek/rtw88/pci.c-903-\tif (!skb)\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-905-\ndrivers/net/wireless/realtek/rtw88/pci.c:906:\tret = rtw_pci_tx_write_data(rtwdev, \u0026pkt_info, skb, RTW_TX_QUEUE_H2C);\ndrivers/net/wireless/realtek/rtw88/pci.c-907-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-916-\ndrivers/net/wireless/realtek/rtw88/pci.c:917:static int rtw_pci_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/pci.c-918-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/pci.c-925-\ndrivers/net/wireless/realtek/rtw88/pci.c:926:\tret = rtw_pci_tx_write_data(rtwdev, pkt_info, skb, queue);\ndrivers/net/wireless/realtek/rtw88/pci.c-927-\tif (ret)\n--\ndrivers/net/wireless/realtek/rtw88/pci.c=1605=static const struct rtw_hci_ops rtw_pci_ops = {\ndrivers/net/wireless/realtek/rtw88/pci.c:1606:\t.tx_write = rtw_pci_tx_write,\ndrivers/net/wireless/realtek/rtw88/pci.c-1607-\t.tx_kick_off = rtw_pci_tx_kick_off,\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c=900=static int rtw_sdio_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c-905-\ndrivers/net/wireless/realtek/rtw88/sdio.c:906:\tskb = rtw_tx_write_data_rsvd_page_get(rtwdev, \u0026pkt_info, buf, size);\ndrivers/net/wireless/realtek/rtw88/sdio.c-907-\tif (!skb)\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c=913=static int rtw_sdio_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c-917-\ndrivers/net/wireless/realtek/rtw88/sdio.c:918:\tskb = rtw_tx_write_data_h2c_get(rtwdev, \u0026pkt_info, buf, size);\ndrivers/net/wireless/realtek/rtw88/sdio.c-919-\tif (!skb)\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c-924-\ndrivers/net/wireless/realtek/rtw88/sdio.c:925:static int rtw_sdio_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/sdio.c-926-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/sdio.c=1170=static const struct rtw_hci_ops rtw_sdio_ops = {\ndrivers/net/wireless/realtek/rtw88/sdio.c:1171:\t.tx_write = rtw_sdio_tx_write,\ndrivers/net/wireless/realtek/rtw88/sdio.c-1172-\t.tx_kick_off = rtw_sdio_tx_kick_off,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=502=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.c:503:rtw_tx_write_data_rsvd_page_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-504-\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-525-}\ndrivers/net/wireless/realtek/rtw88/tx.c:526:EXPORT_SYMBOL(rtw_tx_write_data_rsvd_page_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-527-\ndrivers/net/wireless/realtek/rtw88/tx.c=528=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.c:529:rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-530-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-551-}\ndrivers/net/wireless/realtek/rtw88/tx.c:552:EXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-553-\ndrivers/net/wireless/realtek/rtw88/tx.c=554=void rtw_tx(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-561-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, control-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:562:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-563-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=608=static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-618-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, txq-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:619:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-620-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.h=106=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.h:107:rtw_tx_write_data_rsvd_page_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.h-108-\t\t\t\tstruct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/tx.h=110=struct sk_buff *\ndrivers/net/wireless/realtek/rtw88/tx.h:111:rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.h-112-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=560=static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-580-\ndrivers/net/wireless/realtek/rtw88/usb.c:581:static int rtw_usb_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/usb.c-582-\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=953=static const struct rtw_hci_ops rtw_usb_ops = {\ndrivers/net/wireless/realtek/rtw88/usb.c:954:\t.tx_write = rtw_usb_tx_write,\ndrivers/net/wireless/realtek/rtw88/usb.c-955-\t.tx_kick_off = rtw_usb_tx_kick_off,\n"
} |
| 53/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7490 output: 49 thoughts: 198 Thoughts: **Analyzing the Wireless Transmission Flow** Okay, so I'm digging into this `rtw_hci_tx_write` function. I see it's called from two places: `rtw_tx` and `rtw_txq_push_skb`. Interesting. In `rtw_tx`, a `skb` (socket buffer) is passed in. This immediately tells me that it's likely part of the transmission path. My next thought is to trace where `rtw_tx` itself is called. It’s highly probable that this is happening within the mac80211 framework, which is the standard wireless stack for Linux. If this is the case, then that `skb->cb` (control block) data is being filled by mac80211 itself, which makes sense. I need to keep in mind, I need to check how `IEEE80211_SKB_CB(skb)` is initialized, as that is the source of all the control information. Hold on... I've got to consider that `rtw_usb_tx_write` also handles H2C (Host to Controller) packets and RSVD (Reserved) page packets? Okay, that's a different use case. I need to make sure I understand the interaction there. Let's shift gears and look into `rtw_usb_write_data_h2c` and `rtw_usb_write_data_rsvd_page` next. I need to understand how these relate to the primary TX path. |
| 54/3 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_write_data_h2c",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/usb.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/usb.c=536=static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-549-\ndrivers/net/wireless/realtek/rtw88/usb.c:550:static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\ndrivers/net/wireless/realtek/rtw88/usb.c-551-{\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=953=static const struct rtw_hci_ops rtw_usb_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-972-\t.write_data_rsvd_page = rtw_usb_write_data_rsvd_page,\ndrivers/net/wireless/realtek/rtw88/usb.c:973:\t.write_data_h2c = rtw_usb_write_data_h2c,\ndrivers/net/wireless/realtek/rtw88/usb.c-974-};\n"
} |
| 55/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8408 output: 45 thoughts: 20 Thoughts: Okay, let's dive into this `rtw_usb_write_data_h2c` implementation. I need to get a clear picture of how this function handles data transfer from the host to the device via USB. Specifically, I want to understand the underlying mechanics of this host-to-device (H2C) transfer. I'll need to scrutinize the code itself, looking for details like buffer management, error handling, and any specific optimizations implemented for this data path. I'll be paying close attention to any nuances related to interrupt usage or bulk transfers, as those are typical in this context. I'll need to mentally trace the execution flow, step-by-step, to build a thorough understanding of the process. I want to see if it leverages any specific USB descriptors or endpoint configurations. Analyzing it from the bottom up, or the top down, or both, will be the next step. |
| 56/3 | 2026/08/13 22:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/usb.c",
"FirstLine": 540,
"LineCount": 40
}Results: {
"Contents": " 540:\t\tstruct rtw_tx_pkt_info pkt_info = {0};\n 541:\t\n 542:\t\tpkt_info.tx_pkt_size = size;\n 543:\t\tpkt_info.qsel = TX_DESC_QSEL_BEACON;\n 544:\t\tpkt_info.offset = chip-\u003etx_pkt_desc_sz;\n 545:\t\tpkt_info.ls = true;\n 546:\t\n 547:\t\treturn rtw_usb_write_data(rtwdev, \u0026pkt_info, buf);\n 548:\t}\n 549:\t\n 550:\tstatic int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)\n 551:\t{\n 552:\t\tstruct rtw_tx_pkt_info pkt_info = {0};\n 553:\t\n 554:\t\tpkt_info.tx_pkt_size = size;\n 555:\t\tpkt_info.qsel = TX_DESC_QSEL_H2C;\n 556:\t\n 557:\t\treturn rtw_usb_write_data(rtwdev, \u0026pkt_info, buf);\n 558:\t}\n 559:\t\n 560:\tstatic u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)\n 561:\t{\n 562:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\n 563:\t\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb-\u003edata;\n 564:\t\t__le16 fc = hdr-\u003eframe_control;\n 565:\t\tu8 qsel;\n 566:\t\n 567:\t\tif (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc)))\n 568:\t\t\tqsel = TX_DESC_QSEL_MGMT;\n 569:\t\telse if (is_broadcast_ether_addr(hdr-\u003eaddr1) ||\n 570:\t\t\t is_multicast_ether_addr(hdr-\u003eaddr1))\n 571:\t\t\tqsel = (info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM) ?\n 572:\t\t\t TX_DESC_QSEL_HIGH : skb-\u003epriority;\n 573:\t\telse if (skb_get_queue_mapping(skb) \u003c= IEEE80211_AC_BK)\n 574:\t\t\tqsel = skb-\u003epriority;\n 575:\t\telse\n 576:\t\t\tqsel = TX_DESC_QSEL_BEACON;\n 577:\t\n 578:\t\treturn qsel;\n 579:\t}\n"
} |
| 57/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9429 output: 45 thoughts: 177 Thoughts: **Tracing the USB Data Flow** Okay, so I'm digging into this Realtek WiFi driver code again. I noticed something interesting. `rtw_usb_write_data_h2c` and `rtw_usb_write_data_rsvd_page` – those don't actually go through `rtw_usb_tx_write` directly. Instead, they funnel their data through `rtw_usb_write_data`. That's important to keep in mind, because I was expecting that to be a key point. But where *does* `rtw_usb_tx_write` come in? Ah, right, that's called by `rtw_hci_tx_write`, which in turn is called from two critical places: `rtw_tx` and `rtw_txq_push_skb`. So those functions are where the packet transmission chain really originates, given the code in place. And in both `rtw_tx` and `rtw_txq_push_skb`, I see that an `skb` is passed as an argument. That seems to be the crucial data structure. I'm going to have to look at `rtw_tx` and `rtw_txq_push_skb` more closely to understand the packet lifecycle, and where this `skb` is coming from, and how it is being handled. I'll head over to `drivers/net/wireless/realtek/rtw88/tx.c` and dig in there. |
| 58/3 | 2026/08/13 22:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/tx.c",
"FirstLine": 550,
"LineCount": 40
}Results: {
"Contents": " 550:\t\treturn skb;\n 551:\t}\n 552:\tEXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\n 553:\t\n 554:\tvoid rtw_tx(struct rtw_dev *rtwdev,\n 555:\t\t struct ieee80211_tx_control *control,\n 556:\t\t struct sk_buff *skb)\n 557:\t{\n 558:\t\tstruct rtw_tx_pkt_info pkt_info = {0};\n 559:\t\tint ret;\n 560:\t\n 561:\t\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, control-\u003esta, skb);\n 562:\t\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\n 563:\t\tif (ret) {\n 564:\t\t\trtw_err(rtwdev, \"failed to write TX skb to HCI\\n\");\n 565:\t\t\tgoto out;\n 566:\t\t}\n 567:\t\n 568:\t\trtw_hci_tx_kick_off(rtwdev);\n 569:\t\n 570:\t\treturn;\n 571:\t\n 572:\tout:\n 573:\t\tieee80211_free_txskb(rtwdev-\u003ehw, skb);\n 574:\t}\n 575:\t\n 576:\tstatic void rtw_txq_check_agg(struct rtw_dev *rtwdev,\n 577:\t\t\t\t struct rtw_txq *rtwtxq,\n 578:\t\t\t\t struct sk_buff *skb)\n 579:\t{\n 580:\t\tstruct ieee80211_txq *txq = rtwtxq_to_txq(rtwtxq);\n 581:\t\tstruct ieee80211_tx_info *info;\n 582:\t\tstruct rtw_sta_info *si;\n 583:\t\n 584:\t\tif (test_bit(RTW_TXQ_AMPDU, \u0026rtwtxq-\u003eflags)) {\n 585:\t\t\tinfo = IEEE80211_SKB_CB(skb);\n 586:\t\t\tinfo-\u003eflags |= IEEE80211_TX_CTL_AMPDU;\n 587:\t\t\treturn;\n 588:\t\t}\n 589:\t\n"
} |
| 59/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10647 output: 40 thoughts: 382 Thoughts: **Analyzing the Initialization of `info->flags` in `rtw_tx`**
Okay, so `rtw_tx` receives an `sk_buff` and `ieee80211_tx_control`. This function is called via mac80211's `drv_tx` callback. My initial thought is to trace the initialization of `info->flags` which is part of the `ieee80211_tx_info` structure pointed to by `IEEE80211_SKB_CB(skb)`. I know mac80211 is responsible for setting up this `struct`. I need to ensure that `info->flags` is fully initialized before it's used.
Aha! `IEEE80211_SKB_CB(skb)` is actually cast to a `struct ieee80211_tx_info`. Mac80211 uses `skb->cb` for this purpose during the TX process. So, the key question becomes: is there a scenario where `info->flags` might remain uninitialized within this structure? My initial response is that KMSAN would probably catch this, as it's designed to detect uses of uninitialized memory.
However, I'm using `info->flags` in a conditional statement:
```c
qsel = (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) ?
TX_DESC_QSEL_HIGH : skb->priority;
```
If `info->flags` was truly uninitialized, KMSAN would definitely flag it as a use of an uninitialized value inside that branch, which would be a pretty obvious issue to resolve. But I'm being thorough, I should look more carefully at mac80211's code to determine the exact points where `info->flags` is populated. I need to verify that initialization is happening correctly within mac80211.
|
| 60/3 | 2026/08/13 22:35 | tool | grepper |
0mArgs:{
"Expression": "IEEE80211_SKB_CB",
"PathPrefix": "net/mac80211/"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 658 lines.\nUse more precise expression if possible.\n\nnet/mac80211/agg-tx.c=104=void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)\n--\nnet/mac80211/agg-tx.c-127-\nnet/mac80211/agg-tx.c:128:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/agg-tx.c-129-\t\t\t\t\tIEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/cfg.c=4834=int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,\n--\nnet/mac80211/cfg.c-4854-\nnet/mac80211/cfg.c:4855:\tIEEE80211_SKB_CB(skb)-\u003estatus_data_idr = 1;\nnet/mac80211/cfg.c:4856:\tIEEE80211_SKB_CB(skb)-\u003estatus_data = id;\nnet/mac80211/cfg.c-4857-\nnet/mac80211/cfg.c:4858:\tIEEE80211_SKB_CB(ack_skb)-\u003eack.cookie = *cookie;\nnet/mac80211/cfg.c-4859-\n--\nnet/mac80211/cfg.c=4942=static int ieee80211_probe_peer(struct wiphy *wiphy, struct net_device *dev,\n--\nnet/mac80211/cfg.c-5038-\nnet/mac80211/cfg.c:5039:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/cfg.c-5040-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS |\n--\nnet/mac80211/debugfs_netdev.c=443=static ssize_t ieee80211_if_parse_tkip_mic_test(\n--\nnet/mac80211/debugfs_netdev.c-497-\nnet/mac80211/debugfs_netdev.c:498:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_TKIP_MIC_FAILURE;\nnet/mac80211/debugfs_netdev.c-499-\n--\nnet/mac80211/ht.c=497=int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/ht.c-541-\t/* we'll do more on status of this frame */\nnet/mac80211/ht.c:542:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/ht.c-543-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/ibss.c=1455=static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/ibss.c-1511-\tibss_dbg(sdata, \"Sending ProbeResp to %pM\\n\", mgmt-\u003esa);\nnet/mac80211/ibss.c:1512:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/ibss.c-1513-\n--\nnet/mac80211/ibss.c-1515-\tif (pos[1] == 0)\nnet/mac80211/ibss.c:1516:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_NO_ACK;\nnet/mac80211/ibss.c-1517-\n--\nnet/mac80211/iface.c=479=static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down)\n--\nnet/mac80211/iface.c-695-\t\tskb_queue_walk_safe(\u0026local-\u003epending[i], skb, tmp) {\nnet/mac80211/iface.c:696:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/iface.c-697-\t\t\tif (info-\u003econtrol.vif == \u0026sdata-\u003evif) {\n--\nnet/mac80211/iface.c=951=static u16 ieee80211_monitor_select_queue(struct net_device *dev,\n--\nnet/mac80211/iface.c-956-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/iface.c:957:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/iface.c-958-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/mesh.c=1380=ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh.c-1435-\tmemcpy(hdr-\u003eda, mgmt-\u003esa, ETH_ALEN);\nnet/mac80211/mesh.c:1436:\tIEEE80211_SKB_CB(presp)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mesh.c-1437-\tieee80211_tx_skb(sdata, presp);\n--\nnet/mac80211/mesh_hwmp.c=153=static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_hwmp.c-155-{\nnet/mac80211/mesh_hwmp.c:156:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_hwmp.c-157-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/mesh_hwmp.c=1154=int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_hwmp.c-1157-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\nnet/mac80211/mesh_hwmp.c:1158:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_hwmp.c-1159-\tstruct mesh_path *mpath;\n--\nnet/mac80211/mesh_pathtbl.c=463=void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_pathtbl.c-466-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb-\u003edata;\nnet/mac80211/mesh_pathtbl.c:467:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_pathtbl.c-468-\tstruct ieee80211_mesh_fast_tx *entry, *prev;\n--\nnet/mac80211/mesh_plink.c=211=static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_plink.c-251-\t\treturn err;\nnet/mac80211/mesh_plink.c:252:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_plink.c-253-\tskb_reserve(skb, local-\u003etx_headroom);\n--\nnet/mac80211/mesh_ps.c=368=static void mpsp_trigger_send(struct sta_info *sta, bool rspi, bool eosp)\n--\nnet/mac80211/mesh_ps.c-397-\nnet/mac80211/mesh_ps.c:398:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_ps.c-399-\n--\nnet/mac80211/mesh_ps.c=418=static void mpsp_qos_null_append(struct sta_info *sta,\n--\nnet/mac80211/mesh_ps.c-442-\nnet/mac80211/mesh_ps.c:443:\tinfo = IEEE80211_SKB_CB(new_skb);\nnet/mac80211/mesh_ps.c-444-\tinfo-\u003econtrol.vif = \u0026sdata-\u003evif;\n--\nnet/mac80211/mesh_ps.c=456=static void mps_frame_deliver(struct sta_info *sta, int n_frames)\n--\nnet/mac80211/mesh_ps.c-501-\tskb_queue_walk(\u0026frames, skb) {\nnet/mac80211/mesh_ps.c:502:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_ps.c-503-\t\tstruct ieee80211_hdr *hdr = (void *) skb-\u003edata;\n--\nnet/mac80211/mlme.c=1453=static void ieee80211_send_uhr_omp_req_dbe(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mlme.c-1585-\nnet/mac80211/mlme.c:1586:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-1587-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/mlme.c=2579=static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)\n--\nnet/mac80211/mlme.c-2785-\tif (!assoc_encrypt)\nnet/mac80211/mlme.c:2786:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c-2787-\nnet/mac80211/mlme.c-2788-\tif (ieee80211_hw_check(\u0026local-\u003ehw, REPORTS_TX_ACK_STATUS))\nnet/mac80211/mlme.c:2789:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS |\nnet/mac80211/mlme.c-2790-\t\t\t\t\t\tIEEE80211_TX_INTFL_MLME_CONN_TX;\n--\nnet/mac80211/mlme.c=2796=void ieee80211_send_pspoll(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2808-\nnet/mac80211/mlme.c:2809:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c-2810-\tieee80211_tx_skb(sdata, skb);\n--\nnet/mac80211/mlme.c=2813=void ieee80211_send_nullfunc(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2830-\nnet/mac80211/mlme.c:2831:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/mlme.c-2832-\t\t\t\t\tIEEE80211_TX_INTFL_OFFCHAN_TX_OK;\n--\nnet/mac80211/mlme.c-2834-\tif (ieee80211_hw_check(\u0026local-\u003ehw, REPORTS_TX_ACK_STATUS))\nnet/mac80211/mlme.c:2835:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\nnet/mac80211/mlme.c-2836-\nnet/mac80211/mlme.c-2837-\tif (ifmgd-\u003eflags \u0026 IEEE80211_STA_CONNECTION_POLL)\nnet/mac80211/mlme.c:2838:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_USE_MINRATE;\nnet/mac80211/mlme.c-2839-\n--\nnet/mac80211/mlme.c=2843=void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2867-\nnet/mac80211/mlme.c:2868:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c:2869:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_USE_MINRATE;\nnet/mac80211/mlme.c-2870-\tieee80211_tx_skb(sdata, skb);\n--\nnet/mac80211/mlme.c=8877=void ieee80211_send_teardown_neg_ttlm(struct ieee80211_vif *vif)\n--\nnet/mac80211/mlme.c-8900-\nnet/mac80211/mlme.c:8901:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-8902-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/mlme.c=11155=ieee80211_build_ml_reconf_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mlme.c-11377-\nnet/mac80211/mlme.c:11378:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-11379-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/offchannel.c=810=int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,\n--\nnet/mac80211/offchannel.c-1007-\nnet/mac80211/offchannel.c:1008:\tIEEE80211_SKB_CB(skb)-\u003eflags = flags;\nnet/mac80211/offchannel.c:1009:\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |= IEEE80211_TX_CTRL_DONT_USE_RATE_MASK;\nnet/mac80211/offchannel.c-1010-\n--\nnet/mac80211/offchannel.c-1029-\nnet/mac80211/offchannel.c:1030:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_TX_OFFCHAN |\nnet/mac80211/offchannel.c-1031-\t\t\t\t\tIEEE80211_TX_INTFL_OFFCHAN_TX_OK;\nnet/mac80211/offchannel.c-1032-\tif (ieee80211_hw_check(\u0026local-\u003ehw, QUEUE_CONTROL))\nnet/mac80211/offchannel.c:1033:\t\tIEEE80211_SKB_CB(skb)-\u003ehw_queue =\nnet/mac80211/offchannel.c-1034-\t\t\tlocal-\u003ehw.offchannel_tx_hw_queue;\n--\nnet/mac80211/rate.c=326=static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc)\n--\nnet/mac80211/rate.c-328-\tstruct sk_buff *skb = txrc-\u003eskb;\nnet/mac80211/rate.c:329:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/rate.c-330-\n--\nnet/mac80211/rate.c=414=static bool rate_control_send_low(struct ieee80211_sta *pubsta,\n--\nnet/mac80211/rate.c-416-{\nnet/mac80211/rate.c:417:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rate.c-418-\tstruct ieee80211_supported_band *sband = txrc-\u003esband;\n--\nnet/mac80211/rate.c=882=void ieee80211_get_tx_rates(struct ieee80211_vif *vif,\n--\nnet/mac80211/rate.c-888-\tstruct ieee80211_sub_if_data *sdata;\nnet/mac80211/rate.c:889:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/rate.c-890-\tstruct ieee80211_supported_band *sband;\n--\nnet/mac80211/rate.c=919=void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/rate.c-925-\tstruct ieee80211_sta *ista = NULL;\nnet/mac80211/rate.c:926:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rate.c-927-\tint i;\n--\nnet/mac80211/rc80211_minstrel_ht.c=1595=minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,\n--\nnet/mac80211/rc80211_minstrel_ht.c-1598-\tconst struct mcs_group *sample_group;\nnet/mac80211/rc80211_minstrel_ht.c:1599:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rc80211_minstrel_ht.c-1600-\tstruct ieee80211_tx_rate *rate = \u0026info-\u003estatus.rates[0];\n--\nnet/mac80211/rx.c=2961=ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,\n--\nnet/mac80211/rx.c-3103-\nnet/mac80211/rx.c:3104:\tinfo = IEEE80211_SKB_CB(fwd_skb);\nnet/mac80211/rx.c-3105-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/rx.c=4076=ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx)\n--\nnet/mac80211/rx.c-4119-\t\tif (rx-\u003esdata-\u003evif.type == NL80211_IFTYPE_P2P_DEVICE) {\nnet/mac80211/rx.c:4120:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(nskb);\nnet/mac80211/rx.c-4121-\n--\nnet/mac80211/s1g.c=34=ieee80211_s1g_send_twt_setup(struct ieee80211_sub_if_data *sdata, const u8 *da,\n--\nnet/mac80211/s1g.c-57-\nnet/mac80211/s1g.c:58:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/s1g.c-59-\t\t\t\t\tIEEE80211_TX_INTFL_MLME_CONN_TX |\n--\nnet/mac80211/s1g.c=65=ieee80211_s1g_send_twt_teardown(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/s1g.c-90-\nnet/mac80211/s1g.c:91:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/s1g.c-92-\t\t\t\t\tIEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/scan.c=660=static void ieee80211_send_scan_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/scan.c-675-\t\t\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\nnet/mac80211/scan.c:676:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/scan.c-677-\t\t\tu16 sn = get_random_u16();\n--\nnet/mac80211/scan.c-682-\t\t}\nnet/mac80211/scan.c:683:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= tx_flags;\nnet/mac80211/scan.c:684:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |= IEEE80211_TX_CTRL_DONT_USE_RATE_MASK;\nnet/mac80211/scan.c-685-\t\tieee80211_tx_skb_tid_band(sdata, skb, 7, channel-\u003eband);\n--\nnet/mac80211/sta_info.c=1194=static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb)\n--\nnet/mac80211/sta_info.c-1201-\nnet/mac80211/sta_info.c:1202:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-1203-\n--\nnet/mac80211/sta_info.c=1910=static void ieee80211_send_null_response(struct sta_info *sta, int tid,\n--\nnet/mac80211/sta_info.c-1962-\nnet/mac80211/sta_info.c:1963:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-1964-\n--\nnet/mac80211/sta_info.c=2097=ieee80211_sta_ps_deliver_response(struct sta_info *sta,\n--\nnet/mac80211/sta_info.c-2155-\t\twhile ((skb = __skb_dequeue(\u0026frames))) {\nnet/mac80211/sta_info.c:2156:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-2157-\t\t\tstruct ieee80211_hdr *hdr = (void *) skb-\u003edata;\n--\nnet/mac80211/status.c=22=void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,\n--\nnet/mac80211/status.c-25-\tstruct ieee80211_local *local = hw_to_local(hw);\nnet/mac80211/status.c:26:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-27-\tint tmp;\n--\nnet/mac80211/status.c=44=static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-47-{\nnet/mac80211/status.c:48:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-49-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/status.c=257=ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-261-{\nnet/mac80211/status.c:262:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-263-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/status.c=609=static void ieee80211_report_ack_skb(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-613-{\nnet/mac80211/status.c:614:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(orig_skb);\nnet/mac80211/status.c-615-\tstruct sk_buff *skb;\n--\nnet/mac80211/status.c-625-\tif (info-\u003eflags \u0026 IEEE80211_TX_INTFL_NL80211_FRAME_TX) {\nnet/mac80211/status.c:626:\t\tu64 cookie = IEEE80211_SKB_CB(skb)-\u003eack.cookie;\nnet/mac80211/status.c-627-\t\tstruct ieee80211_sub_if_data *sdata;\n--\nnet/mac80211/status.c=759=static void ieee80211_report_used_skb(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-762-{\nnet/mac80211/status.c:763:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-764-\tu16 tx_time_est = ieee80211_info_get_tx_time_est(info);\n--\nnet/mac80211/status.c=943=void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,\n--\nnet/mac80211/status.c-946-\tstruct sk_buff *skb2;\nnet/mac80211/status.c:947:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-948-\tstruct ieee80211_sub_if_data *sdata;\n--\nnet/mac80211/status.c=1146=void ieee80211_tx_status_skb(struct ieee80211_hw *hw, struct sk_buff *skb)\n--\nnet/mac80211/status.c-1151-\t\t.skb = skb,\nnet/mac80211/status.c:1152:\t\t.info = IEEE80211_SKB_CB(skb),\nnet/mac80211/status.c-1153-\t};\n--\nnet/mac80211/status.c=1167=void ieee80211_tx_status_ext(struct ieee80211_hw *hw,\n--\nnet/mac80211/status.c-1187-\tif (skb \u0026\u0026 (tx_time_est =\nnet/mac80211/status.c:1188:\t\t ieee80211_info_get_tx_time_est(IEEE80211_SKB_CB(skb))) \u003e 0) {\nnet/mac80211/status.c-1189-\t\t/* Do this here to avoid the expensive lookup of the sta\n--\nnet/mac80211/status.c-1191-\t\t */\nnet/mac80211/status.c:1192:\t\tbool mcast = IEEE80211_SKB_CB(skb)-\u003etx_time_mc;\nnet/mac80211/status.c-1193-\t\tieee80211_sta_update_pending_airtime(local, sta,\n--\nnet/mac80211/status.c-1196-\t\t\t\t\t\t true, mcast);\nnet/mac80211/status.c:1197:\t\tieee80211_info_set_tx_time_est(IEEE80211_SKB_CB(skb), 0);\nnet/mac80211/status.c-1198-\t}\n--\nnet/mac80211/tx.c=43=static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,\n--\nnet/mac80211/tx.c-51-\tstruct ieee80211_hdr *hdr;\nnet/mac80211/tx.c:52:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-53-\n--\nnet/mac80211/tx.c=193=ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-196-\tstruct ieee80211_if_managed *ifmgd;\nnet/mac80211/tx.c:197:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-198-\n--\nnet/mac80211/tx.c=270=ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-273-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\nnet/mac80211/tx.c:274:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-275-\tbool assoc = false;\n--\nnet/mac80211/tx.c=378=ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-379-{\nnet/mac80211/tx.c:380:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-381-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=458=ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-460-\tstruct sta_info *sta = tx-\u003esta;\nnet/mac80211/tx.c:461:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-462-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=549=ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-550-{\nnet/mac80211/tx.c:551:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-552-\n--\nnet/mac80211/tx.c=564=ieee80211_select_link_key(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-566-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\nnet/mac80211/tx.c:567:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-568-\tstruct ieee80211_link_data *link;\n--\nnet/mac80211/tx.c=593=ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-595-\tstruct ieee80211_key *key;\nnet/mac80211/tx.c:596:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-597-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=675=ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-676-{\nnet/mac80211/tx.c:677:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-678-\tstruct ieee80211_hdr *hdr = (void *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=820=ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-821-{\nnet/mac80211/tx.c:822:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-823-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=891=static int ieee80211_fragment(struct ieee80211_tx_data *tx,\n--\nnet/mac80211/tx.c-927-\nnet/mac80211/tx.c:928:\t\tinfo = IEEE80211_SKB_CB(tmp);\nnet/mac80211/tx.c-929-\t\tinfo-\u003eflags \u0026= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |\n--\nnet/mac80211/tx.c=952=ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-954-\tstruct sk_buff *skb = tx-\u003eskb;\nnet/mac80211/tx.c:955:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-956-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/tx.c-1002-\t\thdr = (void *)skb-\u003edata;\nnet/mac80211/tx.c:1003:\t\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1004-\n--\nnet/mac80211/tx.c=1208=ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-1213-\tstruct ieee80211_hdr *hdr;\nnet/mac80211/tx.c:1214:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1215-\tbool aggr_check = false;\n--\nnet/mac80211/tx.c=1299=static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1304-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\nnet/mac80211/tx.c:1305:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1306-\tstruct ieee80211_txq *txq = NULL;\n--\nnet/mac80211/tx.c=1354=static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb)\n--\nnet/mac80211/tx.c-1359-\tskb_list_walk_safe(skb, skb, next)\nnet/mac80211/tx.c:1360:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.enqueue_time = now;\nnet/mac80211/tx.c-1361-}\n--\nnet/mac80211/tx.c=1452=static void ieee80211_txq_enqueue(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1469-\tif (unlikely(txqi-\u003etxq.tid == IEEE80211_NUM_TIDS)) {\nnet/mac80211/tx.c:1470:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |=\nnet/mac80211/tx.c-1471-\t\t\tIEEE80211_TX_INTCFL_NEED_TXPROCESSING;\n--\nnet/mac80211/tx.c=1481=static bool fq_vlan_filter_func(struct fq *fq, struct fq_tin *tin,\n--\nnet/mac80211/tx.c-1484-{\nnet/mac80211/tx.c:1485:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1486-\n--\nnet/mac80211/tx.c=1686=static bool ieee80211_tx_frags(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1696-\tskb_queue_walk_safe(skbs, skb, tmp) {\nnet/mac80211/tx.c:1697:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1698-\t\tint q = info-\u003ehw_queue;\n--\nnet/mac80211/tx.c=1762=static bool __ieee80211_tx(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1775-\tskb = skb_peek(skbs);\nnet/mac80211/tx.c:1776:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1777-\tsdata = vif_to_sdata(info-\u003econtrol.vif);\n--\nnet/mac80211/tx.c=1860=static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-1861-{\nnet/mac80211/tx.c:1862:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-1863-\tieee80211_tx_result res = TX_CONTINUE;\n--\nnet/mac80211/tx.c=1909=bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw,\n--\nnet/mac80211/tx.c-1913-\tstruct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);\nnet/mac80211/tx.c:1914:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1915-\tstruct ieee80211_tx_data tx;\n--\nnet/mac80211/tx.c=1952=static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-1958-\tieee80211_tx_result res_prepare;\nnet/mac80211/tx.c:1959:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1960-\tbool result = true;\n--\nnet/mac80211/tx.c=2041=void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-2044-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/tx.c:2045:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2046-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/tx.c=2106=bool ieee80211_parse_tx_radiotap(struct sk_buff *skb,\n--\nnet/mac80211/tx.c-2112-\t\t(struct ieee80211_radiotap_header *) skb-\u003edata;\nnet/mac80211/tx.c:2113:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2114-\tint ret = ieee80211_radiotap_iterator_init(\u0026iterator, rthdr, skb-\u003elen,\n--\nnet/mac80211/tx.c=2324=netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,\n--\nnet/mac80211/tx.c-2328-\tstruct ieee80211_chanctx_conf *chanctx_conf;\nnet/mac80211/tx.c:2329:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2330-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/tx.c=2580=static u16 ieee80211_store_ack_skb(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-2605-\t\t\tif (cookie)\nnet/mac80211/tx.c:2606:\t\t\t\tIEEE80211_SKB_CB(ack_skb)-\u003eack.cookie = cookie;\nnet/mac80211/tx.c-2607-\t\t} else {\n--\nnet/mac80211/tx.c=2648=static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3029-\nnet/mac80211/tx.c:3030:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3031-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/tx.c=3403=static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3407-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/tx.c:3408:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3409-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/tx.c=3621=ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3626-\tstruct sk_buff *skb = tx-\u003eskb;\nnet/mac80211/tx.c:3627:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3628-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/tx.c=3739=void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3775-\nnet/mac80211/tx.c:3776:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3777-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/tx.c=3880=struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,\n--\nnet/mac80211/tx.c-3917-\tif (unlikely(skb)) {\nnet/mac80211/tx.c:3918:\t\tif (!(IEEE80211_SKB_CB(skb)-\u003econtrol.flags \u0026\nnet/mac80211/tx.c-3919-\t\t\t\tIEEE80211_TX_INTCFL_NEED_TXPROCESSING))\nnet/mac80211/tx.c-3920-\t\t\tgoto out;\nnet/mac80211/tx.c:3921:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags \u0026=\nnet/mac80211/tx.c-3922-\t\t\t~IEEE80211_TX_INTCFL_NEED_TXPROCESSING;\n\n"
} |
| 61/3 | 2026/08/13 22:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 25734 output: 41 thoughts: 301 Thoughts: **My Concerns Regarding IEEE 802.11 Packet Handling** Okay, so I'm looking at how we're handling packet metadata within the 802.11 stack, and I've got a few things I need to think through. Specifically, I'm noticing that in `ieee80211_build_hdr`, `ieee80211_xmit_fast`, and `ieee80211_rx_mesh_data`, we're explicitly zeroing out the `info` structure within the SKB's control block: ```c info = IEEE80211_SKB_CB(skb); memset(info, 0, sizeof(*info)); ``` This ensures that `info->flags` and everything else is initialized to zero. Seems sensible enough for standard packet flows. But... what about packets that are injected from userspace? For instance, what happens with packets using radiotap headers? I recall `ieee80211_parse_tx_radiotap`, which seems to be the place where we handle these radiotap-injected packets: ```c struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len, ``` Here, we're also grabbing `info` via `IEEE80211_SKB_CB`, but is it *guaranteed* to be zeroed *before* this function is called? That's the critical question. If not, we could have stale data in `info` influencing the transmission process, or at least introducing some unexpected behavior. We need to know if this memory is initialized to zero before `ieee80211_parse_tx_radiotap` runs. So, let's trace this back. Where is `ieee80211_parse_tx_radiotap` called from? Right, `ieee80211_monitor_start_xmit`. That's the function to investigate next. I need to understand the execution path and ensure that `info` is appropriately initialized for packets originating from radiotap. This could be a subtle bug that could lead to intermittent issues or incorrect frame handling if we aren't careful. I want to be certain about this. |
| 62/3 | 2026/08/13 22:36 | tool | read-file |
0mArgs:{
"File": "net/mac80211/tx.c",
"FirstLine": 2320,
"LineCount": 40
}Results: {
"Contents": "2320:\t\n2321:\t\treturn true;\n2322:\t}\n2323:\t\n2324:\tnetdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,\n2325:\t\t\t\t\t\t struct net_device *dev)\n2326:\t{\n2327:\t\tstruct ieee80211_local *local = wdev_priv(dev-\u003eieee80211_ptr);\n2328:\t\tstruct ieee80211_chanctx_conf *chanctx_conf;\n2329:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\n2330:\t\tstruct ieee80211_hdr *hdr;\n2331:\t\tstruct ieee80211_sub_if_data *tmp_sdata, *sdata;\n2332:\t\tstruct cfg80211_chan_def *chandef;\n2333:\t\tu16 len_rthdr;\n2334:\t\tint hdrlen;\n2335:\t\n2336:\t\tsdata = IEEE80211_DEV_TO_SUB_IF(dev);\n2337:\t\tif (unlikely(!ieee80211_sdata_running(sdata)))\n2338:\t\t\tgoto fail;\n2339:\t\n2340:\t\tmemset(info, 0, sizeof(*info));\n2341:\t\tinfo-\u003eflags = IEEE80211_TX_CTL_REQ_TX_STATUS |\n2342:\t\t\t IEEE80211_TX_CTL_INJECTED;\n2343:\t\n2344:\t\t/* Sanity-check the length of the radiotap header */\n2345:\t\tif (!ieee80211_validate_radiotap_len(skb))\n2346:\t\t\tgoto fail;\n2347:\t\n2348:\t\t/* we now know there is a radiotap header with a length we can use */\n2349:\t\tlen_rthdr = ieee80211_get_radiotap_len(skb-\u003edata);\n2350:\t\n2351:\t\t/*\n2352:\t\t * fix up the pointers accounting for the radiotap\n2353:\t\t * header still being in there. We are being given\n2354:\t\t * a precooked IEEE80211 header so no need for\n2355:\t\t * normal processing\n2356:\t\t */\n2357:\t\tskb_set_mac_header(skb, len_rthdr);\n2358:\t\t/*\n2359:\t\t * these are just fixed to the end of the rt area since we\n"
} |
| 63/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 27350 output: 42 thoughts: 565 Thoughts: **Analyzing the Potential for Uninitialized Flags in USB TX Path** Okay, so I see `memset` initializing `info->flags` right at the start. Good, that's the baseline. My concern is whether we have a path where `rtw_usb_tx_queue_mapping_to_qsel` is called with those flags uninitialized, so I need to be thorough. Let me retrace my steps... I've checked `rtw_usb_write_data_h2c` and `rtw_usb_write_data_rsvd_page`, and they don't directly call that function. Good. Now, I need to consider where those data write functions *do* feed into. Ah, right, those functions like `rtw_tx_write_data_h2c_get` and `rtw_tx_write_data_rsvd_page_get` create an `skb`. Do these ultimately end up calling `rtw_hci_tx_write`? Let me look at the PCI side first: `rtw_pci_write_data_h2c` creates an `skb`, then calls `rtw_pci_tx_write_data`. That's not the USB path, so not relevant. Focusing on the USB path, I see `rtw_usb_write_data_h2c` calls `rtw_usb_write_data` directly, and notably *doesn't* call `rtw_usb_tx_write`. So, if `rtw_usb_tx_queue_mapping_to_qsel` is only called from `rtw_usb_tx_write`, that narrows it down. Right. `rtw_usb_tx_write` is called from `rtw_hci_tx_write`, which is called by the `rtw_tx` and `rtw_txq_push_skb` functions. Both of these are part of the mac80211 TX path, so the `skb->cb` is initialized, as I expect. Okay, that seems to cover those obvious paths... But I need to be *absolutely* sure. Is there *any* other place where `rtw_hci_tx_write` gets called? I need to track down every possible entry point. Gotta be meticulous here. |
| 64/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "rtw_hci_tx_write",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/hci.h=9=struct rtw_hci_ops {\n--\ndrivers/net/wireless/realtek/rtw88/hci.h-35-\ndrivers/net/wireless/realtek/rtw88/hci.h:36:static inline int rtw_hci_tx_write(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/hci.h-37-\t\t\t\t struct rtw_tx_pkt_info *pkt_info,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=554=void rtw_tx(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-561-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, control-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:562:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-563-\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=608=static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-618-\trtw_tx_pkt_info_update(rtwdev, \u0026pkt_info, txq-\u003esta, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c:619:\tret = rtw_hci_tx_write(rtwdev, \u0026pkt_info, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-620-\tif (ret) {\n"
} |
| 65/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 28962 output: 44 thoughts: 55 Thoughts: Here's my thought process, as if I were analyzing this code: **Analyzing the Callers of `rtw_hci_tx_write`** Okay, so I'm digging into this `rtw_hci_tx_write` function, trying to understand its flow. It looks like it's only called from `rtw_tx` and `rtw_txq_push_skb`. That's a good starting point for tracing its usage. Now, I need to figure out *how* `rtw_txq_push_skb` is being used. Where are those calls originating from? Let me trace those calls next, see if I can get a broader picture of the data flow. |
| 66/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "rtw_txq_push_skb",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=576=static void rtw_txq_check_agg(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-607-\ndrivers/net/wireless/realtek/rtw88/tx.c:608:static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-609-\t\t\t struct rtw_txq *rtwtxq,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=628=static void rtw_txq_push(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-643-\ndrivers/net/wireless/realtek/rtw88/tx.c:644:\t\tret = rtw_txq_push_skb(rtwdev, rtwtxq, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-645-\t\tif (ret) {\n"
} |
| 67/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 29529 output: 41 thoughts: 25 Thoughts: Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert: **Investigating the Data Transmission Queue** Alright, so I'm thinking about the data transmission queue, likely within a networking context, and my immediate question is centered on how the `rtw_txq_push` function fits into the overall workflow. Is this function, `rtw_txq_push`, called *directly* from the `rtw_txq_work` function, or something similar within the data transmission code path? This is the core of understanding how data packets are added to the queue for transmission. Understanding the calling relationship is crucial for debugging potential issues with queue management, performance bottlenecks, or race conditions. Knowing if `rtw_txq_push` is called by `rtw_txq_work`, rather than some other function, tells me a lot about the design intentions in the implementation. |
| 68/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "rtw_txq_push",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/tx.c=576=static void rtw_txq_check_agg(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-607-\ndrivers/net/wireless/realtek/rtw88/tx.c:608:static int rtw_txq_push_skb(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-609-\t\t\t struct rtw_txq *rtwtxq,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-627-\ndrivers/net/wireless/realtek/rtw88/tx.c:628:static void rtw_txq_push(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-629-\t\t\t struct rtw_txq *rtwtxq,\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-643-\ndrivers/net/wireless/realtek/rtw88/tx.c:644:\t\tret = rtw_txq_push_skb(rtwdev, rtwtxq, skb);\ndrivers/net/wireless/realtek/rtw88/tx.c-645-\t\tif (ret) {\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=654=void __rtw_tx_work(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/tx.c-664-\t\tieee80211_txq_get_depth(txq, \u0026frame_cnt, NULL);\ndrivers/net/wireless/realtek/rtw88/tx.c:665:\t\trtw_txq_push(rtwdev, rtwtxq, frame_cnt);\ndrivers/net/wireless/realtek/rtw88/tx.c-666-\n"
} |
| 69/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 30329 output: 39 thoughts: 109 Thoughts: **My Line of Inquiry: mac80211 TX Queue Processing** Okay, so `__rtw_tx_work` handles the transmission queues within the mac80211 framework. That means all the `skb`s (Socket Buffers) I'm seeing originate from mac80211, and that `IEEE80211_SKB_CB(skb)` is correctly initialized as a consequence. But wait a minute... I need to consider a potential edge case. What if the network driver itself is generating an `skb` independently of mac80211's normal flow? I need to verify whether the `rtw88` driver, specifically, is creating any of these packets and then passing them to the `rtw_tx` or `rtw_hci_tx_write` functions. I have to make absolutely certain that there isn't a bypass scenario leading to problems down the line. That would be a major oversight. |
| 70/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "rtw_tx\\(",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/mac80211.c=18=static void rtw_ops_tx(struct ieee80211_hw *hw,\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-28-\ndrivers/net/wireless/realtek/rtw88/mac80211.c:29:\trtw_tx(rtwdev, control, skb);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-30-}\n--\ndrivers/net/wireless/realtek/rtw88/tx.c=552=EXPORT_SYMBOL(rtw_tx_write_data_h2c_get);\ndrivers/net/wireless/realtek/rtw88/tx.c-553-\ndrivers/net/wireless/realtek/rtw88/tx.c:554:void rtw_tx(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.c-555-\t struct ieee80211_tx_control *control,\n--\ndrivers/net/wireless/realtek/rtw88/tx.h=85=enum rtw_rsvd_packet_type;\ndrivers/net/wireless/realtek/rtw88/tx.h-86-\ndrivers/net/wireless/realtek/rtw88/tx.h:87:void rtw_tx(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/tx.h-88-\t struct ieee80211_tx_control *control,\n"
} |
| 71/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 31128 output: 40 thoughts: 333 Thoughts: **My Analysis of mac80211's TX Path** Okay, let's break this down. From what I can see, `rtw_tx` is *only* called from `rtw_ops_tx`, which is the mac80211 `tx` callback. That means every single `skb` passed to `rtw_tx` *must* be coming directly from mac80211. And what about `rtw_hci_tx_write`? I remember checking that...it's only called from `rtw_tx` and `rtw_txq_push_skb`. Therefore, *every* `skb` that winds up getting handled by `rtw_usb_tx_queue_mapping_to_qsel` should have its `IEEE80211_SKB_CB(skb)` structure properly initialized by mac80211. This is good, this is the expected behavior. But here's where my mind starts to wander. Is there a loophole? Could there be a situation, a specific packet type perhaps, where `info->flags` *isn't* initialized correctly? I know, from experience, that mac80211 sometimes zeros out the entire `ieee80211_tx_info` structure (`info`) when allocating an `skb`. I just saw it happening in `ieee80211_monitor_start_xmit`, `ieee80211_build_hdr`, `ieee80211_xmit_fast`, and `ieee80211_rx_mesh_data`. The structure is zeroed out. My question is, are there any *other* places, any hidden corners of the mac80211 code, where an `skb` is allocated and transmitted *without* that initial zeroing of `info`? I need to look into this more deeply. I should probably start looking at `ieee80211_tx_skb` or any similar functions. |
| 72/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "IEEE80211_SKB_CB",
"PathPrefix": "net/mac80211/"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 658 lines.\nUse more precise expression if possible.\n\nnet/mac80211/agg-tx.c=104=void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)\n--\nnet/mac80211/agg-tx.c-127-\nnet/mac80211/agg-tx.c:128:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/agg-tx.c-129-\t\t\t\t\tIEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/cfg.c=4834=int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,\n--\nnet/mac80211/cfg.c-4854-\nnet/mac80211/cfg.c:4855:\tIEEE80211_SKB_CB(skb)-\u003estatus_data_idr = 1;\nnet/mac80211/cfg.c:4856:\tIEEE80211_SKB_CB(skb)-\u003estatus_data = id;\nnet/mac80211/cfg.c-4857-\nnet/mac80211/cfg.c:4858:\tIEEE80211_SKB_CB(ack_skb)-\u003eack.cookie = *cookie;\nnet/mac80211/cfg.c-4859-\n--\nnet/mac80211/cfg.c=4942=static int ieee80211_probe_peer(struct wiphy *wiphy, struct net_device *dev,\n--\nnet/mac80211/cfg.c-5038-\nnet/mac80211/cfg.c:5039:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/cfg.c-5040-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS |\n--\nnet/mac80211/debugfs_netdev.c=443=static ssize_t ieee80211_if_parse_tkip_mic_test(\n--\nnet/mac80211/debugfs_netdev.c-497-\nnet/mac80211/debugfs_netdev.c:498:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_TKIP_MIC_FAILURE;\nnet/mac80211/debugfs_netdev.c-499-\n--\nnet/mac80211/ht.c=497=int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/ht.c-541-\t/* we'll do more on status of this frame */\nnet/mac80211/ht.c:542:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/ht.c-543-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/ibss.c=1455=static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/ibss.c-1511-\tibss_dbg(sdata, \"Sending ProbeResp to %pM\\n\", mgmt-\u003esa);\nnet/mac80211/ibss.c:1512:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/ibss.c-1513-\n--\nnet/mac80211/ibss.c-1515-\tif (pos[1] == 0)\nnet/mac80211/ibss.c:1516:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_NO_ACK;\nnet/mac80211/ibss.c-1517-\n--\nnet/mac80211/iface.c=479=static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down)\n--\nnet/mac80211/iface.c-695-\t\tskb_queue_walk_safe(\u0026local-\u003epending[i], skb, tmp) {\nnet/mac80211/iface.c:696:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/iface.c-697-\t\t\tif (info-\u003econtrol.vif == \u0026sdata-\u003evif) {\n--\nnet/mac80211/iface.c=951=static u16 ieee80211_monitor_select_queue(struct net_device *dev,\n--\nnet/mac80211/iface.c-956-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/iface.c:957:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/iface.c-958-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/mesh.c=1380=ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh.c-1435-\tmemcpy(hdr-\u003eda, mgmt-\u003esa, ETH_ALEN);\nnet/mac80211/mesh.c:1436:\tIEEE80211_SKB_CB(presp)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mesh.c-1437-\tieee80211_tx_skb(sdata, presp);\n--\nnet/mac80211/mesh_hwmp.c=153=static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_hwmp.c-155-{\nnet/mac80211/mesh_hwmp.c:156:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_hwmp.c-157-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/mesh_hwmp.c=1154=int mesh_nexthop_resolve(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_hwmp.c-1157-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\nnet/mac80211/mesh_hwmp.c:1158:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_hwmp.c-1159-\tstruct mesh_path *mpath;\n--\nnet/mac80211/mesh_pathtbl.c=463=void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_pathtbl.c-466-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb-\u003edata;\nnet/mac80211/mesh_pathtbl.c:467:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_pathtbl.c-468-\tstruct ieee80211_mesh_fast_tx *entry, *prev;\n--\nnet/mac80211/mesh_plink.c=211=static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mesh_plink.c-251-\t\treturn err;\nnet/mac80211/mesh_plink.c:252:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_plink.c-253-\tskb_reserve(skb, local-\u003etx_headroom);\n--\nnet/mac80211/mesh_ps.c=368=static void mpsp_trigger_send(struct sta_info *sta, bool rspi, bool eosp)\n--\nnet/mac80211/mesh_ps.c-397-\nnet/mac80211/mesh_ps.c:398:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_ps.c-399-\n--\nnet/mac80211/mesh_ps.c=418=static void mpsp_qos_null_append(struct sta_info *sta,\n--\nnet/mac80211/mesh_ps.c-442-\nnet/mac80211/mesh_ps.c:443:\tinfo = IEEE80211_SKB_CB(new_skb);\nnet/mac80211/mesh_ps.c-444-\tinfo-\u003econtrol.vif = \u0026sdata-\u003evif;\n--\nnet/mac80211/mesh_ps.c=456=static void mps_frame_deliver(struct sta_info *sta, int n_frames)\n--\nnet/mac80211/mesh_ps.c-501-\tskb_queue_walk(\u0026frames, skb) {\nnet/mac80211/mesh_ps.c:502:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/mesh_ps.c-503-\t\tstruct ieee80211_hdr *hdr = (void *) skb-\u003edata;\n--\nnet/mac80211/mlme.c=1453=static void ieee80211_send_uhr_omp_req_dbe(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mlme.c-1585-\nnet/mac80211/mlme.c:1586:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-1587-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/mlme.c=2579=static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)\n--\nnet/mac80211/mlme.c-2785-\tif (!assoc_encrypt)\nnet/mac80211/mlme.c:2786:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c-2787-\nnet/mac80211/mlme.c-2788-\tif (ieee80211_hw_check(\u0026local-\u003ehw, REPORTS_TX_ACK_STATUS))\nnet/mac80211/mlme.c:2789:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS |\nnet/mac80211/mlme.c-2790-\t\t\t\t\t\tIEEE80211_TX_INTFL_MLME_CONN_TX;\n--\nnet/mac80211/mlme.c=2796=void ieee80211_send_pspoll(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2808-\nnet/mac80211/mlme.c:2809:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c-2810-\tieee80211_tx_skb(sdata, skb);\n--\nnet/mac80211/mlme.c=2813=void ieee80211_send_nullfunc(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2830-\nnet/mac80211/mlme.c:2831:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/mlme.c-2832-\t\t\t\t\tIEEE80211_TX_INTFL_OFFCHAN_TX_OK;\n--\nnet/mac80211/mlme.c-2834-\tif (ieee80211_hw_check(\u0026local-\u003ehw, REPORTS_TX_ACK_STATUS))\nnet/mac80211/mlme.c:2835:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\nnet/mac80211/mlme.c-2836-\nnet/mac80211/mlme.c-2837-\tif (ifmgd-\u003eflags \u0026 IEEE80211_STA_CONNECTION_POLL)\nnet/mac80211/mlme.c:2838:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_USE_MINRATE;\nnet/mac80211/mlme.c-2839-\n--\nnet/mac80211/mlme.c=2843=void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2867-\nnet/mac80211/mlme.c:2868:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\nnet/mac80211/mlme.c:2869:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_USE_MINRATE;\nnet/mac80211/mlme.c-2870-\tieee80211_tx_skb(sdata, skb);\n--\nnet/mac80211/mlme.c=8877=void ieee80211_send_teardown_neg_ttlm(struct ieee80211_vif *vif)\n--\nnet/mac80211/mlme.c-8900-\nnet/mac80211/mlme.c:8901:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-8902-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/mlme.c=11155=ieee80211_build_ml_reconf_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/mlme.c-11377-\nnet/mac80211/mlme.c:11378:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/mlme.c-11379-\tinfo-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/offchannel.c=810=int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,\n--\nnet/mac80211/offchannel.c-1007-\nnet/mac80211/offchannel.c:1008:\tIEEE80211_SKB_CB(skb)-\u003eflags = flags;\nnet/mac80211/offchannel.c:1009:\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |= IEEE80211_TX_CTRL_DONT_USE_RATE_MASK;\nnet/mac80211/offchannel.c-1010-\n--\nnet/mac80211/offchannel.c-1029-\nnet/mac80211/offchannel.c:1030:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_TX_OFFCHAN |\nnet/mac80211/offchannel.c-1031-\t\t\t\t\tIEEE80211_TX_INTFL_OFFCHAN_TX_OK;\nnet/mac80211/offchannel.c-1032-\tif (ieee80211_hw_check(\u0026local-\u003ehw, QUEUE_CONTROL))\nnet/mac80211/offchannel.c:1033:\t\tIEEE80211_SKB_CB(skb)-\u003ehw_queue =\nnet/mac80211/offchannel.c-1034-\t\t\tlocal-\u003ehw.offchannel_tx_hw_queue;\n--\nnet/mac80211/rate.c=326=static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc)\n--\nnet/mac80211/rate.c-328-\tstruct sk_buff *skb = txrc-\u003eskb;\nnet/mac80211/rate.c:329:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/rate.c-330-\n--\nnet/mac80211/rate.c=414=static bool rate_control_send_low(struct ieee80211_sta *pubsta,\n--\nnet/mac80211/rate.c-416-{\nnet/mac80211/rate.c:417:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rate.c-418-\tstruct ieee80211_supported_band *sband = txrc-\u003esband;\n--\nnet/mac80211/rate.c=882=void ieee80211_get_tx_rates(struct ieee80211_vif *vif,\n--\nnet/mac80211/rate.c-888-\tstruct ieee80211_sub_if_data *sdata;\nnet/mac80211/rate.c:889:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/rate.c-890-\tstruct ieee80211_supported_band *sband;\n--\nnet/mac80211/rate.c=919=void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/rate.c-925-\tstruct ieee80211_sta *ista = NULL;\nnet/mac80211/rate.c:926:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rate.c-927-\tint i;\n--\nnet/mac80211/rc80211_minstrel_ht.c=1595=minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,\n--\nnet/mac80211/rc80211_minstrel_ht.c-1598-\tconst struct mcs_group *sample_group;\nnet/mac80211/rc80211_minstrel_ht.c:1599:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc-\u003eskb);\nnet/mac80211/rc80211_minstrel_ht.c-1600-\tstruct ieee80211_tx_rate *rate = \u0026info-\u003estatus.rates[0];\n--\nnet/mac80211/rx.c=2961=ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,\n--\nnet/mac80211/rx.c-3103-\nnet/mac80211/rx.c:3104:\tinfo = IEEE80211_SKB_CB(fwd_skb);\nnet/mac80211/rx.c-3105-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/rx.c=4076=ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx)\n--\nnet/mac80211/rx.c-4119-\t\tif (rx-\u003esdata-\u003evif.type == NL80211_IFTYPE_P2P_DEVICE) {\nnet/mac80211/rx.c:4120:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(nskb);\nnet/mac80211/rx.c-4121-\n--\nnet/mac80211/s1g.c=34=ieee80211_s1g_send_twt_setup(struct ieee80211_sub_if_data *sdata, const u8 *da,\n--\nnet/mac80211/s1g.c-57-\nnet/mac80211/s1g.c:58:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/s1g.c-59-\t\t\t\t\tIEEE80211_TX_INTFL_MLME_CONN_TX |\n--\nnet/mac80211/s1g.c=65=ieee80211_s1g_send_twt_teardown(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/s1g.c-90-\nnet/mac80211/s1g.c:91:\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |\nnet/mac80211/s1g.c-92-\t\t\t\t\tIEEE80211_TX_CTL_REQ_TX_STATUS;\n--\nnet/mac80211/scan.c=660=static void ieee80211_send_scan_probe_req(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/scan.c-675-\t\t\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\nnet/mac80211/scan.c:676:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/scan.c-677-\t\t\tu16 sn = get_random_u16();\n--\nnet/mac80211/scan.c-682-\t\t}\nnet/mac80211/scan.c:683:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= tx_flags;\nnet/mac80211/scan.c:684:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |= IEEE80211_TX_CTRL_DONT_USE_RATE_MASK;\nnet/mac80211/scan.c-685-\t\tieee80211_tx_skb_tid_band(sdata, skb, 7, channel-\u003eband);\n--\nnet/mac80211/sta_info.c=1194=static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb)\n--\nnet/mac80211/sta_info.c-1201-\nnet/mac80211/sta_info.c:1202:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-1203-\n--\nnet/mac80211/sta_info.c=1910=static void ieee80211_send_null_response(struct sta_info *sta, int tid,\n--\nnet/mac80211/sta_info.c-1962-\nnet/mac80211/sta_info.c:1963:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-1964-\n--\nnet/mac80211/sta_info.c=2097=ieee80211_sta_ps_deliver_response(struct sta_info *sta,\n--\nnet/mac80211/sta_info.c-2155-\t\twhile ((skb = __skb_dequeue(\u0026frames))) {\nnet/mac80211/sta_info.c:2156:\t\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/sta_info.c-2157-\t\t\tstruct ieee80211_hdr *hdr = (void *) skb-\u003edata;\n--\nnet/mac80211/status.c=22=void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,\n--\nnet/mac80211/status.c-25-\tstruct ieee80211_local *local = hw_to_local(hw);\nnet/mac80211/status.c:26:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-27-\tint tmp;\n--\nnet/mac80211/status.c=44=static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-47-{\nnet/mac80211/status.c:48:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-49-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/status.c=257=ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-261-{\nnet/mac80211/status.c:262:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-263-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/status.c=609=static void ieee80211_report_ack_skb(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-613-{\nnet/mac80211/status.c:614:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(orig_skb);\nnet/mac80211/status.c-615-\tstruct sk_buff *skb;\n--\nnet/mac80211/status.c-625-\tif (info-\u003eflags \u0026 IEEE80211_TX_INTFL_NL80211_FRAME_TX) {\nnet/mac80211/status.c:626:\t\tu64 cookie = IEEE80211_SKB_CB(skb)-\u003eack.cookie;\nnet/mac80211/status.c-627-\t\tstruct ieee80211_sub_if_data *sdata;\n--\nnet/mac80211/status.c=759=static void ieee80211_report_used_skb(struct ieee80211_local *local,\n--\nnet/mac80211/status.c-762-{\nnet/mac80211/status.c:763:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-764-\tu16 tx_time_est = ieee80211_info_get_tx_time_est(info);\n--\nnet/mac80211/status.c=943=void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,\n--\nnet/mac80211/status.c-946-\tstruct sk_buff *skb2;\nnet/mac80211/status.c:947:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/status.c-948-\tstruct ieee80211_sub_if_data *sdata;\n--\nnet/mac80211/status.c=1146=void ieee80211_tx_status_skb(struct ieee80211_hw *hw, struct sk_buff *skb)\n--\nnet/mac80211/status.c-1151-\t\t.skb = skb,\nnet/mac80211/status.c:1152:\t\t.info = IEEE80211_SKB_CB(skb),\nnet/mac80211/status.c-1153-\t};\n--\nnet/mac80211/status.c=1167=void ieee80211_tx_status_ext(struct ieee80211_hw *hw,\n--\nnet/mac80211/status.c-1187-\tif (skb \u0026\u0026 (tx_time_est =\nnet/mac80211/status.c:1188:\t\t ieee80211_info_get_tx_time_est(IEEE80211_SKB_CB(skb))) \u003e 0) {\nnet/mac80211/status.c-1189-\t\t/* Do this here to avoid the expensive lookup of the sta\n--\nnet/mac80211/status.c-1191-\t\t */\nnet/mac80211/status.c:1192:\t\tbool mcast = IEEE80211_SKB_CB(skb)-\u003etx_time_mc;\nnet/mac80211/status.c-1193-\t\tieee80211_sta_update_pending_airtime(local, sta,\n--\nnet/mac80211/status.c-1196-\t\t\t\t\t\t true, mcast);\nnet/mac80211/status.c:1197:\t\tieee80211_info_set_tx_time_est(IEEE80211_SKB_CB(skb), 0);\nnet/mac80211/status.c-1198-\t}\n--\nnet/mac80211/tx.c=43=static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,\n--\nnet/mac80211/tx.c-51-\tstruct ieee80211_hdr *hdr;\nnet/mac80211/tx.c:52:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-53-\n--\nnet/mac80211/tx.c=193=ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-196-\tstruct ieee80211_if_managed *ifmgd;\nnet/mac80211/tx.c:197:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-198-\n--\nnet/mac80211/tx.c=270=ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-273-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\nnet/mac80211/tx.c:274:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-275-\tbool assoc = false;\n--\nnet/mac80211/tx.c=378=ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-379-{\nnet/mac80211/tx.c:380:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-381-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=458=ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-460-\tstruct sta_info *sta = tx-\u003esta;\nnet/mac80211/tx.c:461:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-462-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=549=ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-550-{\nnet/mac80211/tx.c:551:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-552-\n--\nnet/mac80211/tx.c=564=ieee80211_select_link_key(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-566-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\nnet/mac80211/tx.c:567:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-568-\tstruct ieee80211_link_data *link;\n--\nnet/mac80211/tx.c=593=ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-595-\tstruct ieee80211_key *key;\nnet/mac80211/tx.c:596:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-597-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=675=ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-676-{\nnet/mac80211/tx.c:677:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-678-\tstruct ieee80211_hdr *hdr = (void *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=820=ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-821-{\nnet/mac80211/tx.c:822:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-823-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx-\u003eskb-\u003edata;\n--\nnet/mac80211/tx.c=891=static int ieee80211_fragment(struct ieee80211_tx_data *tx,\n--\nnet/mac80211/tx.c-927-\nnet/mac80211/tx.c:928:\t\tinfo = IEEE80211_SKB_CB(tmp);\nnet/mac80211/tx.c-929-\t\tinfo-\u003eflags \u0026= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |\n--\nnet/mac80211/tx.c=952=ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)\n--\nnet/mac80211/tx.c-954-\tstruct sk_buff *skb = tx-\u003eskb;\nnet/mac80211/tx.c:955:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-956-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/tx.c-1002-\t\thdr = (void *)skb-\u003edata;\nnet/mac80211/tx.c:1003:\t\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1004-\n--\nnet/mac80211/tx.c=1208=ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-1213-\tstruct ieee80211_hdr *hdr;\nnet/mac80211/tx.c:1214:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1215-\tbool aggr_check = false;\n--\nnet/mac80211/tx.c=1299=static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1304-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\nnet/mac80211/tx.c:1305:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1306-\tstruct ieee80211_txq *txq = NULL;\n--\nnet/mac80211/tx.c=1354=static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb)\n--\nnet/mac80211/tx.c-1359-\tskb_list_walk_safe(skb, skb, next)\nnet/mac80211/tx.c:1360:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.enqueue_time = now;\nnet/mac80211/tx.c-1361-}\n--\nnet/mac80211/tx.c=1452=static void ieee80211_txq_enqueue(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1469-\tif (unlikely(txqi-\u003etxq.tid == IEEE80211_NUM_TIDS)) {\nnet/mac80211/tx.c:1470:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |=\nnet/mac80211/tx.c-1471-\t\t\tIEEE80211_TX_INTCFL_NEED_TXPROCESSING;\n--\nnet/mac80211/tx.c=1481=static bool fq_vlan_filter_func(struct fq *fq, struct fq_tin *tin,\n--\nnet/mac80211/tx.c-1484-{\nnet/mac80211/tx.c:1485:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1486-\n--\nnet/mac80211/tx.c=1686=static bool ieee80211_tx_frags(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1696-\tskb_queue_walk_safe(skbs, skb, tmp) {\nnet/mac80211/tx.c:1697:\t\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1698-\t\tint q = info-\u003ehw_queue;\n--\nnet/mac80211/tx.c=1762=static bool __ieee80211_tx(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-1775-\tskb = skb_peek(skbs);\nnet/mac80211/tx.c:1776:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1777-\tsdata = vif_to_sdata(info-\u003econtrol.vif);\n--\nnet/mac80211/tx.c=1860=static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx)\nnet/mac80211/tx.c-1861-{\nnet/mac80211/tx.c:1862:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx-\u003eskb);\nnet/mac80211/tx.c-1863-\tieee80211_tx_result res = TX_CONTINUE;\n--\nnet/mac80211/tx.c=1909=bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw,\n--\nnet/mac80211/tx.c-1913-\tstruct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);\nnet/mac80211/tx.c:1914:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1915-\tstruct ieee80211_tx_data tx;\n--\nnet/mac80211/tx.c=1952=static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-1958-\tieee80211_tx_result res_prepare;\nnet/mac80211/tx.c:1959:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-1960-\tbool result = true;\n--\nnet/mac80211/tx.c=2041=void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-2044-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/tx.c:2045:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2046-\tstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb-\u003edata;\n--\nnet/mac80211/tx.c=2106=bool ieee80211_parse_tx_radiotap(struct sk_buff *skb,\n--\nnet/mac80211/tx.c-2112-\t\t(struct ieee80211_radiotap_header *) skb-\u003edata;\nnet/mac80211/tx.c:2113:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2114-\tint ret = ieee80211_radiotap_iterator_init(\u0026iterator, rthdr, skb-\u003elen,\n--\nnet/mac80211/tx.c=2324=netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,\n--\nnet/mac80211/tx.c-2328-\tstruct ieee80211_chanctx_conf *chanctx_conf;\nnet/mac80211/tx.c:2329:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-2330-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/tx.c=2580=static u16 ieee80211_store_ack_skb(struct ieee80211_local *local,\n--\nnet/mac80211/tx.c-2605-\t\t\tif (cookie)\nnet/mac80211/tx.c:2606:\t\t\t\tIEEE80211_SKB_CB(ack_skb)-\u003eack.cookie = cookie;\nnet/mac80211/tx.c-2607-\t\t} else {\n--\nnet/mac80211/tx.c=2648=static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3029-\nnet/mac80211/tx.c:3030:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3031-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/tx.c=3403=static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3407-\tstruct ieee80211_local *local = sdata-\u003elocal;\nnet/mac80211/tx.c:3408:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3409-\tstruct ieee80211_hdr *hdr;\n--\nnet/mac80211/tx.c=3621=ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3626-\tstruct sk_buff *skb = tx-\u003eskb;\nnet/mac80211/tx.c:3627:\tstruct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3628-\tstruct ieee80211_hdr *hdr = (void *)skb-\u003edata;\n--\nnet/mac80211/tx.c=3739=void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,\n--\nnet/mac80211/tx.c-3775-\nnet/mac80211/tx.c:3776:\tinfo = IEEE80211_SKB_CB(skb);\nnet/mac80211/tx.c-3777-\tmemset(info, 0, sizeof(*info));\n--\nnet/mac80211/tx.c=3880=struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,\n--\nnet/mac80211/tx.c-3917-\tif (unlikely(skb)) {\nnet/mac80211/tx.c:3918:\t\tif (!(IEEE80211_SKB_CB(skb)-\u003econtrol.flags \u0026\nnet/mac80211/tx.c-3919-\t\t\t\tIEEE80211_TX_INTCFL_NEED_TXPROCESSING))\nnet/mac80211/tx.c-3920-\t\t\tgoto out;\nnet/mac80211/tx.c:3921:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags \u0026=\nnet/mac80211/tx.c-3922-\t\t\t~IEEE80211_TX_INTCFL_NEED_TXPROCESSING;\n\n"
} |
| 73/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 46188 output: 42 thoughts: 354 Thoughts: **Analyzing Potential Uninitialized Memory in mac80211's TX Path** Okay, so I'm digging into `mac80211`'s TX path. I'm thinking about `IEEE80211_SKB_CB(skb)`, which, for TX skbs, is essentially a pointer to a `struct ieee80211_tx_info`. The question is, is there any possibility that `info->flags` might be used before it's initialized? Generally, when `mac80211` allocates an skb for TX, it either zeros the `cb` structure outright or explicitly initializes the fields within it. I've seen multiple examples of this; `ieee80211_build_hdr`, for instance, explicitly calls `memset(info, 0, sizeof(*info))`. Similarly, `__ieee80211_xmit_fast`, `ieee80211_rx_mesh_data`, and `ieee80211_monitor_start_xmit` all zero out the `info` structure, ensuring a known initial state. But what about `ieee80211_tx_skb`? That's just a wrapper around `ieee80211_tx`, so it should inherit the initialization from the lower level. And what about management frames? They're often handled differently. Let me check `ieee80211_mgmt_tx` (specifically in `net/mac80211/offchannel.c`). Aha! In `ieee80211_mgmt_tx`, it looks like `IEEE80211_SKB_CB(skb)->flags = flags;` is used. Wait, this sets `flags` directly, but does it zero out the rest of the `info` structure? I need to look closely at `ieee80211_mgmt_tx` to see if there's any preceding initialization. I need to make sure this isn't a source of potential uninitialized memory reads. |
| 74/3 | 2026/08/13 22:36 | tool | read-file |
0mArgs:{
"File": "net/mac80211/offchannel.c",
"FirstLine": 1000,
"LineCount": 40
}Results: {
"Contents": "1000:\t\t\tif (beacon)\n1001:\t\t\t\tfor (i = 0; i \u003c params-\u003en_csa_offsets; i++)\n1002:\t\t\t\t\tdata[params-\u003ecsa_offsets[i]] =\n1003:\t\t\t\t\t\tbeacon-\u003ecntdwn_current_counter;\n1004:\t\n1005:\t\t\trcu_read_unlock();\n1006:\t\t}\n1007:\t\n1008:\t\tIEEE80211_SKB_CB(skb)-\u003eflags = flags;\n1009:\t\tIEEE80211_SKB_CB(skb)-\u003econtrol.flags |= IEEE80211_TX_CTRL_DONT_USE_RATE_MASK;\n1010:\t\n1011:\t\tskb-\u003edev = sdata-\u003edev;\n1012:\t\n1013:\t\tif (!params-\u003edont_wait_for_ack) {\n1014:\t\t\t/* make a copy to preserve the frame contents\n1015:\t\t\t * in case of encryption.\n1016:\t\t\t */\n1017:\t\t\tret = ieee80211_attach_ack_skb(local, skb, \u0026cookie, GFP_KERNEL);\n1018:\t\t\tif (ret) {\n1019:\t\t\t\tkfree_skb(skb);\n1020:\t\t\t\tgoto out_unlock;\n1021:\t\t\t}\n1022:\t\t}\n1023:\t\n1024:\t\tif (!need_offchan) {\n1025:\t\t\tieee80211_tx_skb_tid(sdata, skb, 7, link_id);\n1026:\t\t\tret = 0;\n1027:\t\t\tgoto out_unlock;\n1028:\t\t}\n1029:\t\n1030:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_TX_OFFCHAN |\n1031:\t\t\t\t\t\tIEEE80211_TX_INTFL_OFFCHAN_TX_OK;\n1032:\t\tif (ieee80211_hw_check(\u0026local-\u003ehw, QUEUE_CONTROL))\n1033:\t\t\tIEEE80211_SKB_CB(skb)-\u003ehw_queue =\n1034:\t\t\t\tlocal-\u003ehw.offchannel_tx_hw_queue;\n1035:\t\n1036:\t\t/* This will handle all kinds of coalescing and immediate TX */\n1037:\t\tret = ieee80211_start_roc_work(local, sdata, params-\u003echan,\n1038:\t\t\t\t\t params-\u003ewait, \u0026cookie, skb,\n1039:\t\t\t\t\t IEEE80211_ROC_TYPE_MGMT_TX);\n"
} |
| 75/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 47758 output: 42 thoughts: 172 Thoughts: **My Concerns Regarding SKB Flags in IEEE 802.11 Management Frame Transmission** Okay, so I'm looking at how we handle the `flags` field within the `ieee80211_mgmt_tx` function, and it seems like we explicitly initialize `IEEE80211_SKB_CB(skb)->flags` with the `flags` variable there. That's good; it's clean and safe. But that got me thinking, what about the other functions that send management frames, like `ieee80211_send_assoc`, `ieee80211_send_pspoll`, and others like them? They're allocating the `skb` using `alloc_skb` or `dev_alloc_skb`. Ah, here's the kicker! I seem to recall that neither of those functions zero out the `skb->cb` area, which is where our custom control block data lives. If those functions only perform a bitwise OR operation (`|=`) on the `IEEE80211_SKB_CB(skb)->flags` field, without prior initialization, then that `flags` value might be uninitialized, leading to potential issues and unpredictable behavior. Let's dig deeper and take a close look at the implementation of `ieee80211_send_assoc` to make sure I'm following this train of thought correctly. We need to confirm if my hunch is correct. |
| 76/3 | 2026/08/13 22:36 | tool | read-file |
0mArgs:{
"File": "net/mac80211/mlme.c",
"FirstLine": 2780,
"LineCount": 40
}Results: {
"Contents": "2780:\t\n2781:\t\tassoc_encrypt = sta \u0026\u0026 sta-\u003esta.epp_peer \u0026\u0026\n2782:\t\t\t\twiphy_dereference(sdata-\u003elocal-\u003ehw.wiphy,\n2783:\t\t\t\t\t\t sta-\u003eptk[sta-\u003eptk_idx]);\n2784:\t\n2785:\t\tif (!assoc_encrypt)\n2786:\t\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\n2787:\t\n2788:\t\tif (ieee80211_hw_check(\u0026local-\u003ehw, REPORTS_TX_ACK_STATUS))\n2789:\t\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_CTL_REQ_TX_STATUS |\n2790:\t\t\t\t\t\t\tIEEE80211_TX_INTFL_MLME_CONN_TX;\n2791:\t\tieee80211_tx_skb(sdata, skb);\n2792:\t\n2793:\t\treturn 0;\n2794:\t}\n2795:\t\n2796:\tvoid ieee80211_send_pspoll(struct ieee80211_local *local,\n2797:\t\t\t\t struct ieee80211_sub_if_data *sdata)\n2798:\t{\n2799:\t\tstruct ieee80211_pspoll *pspoll;\n2800:\t\tstruct sk_buff *skb;\n2801:\t\n2802:\t\tskb = ieee80211_pspoll_get(\u0026local-\u003ehw, \u0026sdata-\u003evif);\n2803:\t\tif (!skb)\n2804:\t\t\treturn;\n2805:\t\n2806:\t\tpspoll = (struct ieee80211_pspoll *) skb-\u003edata;\n2807:\t\tpspoll-\u003eframe_control |= cpu_to_le16(IEEE80211_FCTL_PM);\n2808:\t\n2809:\t\tIEEE80211_SKB_CB(skb)-\u003eflags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;\n2810:\t\tieee80211_tx_skb(sdata, skb);\n2811:\t}\n2812:\t\n2813:\tvoid ieee80211_send_nullfunc(struct ieee80211_local *local,\n2814:\t\t\t\t struct ieee80211_sub_if_data *sdata,\n2815:\t\t\t\t bool powersave)\n2816:\t{\n2817:\t\tstruct sk_buff *skb;\n2818:\t\tstruct ieee80211_hdr_3addr *nullfunc;\n2819:\t\tstruct ieee80211_if_managed *ifmgd = \u0026sdata-\u003eu.mgd;\n"
} |
| 77/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 49082 output: 41 thoughts: 40 Thoughts: Okay, here's my take on those thoughts, framed as my own mental process, given my expertise: **Checking `ieee80211_pspoll_get` for Potential Side Effects** Right, a potential issue just popped into my head regarding `ieee80211_pspoll_get`. I'm wondering if it might be zeroing out a crucial callback or data structure – likely a `cb` (callback) variable, but could be something else. This could have serious implications down the line, so I need to verify that quickly. No assumptions here; I need to drill down and examine the function's behavior. Time to look at the source for `ieee80211_pspoll_get` and see if it touches the `cb` in a way that could cause issues. It's the only way to be certain. Gotta be meticulous. Let's dig in. |
| 78/3 | 2026/08/13 22:36 | tool | grepper |
0mArgs:{
"Expression": "ieee80211_pspoll_get",
"PathPrefix": "net/mac80211/"
}Results: {
"Output": "net/mac80211/mlme.c=2796=void ieee80211_send_pspoll(struct ieee80211_local *local,\n--\nnet/mac80211/mlme.c-2801-\nnet/mac80211/mlme.c:2802:\tskb = ieee80211_pspoll_get(\u0026local-\u003ehw, \u0026sdata-\u003evif);\nnet/mac80211/mlme.c-2803-\tif (!skb)\n--\nnet/mac80211/tx.c=6097=EXPORT_SYMBOL(ieee80211_get_unsol_bcast_probe_resp_tmpl);\nnet/mac80211/tx.c-6098-\nnet/mac80211/tx.c:6099:struct sk_buff *ieee80211_pspoll_get(struct ieee80211_hw *hw,\nnet/mac80211/tx.c-6100-\t\t\t\t struct ieee80211_vif *vif)\n--\nnet/mac80211/tx.c-6131-}\nnet/mac80211/tx.c:6132:EXPORT_SYMBOL(ieee80211_pspoll_get);\nnet/mac80211/tx.c-6133-\n"
} |
| 79/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 49743 output: 41 thoughts: 33 Thoughts: Here's my take on the thought process, as requested: **Diving into `ieee80211_pspoll_get`** Okay, time to dig into the guts of this power save polling mechanism. Specifically, I'm thinking about `ieee80211_pspoll_get` – let's find that function within the `net/mac80211/tx.c` file. I need to understand exactly how this call functions within the transmit path, and how it interacts with other parts of mac80211. What exactly is the purpose and behavior of this function, within the context of 802.11 power saving and transmission? I'll probably be looking at its arguments, any internal data structures it touches, and where it's called from to get a handle on the overall process. Time to get some answers. |
| 80/3 | 2026/08/13 22:36 | tool | read-file |
0mArgs:{
"File": "net/mac80211/tx.c",
"FirstLine": 6099,
"LineCount": 40
}Results: {
"Contents": "6099:\tstruct sk_buff *ieee80211_pspoll_get(struct ieee80211_hw *hw,\n6100:\t\t\t\t\t struct ieee80211_vif *vif)\n6101:\t{\n6102:\t\tstruct ieee80211_sub_if_data *sdata;\n6103:\t\tstruct ieee80211_pspoll *pspoll;\n6104:\t\tstruct ieee80211_local *local;\n6105:\t\tstruct sk_buff *skb;\n6106:\t\n6107:\t\tif (WARN_ON(vif-\u003etype != NL80211_IFTYPE_STATION))\n6108:\t\t\treturn NULL;\n6109:\t\n6110:\t\tsdata = vif_to_sdata(vif);\n6111:\t\tlocal = sdata-\u003elocal;\n6112:\t\n6113:\t\tskb = dev_alloc_skb(local-\u003ehw.extra_tx_headroom + sizeof(*pspoll));\n6114:\t\tif (!skb)\n6115:\t\t\treturn NULL;\n6116:\t\n6117:\t\tskb_reserve(skb, local-\u003ehw.extra_tx_headroom);\n6118:\t\n6119:\t\tpspoll = skb_put_zero(skb, sizeof(*pspoll));\n6120:\t\tpspoll-\u003eframe_control = cpu_to_le16(IEEE80211_FTYPE_CTL |\n6121:\t\t\t\t\t\t IEEE80211_STYPE_PSPOLL);\n6122:\t\tpspoll-\u003eaid = cpu_to_le16(sdata-\u003evif.cfg.aid);\n6123:\t\n6124:\t\t/* aid in PS-Poll has its two MSBs each set to 1 */\n6125:\t\tpspoll-\u003eaid |= cpu_to_le16(1 \u003c\u003c 15 | 1 \u003c\u003c 14);\n6126:\t\n6127:\t\tmemcpy(pspoll-\u003ebssid, sdata-\u003edeflink.u.mgd.bssid, ETH_ALEN);\n6128:\t\tmemcpy(pspoll-\u003eta, vif-\u003eaddr, ETH_ALEN);\n6129:\t\n6130:\t\treturn skb;\n6131:\t}\n6132:\tEXPORT_SYMBOL(ieee80211_pspoll_get);\n6133:\t\n6134:\tstruct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw,\n6135:\t\t\t\t\t struct ieee80211_vif *vif,\n6136:\t\t\t\t\t int link_id, bool qos_ok)\n6137:\t{\n6138:\t\tstruct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);\n"
} |
| 81/3 | 2026/08/13 22:36 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 50782 output: 34 thoughts: 415 Thoughts: **My Concerns Regarding Potential Uninitialized Memory in IEEE 802.11 Power Save Handling** Right, let's see. `ieee80211_pspoll_get` allocates an `skb` with `dev_alloc_skb`. Okay, standard procedure. But wait a minute, I don't see any explicit zeroing of `skb->cb` in `ieee80211_pspoll_get`. Hmm, that's a potential issue. Looking further, in `ieee80211_send_pspoll`, we get the allocated `skb` and set the PS-Poll frame control bits. Then, there's this line: `IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;`. Ah, there it is. The use of `|=` suggests that `IEEE80211_SKB_CB(skb)->flags` might contain garbage data if it's not initialized. I need to figure out if `dev_alloc_skb` or something it calls handles the zeroing of `skb->cb`. I can quickly check, `dev_alloc_skb` calls `netdev_alloc_skb`, which calls `__netdev_alloc_skb`. Now, let's see, `alloc_skb` or `netdev_alloc_skb` don't seem to initialize `skb->cb`. I'd better confirm by going down to `__alloc_skb` in `net/core/skbuff.c` and confirm, yes, it does a `memset` up to `skb->tail` but it doesn't initialize `skb->cb`. I need to be sure that `skb->cb` is indeed part of `struct sk_buff`, so let me check the `struct sk_buff` definition in `include/linux/skbuff.h`. Okay, so I now understand this code has a potential memory safety issue that needs further investigation. |
| 82/3 | 2026/08/13 22:37 | tool | grepper |
0mArgs:{
"Expression": "char\\s+cb\\[",
"PathPrefix": "include/linux/skbuff.h"
}Results: {
"Output": "include/linux/skbuff.h=886=struct sk_buff {\n--\ninclude/linux/skbuff.h-918-\t */\ninclude/linux/skbuff.h:919:\tchar\t\t\tcb[48] __aligned(8);\ninclude/linux/skbuff.h-920-\n"
} |
| 83/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 51776 output: 33 thoughts: 17 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience, presented in the first person: **Navigating the `sk_buff` Structure** Alright, so I'm diving into the `sk_buff` struct again, trying to get my bearings. Let me get a fix on where `cb` is located within it. Need to refresh my memory, you know how these things go. Always useful to remember the offsets and associated fields. I'm thinking I'll start with the standard definitions, probably the core header files where `sk_buff` is declared. From there, I'll need to remember any compiler flags or configuration options that could impact its layout, especially if any specific network card drivers or protocol implementations are involved. Let's see if this rings any bells. |
| 84/3 | 2026/08/13 22:37 | tool | grepper |
0mArgs:{
"Expression": "struct sk_buff \\{",
"PathPrefix": "include/linux/skbuff.h"
}Results: {
"Output": "include/linux/skbuff.h=728=enum skb_tstamp_type {\n--\ninclude/linux/skbuff.h-885-\ninclude/linux/skbuff.h:886:struct sk_buff {\ninclude/linux/skbuff.h-887-\tunion {\n"
} |
| 85/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 52082 output: 36 thoughts: 21 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving into the Kernel's Network Plumbing** Okay, time to get my hands dirty. I'm going to drill down into the core of the Linux networking stack, starting with the very foundation: the `struct sk_buff`. I need a refresher on the data structure that represents the fundamental unit of data transfer in the kernel. I'm heading directly to `include/linux/skbuff.h`. No fluff, straight to the source. Let's see how the packet is actually represented at the lowest level. I'm expecting to find the key fields here: data pointers, metadata, counters, control flags, and perhaps some architecture-specific considerations. I'm interested in how it manages memory, its relationship to the various network headers, and how it is used internally, by the lower layers. Time to dig in and remind myself of the details. |
| 86/3 | 2026/08/13 22:37 | tool | read-file |
0mArgs:{
"File": "include/linux/skbuff.h",
"FirstLine": 886,
"LineCount": 40
}Results: {
"Contents": " 886:\tstruct sk_buff {\n 887:\t\tunion {\n 888:\t\t\tstruct {\n 889:\t\t\t\t/* These two members must be first to match sk_buff_head. */\n 890:\t\t\t\tstruct sk_buff\t\t*next;\n 891:\t\t\t\tstruct sk_buff\t\t*prev;\n 892:\t\n 893:\t\t\t\tunion {\n 894:\t\t\t\t\tstruct net_device\t*dev;\n 895:\t\t\t\t\t/* Some protocols might use this space to store information,\n 896:\t\t\t\t\t * while device pointer would be NULL.\n 897:\t\t\t\t\t * UDP receive path is one user.\n 898:\t\t\t\t\t */\n 899:\t\t\t\t\tunsigned long\t\tdev_scratch;\n 900:\t\t\t\t};\n 901:\t\t\t};\n 902:\t\t\tstruct rb_node\t\trbnode; /* used in netem, ip4 defrag, and tcp stack */\n 903:\t\t\tstruct list_head\tlist;\n 904:\t\t\tstruct llist_node\tll_node;\n 905:\t\t};\n 906:\t\n 907:\t\tstruct sock\t\t*sk;\n 908:\t\n 909:\t\tunion {\n 910:\t\t\tktime_t\t\ttstamp;\n 911:\t\t\tu64\t\tskb_mstamp_ns; /* earliest departure time */\n 912:\t\t};\n 913:\t\t/*\n 914:\t\t * This is the control buffer. It is free to use for every\n 915:\t\t * layer. Please put your private variables there. If you\n 916:\t\t * want to keep them across layers you have to do a skb_clone()\n 917:\t\t * first. This is owned by whoever has the skb queued ATM.\n 918:\t\t */\n 919:\t\tchar\t\t\tcb[48] __aligned(8);\n 920:\t\n 921:\t\tunion {\n 922:\t\t\tstruct {\n 923:\t\t\t\tunsigned long\t_skb_refdst;\n 924:\t\t\t\tvoid\t\t(*destructor)(struct sk_buff *skb);\n 925:\t\t\t};\n"
} |
| 87/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 52894 output: 35 thoughts: 69 Thoughts: Here's my summary, as if I were thinking these things: **Kernel Memory Allocation Puzzle** Okay, so I'm trying to figure something out about this memory layout. I'm seeing `cb` and then `tail`... it seems like `cb` comes before `tail` in the structure. Hmm, that's interesting. I need to keep that in mind. Wait a second, there's a `memset` being called in `__alloc_skb`: ```c memset(skb, 0, offsetof(struct sk_buff, tail)); ``` Aha! This is it. That `offsetof(struct sk_buff, tail)` gives me the offset of the `tail` pointer within the `sk_buff` struct. And that `memset` is zeroing out memory up to that `tail` member. That likely includes `cb`. I should check the code for that `__alloc_skb` function in `net/core/skbuff.c` to confirm my suspicion and see the exact memory layout of this data structure. |
| 88/3 | 2026/08/13 22:37 | tool | grepper |
0mArgs:{
"Expression": "memset\\(skb, 0",
"PathPrefix": "net/core/skbuff.c"
}Results: {
"Output": "net/core/skbuff.c=316=static inline void skbuff_clear(struct sk_buff *skb)\nnet/core/skbuff.c-317-{\nnet/core/skbuff.c:318:\t/* Replace memset(skb, 0, offsetof(struct sk_buff, tail))\nnet/core/skbuff.c-319-\t * with two smaller memset(), with a barrier() between them.\n--\nnet/core/skbuff.c-322-\tBUILD_BUG_ON(offsetof(struct sk_buff, tail) \u003c= 128);\nnet/core/skbuff.c:323:\tmemset(skb, 0, 128);\nnet/core/skbuff.c-324-\tbarrier();\n"
} |
| 89/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 53432 output: 36 thoughts: 10 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience, presented in the first person: **Analyzing the `skbuff_clear` Function** Alright, let's dive into this. The initial thought here, "Let's read `skbuff_clear`," indicates a need to understand the mechanics of that specific function. My immediate assumption is that we are looking at something related to the Linux kernel's networking stack, given the `skbuff` prefix. I'm already anticipating we'll be dealing with the core structure used for managing network packets – the `sk_buff` structure itself. The goal is likely to deconstruct its operation; to understand precisely what happens when an `skbuff` instance is "cleared." This could involve zeroing out memory, releasing associated resources like data buffers and metadata, possibly updating internal flags, and maybe even returning the `skbuff` to a pool for reuse. The specifics are key here. I'll need to look for calls to functions like `kfree_skb`, `skb_release_data`, any manipulation of `data`, `tail`, `len`, `head`, `next`, `prev` pointers, and anything related to reference counting. My primary focus will be on ensuring efficient resource management and preventing memory leaks or use-after-free scenarios. I'll also be watching for any potential race conditions if this function is called concurrently in a multi-threaded context. A clear understanding of how `skbuff_clear` interacts with the underlying memory management and interrupt contexts will be crucial. I'll be looking for comments within the code, and maybe also any related documentation, to understand the rationale behind the chosen implementation, particularly if any optimizations are employed. |
| 90/3 | 2026/08/13 22:37 | tool | read-file |
0mArgs:{
"File": "net/core/skbuff.c",
"FirstLine": 316,
"LineCount": 20
}Results: {
"Contents": " 316:\tstatic inline void skbuff_clear(struct sk_buff *skb)\n 317:\t{\n 318:\t\t/* Replace memset(skb, 0, offsetof(struct sk_buff, tail))\n 319:\t\t * with two smaller memset(), with a barrier() between them.\n 320:\t\t * This forces the compiler to inline both calls.\n 321:\t\t */\n 322:\t\tBUILD_BUG_ON(offsetof(struct sk_buff, tail) \u003c= 128);\n 323:\t\tmemset(skb, 0, 128);\n 324:\t\tbarrier();\n 325:\t\tmemset((void *)skb + 128, 0, offsetof(struct sk_buff, tail) - 128);\n 326:\t}\n 327:\t\n 328:\t/**\n 329:\t * napi_skb_cache_get_bulk - obtain a number of zeroed skb heads from the cache\n 330:\t * @skbs: pointer to an at least @n-sized array to fill with skb pointers\n 331:\t * @n: number of entries to provide\n 332:\t *\n 333:\t * Tries to obtain @n \u0026sk_buff entries from the NAPI percpu cache and writes\n 334:\t * the pointers into the provided array @skbs. If there are less entries\n 335:\t * available, tries to replenish the cache and bulk-allocates the diff from\n"
} |
| 91/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 54233 output: 30 thoughts: 50 Thoughts: Okay, here's my interpretation of those thoughts, presented as my own mental process: **Diving into the Packet Buffer** Alright, I'm looking at this `skb` and it seems to have been initialized, with data up to the `tail` pointer all cleared. Good start. Now, the question is, where's `cb` in relation to that `tail`? It seems logically placed *before* the tail in the context of what I'm looking at. But I should confirm the arrangement, just to be absolutely certain. Let me just quickly verify the memory layout, especially where `tail` is positioned within the `sk_buff` struct, to solidify this understanding. No need to take anything for granted. |
| 92/3 | 2026/08/13 22:37 | tool | grepper |
0mArgs:{
"Expression": "tail;",
"PathPrefix": "include/linux/skbuff.h"
}Results: {
"Output": "include/linux/skbuff.h=886=struct sk_buff {\n--\ninclude/linux/skbuff.h-1091-\t/* These elements must be at the end, see alloc_skb() for details. */\ninclude/linux/skbuff.h:1092:\tsk_buff_data_t\t\ttail;\ninclude/linux/skbuff.h-1093-\tsk_buff_data_t\t\tend;\n--\ninclude/linux/skbuff.h=2716=static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)\ninclude/linux/skbuff.h-2717-{\ninclude/linux/skbuff.h:2718:\treturn skb-\u003ehead + skb-\u003etail;\ninclude/linux/skbuff.h-2719-}\n--\ninclude/linux/skbuff.h=2733=static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)\ninclude/linux/skbuff.h-2734-{\ninclude/linux/skbuff.h:2735:\treturn skb-\u003etail;\ninclude/linux/skbuff.h-2736-}\n--\ninclude/linux/skbuff.h=2913=static inline int skb_tailroom(const struct sk_buff *skb)\ninclude/linux/skbuff.h-2914-{\ninclude/linux/skbuff.h:2915:\treturn skb_is_nonlinear(skb) ? 0 : skb-\u003eend - skb-\u003etail;\ninclude/linux/skbuff.h-2916-}\n"
} |
| 93/3 | 2026/08/13 22:37 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 54880 output: 297 thoughts: 1709 Thoughts: **Analysis of the rtw88 USB Driver Patch and Its KMSAN Implications** Alright, let's break this down. My initial thought is: `tail` is indeed at the end of `struct sk_buff`. Okay, so `cb` within `sk_buff` is zeroed when the `skb` is allocated. That means `info->flags` is initialized to 0 upon allocation, which means whenever `IEEE80211_SKB_CB(skb)->flags |= ...` executes, it's operating on a zero-initialized value. Thus, `info->flags` should always be fully initialized. Now, wait a moment. Are there any possible paths where `skb->cb` gets reused without re-zeroing? If an `skb` is reused—say, in a loopback or forwarded scenario—could the `cb` potentially hold old, stale data? Ah, but in mac80211, when an `skb` is received and then forwarded (like in mesh), `ieee80211_rx_mesh_data` *does* zero the `cb`: `memset(info, 0, sizeof(*info));`. What about *other* reuse cases? If it's cloned, the `cb` is copied. If it's pulled from a cache, `skbuff_clear` is called during allocation which means `cb` is always zeroed during allocation. Okay, mac80211 zeroes it when it reuses an skb for TX (e.g., forwarding). So the patch changes the logic for queue selection from a hardcoded value to an expression accessing `info->flags` and `skb->priority`. Both of those are fields of `skb`'s control block, `cb`. Since `skb` is allocated and zeroed, `info->flags` and `skb->priority` are initialized, so there isn't uninitialized memory read here. The bug this patch fixes is, I think, a functional bug. Broadcast/multicast packets were always being sent with a high priority; this patch properly uses `skb->priority` unless they *need* to be sent after a DTIM. This is definitely a logic issue, a functional bug, not an uninitialized memory read. Let's quickly check the commit message or related patches to confirm. Yep, the patch is about broadcast/multicast queue selection. Before, broadcast/multicast packets were *always* mapped to `TX_DESC_QSEL_HIGH`. Now, they are mapped to `TX_DESC_QSEL_HIGH` only if `IEEE80211_TX_CTL_SEND_AFTER_DTIM` is set in `info->flags`; otherwise, `skb->priority` is used. Purely a logic change for QoS/queue mapping. It's not exposing uninitialized memory. KASAN and other detectors wouldn't catch it because it's a functional bug, possibly causing packet drops or reordering, or breaking mac80211 tests. Wait, could `info->flags` have been uninitialized and KMSAN would've caught it? No, we just proved that `skb->cb` is zeroed on allocation, and mac80211 zeros it when it reuses skbs for TX, so it's always initialized. Let me double-check. Is there *any* scenario where `skb->cb` is *not* zeroed? In `net/core/skbuff.c`, `__alloc_skb` calls `skbuff_clear(skb)`, which zeroes up to `tail`. `skb_clone` copies `cb`. `skb_copy` copies `cb`. So `cb` is *always* initialized. Okay, let me trace `rtw_usb_tx_queue_mapping_to_qsel`. Is it called anywhere else? Only in `rtw_usb_tx_write`. `rtw_usb_tx_write` is called via `rtw_hci_tx_write`. `rtw_hci_tx_write` is called in `rtw_tx` and `rtw_txq_push_skb`, both are part of the TX path from mac80211. In all these paths, `skb` comes from mac80211, where `cb` is initialized. Therefore, this patch does *not* introduce or expose uninitialized memory risks. It's a functional fix. There's no need for a KMSAN session. Let me review the KMSAN rules: 1. Kernel structures to user space - nope. 2. Conditional logic on uninitialized vars - We have this, but... 3. Complex allocations - nope. |
| 94/3 | 2026/08/13 22:37 | tool | set-results |
0mArgs:{
"KMSANReasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB driver. It replaces a hardcoded queue selection with a conditional branch that checks `info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM`, where `info` is the mac80211 TX control block (`IEEE80211_SKB_CB(skb)`).\n\nWhile this introduces a new conditional branch based on a struct field, the `skb-\u003ecb` control block is guaranteed to be initialized. Network socket buffers (`struct sk_buff`) have their control block (`cb`) zeroed upon allocation in the core network stack (via `skbuff_clear()` in `__alloc_skb()`). Furthermore, the mac80211 subsystem explicitly clears or populates the `cb` fields when reusing or forwarding skbs (e.g., `memset(info, 0, sizeof(*info))`).\n\nTherefore, `info-\u003eflags` is fully initialized and does not pose an uninitialized memory risk. The patch fixes a functional/QoS bug regarding packet prioritization, rather than a memory safety issue. Standard KASAN and other bug detectors are sufficient for this code, and a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
}Results: {
"KMSANReasoning": "The patch modifies the queue selection logic for broadcast and multicast packets in the Realtek rtw88 USB driver. It replaces a hardcoded queue selection with a conditional branch that checks `info-\u003eflags \u0026 IEEE80211_TX_CTL_SEND_AFTER_DTIM`, where `info` is the mac80211 TX control block (`IEEE80211_SKB_CB(skb)`).\n\nWhile this introduces a new conditional branch based on a struct field, the `skb-\u003ecb` control block is guaranteed to be initialized. Network socket buffers (`struct sk_buff`) have their control block (`cb`) zeroed upon allocation in the core network stack (via `skbuff_clear()` in `__alloc_skb()`). Furthermore, the mac80211 subsystem explicitly clears or populates the `cb` fields when reusing or forwarding skbs (e.g., `memset(info, 0, sizeof(*info))`).\n\nTherefore, `info-\u003eflags` is fully initialized and does not pose an uninitialized memory risk. The patch fixes a functional/QoS bug regarding packet prioritization, rather than a memory safety issue. Standard KASAN and other bug detectors are sufficient for this code, and a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|