网络子系统4_以太网设备描述符

来源:互联网 发布:女生宿舍关系 知乎 编辑:程序博客网 时间:2024/05/29 00:34
//分配以太网设备描述符1.1 struct net_device *alloc_etherdev(int sizeof_priv){//设备名默认为eth%d,其中%d随系统中以太网络设备数递增return alloc_netdev(sizeof_priv, "eth%d", ether_setup);}//网络设备描述符标准分配函数//alloc_etherdev->alloc_netdev1.2 struct net_device *alloc_netdev(int sizeof_priv, const char *name,void (*setup)(struct net_device *)){void *p;struct net_device *dev;int alloc_size;//对齐到32bitalloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;//kmalloc物理内存上连续p = kmalloc(alloc_size, GFP_KERNEL);if (!p) {printk(KERN_ERR "alloc_dev: Unable to allocate device.\n");return NULL;}memset(p, 0, alloc_size);dev = (struct net_device *)(((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);//在padded中保存为对齐dev到32bit浪费的字节数//dev-padded即可找到kmalloc分配的内存起始地址dev->padded = (char *)dev - (char *)p;if (sizeof_priv)dev->priv = netdev_priv(dev);//初始化设备的函数指针setup(dev);strcpy(dev->name, name);return dev;}//以太网设备通用的初始化函数//调用路径:alloc_netdev->ether_setup1.3 void ether_setup(struct net_device *dev){dev->change_mtu= eth_change_mtu;//保证ethdev的mtu > 68 && mtu < 1500dev->hard_header= eth_header;//向skb填以太网报头dev->rebuild_header = eth_rebuild_header;//完成arp解析以后,重建以太网报头dev->set_mac_address = eth_mac_addr;//设置设备的mac地址dev->hard_header_cache= eth_header_cache;//根据arp查询的结果,构造hh_cache,供邻居子系统使用dev->header_cache_update= eth_header_cache_update;//更新hh_cache中的以太网头dev->hard_header_parse= eth_header_parse;//从skb中取出以太网头,填充到一个unsigned char*指针中dev->type= ARPHRD_ETHER;//以太网类型dev->hard_header_len = ETH_HLEN;//以太网报头长度 14字节dev->mtu= 1500; //最大支持的mtudev->addr_len= ETH_ALEN;//地址长度 6字节dev->tx_queue_len= 1000;//每个设备的传输队列长度dev->flags= IFF_BROADCAST|IFF_MULTICAST;//设备默认支持广播和多播memset(dev->broadcast,0xFF, ETH_ALEN);//以太网广播地址FF:FF:FF:FF:FF:FF}