【linux驱动分析】之dm9000驱动分析(四):net_device结构体

来源:互联网 发布:向量用矩阵表示 编辑:程序博客网 时间:2024/05/18 02:25
net_device结构体,定义在include/linux/netdevice.h中,这是一个很复杂的结构体,先把代码清单列出来,再用到的过程中,逐步分析,最后来这里做个总结。
下面的代码是linux-2.6.38中的。
  1 /*  2  *    The DEVICE structure.  3  *    Actually, this whole structure is a big mistake.  It mixes I/O  4  *    data with strictly "high-level" data, and it has to know about  5  *    almost every data structure used in the INET module.  6  *  7  *    FIXME: cleanup struct net_device such that network protocol info  8  *    moves out.  9  */ 10  11 struct net_device { 12  13     /* 14      * This is the first field of the "visible" part of this structure 15      * (i.e. as seen by users in the "Space.c" file).  It is the name 16      * of the interface. 17      */ 18     char            name[IFNAMSIZ]; 19  20     struct pm_qos_request_list pm_qos_req; 21  22     /* device name hash chain */ 23     struct hlist_node    name_hlist; 24     /* snmp alias */ 25     char             *ifalias; 26  27     /* 28      *    I/O specific fields 29      *    FIXME: Merge these and struct ifmap into one 30      */ 31     unsigned long        mem_end;    /* shared mem end    */ 32     unsigned long        mem_start;    /* shared mem start    */ 33     unsigned long        base_addr;    /* device I/O address    */ 34     unsigned int        irq;        /* device IRQ number    */ 35  36     /* 37      *    Some hardware also needs these fields, but they are not 38      *    part of the usual set specified in Space.c. 39      */ 40  41     unsigned char        if_port;    /* Selectable AUI, TP,..*/ 42     unsigned char        dma;        /* DMA channel        */ 43  44     unsigned long        state; 45  46     struct list_head    dev_list; 47     struct list_head    napi_list; 48     struct list_head    unreg_list; 49  50     /* Net device features */ 51     unsigned long        features; 52 #define NETIF_F_SG        1    /* Scatter/gather IO. */ 53 #define NETIF_F_IP_CSUM        2    /* Can checksum TCP/UDP over IPv4. */ 54 #define NETIF_F_NO_CSUM        4    /* Does not require checksum. F.e. loopack. */ 55 #define NETIF_F_HW_CSUM        8    /* Can checksum all the packets. */ 56 #define NETIF_F_IPV6_CSUM    16    /* Can checksum TCP/UDP over IPV6 */ 57 #define NETIF_F_HIGHDMA        32    /* Can DMA to high memory. */ 58 #define NETIF_F_FRAGLIST    64    /* Scatter/gather IO. */ 59 #define NETIF_F_HW_VLAN_TX    128    /* Transmit VLAN hw acceleration */ 60 #define NETIF_F_HW_VLAN_RX    256    /* Receive VLAN hw acceleration */ 61 #define NETIF_F_HW_VLAN_FILTER    512    /* Receive filtering on VLAN */ 62 #define NETIF_F_VLAN_CHALLENGED    1024    /* Device cannot handle VLAN packets */ 63 #define NETIF_F_GSO        2048    /* Enable software GSO. */ 64 #define NETIF_F_LLTX        4096    /* LockLess TX - deprecated. Please */ 65                     /* do not use LLTX in new drivers */ 66 #define NETIF_F_NETNS_LOCAL    8192    /* Does not change network namespaces */ 67 #define NETIF_F_GRO        16384    /* Generic receive offload */ 68 #define NETIF_F_LRO        32768    /* large receive offload */ 69  70 /* the GSO_MASK reserves bits 16 through 23 */ 71 #define NETIF_F_FCOE_CRC    (1 << 24) /* FCoE CRC32 */ 72 #define NETIF_F_SCTP_CSUM    (1 << 25) /* SCTP checksum offload */ 73 #define NETIF_F_FCOE_MTU    (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ 74 #define NETIF_F_NTUPLE        (1 << 27) /* N-tuple filters supported */ 75 #define NETIF_F_RXHASH        (1 << 28) /* Receive hashing offload */ 76  77     /* Segmentation offload features */ 78 #define NETIF_F_GSO_SHIFT    16 79 #define NETIF_F_GSO_MASK    0x00ff0000 80 #define NETIF_F_TSO        (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) 81 #define NETIF_F_UFO        (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) 82 #define NETIF_F_GSO_ROBUST    (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) 83 #define NETIF_F_TSO_ECN        (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) 84 #define NETIF_F_TSO6        (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) 85 #define NETIF_F_FSO        (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) 86  87     /* List of features with software fallbacks. */ 88 #define NETIF_F_GSO_SOFTWARE    (NETIF_F_TSO | NETIF_F_TSO_ECN | \ 89                  NETIF_F_TSO6 | NETIF_F_UFO) 90  91  92 #define NETIF_F_GEN_CSUM    (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) 93 #define NETIF_F_V4_CSUM        (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM) 94 #define NETIF_F_V6_CSUM        (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) 95 #define NETIF_F_ALL_CSUM    (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) 96  97     /* 98      * If one device supports one of these features, then enable them 99      * for all in netdev_increment_features.100      */101 #define NETIF_F_ONE_FOR_ALL    (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \102                  NETIF_F_SG | NETIF_F_HIGHDMA |        \103                  NETIF_F_FRAGLIST)104 105     /* Interface index. Unique device identifier    */106     int            ifindex;107     int            iflink;108 109     struct net_device_stats    stats;110     atomic_long_t        rx_dropped; /* dropped packets by core network111                          * Do not use this in drivers.112                          */113 114 #ifdef CONFIG_WIRELESS_EXT115     /* List of functions to handle Wireless Extensions (instead of ioctl).116      * See <net/iw_handler.h> for details. Jean II */117     const struct iw_handler_def *    wireless_handlers;118     /* Instance data managed by the core of Wireless Extensions. */119     struct iw_public_data *    wireless_data;120 #endif121     /* Management operations */122     const struct net_device_ops *netdev_ops;123     const struct ethtool_ops *ethtool_ops;124 125     /* Hardware header description */126     const struct header_ops *header_ops;127 128     unsigned int        flags;    /* interface flags (a la BSD)    */129     unsigned short        gflags;130         unsigned int            priv_flags; /* Like 'flags' but invisible to userspace. */131     unsigned short        padded;    /* How much padding added by alloc_netdev() */132 133     unsigned char        operstate; /* RFC2863 operstate */134     unsigned char        link_mode; /* mapping policy to operstate */135 136     unsigned int        mtu;    /* interface MTU value        */137     unsigned short        type;    /* interface hardware type    */138     unsigned short        hard_header_len;    /* hardware hdr length    */139 140     /* extra head- and tailroom the hardware may need, but not in all cases141      * can this be guaranteed, especially tailroom. Some cases also use142      * LL_MAX_HEADER instead to allocate the skb.143      */144     unsigned short        needed_headroom;145     unsigned short        needed_tailroom;146 147     /* Interface address info. */148     unsigned char        perm_addr[MAX_ADDR_LEN]; /* permanent hw address */149     unsigned char        addr_assign_type; /* hw address assignment type */150     unsigned char        addr_len;    /* hardware address length    */151     unsigned short          dev_id;        /* for shared network cards */152 153     spinlock_t        addr_list_lock;154     struct netdev_hw_addr_list    uc;    /* Unicast mac addresses */155     struct netdev_hw_addr_list    mc;    /* Multicast mac addresses */156     int            uc_promisc;157     unsigned int        promiscuity;158     unsigned int        allmulti;159 160 161     /* Protocol specific pointers */162 163 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)164     struct vlan_group __rcu    *vlgrp;        /* VLAN group */165 #endif166 #ifdef CONFIG_NET_DSA167     void            *dsa_ptr;    /* dsa specific data */168 #endif169     void             *atalk_ptr;    /* AppleTalk link     */170     struct in_device __rcu    *ip_ptr;    /* IPv4 specific data    */171     struct dn_dev __rcu     *dn_ptr;        /* DECnet specific data */172     struct inet6_dev __rcu    *ip6_ptr;       /* IPv6 specific data */173     void            *ec_ptr;    /* Econet specific data    */174     void            *ax25_ptr;    /* AX.25 specific data */175     struct wireless_dev    *ieee80211_ptr;    /* IEEE 802.11 specific data,176                            assign before registering */177 178 /*179  * Cache lines mostly used on receive path (including eth_type_trans())180  */181     unsigned long        last_rx;    /* Time of last Rx182                          * This should not be set in183                          * drivers, unless really needed,184                          * because network stack (bonding)185                          * use it if/when necessary, to186                          * avoid dirtying this cache line.187                          */188 189     struct net_device    *master; /* Pointer to master device of a group,190                       * which this device is member of.191                       */192 193     /* Interface address info used in eth_type_trans() */194     unsigned char        *dev_addr;    /* hw address, (before bcast195                            because most packets are196                            unicast) */197 198     struct netdev_hw_addr_list    dev_addrs; /* list of device199                               hw addresses */200 201     unsigned char        broadcast[MAX_ADDR_LEN];    /* hw bcast add    */202 203 #ifdef CONFIG_RPS204     struct kset        *queues_kset;205 206     struct netdev_rx_queue    *_rx;207 208     /* Number of RX queues allocated at register_netdev() time */209     unsigned int        num_rx_queues;210 211     /* Number of RX queues currently active in device */212     unsigned int        real_num_rx_queues;213 #endif214 215     rx_handler_func_t __rcu    *rx_handler;216     void __rcu        *rx_handler_data;217 218     struct netdev_queue __rcu *ingress_queue;219 220 /*221  * Cache lines mostly used on transmit path222  */223     struct netdev_queue    *_tx ____cacheline_aligned_in_smp;224 225     /* Number of TX queues allocated at alloc_netdev_mq() time  */226     unsigned int        num_tx_queues;227 228     /* Number of TX queues currently active in device  */229     unsigned int        real_num_tx_queues;230 231     /* root qdisc from userspace point of view */232     struct Qdisc        *qdisc;233 234     unsigned long        tx_queue_len;    /* Max frames per queue allowed */235     spinlock_t        tx_global_lock;236 237 #ifdef CONFIG_XPS238     struct xps_dev_maps __rcu *xps_maps;239 #endif240 241     /* These may be needed for future network-power-down code. */242 243     /*244      * trans_start here is expensive for high speed devices on SMP,245      * please use netdev_queue->trans_start instead.246      */247     unsigned long        trans_start;    /* Time (in jiffies) of last Tx    */248 249     int            watchdog_timeo; /* used by dev_watchdog() */250     struct timer_list    watchdog_timer;251 252     /* Number of references to this device */253     int __percpu        *pcpu_refcnt;254 255     /* delayed register/unregister */256     struct list_head    todo_list;257     /* device index hash chain */258     struct hlist_node    index_hlist;259 260     struct list_head    link_watch_list;261 262     /* register/unregister state machine */263     enum { NETREG_UNINITIALIZED=0,264            NETREG_REGISTERED,    /* completed register_netdevice */265            NETREG_UNREGISTERING,    /* called unregister_netdevice */266            NETREG_UNREGISTERED,    /* completed unregister todo */267            NETREG_RELEASED,        /* called free_netdev */268            NETREG_DUMMY,        /* dummy device for NAPI poll */269     } reg_state:16;270 271     enum {272         RTNL_LINK_INITIALIZED,273         RTNL_LINK_INITIALIZING,274     } rtnl_link_state:16;275 276     /* Called from unregister, can be used to call free_netdev */277     void (*destructor)(struct net_device *dev);278 279 #ifdef CONFIG_NETPOLL280     struct netpoll_info    *npinfo;281 #endif282 283 #ifdef CONFIG_NET_NS284     /* Network namespace this network device is inside */285     struct net        *nd_net;286 #endif287 288     /* mid-layer private */289     union {290         void                *ml_priv;291         struct pcpu_lstats __percpu    *lstats; /* loopback stats */292         struct pcpu_tstats __percpu    *tstats; /* tunnel stats */293         struct pcpu_dstats __percpu    *dstats; /* dummy stats */294     };295     /* GARP */296     struct garp_port __rcu    *garp_port;297 298     /* class/net/name entry */299     struct device        dev;300     /* space for optional device, statistics, and wireless sysfs groups */301     const struct attribute_group *sysfs_groups[4];302 303     /* rtnetlink link ops */304     const struct rtnl_link_ops *rtnl_link_ops;305 306     /* VLAN feature mask */307     unsigned long vlan_features;308 309     /* for setting kernel sock attribute on TCP connection setup */310 #define GSO_MAX_SIZE        65536311     unsigned int        gso_max_size;312 313 #ifdef CONFIG_DCB314     /* Data Center Bridging netlink ops */315     const struct dcbnl_rtnl_ops *dcbnl_ops;316 #endif317 318 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)319     /* max exchange id for FCoE LRO by ddp */320     unsigned int        fcoe_ddp_xid;321 #endif322     /* n-tuple filter list attached to this device */323     struct ethtool_rx_ntuple_list ethtool_ntuple_list;324 325     /* phy device may attach itself for hardware timestamping */326     struct phy_device *phydev;327 };
0 0
原创粉丝点击