使用NDB调试网络栈

__dhd_sendpkt

为了查看bcmdhd的发送网络包,需要先在`__dhd_sendpkt`处设置断点。

bl0 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-timesynPGD:0xffffffc0f3693000 CR3=0x0state 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_ROAMINGuint8 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_DUMPdhd_dhcp_dump(dhd_ifname(dhdp, ifidx), pktdata, TRUE);
#endif /* DHD_DHCP_DUMP */
#ifdef DHD_ICMP_DUMPdhd_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/1state 0 flags:0x4208040 stack:0xffffff800a350000

使用NDB调试网络栈相关推荐

  1. 网络栈主要结构介绍(socket、sock、sk_buff,etc)

    1.socket (include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少. /** I ...

  2. 使用NDB调试Linux内核的线程切换过程

    使用NDB调试Linux内核的线程切换过程 cpu_switch_to 因为要调试Linux内核的线程切换过程,所以需要在`cpu_switch_to`处设置断点. 注意:ARM无法设置软件断点,只能 ...

  3. 【读书笔记】【WebKit技术内 幕(二)】Chromium Webkit资源加载与网络栈、DOM树、HTML解释器、影子DOM、CSS解释器和样式布局、网页层次与渲染、绘图上下文、

    文章目录 前言 Something great 第4章 资源加载和网络栈 Webkit 资源加载 Chromium多进程资源加载 Chromium 网络栈 第5章 HTML解释器和DOM模型 DOM模 ...

  4. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...

  5. Linux内核网络栈1.2.13-route.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> route路由表概述 在IP协议的实现中,只要发送数据包都要查询路由表,选择合适的路由选项,确定下一站的地址,并构造MAC ...

  6. Linux内核网络栈1.2.13-icmp.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> icmp协议 在实现的过程中, ICMP协议工作再IP协议之上,但又不与TCP协议工作再一级,而是在下一级,在一般ICMP ...

  7. Linux内核网络栈1.2.13-tcp.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> af_inet.c文件中调用函数在协议层的实现 本文主要根据在af_inet.c文件中根据初始化不同的协议,来调用不同的协 ...

  8. Linux内核网络栈1.2.13-af_inet.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数继续调用分析 根据socket提供的常用库函数,socket.read和write等函数,继续往下一层 ...

  9. Linux内核网络栈1.2.13-socket.c函数概述

    参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数概述 根据socket提供的常用的库函数,socket,read,write等函数, 执行的过程 in ...

最新文章

  1. FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)
  2. Linux目录和文件中的常用命令(二)
  3. Python笔记(十五)_异常处理
  4. UILabel和NSAttributedString那些事
  5. 【FLink】Flink 1.12 TaskManager 内存结构
  6. 如果/否则列表理解?
  7. MasterPage简介
  8. HTTP 缓存机制及原理
  9. C4D OCtane渲染器大师之路笔记(四):使用OC灯光
  10. [GIS教程] 5.3 空间数据组织
  11. realme v11密码解锁_真我V11忘记密码怎么刷机删除跳过激活账号使用
  12. dwcc怎么设置html默认,Dreamweaver CC 2019如何设置界面首选项?
  13. 《如何学商学》及听课感想
  14. 由对称性知定点一定在x轴上_圆锥曲线中的定点定值问题的四种模型.doc
  15. 本地开发H5页面如何发版成为微信公众号?
  16. 生存分析之Cox模型简述与参数求解
  17. 【实用教程】本地blast使用及简单python脚本辅助
  18. java华氏温度与摄氏度的互相转换
  19. APK 本地化/修改利器 —— 《android-apktool》
  20. ❤ CSDN榜一博主,半年文章汇总【答谢粉丝、文末送书4本】❤

热门文章

  1. asp从服务器下载文件的几种方法
  2. kubernetes自定义hosts域名解析
  3. HC32F460之时钟(晶振)设置
  4. 帆软报表sum求和不展示问题
  5. 什么是Redux,如何使用?
  6. WIN8软件测试,Win8 RP和Win7性能全面测试:Win8快一倍
  7. 使用oyente智能检测工具总结
  8. 锂电池办理IEC62133认证、CB认证、EN62133认证、UN38.3检测报告
  9. 192.168.1.198接口地址
  10. 给OpenCV初学者的礼物——OpenCV人脸检测入门教程