Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    R311 Tina usb gadget ncm wrong ndp sign 问题修复

    其它全志芯片讨论区
    1
    1
    142
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      dream LV 6 last edited by dream

      一、模拟网卡简介

      在 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

      6595a2d6-f9c6-44ee-96a0-19261fd80bc2-image.png

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

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

      eem:
      了解不多。

      二、问题现象

      启用步骤很简单,全志也有相应的文档介绍,这里只介绍问题以及解决方法。

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

      e8686527-b0f9-4280-abf4-c505424ddd7b-image.png

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

      ca933ff8-44c1-4f60-8e23-9d4e83cd1a0e-image.png

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

      926f7042-e326-4728-b206-24a499e9841b-image.png

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

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

      https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/gadget/function/f_ncm.c?h=v5.18

      af816862-f218-43bd-ae22-cd45e7cdb400-image.png

      三、修复补丁

      由于 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",
      

      实测吞吐量:

      90b6a492-888a-4530-9bbd-fee278e4c11e-image.png

      1 Reply Last reply Reply Quote Share 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策