分析struct net

    技术2022-05-12  4

    分析struct net_device 相关文件: linux/include/linux/netdevice.h linux/drivers/net/Space.c linux/include/net/iw_handler.h char name[IFNAMSIZ]; 在space.c文件中初始化。 unsigned long mem_end; unsigned long mem_start; 设备相关的共享内存区 unsigned long base_addr; 设备io地址,用于内存映射前的io unsigned int irq; 中断号 unsigned char if_port; unsigned char dma; 这两个变量不是每个设备都有用,但是都被space.c初始化 unsigned long state; 设备状态 __LINK_STATE_XOFF         0 Device queue turned off. __LINK_STATE_START        1 Device queue turned on. __LINK_STATE_PRESENT    2 Device ready to be scheduled. __LINK_STATE_SCHED     3 __LINK_STATE_NOCARRIER     4 __LINK_STATE_RX_SCHED     5 Device placed on poll list. __LINK_STATE_LINKWATCH_PENDING 6 /* The device initialization function. Called only once. */ int    (*init)(struct net_device *dev); 这是最后一个被space.c中的probe函数预先初始化的数据。 /* Interface index. Unique device identifier    */ int ifindex; int iflink; 设备的次序,和唯一的设备标识符。 struct net_device_stats* (*get_stats)(struct net_device *dev); 返回网络接口状态 struct iw_statistics* (*get_wireless_stats)(struct net_device *dev); 这个函数我并没有在最新的内核中看到,可能是修改了挺多;但是看到了配置选项。 struct iw_handler_def * wireless_handlers; struct ethtool_ops *ethtool_ops; 这是无线设备使用的扩展功能。 在linux/include/net/iw_handler.h中可以看到更多关于。 我们开始在用户看不到的区域了,驱动的编写者不应该涉及到这部分,这是系统内部的。 unsigned long trans_start; 最后一次传输的开始时间。 unsigned long last_rx; 最后收到数据包的时间。 unsigned short flags; /* interface flags (a la BSD)*/ unsigned short gflags; BSD风格的标识。 unsigned short priv_flags; 和flags相同,但是不可见在用户空间。 unsigned short unused_alignment_fixer; unsigned mtu; 最大传输单元 unsigned short type; 网络硬件的类型 unsigned short hard_header_len;        /* hardware hdr length  */ 数据链路层的头大小。 void *priv; 指向似有数据 struct net_device *master; 指向设备群中主设备 unsigned char broadcast[MAX_ADDR_LEN]; 广播地址 unsigned char dev_addr[MAX_ADDR_LEN]; 硬件地址 在内核代码中有这么一句话:Interface address info used in eth_type_trans() unsigned char addr_len; 硬件地址长度 struct dev_mc_list *mc_list; 网络设备的链路层或者是MAC多播地址, 关于多播和单播 int mc_count 多播地址数 int promiscuity; 是否为混杂模式 int allmulti; int watchdog_timeo; struct timer_list watchdog_timer; 看门狗 void *atalk_ptr; 用于AppleTalk void *ip_ptr; 用于ipv4 void *dn_ptr; 用于DECnet void *ip6_ptr; 用于ipv6 void *ec_ptr; 用于Econet void *ax25_ptr; 用于AX.25协议 struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, assign before registering */ struct list_head poll_list; 排序数据包的链表 int quota; 用于backlog device,输入的队列 int weight; struct Qdisc *qdisc; 队列原则 struct Qdisc *qdisc_sleeping;??struct Qdisc *qdisc_list; 指向了注册了的队列原则用于网络接口设备 struct Qdisc *qdisc_ingress; 输入队列的原则 unsigned long tx_queue_len; 最大的输出数目 spinlock_t xmit_lock; 用于同步hard_start_xmit函数 int xmit_lock_owner; spinlock_t queue_lock; 队列互斥锁 atomic_t refcnt; 指向该设备的引用 struct list_head todo_list; 用于没有注册和注册了的延迟设备 /*register/unregister state machine */ enum { NETREG_UNINITIALIZED=0,     NETREG_REGISTERED, /* completed register_netdevice */     NETREG_UNREGISTERING, /* called unregister_netdevice */     NETREG_UNREGISTERED, /* completed unregister todo */     NETREG_RELEASED, /* called free_netdev */ } reg_state; /* Net device features */ unsigned long features; 可选项: #define NETIF_F_SG 1 /* Scatter/gather IO. */ #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ #define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */ #define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */ #define NETIF_F_IPV6_CSUM 16 /* Can checksum TCP/UDP over IPV6 */ #define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */ #define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */ #define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */ #define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */ #define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */ #define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */ #define NETIF_F_GSO 2048 /* Enable software GSO. */ #define NETIF_F_LLTX 4096 /* LockLess TX */ #define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */ /* Segmentation offload features */ #define NETIF_F_GSO_SHIFT 16 #define NETIF_F_GSO_MASK 0xffff0000 #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) #define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) 350 #define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) #define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) /* List of features with software fallbacks. */ 355 #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) #define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM) 360 #define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) #define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) void (*uninit)(struct net_device *dev); 在设备和网络连接时候被调用。 void (*destructor)(struct net_device *dev); 当最后一个用户撤销了引用时。 接下来的一些函数是真正的执行函数,在后面将介绍。 struct net_bridge_port *br_port; 用于实现第二层的桥接。 #ifdef CONFIG_NET_FASTROUTE #define NETDEV_FASTROUTE_HMASK 0xF 如果定义了快速路由,那么这将生效 rwlock_t fastpath_lock; struct dst_entry *fastpath[NETDEV_FASTROUTE_HMASK+1]; struct divert_blk *divert; 将会被每一个接口类型的初始化函数初始化。 struct class_device class_dev; struct net_device_stats* (*last_stats)(struct net_device *);

    最新回复(0)