【ndo_init】
注册网络设备时调用,驱动程序一般不使用,虚拟网络设备可能使用
【ndo_uninit】
网络设备卸载时调用,驱动程序一般使用
【ndo_open】
1、禁止所有中断、关闭载波(netif_carrier_off);
2、分配并初始化传输和接收描述符环内存(使用dma_alloc_coherent分配确保EMAC和CPU都可以访问);
3、分配发送skb处理状态的链表或者数组空间(使用kzalloc),其实也可以用sk_buff_head相关的数据结构和函数;
4、初始化接收描述符环,包括分配struct sk_buff以及数据缓存区(netdev_alloc_skb),并且进行DMA映射(dma_map_single);
5、注册中断相关函数(request_irq);
6、初始化MAC硬件模块(设置MAC相关过滤参数、填写传输和接收描述符初始化地址dma_addr_t、中断设置、聚合功能配置);
7、PHY芯片初始化并启动;
8、使能NAPI模块(napi_enable);
9、调用netif_start_queue或者netif_tx_start_all_queues使能传输队列调度;
10、调用netif_wake_queue或者netif_tx_wake_all_queues开启传输队列的调度(因为此时所有的传输环为空,可以立刻开始传输);
11、使能传输/接收通道,打开中断,开启定时器功能;
【ndo_stop】
1、停止上层传输调度;
2、停止NAPI功能;
3、停止MAC接收功能;
4、等待既有的skb数据发出去,释放skb跟踪链表;
5、停止发送功能;
6、禁止中断功能;
7、手动处理已接收到的数据包传递给上层协议;
8、释放接受和发送描述符环内存空间;
9、释放接收缓存数据空间;
10、反注册中断函数;
11、删除NAPI功能(netif_napi_del);
12、停止并删除timer功能、取消并删除delaywork;
13、关闭载波netif_carrier_off;
14、关闭MAC和PHY电源;
【ndo_start_xmit】
1、检查skb_shinfo(skb)->tx_flags标志位,SKBTX_HW_TSTAMP指示硬件向上层软件提供硬件时间戳(调用skb_tstamp_tx 、skb_tx_timestamp),设置过程中置位SKBTX_IN_PROGRESS,表示硬件正在处理上层的时间戳提取要求;
2、根据ip_summed查看是否需要协助计算校验和,需要csum_start和csum_offset;
3、是否需要VLAN标签插入,需要vlan_proto和vlan_tci;
4、queue_mapping指示该SKB需要插入到哪个传输队列上;
5、根据nr_frags检查是否需要发送碎片包,此时需要初始化nr_frags数量的传输描述符;
6、检查skb->encapsulation,确定是否需要使用内层协议头;
7、检查skb_shinfo(skb)->gso_size是否需要硬件进行分片操作;
7、映射DMA操作需要的地址,填入传输描述符中;
8、更新传输描述环相关状态;
9、记录该等待传输的SKB到链表中;
10、如果传输环空间不够应停止上层继续调度,也可以调用BQL机制(netdev_tx_sent_queue)实现自动调度控制;
11、检查skb是否为jumbo帧,硬件是否支持直接发送;
12、检查skb->no_fcs确定是否硬件需要在帧尾部加上FCS;
【ndo_select_queue】
选择传输队列
【ndo_change_rx_flags】
1、通知驱动程序netdev->flags标记(IFF_PROMISC、IFF_ALLMULTI、IFF_MULTICAST)已变更,由于上层协议栈对于ndo_change_rx_flags和ndo_set_rx_mode的调用并不同意,硬件的相应设置变更被放到ndo_set_rx_mode实现;
【ndo_set_rx_mode】
1、根据netdev->flags标记(IFF_PROMISC、IFF_ALLMULTI、IFF_MULTICAST),设置硬件混杂模式、单播模式、多播模式使能;
2、根据dev->uc设置硬件的单播地址列表,辅助函数netdev_for_each_uc_addr;
3、根据dev->mc设置硬件的多播地址列表,辅助函数netdev_for_each_mc_addr;
4、设置驱动私有的接收工作模式;
【ndo_set_mac_address】
设置网卡的MAC地址,更新dev->dev_addr,并设置相应硬件寄存器;传递参数为struct sockaddr
【ndo_validate_addr】
验证dev->dev_addr是否合法,对于ethernet网络,直接调用is_valid_ether_addr函数
【ndo_do_ioctl】
1、bond_dev设备相关的命令,驱动不理会;
2、PHY芯片的命令操作,直接使用generic_mii_ioctl函数phy_mii_ioctl函数;
3、net_bridge设备命令,驱动不理会;
4、PTP命令,驱动从ifr->ifr_data取出struct hwtstamp_config,根据其参数配置硬件的PTP时间戳功能;备注:config.flags必须为0,config.tx_type为HWTSTAMP_TX_OFF系列,config.rx_filter为HWTSTAMP_FILTER_NONE系列;
5、SIOCWANDEV命令,针对WLAN设备的。。。
【ndo_set_config】
驱动已经不再使用它啦~~
【ndo_change_mtu】
更改硬件的MTU值,注意检查硬件是否支持。。以及是否需要重新分配初始化描述符环以及接收缓存;
【ndo_neigh_setup】
设置邻居子系统struct neigh_parms参数,驱动不理会
【ndo_tx_timeout】
此时多半MAC以及宕机了,当然实际处理应该因人而异,不一定非得进行一次完全复位初始化操作
1、保存现场快照;
2、关闭MAC和PHY;
3、复位并重新初始化MAC和PHY
【ndo_get_stats64】
拷贝硬件统计计数到用户空间,注意使用的是__u64;对于1G或者更快的网卡,64位是必须的;
【ndo_get_stats】
拷贝硬件统计计数到用户空间,注意使用的是__u32;可以直接拷贝netdev->stats;低速网卡使用此方法;
【ndo_vlan_rx_add_vid】
如果网卡支持VLAN的VID过滤,则增加VID到过滤列表中;
【ndo_vlan_rx_kill_vid】
如果网卡支持VLAN的VID过滤,则从过滤列表中删除对应的VID;
【ndo_poll_controller】
使用查询方式代替中断方式处理网卡数据包收发事件,注意必须禁止中断,实际上直接调用中断函数,也可以直接调度NAPI去处理;
【ndo_netpoll_setup】
【ndo_netpoll_cleanup】
只有虚拟网络设备在使用
【ndo_set_vf_mac】
设置虚拟网卡的MAC地址,第二个参数是VF,第三个参数是需要设置的MAC地址指针;
【ndo_set_vf_vlan】
设置虚拟网卡的VLAN ID和User Priority,第二个参数代表虚拟功能号,第三个参数代表VLAN ID(1-4094),第四个参数代表User Priority(0-7)
VLAN TAG定义:
TPID |
User Priority |
CFI |
VID |
【ndo_set_vf_tx_rate】
设置虚拟网卡的传输速率,由于多个虚拟网卡共享一个物理端口,所以单个虚拟网卡的传输速率肯定小于标准值;
【ndo_set_vf_spoofchk】
设置虚拟网卡的MAC/VLAN反欺诈过滤功能(传输通道);
【ndo_get_vf_config】
获取虚拟网卡的参数,包括虚拟功能号、mac地址、传输速率、优先级Qos、欺诈使能标记,填入struct ifla_vf_info;
【ndo_set_vf_port】
设置虚拟网卡的参数:可能包括IFLA_PORT_UNSPEC至IFLA_PORT_RESPONSE;当前只有cisco的enic驱动支持
【ndo_get_vf_port】
返回虚拟网卡的参数,放到传递的第三个参数(skb),可以调用辅助函数nla_put;当前只有cisco的enic驱动支持
【ndo_setup_tc】
设置网卡的流量分类控制,如果第二个参数为0 ,则调用netdev_reset_tc关闭流量分类控制功能,相应的禁止硬件功能;如果第二个参数不为0 ,则设置netdev_set_num_tc和netdev_set_prio_tc_map
【ndo_fcoe_enable】
打开FCOE的卸货功能(offload),更新netdev->features,调用netdev_features_change,重新分配初始化传输接收环;
【ndo_fcoe_disable】
关闭FCOE的卸货功能(offload),更新netdev->features,调用netdev_features_change,重新分配初始化传输接收环;
【ndo_fcoe_ddp_setup】
【ndo_fcoe_ddp_target】
执行DDP(Direct Data Placement Protocol)相关的初始化操作,特别是struct scatterlist的DMA初始化;
【ndo_fcoe_ddp_done】
DDP(Direct Data Placement Protocol)完成后的处理,释放资源供下次DDP请求;
【ndo_fcoe_get_hbainfo】
返回硬件和驱动信息,填入struct netdev_fcoe_hbainfo;
【ndo_fcoe_get_wwn】
返回驱动自定义的wwn值,传入的参数type可能是NETDEV_FCOE_WWNN或者NETDEV_FCOE_WWPN;
关于WWNN和WWPN的说明参考《WWNN和WWPN介绍》
【ndo_rx_flow_steer】
设置RFS硬件过滤器,关于RFS参考《Receive flow steering》;
【ndo_add_slave】
创建虚拟网卡设备,驱动几乎不用;
【ndo_del_slave】
删除虚拟网卡设备,驱动几乎不用;
【ndo_fix_features】
检查并修正传递的netdev_features_t features是否满足硬件能力要求;
【ndo_set_features】
更改网卡的netdev->features并设置硬件的相应能力;
【ndo_neigh_construct】
构造邻居子系统struct neighbour,驱动几乎不用;
【ndo_neigh_destroy】
反构造邻居子系统struct neighbour,驱动几乎不用;
【ndo_fdb_add】
给指定地址添加FDB(forwarding database)实体;
【ndo_fdb_del】
给指定地址删除FDB(forwarding database)实体;
【ndo_fdb_dump】
导出FDB实体到skb中,同时更新idx,辅助函数包括netif_addr_lock_bh、nlmsg_populate_fdb、
【ndo_bridge_setlink】
设置网卡链路信息,从struct nlmsghdr获取设置信息;
【ndo_bridge_getlink】
返回网卡链路信息,填入skb中;
【ndo_bridge_dellink】
删除网卡链路信息;
【ndo_change_carrier】
虚拟网络设备使用,模拟网络载波的开关;