【随笔记】linux usb gadget ncm wrong ndp sign 问题修复

article/2025/10/30 8:18:38

一、模拟网卡简介

在 Linux 通过 usb 模拟网卡时,有四种方式:

1. 使用 usb gadget rndis
2. 使用 usb gadget ecm
3. 使用 usb gadget ncm
4. 使用 usb gadget eem

rndis:是微软公司制定的协议规范, 不过似乎规范不完整, 引起 rndis host 驱动作者的强烈反对。lichee\linux-4.9\drivers\net\usb\rndis_host.c

ecm:传输的是纯粹的以太网包,一次USB传输只包含一个以太网帧,因此吞吐量较低,实测在 6MB/s 左右,Windows 的驱动不太好找,Ubuntu 可以直接支持。

ncm:ecm 的改进版本,每个NCM报文可以包含多个以太网帧,这种特性称为报文聚合,即调用一次URB可以发送或者接收多个IP报文,实测在 17MB/s 左右,Windows 自带有驱动(本文在 Win10 平台实测通过),Ubuntu 可以直接支持。

eem:了解不多。

二、问题现象

接入 Windows 之后,启用该网卡,会不停的输出 "Wrong NDP SIGN",并且无法相互 ping 通。

检查发现因为 ncm->ndp_sign 的值等于 0,未被正确赋值。(f_ncm.c)

 

 分析发现 ncm->ndp_sign 只有在设置 CRC 模式的时候才会拷贝 ncm->parser_opts,由此可见 Win10 的 ncm 驱动并未主动配置 CRC 模式引起。

 

经调试发现 USB_CDC_SET_NTB_FORMAT 会被触发,会设置 ncm->parser_opts,那么如果也顺道一同拷贝 ncm->ndp_sign 应该就能解决问题。

实测确实解决了问题,既然 f_ncm.c 驱动有缺陷,那么很有可能最新的内核已经解决了此问题,查看了最新内核的驱动(v5.18),发现已经调整了 ncm->ndp_sign 顺序,在 switch 语句后面进行赋值,同样也能解决问题。

f_ncm.c « function « gadget « usb « drivers - kernel/git/torvalds/linux.git - Linux kernel source tree

 

三、修复补丁

由于 5.9.y 相对于 4.9 版本改动较大,这里发出一个针对 4.9 版本修复此问题的最小改动补丁。

