声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是介绍关于linux 如何实现loopback NIC 驱动!
dev_unicast_init是初始化unicast地址。
static void dev_unicast_init(struct net_device *dev) { __hw_addr_init(&dev->uc); }
|
上篇文章介绍过__hw_addr_init这个方法,只是对链表进行初始化。
链表关系上篇文章里也有关于uc的,请参考。
netdev_init_queues是初始化device的送信/发信queue。
static void netdev_init_queues(struct net_device *dev) { netdev_init_one_queue(dev, &dev->rx_queue, NULL); netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL); spin_lock_init(&dev->tx_global_lock); }
|
初始化queue,只是把queue的dev指针设置为本device的net_device指针。
之后初始化net device关联的其他双向链表,然后执行call back方法,
即loopback_setup方法
/* * The loopback device is special. There is only one instance * per network namespace. */ static void loopback_setup(struct net_device *dev) { dev->mtu = (16 * 1024) + 20 + 20 + 12; dev->hard_header_len = ETH_HLEN; /* 14 */ dev->addr_len = ETH_ALEN; /* 6 */ dev->tx_queue_len = 0; dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ dev->flags = IFF_LOOPBACK; dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX | NETIF_F_NETNS_LOCAL; dev->ethtool_ops = &loopback_ethtool_ops; dev->header_ops = ð_header_ops; dev->netdev_ops = &loopback_ops; dev->destructor = loopback_dev_free; }
|
这个设置很重要,关于这个net device的特有设置。
loopback NetDevice被设置为普通的Ether网卡,
所以,addr_len长度就是Mac地址长度。hard_header_len就是EthernetFrame
Header的长度了。还设置了最重要的VFT,其中netdev_ops就是对NIC操作的
VFT。比如启动,关闭网卡等。定义如下
static const struct net_device_ops loopback_ops = { .ndo_init = loopback_dev_init, .ndo_start_xmit= loopback_xmit, .ndo_get_stats = loopback_get_stats, };
|
注册NIC时将调用ndo_init这个Call Back方法。
ndo_start_xmit是被L3层送信时所调用。即送信方法。
ndo_get_stats是去NIC的状态信息。
header_ops是对NIC头部信息的操作VFT,其实就是EthernetFrame 的头部处理的方法。
ethtool_ops是UserSpace操作NIC的VFT。
阅读(1002) | 评论(0) | 转发(0) |