Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1007135
  • 博文数量: 442
  • 博客积分: 1146
  • 博客等级: 少尉
  • 技术积分: 1604
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 12:52
个人简介

123

文章分类

全部博文(442)

文章存档

2017年(3)

2016年(15)

2015年(132)

2014年(52)

2013年(101)

2012年(110)

2011年(29)

分类:

2012-01-18 22:03:32

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见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 = &eth_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。
 
 
 
 
 
 
 
 
 
 
 
 
 
 




阅读(1008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~