閱讀269 返回首頁    go 阿裏雲 go 技術社區[雲棲]


網絡子係統4_以太網設備描述符

//分配以太網設備描述符
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_netdev
1.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;

	//對齊到32bit
	alloc_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_setup
1.3 void ether_setup(struct net_device *dev)
{
	dev->change_mtu		= eth_change_mtu;//保證ethdev的mtu > 68 && mtu < 1500
	dev->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; //最大支持的mtu
	dev->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

}



最後更新:2017-04-03 15:21:55

  上一篇:go 25款很好看的液晶數字字體下載
  下一篇:go Java麵向對象高級--接口的基本概念--------interface、implements