diff --git a/lichee/linux-4.9/drivers/usb/gadget/function/f_ncm.c b/lichee/linux-4.9/drivers/usb/gadget/function/f_ncm.c
old mode 100644
new mode 100755
index 639603722..278580b5a
--- a/lichee/linux-4.9/drivers/usb/gadget/function/f_ncm.c
+++ b/lichee/linux-4.9/drivers/usb/gadget/function/f_ncm.c
@@ -828,7 +828,7 @@ static int ncm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)default:goto invalid;}
-		ncm->ndp_sign = ncm->parser_opts->ndp_sign | ndp_hdr_crc;
+		// ncm->ndp_sign = ncm->parser_opts->ndp_sign | ndp_hdr_crc;value = 0;break;}
@@ -846,6 +846,9 @@ static int ncm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)w_value, w_index, w_length);}+	// lmx: fix ncm_unwrap_ntb() --> ncm->ndp_sign to==0, generate "Wrong NDP SIGN" Bug
+	ncm->ndp_sign = ncm->parser_opts->ndp_sign | (ncm->is_crc ? NCM_NDP_HDR_CRC : 0);
+/* respond with data transfer or status phase? */if (value >= 0) {DBG(cdev, "ncm req%02x.%02x v%04x i%04x l%d\n",

实测吞吐量:


http://chatgpt.dhexx.cn/article/eEFhusn8.shtml

相关文章

nDPI分析

nDPI分析 一.概述 nDPI是保持高度欢迎的OpenDPI,在GPL证书下发布,它的目标是增加新的协议,扩展原有的库;为了支持多平台的体验,它除了支持UNIX系列外,还支持windows版本;而且,可以…

如何实现在on ethernetPacket中自动回复NDP response消息

对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…

IPv6 NDP邻居发现协议 1

NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达…

NPDP是什么?

NPDP由美国产品开发与管理协会(PDMA)发起,是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位知识体系。 一,为什么要考NPDP认证? 1.对于个人: 1)确保精通新…

802.11 NDP Sounding

NDP Sounding 1.NDP原理2.NDP 过程3.帧结构3.1 NDPA结构3.2 CBF帧 1.NDP原理 802.11n标准提供的波束成形技术,可以通过预先补偿发射天线的相位,让两条波束进行叠加以实现最好的效果 显式波束成形需要终端反馈信道信息: AP向STA发送探测数据…

【IPv6】IPv6 NDP邻居状态详解

NDP 邻居状态 任意两个通信的主机在通信之前,先要建立邻居。(省的去查找arp了) 因为接下来的文字会很乱,排版费劲,所以用这个来。 未完成(Incomplete),可达(Reachable),陈旧(Stale),延迟(Delay),探查(Probe) 正常过程…

ICMPV6协议及NDP协议

一、ICMPV6 1、基于ipv6的ICMPv6(Internet control message protocol for IPv6)是 IPv6 下的 Internet 控制报文协议;在 IPv6 中,ICMPv6 整合实现了 IPv4 中的 ICMP(ping命令)、ARP 以及 IGMP 的所有功能&a…

IPV6 邻居发现协议(NDP)

IPV6除了显著增加了地址空间外,另一个最显著的特征就是它的即插即用性。 邻居发现协议(Neighbor Discovery Protocol,NDP)就是使用以下的功能实现即插即用特性的协议: 路由器发现:当一个节点连接到一个IPV6的链路时,它…

802.11 - NDP反馈报告

目录 概述 帧格式 能力指示 NFRP Trigger帧格式 Common Info字段 HE TB feedback NDP帧格式 NDP Feedback Report Parameter Set element格式 NDP反馈报告流程 概述 STA行为 NDP反馈报告的TXVECTOR参数 STA处理流程 NDP反馈报告流程中的Power save操作 概述 NDP反…

ipv6的NDP协议有哪些功能,是如何进行工作的

ipv6的NDP协议有哪些功能 NDP(neighbor Discovery protocol)是ICMPv6的子协议是IPV6协议体系中一个重要的基础协议,邻居发现协议替代了IPV4的ARP,ICMP路由器发现。它定义了使用ICMPv6报文实现地址解析,跟踪邻居状态&a…

IPV6邻居发现协议(NDP)

概述 NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不…

11.NDP协议分析与实践

NDP 协议分析与实践 1. 概述 1.1 简介 Neighbor Discovery Protocol 基于 ICMPv6 实现,用于替代 IPv4 中的 ARP 和 ICMP 路由器发现基于 ICMPv6 实现节点发现(主机和路由)、重复地址检测、地址解析、邻居不可达检测和重定向等功能 1.2 NDP 报文格式 1.2.1 路由…

IPv6邻居发现协议--NDP详解

一、ICMPv6 -Internet控制报文协议 ICMPv6是IPV6的基础协议之一,用于向源节点传递报文转发的信息或错误 协议类型号(即:IPv6Next Header)为58 icmpv6可以提供icmpv4的的对应功能之外,还有其他一些功能的基础如邻居发…

IPv6中NDP协议简介

本文介绍IPv6中一种重要协议——NDP协议。NDP协议是实现IPv6通信的重要协议之一,本文将详细介绍IPv6中NDP的协议实现过程和技术细节。 阅读本文,您需要又有一定的IPv6基础知识,您如果对此还存在困惑,欢迎查阅下列文章:…

5. NDP

NDP(Neighbor Discovery Protocol)NDP实现了IPv6中诸多重要机制。 路由器发现:该功能帮助设备发现链路上的路由器,并获得路由器通告的信息。 无状态自动配置:无状态自动配置是IPv6的一个亮点功能,它使得IP…

NDP原理详解

概述: 节点使用ND,可以确定连接在同一链路上的邻居的链路层地址,快速清除已经变成无效的缓存值。主机也使用ND发现能为其转发报文的路由器。最后,节点使用此协议主动跟踪哪一个邻居可达,哪一个邻居不可达,…

NDP 协议介绍

邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。 邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器 发现(RouterDiscovery),它定义了…

一文解释NDP协议(IPv6邻居发现协议)ICMPv6

目录 目录 一、前言介绍: 1.1、NDP简单说明: 1.2、ICMPv6-Internet控制报文协议 1.3、IPv6和IPv4相比有哪些优势? 二、IPv6邻居发现协议--NDP详解 2.1、IPv6地址解析 2.1.1、邻居请求(Neighbor solicition)NS …

欧拉道路与欧拉回路

1. 相关的概念如下: ① 有向图G为欧拉回路:当且仅当G的基图连通,且所有顶点的入度等于出度 ② 有向图G为欧拉路:当且仅当G的基图连通,而且只存在一个顶点u的入度比出度大于1,只存在一个顶点v的出度比入度…

欧拉回路及例题

欧拉回路 几个定义性质与定理 定理1 推论1 定理2 推论2 性质1性质2 算法主体例题 uoj117求给定图的欧拉回路poj1041求字典序最小的欧拉回路poj1386Play on Wordspoj2230求无向图欧拉图要求每条边走两遍且方向不同poj2513字符串的欧拉图poj2337字典序poj1637Sightseeing tour求…