使用NDB调试网络栈
使用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调试网络栈相关推荐
- 网络栈主要结构介绍(socket、sock、sk_buff,etc)
1.socket (include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少. /** I ...
- 使用NDB调试Linux内核的线程切换过程
使用NDB调试Linux内核的线程切换过程 cpu_switch_to 因为要调试Linux内核的线程切换过程,所以需要在`cpu_switch_to`处设置断点. 注意:ARM无法设置软件断点,只能 ...
- 【读书笔记】【WebKit技术内 幕(二)】Chromium Webkit资源加载与网络栈、DOM树、HTML解释器、影子DOM、CSS解释器和样式布局、网页层次与渲染、绘图上下文、
文章目录 前言 Something great 第4章 资源加载和网络栈 Webkit 资源加载 Chromium多进程资源加载 Chromium 网络栈 第5章 HTML解释器和DOM模型 DOM模 ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...
- Linux内核网络栈1.2.13-route.c概述
参考资料 <<linux内核网络栈源代码情景分析>> route路由表概述 在IP协议的实现中,只要发送数据包都要查询路由表,选择合适的路由选项,确定下一站的地址,并构造MAC ...
- Linux内核网络栈1.2.13-icmp.c概述
参考资料 <<linux内核网络栈源代码情景分析>> icmp协议 在实现的过程中, ICMP协议工作再IP协议之上,但又不与TCP协议工作再一级,而是在下一级,在一般ICMP ...
- Linux内核网络栈1.2.13-tcp.c概述
参考资料 <<linux内核网络栈源代码情景分析>> af_inet.c文件中调用函数在协议层的实现 本文主要根据在af_inet.c文件中根据初始化不同的协议,来调用不同的协 ...
- Linux内核网络栈1.2.13-af_inet.c概述
参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数继续调用分析 根据socket提供的常用库函数,socket.read和write等函数,继续往下一层 ...
- Linux内核网络栈1.2.13-socket.c函数概述
参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数概述 根据socket提供的常用的库函数,socket,read,write等函数, 执行的过程 in ...
最新文章
- FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)
- Linux目录和文件中的常用命令(二)
- Python笔记(十五)_异常处理
- UILabel和NSAttributedString那些事
- 【FLink】Flink 1.12 TaskManager 内存结构
- 如果/否则列表理解?
- MasterPage简介
- HTTP 缓存机制及原理
- C4D OCtane渲染器大师之路笔记(四):使用OC灯光
- [GIS教程] 5.3 空间数据组织
- realme v11密码解锁_真我V11忘记密码怎么刷机删除跳过激活账号使用
- dwcc怎么设置html默认,Dreamweaver CC 2019如何设置界面首选项?
- 《如何学商学》及听课感想
- 由对称性知定点一定在x轴上_圆锥曲线中的定点定值问题的四种模型.doc
- 本地开发H5页面如何发版成为微信公众号?
- 生存分析之Cox模型简述与参数求解
- 【实用教程】本地blast使用及简单python脚本辅助
- java华氏温度与摄氏度的互相转换
- APK 本地化/修改利器 —— 《android-apktool》
- ❤ CSDN榜一博主,半年文章汇总【答谢粉丝、文末送书4本】❤