移远官网

关于Linux系统上usb网卡名字

我的USB模组,在接到Linux主机上,一般都会出现USB网卡和USB串口。
有时候我们会看到这个网卡的名字怪怪的,有时候看到的又是前篇一律的usb0、eth0、wwan0,然后我们的就会去想,如何去固定这个网卡名字。
能不能呢?当然能。
在想办法固定网卡名字之前,我们需要了解,网卡的名字是Linux系统哪些条件决定的!

决定USB网卡名字的因素

  • Linux 内核
  • udev、grub等

我在一个USB Hub (vid=2c7c, pid=0125) 上插了两个EC20
我用自定义udev rule去指定AT接口的设备名称

首先要记录Hub上USB接口位置与系统内devpath属性的对应关系
取决于硬件设计,不一定是按次序递增
先用几条规则给USB接口打上TAG

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2c7c", ATTR{idProduct}=="0125", ATTR{devpath}=="*.3", TAG+="quectel0"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2c7c", ATTR{idProduct}=="0125", ATTR{devpath}=="*.2", TAG+="quectel1"

然后针对每个设备的每个接口,指定希望使用的设备名称,我这里只用了AT和UAC接口

# 00: diag
# 01: nmea
# 02: at
# 03: ppp
# 04: wwan
# 05: adb
# 06: uac
# 07: snd
# 08: snd

ACTION=="add", SUBSYSTEM=="tty",   TAGS=="quectel0", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="quectel0-at"
ACTION=="add", SUBSYSTEM=="sound", TAGS=="quectel0", ENV{ID_USB_INTERFACE_NUM}=="06", SYMLINK+="quectel0-uac"
ACTION=="add", SUBSYSTEM=="tty",   TAGS=="quectel1", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="quectel1-at"
ACTION=="add", SUBSYSTEM=="sound", TAGS=="quectel1", ENV{ID_USB_INTERFACE_NUM}=="06", SYMLINK+="quectel1-uac"

systemd的udev存在bug,上述规则只在开机时起作用,运行时插拔无法生效,原因待排查

看看是否支持udevadm。
用udevadm monitor检查下插拔过程。
ATTR{devpath}== 这个是否发生了变化。

Linux 内核里网卡名称的由来

网卡设备的初始化,在内核里包括两个部分,一部分应该在drivers还有一部分在net/里。net目录里不只是内核协议栈的代码。

之前有个客户这么改过代码


dev.c(kernel/msm-4.9/net/core/dev.c), we renamed the eth8 as below
static int **dev_alloc_name_ns(**struct net *net,
          struct net_device *dev,
         const char *name)
 {
   char buf[IFNAMSIZ];
   int ret;

  ret = __dev_alloc_name(net, name, buf);
   if (ret >= 0){
    else if(!strcmp(netdev_drivername(dev),"rndis_host")|| !strcmp(netdev_drivername(dev),"GobiNet")) //LTEmodem
     strlcpy(dev->name,"eth8", IFNAMSIZ);
   }
}

这里判断驱动名字修改网卡名称。

一般来说,我们不会去动 net里的代码。我们只需要修改 usbnet.c 就可以了。

usbnet.c 哪里决定了网卡名称

usbnet_probe 里 根据网卡的flag 决定

假如我们需要修改网卡名称怎么做?

usbnet 里固定USB网卡的名字

固定网卡的名字,可以根据一些条件来决定

  • 驱动名称
  • usb 描述符信息
  • driver_info

这里可以打印出usb 的

这里可以打印出VID PID interface 甚至是USB的类信息,驱动名称

在这里可以打印出一些usb的bus dev 甚至kobj对象里的信息,这些信息也可以用来修改网卡名称。

上面log 会打印

这些和uevent 上报的udevadm 打印出来的是一致的。

这里是一个客户同时接了两个模组,希望固定网卡名称的方法

struct device 结构里有成员 struct kobject kobj

为什么GobiNet 有的版本网卡名字是ethX,有的是usbX?

在新版本的代码里


可以看到.flags = FLAG_RX_ASSEMBLE, //usb0

而在老版本的GobiNet 驱动里,由于

flag 或上了 FLAG_ETHER,所以出来的网卡就是ethX.
通过ubnet_probe 我们知道,只要或上了 FLAG_ETHER 出来的就是ethX了