net_device 结构体分析

/*
 *    The DEVICE structure.
 *    Actually, this whole structure is a big mistake.  It mixes I/O
 *    data with strictly "high-level" data, and it has to know about
 *    almost every data structure used in the INET module.
 *
 *    FIXME: cleanup struct net_device such that network protocol info
 *    moves out.
 */

struct net_device {

    /*
     * This is the first field of the "visible" part of this structure
     * (i.e. as seen by users in the "Space.c" file).  It is the name
     * of the interface.
     */
    char            name[IFNAMSIZ];    //网络设备的具体名字

    struct pm_qos_request_list pm_qos_req;

    /* device name hash chain */
    struct hlist_node    name_hlist;
    /* snmp alias */
    char             *ifalias;

    /*
     *    I/O specific fields
     *    FIXME: Merge these and struct ifmap into one
     */
    unsigned long        mem_end;    /* shared mem end    */ //设备说是用的共享内存的起始和结束地址
    unsigned long        mem_start;    /* shared mem start    */
    unsigned long        base_addr;    /* device I/O address    */ //网络设备I/O基地址
    unsigned int        irq;        /* device IRQ number    */ //设备使用的中断号

    /*
     *    Some hardware also needs these fields, but they are not
     *    part of the usual set specified in Space.c.
     */

    unsigned char        if_port;    /* Selectable AUI, TP,..*/ //指定多端口设备使用哪个端口,仅针对多端口设备
    unsigned char        dma;        /* DMA channel        */ //分配给该设备的 DMA 通道

    unsigned long        state;

    struct list_head    dev_list;
    struct list_head    napi_list;
    struct list_head    unreg_list;

    /* 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 - deprecated. Please */
                    /* do not use LLTX in new drivers */
#define NETIF_F_NETNS_LOCAL    8192    /* Does not change network namespaces */
#define NETIF_F_GRO        16384    /* Generic receive offload */
#define NETIF_F_LRO        32768    /* large receive offload */

/* the GSO_MASK reserves bits 16 through 23 */
#define NETIF_F_FCOE_CRC    (1 << 24) /* FCoE CRC32 */
#define NETIF_F_SCTP_CSUM    (1 << 25) /* SCTP checksum offload */
#define NETIF_F_FCOE_MTU    (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/
#define NETIF_F_NTUPLE        (1 << 27) /* N-tuple filters supported */
#define NETIF_F_RXHASH        (1 << 28) /* Receive hashing offload */

    /* Segmentation offload features */
#define NETIF_F_GSO_SHIFT    16
#define NETIF_F_GSO_MASK    0x00ff0000
#define NETIF_F_TSO        (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO        (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
#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)
#define NETIF_F_FSO        (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)

    /* List of features with software fallbacks. */
#define NETIF_F_GSO_SOFTWARE    (NETIF_F_TSO | NETIF_F_TSO_ECN |                  NETIF_F_TSO6 | NETIF_F_UFO)


#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)
#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)

    /*
     * If one device supports one of these features, then enable them
     * for all in netdev_increment_features.
     */
#define NETIF_F_ONE_FOR_ALL    (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST |                  NETIF_F_SG | NETIF_F_HIGHDMA |                         NETIF_F_FRAGLIST)

    /* Interface index. Unique device identifier    */
    int            ifindex;
    int            iflink;

    struct net_device_stats    stats;
    atomic_long_t        rx_dropped; /* dropped packets by core network
                         * Do not use this in drivers.
                         */

#ifdef CONFIG_WIRELESS_EXT
    /* List of functions to handle Wireless Extensions (instead of ioctl).
     * See <net/iw_handler.h> for details. Jean II */
    const struct iw_handler_def *    wireless_handlers;
    /* Instance data managed by the core of Wireless Extensions. */
    struct iw_public_data *    wireless_data;
#endif
    /* Management operations */
    const struct net_device_ops *netdev_ops;
    const struct ethtool_ops *ethtool_ops;

    /* Hardware header description */
    const struct header_ops *header_ops;

    unsigned int        flags;    /* interface flags (a la BSD)    */    //网络接口标志
    unsigned short        gflags;
        unsigned int            priv_flags; /* Like ‘flags‘ but invisible to userspace. */
    unsigned short        padded;    /* How much padding added by alloc_netdev() */

    unsigned char        operstate; /* RFC2863 operstate */
    unsigned char        link_mode; /* mapping policy to operstate */

    unsigned int        mtu;    /* interface MTU value        */   //最大传输单元
    unsigned short        type;    /* interface hardware type    */   //硬件接口的类型
    unsigned short        hard_header_len;    /* hardware hdr length    */  //网络设备的硬件头长度

    /* extra head- and tailroom the hardware may need, but not in all cases
     * can this be guaranteed, especially tailroom. Some cases also use
     * LL_MAX_HEADER instead to allocate the skb.
     */
    unsigned short        needed_headroom;
    unsigned short        needed_tailroom;

    /* Interface address info. */
    unsigned char        perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
    unsigned char        addr_assign_type; /* hw address assignment type */
    unsigned char        addr_len;    /* hardware address length    */
    unsigned short          dev_id;        /* for shared network cards */

    spinlock_t        addr_list_lock;
    struct netdev_hw_addr_list    uc;    /* Unicast mac addresses */
    struct netdev_hw_addr_list    mc;    /* Multicast mac addresses */
    int            uc_promisc;
    unsigned int        promiscuity;
    unsigned int        allmulti;


