NDIS修改过滤驱动Send功能异常,调用NdisFSendNetBufferListsComplete后无响应
NDIS过滤驱动TX路径问题解答
核心问题1:NdisFSendNetBufferListsComplete触发的逻辑
- 调用该函数的本质是过滤驱动向上层协议栈宣告:已处理完上层下发的发送NBL请求,上层可回收对应的
NET_BUFFER、NET_BUFFER_LIST结构体以及关联的报文内存。 - 若返回的
NET_BUFFER_LIST结构体的Status字段设为NDIS_STATUS_SUCCESS,TCP/IP协议栈会判定该报文已被成功发送到网络链路层,无发送错误。 - 注意:协议栈此处的「发送成功」仅代表报文已脱离协议栈管控,不会再跟踪该原始NBL对应报文的后续链路层、网络层响应,和你克隆后发起的发送请求完全无关联。
核心问题2:TX路径出站报文正常但无响应的根因排查
你当前的问题90%以上概率是克隆注入的NBL元数据配置错误,常见问题点如下:
- 克隆NBL时未正确拷贝原始NBL的
SourceHandle、NetBufferListInfo字段必填项,比如VLAN标签、校验和卸载标记、NBL所属网络适配器上下文。RX路径正常是因为接收注入的元数据要求远低于发送路径,TX路径如果元数据错误,哪怕报文载荷正确,也可能出现网卡/下层驱动校验失败、交换机直接丢弃报文的问题。 - 调用
NdisFSendNetBufferLists时,SendFlags参数未和原始下发的SendFlags对齐,特别是NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK标记如果未开启,协议栈不会将你注入的发送报文和对应的接收响应做关联,就算ICMP响应到达网卡,协议栈也会判定和之前发出的ping请求无关,直接丢弃。 - 如果你修改了报文的源IP、源MAC或上层端口,未同步更新
NetBufferListInfo里的对应卸载参数,会导致校验和计算错误,对端收到报文后直接丢弃,自然不会返回响应。
快速验证方法
可以先关闭测试网卡所有的卸载功能(TCP校验和、UDP校验和、IP校验和、大包发送卸载全部禁用),再做ping测试,如果此时能收到响应,即可确认是NBL的卸载元数据配置错误导致的问题。
内容的提问来源于stack exchange,提问作者Rakoo
相关产品推荐
相关产品推荐

