在linux系统中,网卡及对应的net_device结构体实例是由上层的网络子系统操作的,ecdev_offer()的作用是将网卡转交给ehterlab master操作。
一、预备知识net_device结构体
linux系统中,每一个网卡对应一个net_device结构体的实例,一个网卡要能够被内核识别并收发数据,一般需要经过net_device结构体的创建、初始化、注册到内核、打开设备等步骤:
其中,net_device的创建一般在网卡驱动程序的probe函数中完成。
net_device是一个很大的结构体,包含很多成员变量和函数指针,因此初始化工作分散在多处完成,与网卡硬件细节无关的通用数据域由内核的网络子系统初始化,如发送队列长度、MTU等,与网卡硬件相关的数据域由网卡的驱动程序初始化,如MAC地址、中断号等。
初始化完成后,net_device将被注册到内核中,并加入到dev_base_head开始的双向链表中,之后上层的协议(如TCP/IP)就可以通过调用net_device中的函数完成数据的收发。
然而,EtherCAT数据包不需要经过TCP/IP协议栈,因此net_device结构体不需要注册到内核中,而是由ecdev_offer注册到etherlab master中。