使用NDB调试网络栈
__dhd_sendpkt
为了查看bcmdhd的发送网络包,需要先在`__dhd_sendpkt`处设置断点。
bl
0 e ffffff80`011b45e8 0001 (0001) bcmdhd!__dhd_sendpkt
断点命中后,可以在右侧看到源代码(当然需要.srcpath+ 指定内核源代码的路径)。
具体可以参照下方链接内的文章进行操作。
通过1:kd可以知道,1号CPU正在处理网络包,如果这个时候切到其他CPU(GDK8共有4个CPU),就可以看到它们正在干别的事情。
比如3号CPU这个时候正在处理中断事件,下面是切断3号CPU后的栈回溯。
k
Child-SP RetAddr Call Site
ffffff80`0801bf60 ffffff80`080c0968 lk!ksoftirqd_running+0x24 [kernel/softirq.c @ 92]
ffffff80`0801bf60 ffffff80`08127100 lk!irq_exit+0x90 [kernel/softirq.c @ 362]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
ffffff80`0801bf60 ffffff80`080811c0 lk!__handle_domain_irq+0x60 [./include/asm-generic/irq_regs.h @ 33]
ffffff80`0801bf60 ffffff80`08082ee8 lk!gic_handle_irq+0x58 [./arch/arm64/include/asm/io.h @ 90]
ffffff80`0801bf60 ffffff80`08127100 lk!el1_irq+0xe8 [arch/arm64/kernel/entry.S @ 645]
先看一下栈回溯,用于k只能看到前20个栈帧,所以用kn 150显示完整的调用栈。
从下面的栈回溯里面可以看到,网络包先经过内核进入到了udp协议栈,然后进入ip层,接着进入链路层,链路层这里是
Linux内核的通用实现,先调用统一实现,之后进入到博通厂商的bcmdhd驱动内,最后开始发生网络包。
kn 150
# Child-SP RetAddr Call Site
00 ffffff80`0b79b640 ffffff80`011bc404 bcmdhd!__dhd_sendpkt [drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c @ 4754]
01 ffffff80`0b79b640 ffffff80`08d838dc bcmdhd!dhd_start_xmit+0x3bc [drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c @ 5366]
02 ffffff80`0b79b640 ffffff80`08dc2e2c lk!dev_hard_start_xmit+0x9c [./include/linux/netdevice.h @ 4390]
03 ffffff80`0b79b640 ffffff80`08dc30b8 lk!sch_direct_xmit+0x1ac [net/sched/sch_generic.c @ 332]
04 ffffff80`0b79b640 ffffff80`08d83e14 lk!__qdisc_run+0x138 [net/sched/sch_generic.c @ 403]
05 ffffff80`0b79b640 ffffff80`08d84478 lk!__dev_queue_xmit+0x254 [./include/linux/seqlock.h @ 234]
06 ffffff80`0b79b640 ffffff80`08d97cd0 lk!dev_queue_xmit+0x10 [net/core/dev.c @ 3872]
07 ffffff80`0b79b640 ffffff80`08eedb58 lk!neigh_resolve_output+0xf0 [net/core/neighbour.c @ 1384]
08 ffffff80`0b79b640 ffffff80`08ef18f4 lk!ip6_finish_output2+0x270 [./include/net/neighbour.h @ 501]
09 ffffff80`0b79b640 ffffff80`08ef1a1c lk!ip6_finish_output+0x1b4 [net/ipv6/ip6_output.c @ 155]
0a ffffff80`0b79b640 ffffff80`08f47974 lk!ip6_output+0x74 [./include/linux/netfilter.h @ 278]
0b ffffff80`0b79b640 ffffff80`08ef21d8 lk!ip6_local_out+0x44 [net/ipv6/output_core.c @ 181]
0c ffffff80`0b79b640 ffffff80`08f13abc lk!ip6_send_skb+0x28 [net/ipv6/ip6_output.c @ 1704]
0d ffffff80`0b79b640 ffffff80`08f1462c lk!udp_v6_send_skb.isra.6+0x164 [net/ipv6/udp.c @ 1115]
0e ffffff80`0b79b640 ffffff80`08ea09ec lk!udpv6_sendmsg+0x76c [net/ipv6/udp.c @ 1411]
0f ffffff80`0b79b640 ffffff80`08d5f598 lk!inet_sendmsg+0x34 [net/ipv4/af_inet.c @ 799]
10 ffffff80`0b79b640 ffffff80`08d61310 lk!sock_sendmsg+0x50 [net/socket.c @ 623]
11 ffffff80`0b79b640 ffffff80`08d613b0 lk!__sys_sendto+0xb8 [net/socket.c @ 1787]
12 ffffff80`0b79b640 ffffff80`08098ca4 lk!__arm64_sys_sendto+0x20 [net/socket.c @ 1795]
13 ffffff80`0b79b640 ffffff80`08098de0 lk!el0_svc_common.constprop.0+0x64 [./arch/arm64/include/asm/current.h @ 19]
14 ffffff80`0b79b640 ffffff80`08083d08 lk!el0_svc_handler+0x28 [arch/arm64/kernel/syscall.c @ 164]
15 ffffffc0`fdd65600 00000000`00000040 lk!el0_svc+0x8 [arch/arm64/kernel/entry.S @ 941]
看完栈回溯后,再看一下进程,使用!ps命令就可以列出当前进程。
通过!ps可以知道,`systemd-timesyncd`就是当前的进程。
[ndb]!ps
task_struct:0xffffffc0f46cd880 pid: 167 comm:systemd-timesyn
PGD:0xffffffc0f3693000 CR3=0x0
state 0 flags:0x404100 stack:0xffffff800b798000
systemd-timesyncd:是通过网络提供系统时钟同步的服务,在有网络链接的时候会用到。
继续往下看。
通过源代码窗口可以看到`__dhd_sendpkt`的参数。
__dhd_sendpkt(dhd_pub_t *dhdp, int ifidx, void *pktbuf)
通过dv显示局部变量,然后根据显示的地址查看一下dhd_pub_t结构体信息。
dv
@ x0 dhdp = ffffffc0eaa600a8
@ x1 ifidx = 0
@ x2 pktbuf = ffffffc0edf8bf00
@ x1 ret = 0
@ psr dhd =
@ psr eh =
dt bcmdhd!dhd_pub_t 0xffffffc0eaa600a8
+0x000 osh : 0xffffffc0`f3548300
+0x008 bus : 0xffffffc0`eaa01800
+0x010 prot : 0xffffffc0`eaa5c000
+0x018 info : 0xffffffc0`eaa60000
+0x020 dbg : 0xffffffc0`f22c1800
+0x028 up : 1
+0x02c up_lock : spinlock
+0x030 txoff : 0
+0x031 dongle_reset : 0
+0x034 busstate : 2 ( DHD_BUS_DATA )
+0x038 dhd_bus_busy_state : 1
+0x03c hdrlen : 0x34
+0x040 maxctl : 0x2810
+0x044 rxsz : 0x6d2
+0x048 wme_dp : 0 ''
+0x049 iswl : 1
+0x050 drv_version : 0
+0x058 mac : ether_addr
+0x060 dstats :
+0x0a8 tx_packets : 26343
+0x0b0 tx_dropped : 0
+0x0b8 tx_multicast : 65
+0x0c0 tx_errors : 0
+0x0c8 tx_ctlpkts : 1480
+0x0d0 tx_ctlerrs : 0
+0x0d8 rx_packets : 28527
+0x0e0 rx_multicast : 80
+0x0e8 rx_errors : 0
+0x0f0 rx_ctlpkts : 1480
+0x0f8 rx_ctlerrs : 0
+0x100 rx_dropped : 0
+0x108 rx_flushed : 0
+0x110 wd_dpc_sched : 0
+0x118 rx_pktgetfail : 0
+0x120 tx_pktgetfail : 0
+0x128 rx_readahead_cnt : 4
+0x130 tx_realloc : 2
+0x138 fc_packets : 0
+0x140 bcmerror : 0
+0x144 tickcnt : 0x2f85
+0x148 dongle_error : -23
+0x14c country_code : [4]uint8[] 0 ''
+0x150 suspend_disable_flag : 0
+0x154 in_suspend : 0
+0x158 pno_enable : 0
+0x15c pno_suspend : 0
+0x160 suspend_bcn_li_dtim : 3
+0x164 early_suspended : 0
+0x168 dhcp_in_progress : 0
+0x170 pktfilter : [100] (null)
+0x490 pktfilter_count : 10
+0x494 dhd_cspec : wl_country
+0x4a0 dhd_cflags : 1
+0x4a4 force_country_change : 1
+0x4a5 eventmask : [20]char[] ""
+0x4bc op_mode : 5
+0x4c0 wl_start_stop_lock : mutex
+0x4e0 wl_softap_lock : mutex
+0x500 wlfc_enabled : 0
+0x504 wlfc_mode : 0
+0x508 wlfc_state : (null)
+0x510 proptxstatus_mode : 0 ''
+0x511 proptxstatus_txoff : 0
+0x512 proptxstatus_module_ignore : 0
+0x513 proptxstatus_credit_ignore : 0
+0x514 proptxstatus_txstatus_ignore : 0
+0x515 wlfc_rxpkt_chk : 0
+0x518 skip_fc : 0xffffff80`011b3278 bcmdhd!dhd_wlfc_skip_fc+0
+0x520 plat_init : 0xffffff80`011b37a0 bcmdhd!dhd_wlfc_plat_init+0
+0x528 plat_deinit : 0xffffff80`011b3270 bcmdhd!dhd_wlfc_plat_deinit+0
+0x530 pno_state : 0xffffffc0`ed9cc000
+0x538 rtt_state : 0xffffffc0`eafcfb00
+0x540 rtt_supported : 0
+0x541 dongle_isolation : 0
+0x542 is_pcie_watchdog_reset : 0
+0x543 dongle_trap_occured : 0
+0x544 iovar_timeout_occured : 0
+0x548 hang_was_sent : 0
+0x54c rxcnt_timeout : 0
+0x550 txcnt_timeout : 0
+0x554 hang_report : 1
+0x556 hang_reason : 0
+0x558 tdls_enable : 0
+0x560 reorder_bufs : [256] (null)
+0xd60 fw_capabilities : [512]char[] " wapi epno ap sta wme 802.11d 802.11h rm cqa ccx cac mbss16 dualband ampdu amsdurx radio_pwrsave btamp p2p "
+0xf60 skbbuf : [1024] (null)
+0x2f60 store_idx : 0x3ae
+0x2f64 sent_idx : 0x3ae
+0x2f68 tcpack_sup_mode : 0 ''
+0x2f70 tcpack_sup_module : (null)
+0x2f78 tcpack_sup_ratio : 0
+0x2f7c tcpack_sup_delay : 0
+0x2f80 arp_version : 1
+0x2f88 sta_pool : (null)
+0x2f90 staid_allocator : (null)
+0x2f98 flowid_allocator : (null)
+0x2fa0 flow_ring_table : (null)
+0x2fa8 if_flow_lkup : (null)
+0x2fb0 flowid_lock : (null)
+0x2fb8 flowring_list_lock : (null)
+0x2fc0 num_flow_rings : 0
+0x2fc4 cumm_ctr : 0
+0x2fc8 l2cumm_ctr : 0
+0x2fcc d2h_sync_mode : 0
+0x2fd0 flow_prio_map : [8]uint8[] 0 ''
+0x2fd8 flow_prio_map_type : 0 ''
+0x2fd9 enable_log : [16]char[] ""
+0x2fe9 dma_d2h_ring_upd_support : 0
+0x2fea dma_h2d_ring_upd_support : 0
+0x2feb dma_ring_upd_overwrite : 0
+0x2fec idma_enable : 0
+0x2ff0 idma_inited : 0
+0x2ff4 idma_retention_ds : 0
+0x2ff5 ifrm_enable : 0
+0x2ff8 ifrm_inited : 0
+0x3000 soc_ram : (null)
+0x3008 soc_ram_length : 0
+0x300c memdump_type : 0
+0x3010 memdump_enabled : 2
+0x3014 memdump_success : 0
+0x3018 tdls_mode : 0
+0x301c lazy_roam_enable : 0
+0x301d apf_set : 0
+0x301e h2d_phase_supported : 0
+0x301f force_dongletrap_on_bad_h2d_phase : 0
+0x3020 dongle_trap_data : 0
+0x3024 cto_enable : 0
+0x3028 cto_threshold : 0
+0x302c fw_download_done : 0
+0x3030 last_trap_info : _trap_struct
+0x3080 rand_mac_oui : [3]uint8[] 0 ''
+0x3088 ts : (null)
+0x3090 d2h_hostrdy_supported : 0
+0x3091 d11_tx_status : 0
+0x3092 ndo_version : 0
+0x3094 ndo_enable : 0
+0x3095 ndo_host_ip_overflow : 0
+0x3098 ndo_max_host_ip : 0xa
+0x309c max_dtim_enable : 0
+0x309d wbtext_support : 0
+0x30a0 mw_list_head : dll
+0x30b0 mw_id : 0
+0x30b4 tdls_lock : spinlock
+0x30b8 ext_trap_data_supported : 0
+0x30c0 extended_trap_data : (null)
+0x30c8 clm_path : 0xffffffc0`eaa65230 "/vendor/etc/firmware/clm.blob"
+0x30d0 conf_path : 0xffffffc0`eaa66230 "/vendor/etc/firmware/config.txt"
+0x30d8 conf : 0xffffffc0`edb51000
+0x30e0 adapter : 0xffffffc0`ea9f7780
+0x30e8 escan : 0xffffffc0`eaea0000
+0x30f0 iapsta_params : 0xffffffc0`f22c3c00
+0x30f8 disabling : 0
在结构体内,可以看看到下面一些较为关键的信息:
mac成员里面记录着mac的地址。
+0x058 mac : ether_addr
dt bcmdhd!ether_addr 0xffffffc0eaa600a8+0x058
+0x000 octet : [6]uint8[] 0xe0 ''
hdrlen记录着dhd头的长度。
maxctl记录着rxctl最大接收大小。
rxsz记录着rx的缓冲区大小。
+0x03c hdrlen : 0x34
+0x040 maxctl : 0x2810
+0x044 rxsz : 0x6d2
发送给dongle网络包数据的统计信息:
+0x0a8 tx_packets : 27586
+0x0b8 tx_multicast : 151
发生给网络接口的网络包数据的统计信息:
+0x0d8 rx_packets : 29673
+0x0e0 rx_multicast : 129
下面几个成员记录着最近的失败信息。
+0x140 bcmerror : 0
+0x144 tickcnt : 0x378d
+0x148 dongle_error : -23
固件信息,802.11b是一种协议,解决不能使用2.4GHz频段国家的使用问题。
+0xd60 fw_capabilities : [512]char[] " wapi epno ap sta wme 802.11d 802.11h rm cqa ccx cac mbss16 dualband ampdu amsdurx radio_pwrsave btamp p2p "
clm文件和配置文件的路径:
+0x30c8 clm_path : 0xffffffc0`eaa65230 "/vendor/etc/firmware/clm.blob"
+0x30d0 conf_path : 0xffffffc0`eaa66230 "/vendor/etc/firmware/config.txt"
adapter记录了配对信息,中断信息和股价路径。
通过dd命令查看地址,可以看到里面的地址是`dhd_cfgvendor_priv_string_handler`函数的地址。
+0x30e0 adapter : 0xffffffc0`ea9f7780
dd 0xffffffc0`ea9f7780
ffffffc0`ea9f7780 01263c30 ffffff80 0000003c 00000004
ffffffc0`ea9f7790 00000000 00000000 00000000 00000000
ffffffc0`ea9f77a0 00000000 00000000 00000000 00000000
ffffffc0`ea9f77b0 01285208 ffffff80 ffffffff ffffffff
ffffffc0`ea9f77c0 ffffffff 00000000 00000000 00000000
ffffffc0`ea9f77d0 ea9f77d0 ffffffc0 ea9f77d0 ffffffc0
ffffffc0`ea9f77e0 00000001 00000000 00000000 00000000
ffffffc0`ea9f77f0 00000000 00000000 00000000 00000000
ln 0xffffff8001285208
(ffffff80`01250568) bcmdhd!dhd_cfgvendor_priv_string_handler+0x34ca0
接下来会先判断状态,如果不对,会把网络包清理掉,然后返回。
up:代表驱动是否已经启用。
busstate:是一个枚举型,里面记录了总线的状态信息。
if (!dhdp->up || (dhdp->busstate == DHD_BUS_DOWN)) {
/* free the packet here since the caller won't */
PKTCFREE(dhdp->osh, pktbuf, TRUE);
return -ENODEV;
}
由于未开启`DHD_L2_FILTER`,所以会直接更新多广播的统计数据。
if (PKTLEN(dhdp->osh, pktbuf) >= ETHER_HDR_LEN) {
uint8 *pktdata = (uint8 *)PKTDATA(dhdp->osh, pktbuf);
eh = (struct ether_header *)pktdata;
if (ETHER_ISMULTI(eh->ether_dhost))
dhdp->tx_multicast++;
if (ntoh16(eh->ether_type) == ETHER_TYPE_802_1X) {
#ifdef DHD_LOSSLESS_ROAMING
uint8 prio = (uint8)PKTPRIO(pktbuf);
/* back up 802.1x's priority */
dhdp->prio_8021x = prio;
#endif /* DHD_LOSSLESS_ROAMING */
DBG_EVENT_LOG(dhdp, WIFI_EVENT_DRIVER_EAPOL_FRAME_TRANSMIT_REQUESTED);
atomic_inc(&dhd->pend_8021x_cnt);
dhd_dump_eapol_4way_message(dhdp, dhd_ifname(dhdp, ifidx), pktdata, TRUE);
}
if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) {
#ifdef DHD_DHCP_DUMP
dhd_dhcp_dump(dhd_ifname(dhdp, ifidx), pktdata, TRUE);
#endif /* DHD_DHCP_DUMP */
#ifdef DHD_ICMP_DUMP
dhd_icmp_dump(dhd_ifname(dhdp, ifidx), pktdata, TRUE);
#endif /* DHD_ICMP_DUMP */
}
} else {
PKTCFREE(dhdp->osh, pktbuf, TRUE);
return BCME_ERROR;
}
dhd_wlfc_is_supported
在完成统计之后,bcmdhd回去检查wlfc的支持状况。
bool dhd_wlfc_is_supported(dhd_pub_t *dhd)
{
bool rc = TRUE;
if (dhd == NULL) {
DHD_ERROR(("Error: %s():%d\n", __FUNCTION__, __LINE__));
return FALSE;
}
dhd_os_wlfc_block(dhd);
if (!dhd->wlfc_state || (dhd->proptxstatus_mode == WLFC_FCMODE_NONE)) {
rc = FALSE;
}
dhd_os_wlfc_unblock(dhd);
return rc;
}
走到skb_push这里,skb_push会往skb数据区的头部添加数据。
void *skb_push(struct sk_buff *skb, unsigned int len)
{
skb->data -= len;
skb->len += len;
if (unlikely(skb->data < skb->head))
skb_under_panic(skb, len, __builtin_return_address(0));
return skb->data;
}
EXPORT_SYMBOL(skb_push);
dhd_wlfc_commit_packets
dhd_wlfc_commit_packets里面有一个非常重要的参数f_commitpkt_t fcommit,他记录着dhd_bus_txdata函数的地址,这个函数是下一层的传输函数。
dv
@ x0 dhdp = ffffffc0eaa600a8
@ x1 fcommit = ffffff80011f1e28
@ x2 commit_ctx = ffffffc0eaa01800
@ x3 pktbuf = ffffffc0aad35900
@ x4 need_toggle_host_if = 1
@ x20 rc = ffffff8009e1e000
@ psr ctx =
__FUNCTION__ = Array [24]
ln 0xffffff80011f1e28
(ffffff80`011f1e28) bcmdhd!dhd_bus_txdata
Exact matches:
dhd_bus_txdata
通过查看dhd_bus结构体的信息,可以知道很多信息,比如网卡的名字AP6330和它固件的位置。
dt bcmdhd!dhd_bus 0xffffffc0eaa01800
+0x000 dhd : 0xffffffc0`eaa600a8
+0x008 sdh : 0xffffffc0`f10f8f00
+0x010 sih : 0xffffffc0`f3723c00
+0x018 vars : 0xffffffc0`ebca1800 "manfid=0x2d0"
+0x020 varsz : 0x471
+0x024 sbaddr : 0
+0x028 regs : 0x00000000`18002000
+0x030 sdpcmrev : 7
+0x034 armrev : 3
+0x038 ramrev : 0
+0x03c ramsize : 0x48000
+0x040 orig_ramsize : 0x48000
+0x044 srmemsize : 0
+0x048 bus : 3
+0x04c bus_num : 2
+0x050 slot_num : 1
+0x054 hostintmask : 0x200000f0
+0x058 intstatus : 0
+0x05c dpc_sched : 0
+0x05d fcstate : 0
+0x05e cl_devid : 0
+0x060 fw_path : 0xffffffc0`eaa63230 "/vendor/etc/firmware/fw_RK903_ag.bin"
+0x068 nv_path : 0xffffffc0`eaa64230 "/vendor/etc/firmware/nvram_AP6330.txt"
+0x070 blocksize : 0x100
+0x074 roundup : 0x100
+0x078 txq : pktq
+0x208 flowcontrol : 0 ''
+0x209 tx_seq : 0x24 '$'
+0x20a tx_max : 0x29 ')'
+0x20b hdrbuf : [64]uint8[] 0 ''
+0x250 rxhdr : 0xffffffc0`eaa01a20 -> 0 ''
+0x258 nextlen : 0
+0x25a rx_seq : 0x3a ':'
+0x25b rxskip : 0
+0x260 glomd : (null)
+0x268 glom : (null)
+0x270 glomerr : 0
+0x278 rxbuf : 0xffffffc0`eae40000 -> 0x29 ')'
+0x280 rxblen : 0x283c
+0x288 rxctl : 0xffffffc0`eae4000c -> 0x7 ''
+0x290 databuf : 0xffffffc0`eae50000 -> 0xc0 ''
+0x298 dataptr : 0xffffffc0`eae50000 -> 0xc0 ''
+0x2a0 rxlen : 0
+0x2a4 sdpcm_ver : 0x4 ''
+0x2a5 intr : 1
+0x2a6 poll : 0
+0x2a7 ipend : 0
+0x2a8 intdis : 0
+0x2ac intrcount : 0x6ca8
+0x2b0 lastintrs : 0
+0x2b4 spurious : 0
+0x2b8 pollrate : 0
+0x2bc polltick : 0
+0x2c0 pollcnt : 0
+0x2c8 console : dhd_console
+0x2f8 console_addr : 0x46664
+0x2fc regfails : 0
+0x300 clkstate : 3
+0x304 activity : 1
+0x308 idletime : 5
+0x30c idlecount : 0
+0x310 idleclock : 0
+0x314 sd_divisor : 2
+0x318 sd_mode : 2
+0x31c sd_rxchain : 0
+0x320 use_rxchain : 0
+0x321 sleeping : 0
+0x328 bus_sleep : wait_queue_head
+0x340 ctrl_wait : 0
+0x348 ctrl_tx_wait : wait_queue_head
+0x360 rxflow_mode : 0
+0x364 rxflow : 0
+0x368 prev_rxlim_hit : 0
+0x36c alp_only : 0
+0x36d usebufpool : 0
+0x370 txinrx_thres : 0
+0x374 dotxinrx : 1
+0x378 ext_loop : 0
+0x379 loopid : 0 ''
+0x37c pktgen_freq : 1
+0x380 pktgen_count : 0
+0x384 pktgen_print : 0x3e8
+0x388 pktgen_total : 0
+0x38c pktgen_minlen : 0
+0x390 pktgen_maxlen : 0x708
+0x394 pktgen_mode : 1
+0x398 pktgen_stop : 1
+0x39c pktgen_tick : 0
+0x3a0 pktgen_ptick : 0
+0x3a4 pktgen_sent : 0
+0x3a8 pktgen_rcvd : 0
+0x3ac pktgen_prev_time : 0
+0x3b0 pktgen_prev_sent : 0
+0x3b4 pktgen_prev_rcvd : 0
+0x3b8 pktgen_fail : 0
+0x3bc pktgen_len : 0
+0x3be pktgen_rcv_state : 0
+0x3c0 pktgen_rcvd_rcvsession : 0
+0x3c4 tx_sderrs : 0
+0x3c8 fcqueued : 0x6bc5
+0x3cc rxrtx : 0
+0x3d0 rx_toolong : 0
+0x3d4 rxc_errors : 0
+0x3d8 rx_hdrfail : 0
+0x3dc rx_badhdr : 0
+0x3e0 rx_badseq : 0
+0x3e4 fc_rcvd : 0xdad
+0x3e8 fc_xoff : 0x69b
+0x3ec fc_xon : 0x712
+0x3f0 rxglomfail : 0
+0x3f4 rxglomframes : 0x10b2
+0x3f8 rxglompkts : 0x49b9
+0x3fc f2rxhdrs : 0xe39e
+0x400 f2rxdata : 0x8775
+0x404 f2txdata : 0x7324
+0x408 f1regdata : 0xd94d
+0x40c wake_counts :
+0x418 ctrl_frame_buf : (null)
+0x420 ctrl_frame_len : 0
+0x424 ctrl_frame_stat : 0
+0x428 rxint_mode : 0
+0x42c remap : 0
+0x42d kso : 1
+0x42e _slpauto : 0
+0x42f _oobwakeup : 0
+0x430 _srenab : 0
+0x431 readframes : 0
+0x432 reqbussleep : 0
+0x434 resetinstr : 0
+0x438 dongle_ram_base : 0
+0x440 glom_pkt_arr : [36] (null)
+0x560 txglom_cnt : 0
+0x564 txglom_total_len : 0
+0x568 txglom_enable : 0
+0x56c txglomsize : 6
+0x570 dongle_trap_addr : 0
+0x574 txglomframes : 0x6bc5
+0x578 txglompkts : 0x6bc5
+0x580 membuf : 0xffffffc0`edb53000 -> 0x1 ''
这个时候我们再去看当前进程,就会发现这个已经在网络软中断内了,准备告诉CPU有数据来了。
[ndb]!ps
task_struct:0xffffffc00a343b00 pid: 18 comm:ksoftirqd/1
state 0 flags:0x4208040 stack:0xffffff800a350000