Chinaunix首页 | 论坛 | 博客
  • 博客访问: 411956
  • 博文数量: 59
  • 博客积分: 1510
  • 博客等级: 上尉
  • 技术积分: 857
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 11:50
文章分类

全部博文(59)

文章存档

2011年(1)

2010年(36)

2009年(22)

我的朋友

分类: LINUX

2009-09-21 10:33:38

net_device分析

2009-07-09 15:25

先上代码!

复杂版本:

Code:

   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.     /*

  15.      * This is the first field of the "visible" part of this structure

  16.      * (i.e. as seen by users in the "Space.c" file).  It is the name

  17.      * the interface.

  18.      */ 

  19.     char            name[IFNAMSIZ]; 

  20.     /* device name hash chain */ 

  21.     struct hlist_node   name_hlist; 

  22.     /* snmp alias */ 

  23.     char            *ifalias; 

  24.  

  25.     /*

  26.      *  I/O specific fields

  27.      *  FIXME: Merge these and struct ifmap into one

  28.      */ 

  29.     unsigned long       mem_end;    /* shared mem end   */ 

  30.     unsigned long       mem_start;  /* shared mem start */ 

  31.     unsigned long       base_addr;  /* device I/O address   */ 

  32.     unsigned int        irq;        /* device IRQ number    */ 

  33.  

  34.     /*

  35.      *  Some hardware also needs these fields, but they are not

  36.      *  part of the usual set specified in Space.c.

  37.      */ 

  38.  

  39.     unsigned char       if_port;    /* Selectable AUI, TP,..*/

  40.     unsigned char       dma;        /* DMA channel      */ 

  41.  

  42.     unsigned long       state; 

  43.  

  44.     struct list_head    dev_list; 

  45.     struct list_head    napi_list; 

  46.  

  47.     /* Net device features */ 

  48.     unsigned long       features; 

  49. #define NETIF_F_SG      1   /* Scatter/gather IO. */ 

  50. #define NETIF_F_IP_CSUM     2   /* Can checksum TCP/UDP over IPv4. */ 

  51. #define NETIF_F_NO_CSUM     4   /* Does not require checksum. F.e. loopack. */ 

  52. #define NETIF_F_HW_CSUM     8   /* Can checksum all the packets. */ 

  53. #define NETIF_F_IPV6_CSUM   16  /* Can checksum TCP/UDP over IPV6 */ 

  54. #define NETIF_F_HIGHDMA     32  /* Can DMA to high memory. */ 

  55. #define NETIF_F_FRAGLIST    64  /* Scatter/gather IO. */ 

  56. #define NETIF_F_HW_VLAN_TX  128 /* Transmit VLAN hw acceleration */ 

  57. #define NETIF_F_HW_VLAN_RX  256 /* Receive VLAN hw acceleration */ 

  58. #define NETIF_F_HW_VLAN_FILTER  512 /* Receive filtering on VLAN */ 

  59. #define NETIF_F_VLAN_CHALLENGED 1024    /* Device cannot handle VLAN packets */ 

  60. #define NETIF_F_GSO     2048    /* Enable software GSO. */ 

  61. #define NETIF_F_LLTX        4096    /* LockLess TX - deprecated. Please */ 

  62.                     /* do not use LLTX in new drivers */ 

  63. #define NETIF_F_NETNS_LOCAL 8192    /* Does not change network namespaces */ 

  64. #define NETIF_F_GRO     16384   /* Generic receive offload */ 

  65. #define NETIF_F_LRO     32768   /* large receive offload */ 

  66.  

  67.     /* Segmentation offload features */ 

  68. #define NETIF_F_GSO_SHIFT   16 

  69. #define NETIF_F_GSO_MASK    0xffff0000 

  70. #define NETIF_F_TSO     (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) 

  71. #define NETIF_F_UFO     (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) 

  72. #define NETIF_F_GSO_ROBUST  (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) 

  73. #define NETIF_F_TSO_ECN     (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) 

  74. #define NETIF_F_TSO6        (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) 

  75.  

  76.     /* List of features with software fallbacks. */ 

  77. #define NETIF_F_GSO_SOFTWARE    (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) 

  78.  

  79.  

  80. #define NETIF_F_GEN_CSUM    (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) 

  81. #define NETIF_F_V4_CSUM     (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM) 

  82. #define NETIF_F_V6_CSUM     (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) 

  83. #define NETIF_F_ALL_CSUM    (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) 

  84.  

  85.     /*

  86.      * If one device supports one of these features, then enable them

  87.      * for all in netdev_increment_features.

  88.      */ 

  89. #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \ 

  90.                  NETIF_F_SG | NETIF_F_HIGHDMA |     \ 

  91.                  NETIF_F_FRAGLIST) 

  92.  

  93.     /* Interface index. Unique device identifier    */ 

  94.     int         ifindex; 

  95.     int         iflink; 

  96.  

  97.     struct net_device_stats stats; 

  98.  

  99. #ifdef CONFIG_WIRELESS_EXT 

 100.     /* List of functions to handle Wireless Extensions (instead of ioctl).

 101.      * See for details. Jean II */ 

 102.     const struct iw_handler_def *   wireless_handlers; 

 103.     /* Instance data managed by the core of Wireless Extensions. */ 

 104.     struct iw_public_data * wireless_data; 

 105. #endif 

 106.     /* Management operations */ 

 107.     const struct net_device_ops *netdev_ops; 

 108.     const struct ethtool_ops *ethtool_ops; 

 109.  

 110.     /* Hardware header description */ 

 111.     const struct header_ops *header_ops; 

 112.  

 113.     unsigned int        flags;  /* interface flags (a la BSD)   */ 

 114.     unsigned short      gflags; 

 115.         unsigned short          priv_flags; /* Like 'flags' but invisible to userspace. */ 

 116.     unsigned short      padded; /* How much padding added by alloc_netdev() */ 

 117.  

 118.     unsigned char       operstate; /* RFC2863 operstate */ 

 119.     unsigned char       link_mode; /* mapping policy to operstate */ 

 120.  

 121.     unsigned        mtu;    /* interface MTU value      */ 

 122.     unsigned short      type;   /* interface hardware type  */ 

 123.     unsigned short      hard_header_len;    /* hardware hdr length  */ 

 124.  

 125.     /* extra head- and tailroom the hardware may need, but not in all cases

 126.      * can this be guaranteed, especially tailroom. Some cases also use

 127.      * LL_MAX_HEADER instead to allocate the skb.

 128.      */ 

 129.     unsigned short      needed_headroom; 

 130.     unsigned short      needed_tailroom; 

 131.  

 132.     struct net_device   *master; /* Pointer to master device of a group,

 133.                       * which this device is member of.

 134.                       */ 

 135.  

 136.     /* Interface address info. */ 

 137.     unsigned char       perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ 

 138.     unsigned char       addr_len;   /* hardware address length  */ 

 139.     unsigned short          dev_id;     /* for shared network cards */ 

 140.  

 141.     spinlock_t      addr_list_lock; 

 142.     struct dev_addr_list    *uc_list;   /* Secondary unicast mac addresses */ 

 143.     int         uc_count;   /* Number of installed ucasts   */ 

 144.     int         uc_promisc; 

 145.     struct dev_addr_list    *mc_list;   /* Multicast mac addresses  */ 

 146.     int         mc_count;   /* Number of installed mcasts   */ 

 147.     unsigned int        promiscuity; 

 148.     unsigned int        allmulti; 

 149.  

 150.  

 151.     /* Protocol specific pointers */ 

 152.      

 153. #ifdef CONFIG_NET_DSA 

 154.     void            *dsa_ptr;   /* dsa specific data */ 

 155. #endif 

 156.     void            *atalk_ptr; /* AppleTalk link   */ 

 157.     void            *ip_ptr;    /* IPv4 specific data   */   

 158.     void                    *dn_ptr;        /* DECnet specific data */ 

 159.     void                    *ip6_ptr;       /* IPv6 specific data */ 

 160.     void            *ec_ptr;    /* Econet specific data */ 

 161.     void            *ax25_ptr;  /* AX.25 specific data */ 

 162.     struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,

 163.                            assign before registering */ 

 164.  

 165. /*

 166.  * Cache line mostly used on receive path (including eth_type_trans())

 167.  */ 

 168.     unsigned long       last_rx;    /* Time of last Rx  */ 

 169.     /* Interface address info used in eth_type_trans() */ 

 170.     unsigned char       dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast 

 171.                                because most packets are unicast) */ 

 172.  

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

 174.  

 175.     struct netdev_queue rx_queue; 

 176.  

 177.     struct netdev_queue *_tx ____cacheline_aligned_in_smp; 

 178.  

 179.     /* Number of TX queues allocated at alloc_netdev_mq() time  */ 

 180.     unsigned int        num_tx_queues; 

 181.  

 182.     /* Number of TX queues currently active in device  */ 

 183.     unsigned int        real_num_tx_queues; 

 184.  

 185.     unsigned long       tx_queue_len;   /* Max frames per queue allowed */ 

 186.     spinlock_t      tx_global_lock; 

 187. /*

 188.  * One part is mostly used on xmit path (device)

 189.  */ 

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

 191.     unsigned long       trans_start;    /* Time (in jiffies) of last Tx */ 

 192.  

 193.     int         watchdog_timeo; /* used by dev_watchdog() */ 

 194.     struct timer_list   watchdog_timer; 

 195.  

 196.     /* Number of references to this device */ 

 197.     atomic_t        refcnt ____cacheline_aligned_in_smp; 

 198.  

 199.     /* delayed register/unregister */ 

 200.     struct list_head    todo_list; 

 201.     /* device index hash chain */ 

 202.     struct hlist_node   index_hlist; 

 203.  

 204.     struct net_device   *link_watch_next; 

 205.  

 206.     /* register/unregister state machine */ 

 207.     enum { NETREG_UNINITIALIZED=0, 

 208.            NETREG_REGISTERED,   /* completed register_netdevice */ 

 209.            NETREG_UNREGISTERING,    /* called unregister_netdevice */ 

 210.            NETREG_UNREGISTERED, /* completed unregister todo */ 

 211.            NETREG_RELEASED,     /* called free_netdev */ 

 212.            NETREG_DUMMY,        /* dummy device for NAPI poll */ 

 213.     } reg_state; 

 214.  

 215.     /* Called from unregister, can be used to call free_netdev */ 

 216.     void (*destructor)(struct net_device *dev); 

 217.  

 218. #ifdef CONFIG_NETPOLL 

 219.     struct netpoll_info *npinfo; 

 220. #endif 

 221.  

 222. #ifdef CONFIG_NET_NS 

 223.     /* Network namespace this network device is inside */ 

 224.     struct net      *nd_net; 

 225. #endif 

 226.  

 227.     /* mid-layer private */ 

 228.     void            *ml_priv; 

 229.  

 230.     /* bridge stuff */ 

 231.     struct net_bridge_port  *br_port; 

 232.     /* macvlan */ 

 233.     struct macvlan_port *macvlan_port; 

 234.     /* GARP */ 

 235.     struct garp_port    *管理员在2009年8月13日编辑了该文章文章。

-->
阅读(1811) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~