Как правильно зарегистрировать новый net_device? - PullRequest
7 голосов
/ 18 июля 2011

Я пытаюсь зарегистрировать новый net_device в Linux ... Я могу выделить и зарегистрировать его правильно, и ifconfig показывает это.Проблема возникает, когда я пытаюсь установить интерфейс:

ifconfig my_dev up

происходит зависание ядра ... проблема присутствует только на машинах x86, и я не могу выяснить причину ... наПКК машина все работает хорошо.Код очень прост:

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_close и veth_ioctl просто возвращают 0. Может, в структуре veth_ops отсутствует поле?

Спасибовсе!

1 Ответ

5 голосов
/ 03 августа 2011

Да, вы пропустили один элемент в 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;
}

А также изменить open на

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 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...