LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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博客

玩转「Wi-Fi」系列之常用命令(四)-CSDN博客

玩转「Wi-Fi」系列之应用程序(五)-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的一些主要作用:

  1. 无线接入点(AP):hostapd 可以让您将无线网卡配置为AP模式,从而允许其他无线设备连接到您的网络。
  2. 支持多种认证协议:它支持WEP、WPA、WPA2等多种认证协议,提供不同级别的安全性。
  3. 配置灵活:通过配置文件,您可以灵活地设置网络的SSID、信道、加密方式等参数。
  4. 与其他服务集成:hostapd 可以与DHCP服务器(如udhcpddnsmasq)集成,为连接的设备自动分配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

 

posted on 2024-06-16 23:59  ArnoldLu  阅读(750)  评论(0编辑  收藏  举报

导航