【源码】net_device结构

自己对TCP/IP内核有兴趣,一直只是不愠不火的看着,没什么头绪,没什么总结,想借着最近有想写blog的精神,坚持一段时间,看看到底写到什么程度。先分析结构体,再考虑下怎么写初始化。

因为相应出书了,只看书而使自己忘记了看源码本书,两者互相看的话,可能效果更好。

目前没找到更好的排版,只是凑合先这么着,找到更好的换。

http://www.oschina.net/code/explore/linux-2.6.36/include/linux/netdevice.h   line778

/**
*    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通道,由ISA设备使用 */

    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;/*以dev_new_index注册时分派给每个设备*/
    int            iflink; /*由(虚拟)隧道设备使用*/

    struct net_device_stats    stats;

#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; /**标识可以通过ifconifg命令查看*/
    unsigned short          priv_flags; /** Like 'flags' but invisible to userspace. 由VLAN和Bridge虚拟设备使用*/
    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;

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

    /** 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 */
#ifdef CONFIG_NET_DSA
    void            *dsa_ptr;    /** dsa specific data */
#endif
    void             *atalk_ptr;    /** AppleTalk link     */
    void            *ip_ptr;    /** IPv4 specific data    */
    void                    *dn_ptr;        /** DECnet specific data */
    void                    *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 line mostly used on receive path (including eth_type_trans())
*/
    unsigned long        last_rx;    /** Time of last Rx    */
    /** Interface address info used in eth_type_trans() */
    unsigned char        *dev_addr;    /** hw address, (before bcast
                           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 alloc_netdev_mq() time  */
    unsigned int        num_rx_queues;
#endif

    struct netdev_queue    rx_queue;
    rx_handler_func_t    *rx_handler;
    void            *rx_handler_data;

    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;
/**
* One part is mostly used on xmit path (device)
*/
    /** 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 */
    atomic_t        refcnt ____cacheline_aligned_in_smp;

    /** 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 */
    void            *ml_priv;

    /** GARP */
    struct garp_port    *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;
};

 

 

 

参考资料:{应该以这两本为主了,网上资料用来完善}

《深入理解Linux网络技术内幕》

《LDD》

 

PS:这几个网页资料先录下,没看完

http://wenku.baidu.com/view/f6d0cd4469eae009581bece5.html###

http://blog.21ic.com/user1/1066/archives/2007/40728.html

http://blog.csdn.net/smallnew198705/article/details/5489346

http://blog.sina.com.cn/s/blog_5ceeb9ea0100wzxj.html

http://oss.org.cn/kernel-book/ldd3/ch17s03.html

你可能感兴趣的:(【源码】net_device结构)