struct net_device_ops 详解

【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】

虚拟网络设备使用,模拟网络载波的开关;

你可能感兴趣的:(NET驱动)