Приветствую,
работаю над модулем реализующим виртуальный девайс для определенной задачи. Ядро 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, кроме этапа создания девайса.
Есть ли какие-то предположения, где возможна ошибка и как ее искать?
Есть ли какие-то ядерные средства отслеживания подобных ситуаций? (например,
отслеживать состояние и обращения к девайсам зарегистрированных в ядре?).
Буду признателен за советы. Спасибо.