linux - 注册新网络设备的正确方法是什么?

标签 linux linux-kernel

我正在尝试在 Linux 中注册一个新的 net_device...我可以正确分配和注册它,ifconfig 会显示它。当我尝试建立界面时,问题来了:

ifconfig my_dev up

发生内核卡住...问题仅出现在 x86 机器上,我无法找出原因...在 pcc 机器上一切正常。代码非常简单:

static struct net_device *my_dev;

static int veth_dev_init(struct net_device *dev);
static int veth_open(struct net_device *dev);
static int veth_close(struct net_device *dev);
static int veth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);

static struct veth_priv
{
   ...
};

static struct net_device_ops veth_ops =
{
  .ndo_init = veth_dev_init,
  .ndo_open = veth_open,
  .ndo_stop = veth_close,
  .ndo_do_ioctl = veth_ioctl
};

static int __init veth_init()
{
  my_dev = alloc_netdev(sizeof(struct veth_priv), "my_dev", ether_setup);
  if (my_dev == NULL)
    return -ENOMEM;

  my_dev->netdev_ops = &veth_ops;

  register_netdev(my_dev);
  return 0;
}

static void __exit veth_exit()
{
  unregister_netdev(my_dev);
  free_netdev(my_dev);
}

module_init(veth_init);
module_exit(veth_exit);

前四个函数 veth_dev_init、veth_open、veth_closeveth_ioctl 只返回 0。 也许 veth_ops 结构中缺少字段?

谢谢大家!

最佳答案

是的,您错过了 struct net_device_ops 中的一个元素
同时添加.ndo_start_xmit,函数必须返回NETDEV_TX_OK或NETDEV_TX_BUSY。

使用方法如下

static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
    return NETDEV_TX_OK;
}

同时更改打开

static int veth_open(struct net_device *dev)
{
     memcpy(dev->dev_addr, "\0ABCD0", ETH_ALEN);
     netif_start_queue(dev);
     return 0;
}

然后在 veth_ops

static struct net_device_ops veth_ops = {
     .ndo_init         = veth_dev_init,
     .ndo_open         = veth_open,
     .ndo_stop         = veth_close,
     .ndo_start_xmit   = veth_xmit,
     .ndo_do_ioctl     = veth_ioctl,
};

然后插入模块后

给 ifconfig my_dev 192.168.10.98 ...

关于linux - 注册新网络设备的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726939/

相关文章:

linux - 使用bash将二进制文件转换为十进制格式,如何?

c++ - 我调用execvp运行Java时发生错误

linux - Bash init - 在特定用户下启动服务

linux - PCI/PCIe 设备如何在 Linux 内核中初始化/注册自己?

linux - 不引导嵌入在 Linux 内核中的 RAM 文件系统

php - Git POST webhook shell_exec

c - 当有 `-L` 时使用 `LD_LIBRARY_PATH` 有什么意义?

linux-kernel - "kernel tainted"是什么意思?

c - Linux 内核从 kzalloc 取消引用 memset 中的 NULL 指针

linux - 为什么 Linux 内核的 pr_debug 没有给出任何输出?