    /* Protocol specific pointers */

#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
    struct vlan_group __rcu    *vlgrp;        /* VLAN group */
#endif
#ifdef CONFIG_NET_DSA
    void            *dsa_ptr;    /* dsa specific data */
#endif
    void             *atalk_ptr;    /* AppleTalk link     */
    struct in_device __rcu    *ip_ptr;    /* IPv4 specific data    */
    void                    *dn_ptr;        /* DECnet specific data */
    struct inet6_dev __rcu    *ip6_ptr;       /* IPv6 specific data */
    void            *ec_ptr;    /* Econet specific data    */
    void            *ax25_ptr;    /* AX.25 specific data */
    struct wireless_dev    *ieee80211_ptr;    /* IEEE 802.11 specific data,
                           assign before registering */

/*
 * Cache lines mostly used on receive path (including eth_type_trans())
 */
    unsigned long        last_rx;    /* Time of last Rx
                         * This should not be set in
                         * drivers, unless really needed,
                         * because network stack (bonding)
                         * use it if/when necessary, to
                         * avoid dirtying this cache line.
                         */

    struct net_device    *master; /* Pointer to master device of a group,
                      * which this device is member of.
                      */

    /* Interface address info used in eth_type_trans() */
    unsigned char        *dev_addr;    /* hw address, (before bcast  //设备的硬件地址,即MAC地址
                           because most packets are
                           unicast) */

    struct netdev_hw_addr_list    dev_addrs; /* list of device         //设备的广播地址
                              hw addresses */

    unsigned char        broadcast[MAX_ADDR_LEN];    /* hw bcast add    */

#ifdef CONFIG_RPS
    struct kset        *queues_kset;

    struct netdev_rx_queue    *_rx;

    /* Number of RX queues allocated at register_netdev() time */
    unsigned int        num_rx_queues;

    /* Number of RX queues currently active in device */
    unsigned int        real_num_rx_queues;
#endif

    rx_handler_func_t    *rx_handler;
    void            *rx_handler_data;

    struct netdev_queue __rcu *ingress_queue;

/*
 * Cache lines mostly used on transmit path
 */
    struct netdev_queue    *_tx ____cacheline_aligned_in_smp;

    /* Number of TX queues allocated at alloc_netdev_mq() time  */
    unsigned int        num_tx_queues;

    /* Number of TX queues currently active in device  */
    unsigned int        real_num_tx_queues;

    /* root qdisc from userspace point of view */
    struct Qdisc        *qdisc;

    unsigned long        tx_queue_len;    /* Max frames per queue allowed */
    spinlock_t        tx_global_lock;

    /* These may be needed for future network-power-down code. */

    /*
     * trans_start here is expensive for high speed devices on SMP,
     * please use netdev_queue->trans_start instead.
     */
    unsigned long        trans_start;    /* Time (in jiffies) of last Tx    */

    int            watchdog_timeo; /* used by dev_watchdog() */
    struct timer_list    watchdog_timer;

    /* Number of references to this device */
    int __percpu        *pcpu_refcnt;

    /* delayed register/unregister */
    struct list_head    todo_list;
    /* device index hash chain */
    struct hlist_node    index_hlist;

    struct list_head    link_watch_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 */
           NETREG_DUMMY,        /* dummy device for NAPI poll */
    } reg_state:16;

    enum {
        RTNL_LINK_INITIALIZED,
        RTNL_LINK_INITIALIZING,
    } rtnl_link_state:16;

    /* Called from unregister, can be used to call free_netdev */
    void (*destructor)(struct net_device *dev);

#ifdef CONFIG_NETPOLL
    struct netpoll_info    *npinfo;
#endif

#ifdef CONFIG_NET_NS
    /* Network namespace this network device is inside */
    struct net        *nd_net;
#endif

    /* mid-layer private */
    union {
        void                *ml_priv;
        struct pcpu_lstats __percpu    *lstats; /* loopback stats */
        struct pcpu_tstats __percpu    *tstats; /* tunnel stats */
        struct pcpu_dstats __percpu    *dstats; /* dummy stats */
    };
    /* GARP */
    struct garp_port __rcu    *garp_port;

    /* class/net/name entry */
    struct device        dev;
    /* space for optional device, statistics, and wireless sysfs groups */
    const struct attribute_group *sysfs_groups[4];

    /* rtnetlink link ops */
    const struct rtnl_link_ops *rtnl_link_ops;

    /* VLAN feature mask */
    unsigned long vlan_features;

    /* for setting kernel sock attribute on TCP connection setup */
#define GSO_MAX_SIZE        65536
    unsigned int        gso_max_size;

#ifdef CONFIG_DCB
    /* Data Center Bridging netlink ops */
    const struct dcbnl_rtnl_ops *dcbnl_ops;
#endif

#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
    /* max exchange id for FCoE LRO by ddp */
    unsigned int        fcoe_ddp_xid;
#endif
    /* n-tuple filter list attached to this device */
    struct ethtool_rx_ntuple_list ethtool_ntuple_list;

    /* phy device may attach itself for hardware timestamping */
    struct phy_device *phydev;
};


Reference

[1].http://blog.csdn.net/lamdoc/article/details/7876777



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。