MirkoBanchi MirkoBanchi - 4 months ago 16
Linux Question

Which is the correct way to register a new net_device?

i'm trying to register a new

net_device
in linux...i can alloc and register it correctly and
ifconfig
shows it. The problem arrives when i try to put the interface up:

ifconfig my_dev up


A kernel freeze occurs...the problem is present only on x86 machines and i can't figure out the reason...on a pcc machine all works well. The code is very simple:

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);


The first four functions
veth_dev_init, veth_open, veth_close
and
veth_ioctl
simply return 0.
Maybe is there a missing field in
veth_ops
structure?

Thank you all!

Answer

Yea, you missed one element in struct net_device_ops
Add .ndo_start_xmit also, And the function must return NETDEV_TX_OK or NETDEV_TX_BUSY.

use as follows

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

And also change the open as

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

Then in 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,
};

Then after inserting the module

give ifconfig my_dev 192.168.10.98 ...

Comments