Linux下基于USB的WiFi(RTL8723DU):驱动、wpa_supplicant配置、hostapd配置等
1 WiFi基本概念
WLAN(Wireless LAN)是无线局域网的意思。
IEEE 802.11是现今无线局域网通用的标准。
关于802.11协议介绍参考《802 11协议介绍》。
信道也就是频段,是以无线信号作为传输载体的数据信号传送通道。802.11 工作组划分了4个独立的频段:2.4 GHz、3.6 GHz、4.9 GHz 和 5.8 GHz,每个频段又划分为若干信道。
信号强度:Wi-Fi 采用db, dbm 衡量信号强度的好坏, 数值越大, 信号强度越好。
WiFi加密方式主要有:WEP(Wired Equivalent Privacy,有线等效保密)、WPA(Wi-Fi Procted Access)、WPA2-PSK(Pre-Shared Key,PSK,又称为个人模式)、WPA3。
关于WEP/WPA/WPA2/WPA3的更详细对比参考《WPA2与 WPA3》。
工作站(Station):无线终端设备。
基站(Access Point):无线路由器。
SSID(Service Set Identifier)可以将一个WiFi分为几个需要不同身份验证的子网络,每一个子网络都需要独立的身份验证,只有通过身份验证的用户才可以进入相应的子网络,防止未被授权的用户进入本网络。
BSSID(Basic SSID)一种特殊的Ad-hoc LAN的应用,也称为Basic Service Set (BSS),一群计算机设定相同的BSS名称,即可自成一个group。每个BSS都会被赋予一个BSSID,它是一个长度为48位的二进制标识符,用来识别不同的BSS。其的主要优点是它可以作为过滤之用。
ACS(Automatic Channel Selection):即自动信道选择,允许无线接入点(AP)或无线路由器自动选择最佳的信道来操作,以减少干扰并提高网络性能。
EAP(Extensible Authentication Protocol)是一种在无线网络中进行身份验证的协议。
RADIUS(Remote Authentication Dial-In User Service)是一种网络传输协议,用于在计算机网络中进行用户认证、授权和账户管理。
WPS(Wi-Fi Protected Setup)是一个无线网络安全标准,旨在让家庭用户使用无线网络时简化加密步骤。
WPA3(Wi-Fi Protected Access)有WPA、WPA2和WPA3三个标准,是一种保护Wi-Fi安全的系统,它是应研究者在前一代的系统有线等效加密(WEP)中找到的几个严重的弱点而产生的。
nl80211是一个基于Netlink协议的用户空间协议,用于对无线设备进行配置管理。
mac80211是一个提供给驱动程序开发者的框架,用于编写支持软件MAC(SoftMAC)无线设备的驱动程序。
参考《玩转「Wi-Fi」系列之基本概念(一)-CSDN博客》《玩转「Wi-Fi」系列之名词解读(二)-CSDN博客》。
2 BT/WiFi原理图
3 WiFi dts
wireless_wlan: wireless-wlan { compatible = "wlan-platdata"; wifi_chip_type = "ap6398s"; pinctrl-names = "default"; pinctrl-0 = <&wifi_host_wake_irq>; WIFI,host_wake_irq = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>; // WIFI,poweren_gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; status = "okay"; };
4 WLAN驱动
RTL8723DU驱动依赖于USB Subsystem和Networking Subsystem,将USB外设注册成网络设备;然后注册rfkill设备。
4.1 RFKILL设备驱动
rfkill_rk_init主要处理wlan相关的rfkill设备:
rfkill_rk_init
rfkill_wlan_init
rfkill_wlan_driver
rfkill_wlan_probe
class_register--注册rkwifi类,创建属性节点wifi_bt_vbat/wifi_power/wifi_set_carddetect。
wlan_platdata_parse_dt--解析dts内容,填充struct rksdmmc_gpio_wifi_moudle。
wake_lock_init
rfkill_set_wifi_bt_power
fb_register_client--注册fb设备的notifier为rfkill_wlan_fb_notifier。
rfkill_wlan_fb_event_notify--根据blank_mode进行early_suspend/later_resume操作。
rfkill_rk_driver
rfkill_rk_probe
proc_create
rfkill_rk_setup_gpio
wake_lock_init
rfkill_rk_setup_wake_irq
rfkill_alloc--分配wlan的rfkill设备,操作函数集为rfkill_rk_ops。
rfkill_init_sw_state
rfkill_set_sw_state
rfkill_set_hw_state
rfkill_register--注册wlan相关rfkill到rfkill子系统。
4.2 WLAN设备驱动
Realtek Wireless驱动入口为rtw_drv_entry:
- 给WiFi上电。
- 分配wakelock。
- 创建Netlink Family。
- 注册Netdevice/inet/inet6 Notifier。
- 注册USB设备驱动。
rtw_drv_entry
platform_wifi_power_on
rtw_suspend_lock_init
wake_lock_init--创建几个wakelock。
rtw_drv_proc_init
rtw_proc_create_dir--每个进程创建/proc/xxx/net/rtl8723du目录。
rtw_proc_create_entry--每个进程在/proc/xxx/net/rtl8723du下创建一系列procfs节点。
rtw_nlrtw_init
genl_register_family--注册一个通用Netlink家族。
rtw_ndev_notifier_register
register_netdevice_notifier
rtw_ndev_notifier_call
rtw_inetaddr_notifier_register
register_inetaddr_notifier
rtw_inetaddr_notifier_call
register_inet6addr_notifier
rtw_inet6addr_notifier_call
usb_register--注册RTW的usb驱动usb_drv.usbdrv。
RTW的USB驱动:
struct rtw_usb_drv usb_drv = {
.usbdrv.name = (char *)DRV_NAME,--驱动程序的名称,用于标识驱动。
.usbdrv.probe = rtw_drv_init,--当内核发现一个设备可能由这个驱动程序处理时,会调用这个函数。probe
函数负责初始化设备,如果初始化成功,它将返回0或一个负数(表示错误)。
.usbdrv.disconnect = rtw_dev_remove,--当USB设备从系统中断开连接时,会调用这个函数。它允许驱动程序进行清理工作,例如释放资源。
.usbdrv.id_table = rtw_usb_id_tbl,--一个指针数组,列出了这个驱动程序能够支持的设备ID。内核使用这个表来匹配连接的设备。
.usbdrv.suspend = rtw_suspend,--当系统进入挂起状态时,会调用这个函数,允许驱动程序保存状态或执行挂起操作。
.usbdrv.resume = rtw_resume,--当系统从挂起状态恢复时,会调用这个函数,允许驱动程序恢复其操作。
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
.usbdrv.reset_resume = rtw_resume,--如果设备需要重置后恢复,会调用这个函数。
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
.usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,--用于在驱动程序加载和卸载时执行额外的操作。
#else
.usbdrv.driver.shutdown = rtw_dev_shutdown,
#endif
};
struct usb_device_id
用于指定USB设备的识别信息。每个USB设备都有一个唯一的设备ID,包括供应商ID(Vendor ID,简称VID)和产品ID(Product ID,简称PID)。struct usb_device_id
结构体允许驱动程序定义它们能够支持的设备列表,内核使用这个列表来匹配连接到系统的设备。
struct usb_device_id {
__u16 match_flags;--这个字段定义了哪些字段需要匹配。例如,如果只关心供应商ID,可以设置相应的标志位来忽略产品ID的匹配。
__u16 idVendor;--供应商ID,是一个16位的值,用于唯一标识USB设备的制造商。
__u16 idProduct;--产品ID,也是一个16位的值,用于唯一标识特定供应商下的产品。
__u16 bcdDevice_lo;
__u16 bcdDevice_hi;--产品ID,用于唯一标识特定供应商下的产品。
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;--于匹配设备的类、子类和协议。如果驱动程序只关心特定的设备类,可以在match_flags
中设置相应的标志位。
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 bInterfaceNumber;
kernel_ulong_t driver_info--通常用于存储额外的信息,比如指向特定数据结构的指针,这些数据结构可以包含驱动程序需要的额外信息。
__attribute__((aligned(sizeof(kernel_ulong_t))));
};
USB VID/ID匹配表如下:
/* DID_USB_v916_20130116 */ static struct usb_device_id rtw_usb_id_tbl[] = { ... #ifdef CONFIG_RTL8723D /*=== Realtek demoboard ===*/ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xD723, 0xff, 0xff, 0xff), .driver_info = RTL8723D}, /* 8723DU 1*1 */ #endif... {} /* Terminating entry */ };
USB_DEVICE_AND_INTERFACE_INFO
是一个宏,用于在Linux内核的USB设备ID表中定义一个匹配特定设备和接口的条目。这个宏提供了一种方式来指定一个USB设备,不仅基于它的供应商ID和产品ID,还基于它的接口类、子类和协议。
#define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, cl, sc, pr) \ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ | USB_DEVICE_ID_MATCH_DEVICE, \ .idVendor = (vend), \ .idProduct = (prod), \ .bInterfaceClass = (cl), \ .bInterfaceSubClass = (sc), \ .bInterfaceProtocol = (pr)
- USB_VENDER_ID_REALTEK是供应商ID。
- 0xD723是产品ID。
- 0xff表示接口类、子类和协议的匹配是“don't care”(不关心),即这些字段不用于匹配。如果你想要指定特定的接口类、子类或协议,可以在这里填入相应的值。
rtw_drv_init初始化USB WLAN设备:
rtw_drv_init
rtw_os_ndevs_init
rtw_os_ndevs_alloc
rtw_os_ndevs_register
rtw_os_ndev_register
netdev_set_default_ethtool_ops--设置ethtool_ops成员为rtw_ethtools_ops。
rtw_init_netdev_name--设置netdev名称。
register_netdevice
5 wpa_supplicant启动
S79wifiblue加载Realtek Wireless驱动:
#!/bin/sh MODULE1="/usr/local/modules/8723du.ko" MODULE2="/usr/local/modules/rtk_btusb.ko" load_modules() { echo "Loading modules..." if [ -f "$MODULE1" ]; then insmod "$MODULE1" else echo "Module $MODULE1 not found!" fi if [ -f "$MODULE2" ]; then insmod "$MODULE2" else echo "Module $MODULE2 not found!" fi } unload_modules() { echo "Unloading modules..." rmmod "8723du" 2>/dev/null rmmod "rtk_btusb" 2>/dev/null } case "$1" in start) load_modules ;; stop) unload_modules ;; restart) unload_modules load_modules ;; status) echo "Checking module status..." lsmod | grep -q "8723du" && echo "8723du is loaded." || echo "8723du is not loaded." lsmod | grep -q "rtk_btusb" && echo "rtk_btusb is loaded." || echo "rtk_btusb is not loaded." ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0
S99wpa_supplicant启动wpa_supplicant:
#!/bin/sh DAEMON=/usr/sbin/wpa_supplicant DAEMON_NAME=wpa_supplicant DAEMON_PID=/var/run/wpa_supplicant.pid DAEMON_OPTS="-B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -P $DAEMON_PID" DESC="WPA supplicant" NAME=wpa_supplicant do_start() { echo "Starting wpa_supplicant" start-stop-daemon --start --quiet --exec $DAEMON -- \ $DAEMON_OPTS echo $? } do_stop() { echo "Stopping wpa_supplicant" start-stop-daemon --stop --quiet --name $DAEMON_NAME echo $? } case "$1" in start) do_start ;; stop) do_stop ;; status) status_of_proc -p $DAEMON_PID $DAEMON_NAME wpa_supplicant && exit 0 || exit $? ;; restart|force-reload) do_stop do_start ;; try-restart|reload) do_stop sleep 1 do_start ;; *) echo "Usage: $0 {start|stop|status|restart|try-restart|force-reload}" exit 1 ;; esac exit 0
6 WiFi相关工具
玩转「Wi-Fi」系列之测试工具(三)_wifi analyzer 3.11.2-CSDN博客
6.1 wap_supplicant/wpa_cli配置网络
WPA(WiFi Protected Access)是WiFi安全访问的意思,WPA是一种基于标准的可互操作的WLAN安全性增强解决方案。wpa_supplicant死一个独立守护进程,是WPA的应用层认证客户端,负责完成认证相关的登录,加密等工作。其核心是一个消息循环,再消息循环中处理WPA状态机,控制命令,驱动事件,配置信息等。wpa_cli是wpa_supplicant客户端,负责发起搜索,设置和连接网络等。
6.1.1 启动wpa_supplicant守护进程
wpa_supplicant使用说明:
drivers: nl80211 = Linux nl80211/cfg80211 options: -b = optional bridge interface name -B = run daemon in the background--作为后台守护进程运行。 -c = Configuration file--配置文件路径。 -C = ctrl_interface parameter (only used if -c is not) -d = increase debugging verbosity (-dd even more) -D = driver name (can be multiple drivers: nl80211,wext) -e = entropy file -f = log output to debug file instead of stdout -g = global ctrl_interface -G = global ctrl_interface group -h = show this help text -i = interface name--指定网络设备接口。 -I = additional configuration file -K = include keys (passwords, etc.) in debug output -L = show license (BSD) -m = Configuration file for the P2P Device interface -M = start describing new matching interface -N = start describing new interface -o = override driver parameter for new interfaces -O = override ctrl_interface parameter for new interfaces -p = driver parameters -P = PID file -q = decrease debugging verbosity (-qq even less) -t = include timestamp in debug messages -v = show version -W = wait for a control interface monitor before starting example: wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
wap_supplicant启动实例:
wpa_supplicant -B -i wlan0 -c /userdata/cfg/wpa_supplicant.conf
wpa_supplicant.conf内容如下:
ctrl_interface=/var/run/wpa_supplicant update_config=1--必须设置为1,wpa_cli才能使用save_config命令。 ap_scan=1 network={ key_mgmt=NONE }
6.1.2 wpa_cali连接WiFi网络
测试wpa_cli到wpa_supplicant连接:
wpa_cli -i wlan0 ping
PONG
搜索附件wifi热点:
wpa_cli -i wlan0 scan
OK
显示wifi热点搜索结果:
wpa_cli -i wlan0 scan_result bssid / frequency / signal level / flags / ssid 30:37:b3:12:43:7c 2462 -60 [WPA2-PSK-CCMP+TKIP][WPS][ESS] ChinaNet-6wrz b4:89:01:a2:3f:f4 2437 -65 [WPA2-PSK-CCMP+TKIP][WPS][ESS] ChinaNet-6wrz 14:d8:64:36:f3:2b 2437 -76 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] MCC17-AP 3c:bc:d0:81:0c:e0 2462 -82 [WPA2-PSK-CCMP][ESS] ChinaNet-PTUA b8:0b:da:36:fe:45 2412 -84 [ESS] midea_fc_3368
当前WPA/EAPOL/EAP通讯状态:
wpa_cli -i wlan0 status bssid=b8:0b:da:37:0b:b5 freq=2412 ssid=midea_fc_2059 id=0 mode=station wifi_generation=4 pairwise_cipher=NONE group_cipher=NONE key_mgmt=NONE wpa_state=COMPLETED ip_address=192.168.1.3 p2p_device_address=14:f5:f9:f9:35:88 address=14:f5:f9:f9:35:88 uuid=3714420a-ad12-54c5-9a75-7de37413f93c
查看当前连接的是哪个网络:
wpa_cli -i wlan0 list_network network id / ssid / bssid / flags 0 any [CURRENT]
获取一个存储wifi结构的id,初始值为1:
wpa_cli -i wlan0 add_network 1
设置ID为1的热点SSID:
wpa_cli -i wlan0 set_network 1 ssid '"<ssid>"' OK
设置ID为1的热点的密码:
wpa_cli -i wlan0 set_network 1 psk '"<psk>"' OK
设置当前网络优先级,默认为2:
wpa_cli -i wlan0 set_network 1 priority 2 OK
设置ssid默认为1
wpa_cli -i wlan0 set_network 1 scan_ssid 1 OK
启动连接ID为1的网络:
wpa_cli -i wlan0 enable_network 1 OK
选择网络1:
wpa_cli -i wlan0 select_network 1
OK
wpa_supplicant.conf中必须设置update_config=1。保存网络配置:
wpa_cli -i wlan0 save_config
OK
保存结果:
ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ key_mgmt=NONE disabled=1 } network={ ssid="<ssid>" psk="<psk>" }
比较精简的连接配置:
wpa_supplicant -B -i wlan0 -c /wpa_supplicant.conf wpa_cli -i wlan0 scan wpa_cli -i wlan0 add_network wpa_cli -i wlan0 set_network 1 ssid '"<ssid>"' wpa_cli -i wlan0 set_network 1 psk '"<psk>"' wpa_cli -i wlan0 enable_network 1 wpa_cli -i wlan0 select_network 1
wpa_cli -i wlan0 save_config
更多参考:《wpa_supplicant详解》《wiFI基础知识----wpa_supplicant_gege_hxg的博客-CSDN博客》《玩转「Wi-Fi」系列之wpa_supplicant 介绍(七) - 简书 (jianshu.com)》。
6.2 iwlist/iwconfig
iwlist查看WiFi接口的详细信息,比如扫描:
iwlist wlan0 scan wlan0 Scan completed : ... Cell 02 - Address: B8:0B:DA:37:0B:B5 ESSID:"midea_fc_2059" Protocol:IEEE 802.11bgn Mode:Master Frequency:2.412 GHz (Channel 1) Encryption key:off Bit Rates:65 Mb/s Quality=20/100 Signal level=15/100 Extra:fm=0003 ...
iwconfig用于配置WiFi接口:
查看特定无线接口的状态 (例如接口名为 wlan0):
iwconfig wlan0
扫描无线网络 (显示可用的无线网络列表):
iwconfig wlan0 scan
设置无线接口的模式 (例如将 wlan0 设置为管理模式):
iwconfig wlan0 mode Managed
设置无线接口的加密方式 (例如为 wlan0 设置WEP加密):
iwconfig wlan0 enc on
设置无线接口的ESSID (连接到特定的无线网络):
iwconfig wlan0 essid "your_network_name"
WiFi开发相关的基础工具:iwconfig、iwlist、wpa_supplicant、hostapd(详解)-CSDN博客
6.3 iw
查看无线接口的当前状态 (包括连接状态、加密方式等):
iw dev wlan0 link
扫描附近的无线网络 (列出所有可扫描到的无线网络):
iw dev wlan0 scan
查看无线接口的详细信息 (包括支持的频率、信道、加密方式等):
iw dev wlan0 info
设置无线接口的模式 (例如,将 wlan0 设置为管理模式):
iw dev wlan0 set type managed
连接到一个无线网络 (指定 SSID 和加密方式):
iw dev wlan0 connect "your_ssid" type managed key s:"your_passphrase"
断开与无线网络的连接:
iw dev wlan0 disconnect
设置无线接口的信道或频率 (例如,设置信道为 36):
iw dev wlan0 set freq 5180
设置无线接口的MTU (最大传输单元):
iw dev wlan0 set mtu 1500
启用或禁用无线接口的功率保存模式:
iw dev wlan0 set power save on # 启用功率保存
iw dev wlan0 set power save off # 禁用功率保存
设置无线接口的MAC地址:
iw dev wlan0 set address 00:11:22:33:44:55
获取无线接口的统计信息 (例如,接收和发送的包的数量):
iw dev wlan0 link
6.4 hostapd
《en:users:documentation:hostapd》:hostapd介绍、配置等。《Linux hostapd (Linux Wireless 文档翻译)》是前文的翻译。
《【WiFi】Hostapd工作流程分析》:关于hostapd架构图、以及wpa_supplicant/hostapd及内核相关网络知识。
hostapd
实现了IEEE 802.11标准中的无线接入点(AP)和认证服务器的功能。以下是hostapd
的一些主要作用:
- 无线接入点(AP):
hostapd
可以让您将无线网卡配置为AP模式,从而允许其他无线设备连接到您的网络。 - 支持多种认证协议:它支持WEP、WPA、WPA2等多种认证协议,提供不同级别的安全性。
- 配置灵活:通过配置文件,您可以灵活地设置网络的SSID、信道、加密方式等参数。
- 与其他服务集成:
hostapd
可以与DHCP服务器(如udhcpd
或dnsmasq
)集成,为连接的设备自动分配IP地址。
创建/etc/hostapd/hostapd.conf配置文件:
interface=wlan0 ssid=arnoldlu hw_mode=g channel=6 wmm_enabled=0 macaddr_acl=0 auth_algs=1 wpa=2 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
创建启动hostapd守护进程脚本/etc/init.d/S99hostapd:
#!/bin/sh NAME=hostapd DAEMON=/usr/sbin/$NAME DAEMON_ARGS="/etc/hostapd/hostapd.conf" # Add any hostapd startup arguments here PIDFILE=/var/run/$NAME.pid export PATH=/sbin:/usr/sbin:/bin:/usr/bin start() { echo "Starting hostapd..." start-stop-daemon --start --quiet --exec $DAEMON -- \ -P $PIDFILE -B -- \ $DAEMON_ARGS } stop() { echo "Stopping hostapd..." start-stop-daemon --stop --quiet --pidfile $PIDFILE } status() { echo "Checking hostapd status..." start-stop-daemon --status --quiet --pidfile $PIDFILE } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
6.5 connman
参考《网络连接管理Connection Manager(connman)记录》。
7 WiFi相关调试节点
7.1 /proc/net/wireless
包含了系统中所有无线接口的统计信息摘要。每行代表一个接口,显示了接收和发送的包、错误、丢弃的包等信息。
net_dev_init
dev_proc_init
register_pernet_subsys--创建dev_proc_ops。
dev_proc_net_init
wext_proc_init
proc_create_net--创建/proc/net/wireless节点,操作函数集为wireless_seq_ops。
wireless_dev_seq_show
wireless_seq_printf_stats
7.2 /sys/class/net/wlan0
/sys/class/net/wlan0 |-- addr_assign_type |-- addr_len |-- address |-- broadcast |-- carrier |-- carrier_changes |-- carrier_down_count |-- carrier_up_count |-- dev_id |-- dev_port |-- device -> ../../../2-1.1:1.2 |-- dormant |-- duplex |-- flags |-- gro_flush_timeout |-- ifalias |-- ifindex |-- iflink |-- link_mode |-- mtu |-- name_assign_type |-- napi_defer_hard_irqs |-- netdev_group |-- operstate |-- phy80211 -> ../../ieee80211/phy0 |-- phys_port_id |-- phys_port_name |-- phys_switch_id |-- power |-- proto_down |-- queues | |-- rx-0 | | |-- rps_cpus | | `-- rps_flow_cnt ... | |-- tx-0 | | |-- byte_queue_limits | | | |-- hold_time | | | |-- inflight | | | |-- limit | | | |-- limit_max | | | `-- limit_min | | |-- traffic_class | | |-- tx_maxrate | | |-- tx_timeout | | |-- xps_cpus | | `-- xps_rxqs ... |-- speed |-- statistics | |-- collisions | |-- multicast | |-- rx_bytes | |-- rx_compressed | |-- rx_crc_errors | |-- rx_dropped | |-- rx_errors | |-- rx_fifo_errors | |-- rx_frame_errors | |-- rx_length_errors | |-- rx_missed_errors | |-- rx_nohandler | |-- rx_over_errors | |-- rx_packets | |-- tx_aborted_errors | |-- tx_bytes | |-- tx_carrier_errors | |-- tx_compressed | |-- tx_dropped | |-- tx_errors | |-- tx_fifo_errors | |-- tx_heartbeat_errors | |-- tx_packets | `-- tx_window_errors |-- subsystem -> ../../../../../../../../../class/net |-- testing |-- tx_queue_len |-- type |-- uevent `-- wireless
7.3 USB相关sysfs
|-- 2-1.1:1.0 |-- 2-1.1:1.1 |-- 2-1.1:1.2 | |-- ep_05 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type---Bulk类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ep_06 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type--Bulk类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ep_08 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type--Bulk类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ep_09 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type--Bulk类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ep_84 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type--Bulk类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ep_87 | | |-- bEndpointAddress | | |-- bInterval | | |-- bLength | | |-- bmAttributes | | |-- direction | | |-- interval | | |-- power | | |-- type--Interrupt类型。 | | |-- uevent | | `-- wMaxPacketSize | |-- ieee80211--802.11设备。 | | `-- phy0 | | |-- address_mask | | |-- addresses | | |-- device -> ../../../2-1.1:1.2 | | |-- index | | |-- macaddress | | |-- name | | |-- power | | |-- rfkill1--WiFi的RFKILL设备。 | | | |-- device -> ../../phy0 | | | |-- hard | | | |-- index | | | |-- name | | | |-- persistent | | | |-- power | | | |-- soft | | | |-- state | | | |-- subsystem -> ../../../../../../../../../../class/rfkill | | | |-- type | | | `-- uevent | |-- interface | |-- modalias | |-- net--网络设备。 | |-- power | |-- subsystem -> ../../../../../../../bus/usb | |-- supports_autosuspend | |-- uevent |-- ep_00