LINUX.ORG.RU

портиться указатель в net_device

 ,


0

1

Приветствую,

работаю над модулем реализующим виртуальный девайс для определенной задачи. Ядро 2.6.31.8, платформа MIPS.

Логика следующая:

static struct net_device_ops virt_net_ops = {
  .ndo_init = virt_net_init,
  .ndo_open = virt_net_open,
  .ndo_stop = virt_net_stop,
  .ndo_do_ioctl = virt_net_ioctl,
  .ndo_get_stats    = virt_net_get_stats,
  .ndo_start_xmit   = virt_net_start_xmit,
};

...

  struct net_device *dev;
  struct my_dev *virt;

  dev = alloc_netdev(..);
  /* check for NULL */

  virt = netdev_priv(dev);

  dev->netdev_ops = &virt_net_ops;
  SET_ETHTOOL_OPS(dev, &virt_ethtool_ops);
  dev_net_set(dev, net);
  virt->magic = MY_VIRT_DEV_MAGIC;
  ret = register_netdev(dev);
  if (ret) {
     printk("register_netdev failed\n");
     free_netdev(dev);
     return ret;
  }

Устройства создается по получении сообщения из user-space через netlink сокеты. Однако, я наблюдаю что указатель net_device_ops в 'net_dev' каким-то образом меняется, т.е.

1) создаем девайс (аллоцировали net_dev, проинициализировали поля включая net_device_ops, который указывает на static структуру в этом же модуле), регистрируем девайс register_netdev() - все OK.

2) пытаемся создать устройство с этим же именем вторично, повторяем все те же шаги, вызываем register_netdev() который возвращает ошибку, делаем free_netdev(dev) и возвращаем ошибку пользовательскому процессу.

Где-то между этим двумя событиями указатель net_device_ops в первой структуре 'net_dev' сменился, хотя все остальные поля остались нетронутыми. Нигде в моем коде я напрямую не манипулирую с net_device_ops, кроме этапа создания девайса.

Есть ли какие-то предположения, где возможна ошибка и как ее искать? Есть ли какие-то ядерные средства отслеживания подобных ситуаций? (например, отслеживать состояние и обращения к девайсам зарегистрированных в ядре?).

Буду признателен за советы. Спасибо.

★★

Выложи код модуля полностью. Читать это текстовое описание — влом. По крайней мере мне.

ttnl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.