2019独角兽企业重金招聘Python工程师标准>>>

自己对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

转载于:https://my.oschina.net/wolflion/blog/90896

【源码】net_device结构相关推荐

  1. asterisk源码目录结构

    版本:asterisk-1.8.7.1 下载地址:asterisk-1.8.7.1.tar.gz main函数所在文件:main/asterisk.c (3182行) 文件夹: addons :ast ...

  2. 【原创】【专栏】《Linux设备驱动程序》--- LDD3源码目录结构和源码分析经典链接

    http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析 ...

  3. RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!

    RTOS有众多种,用得最火的是FreeRTOS,因为它即使用于商业途径,也是开源免费的:其次是就是uCOS-II和uCOS-III.uCOS-II用于商业途径是需要付费的,但是对于学习研究却是免费的. ...

  4. linux与安卓系统目录,android系统架构及源码目录结构

    1. android系统架构: android系统架构采用了分层架构的思想,如下图所示,从上到下共4层,分别为:应用程序层.应用程序框架层.系统库和android运行时层.linux内核层. 每层功能 ...

  5. 【lLinux驱动】linux内核源码目录结构

    linux内核源码目录结构 代码目录结构 在阅读源码之前,还应知道Linux内核源码的整体分布情况.现代的操作系统一般由进程管理.内存管理.文件系统.驱动程序和网络等组成.Linux内核源码的各个目录 ...

  6. Pixhawk飞控源码目录结构及编译流程分析

     http://blog.csdn.net/xlb7679/article/details/51658956 (PS:这是第一次写博客,以前也有记录一些经验总结心得什么的,不过都是手写笔记或者记在 ...

  7. Android系统源码学习——源码目录结构介绍

    2019独角兽企业重金招聘Python工程师标准>>> Android 4.0源码目录结构: 本文介绍Android源码目录结构,以便读者理清Android编译系统核心代码在Andr ...

  8. Linux操作系统内核源码目录结构详解

    Linux内核源码目录结构 代码目录结构 在阅读源码之前,还应知道Linux内核源码的整体分布情况.现代的操作系统一般由进程管理.内存管理.文件系统.驱动程序和网络等组成.Linux内核源码的各个目录 ...

  9. Android4.0源码目录结构详解

    Android4.0源码目录结构详解 Android4.0与2.1目录差不多 alsa这块,注意external/tinyalsa下有: include/tinyalsa/asoundlib.h mi ...

  10. ijkplayer源码---FFPlayer结构体4 SDL_Aout

    ijkplayer源码---FFPlayer结构体1_qq_15255121的专栏-CSDN博客 ijkplayer源码---FFPlayer结构体2_qq_15255121的专栏-CSDN博客 ij ...

最新文章

  1. 常见损失函数和评价指标总结
  2. [值得学习]售前工程师的成长---一个老员工的经验之谈(一)
  3. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》目录—导读
  4. ThinkPHP5.0中Redis的使用和封装
  5. HTML基础(格式标签)
  6. java enummap_Java EnumMap size()方法与示例
  7. java构造方法和实例化,10. JavaSE-子类实例化过程 构造方法间调用
  8. Unity环境下RTMP推流+RTMP播放低延迟解决方案
  9. 打开数据库_打开这份指南,数据库运维也能优雅、简单!
  10. 【洛谷P1169】[ZJOI2007]棋盘制作
  11. C语言 - 判断素数
  12. ffmpeg的安装和使用教程
  13. iec104点号_IEC104规约报文说明(104报文解释的较好的文本)
  14. 分不清蓝牙适配器、蓝牙接收器和蓝牙发射器?伦茨科技为你讲解
  15. 【我的Android进阶之旅】Android 因为时间设置错误,请求报错 Could not validate certificate: Certificate expired at
  16. python爬虫网页崩溃怎么处理_《Python网络爬虫》1.2 爬取网页的异常处理
  17. 微信公众平台素材编辑与自动回复图文教程
  18. 好文分享:一切都是最好的安排
  19. 阿里云云呼叫中心——软电话SDK前端接入
  20. 国内与国际控制学科知名会议

热门文章

  1. 8/100. Find All Numbers Disappeared in an Array
  2. 命令行下载利器- Aria2
  3. 【感想文】找到自己的兴趣所在,坚持下去。写文章,学习,我的坚持。
  4. JS+HTML画图的几种方法
  5. 机器翻译 - 日期翻译
  6. button-xml 中android:clickable=false 属性
  7. Object-c学习之路三(@class与#import的区别)
  8. eclipse+pydev添加已存在django项目及其调试方法
  9. display:block的注意
  10. Jboss4集群配置【转】