Linux操作系统原理—内核网络协议栈( 六 )


/* Initialize the rest of the 8390 device structure. */ int ethdev_init(struct device *dev) { if (ei_debug > 1) printk(version); if (dev->priv == NULL) { //申请私有空间 struct ei_device *ei_local; //8390 网卡设备的结构体 dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL); //申请内核内存空间 memset(dev->priv, 0, sizeof(struct ei_device)); ei_local = (struct ei_device *)dev->priv; #ifndef NO_PINGPONG ei_local->pingpong = 1; #endif } /* The open call may be overridden by the card-specific code. */ if (dev->open == NULL) dev->open = &ei_open; // 设备的打开函数 /* We should have a dev->stop entry also. */ dev->hard_start_xmit = &ei_start_xmit; // 设备的发送函数 , 定义在 8390.c 中 dev->get_stats = get_stats; #ifdef HAVE_MULTICAST dev->set_multicast_list = &set_multicast_list; #endif ether_setup(dev); return 0; } UDP 的收发包流程总览
Linux操作系统原理—内核网络协议栈
本文插图
内核中断收包流程
Linux操作系统原理—内核网络协议栈
本文插图
UDP 收包流程
Linux操作系统原理—内核网络协议栈
本文插图
UDP 发包流程
Linux操作系统原理—内核网络协议栈
本文插图
【Linux操作系统原理—内核网络协议栈】