struct 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
  * the interface.
  */
 char   name[IFNAMSIZ]; 不必多说,就是ifconfig 后面的第一个参数
 /* device name hash chain */
 struct hlist_node name_hlist;

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

 unsigned long  state;

 struct list_head dev_list; 做什么用呢?估计是内核维护
 
 /* The device initialization function. Called only once. */
 int   (*init)(struct net_device *dev);

 /* ------- Fields preinitialized in Space.c finish here ------- */

 /* Net device features */
 unsigned long  features;
#define NETIF_F_SG  1 /* Scatter/gather IO. */
#define NETIF_F_IP_CSUM  2 /* Can checksum only 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_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 */

 /* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
#define NETIF_F_GSO_MASK 0xffff0000
#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)

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

#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM)

 struct net_device *next_sched;

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


 struct net_device_stats* (*get_stats)(struct net_device *dev);
 struct net_device_stats stats; 网卡发送包的个数等等,ifconfig eth0看到的东西就是啦

#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
 const struct ethtool_ops *ethtool_ops;

 /*
  * This marks the end of the "visible" part of the structure. All
  * fields hereafter are internal to the system, and may change at
  * will (read: may be cleaned up at will).
  */


 unsigned int  flags; /* interface flags (a la BSD) */
 unsigned short  gflags;
        unsigned short          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  mtu; /* interface MTU value  */
 unsigned short  type; /* interface hardware type */
 unsigned short  hard_header_len; /* hardware hdr length */

 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_len; /* hardware address length */
 unsigned short          dev_id;  /* for shared network cards */

 struct dev_mc_list *mc_list; /* Multicast mac addresses */
 int   mc_count; /* Number of installed mcasts */
 int   promiscuity;
 int   allmulti;


 /* Protocol specific pointers */
 
 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())
 */
 struct list_head poll_list ____cacheline_aligned_in_smp;
     /* Link to poll list */

 int   (*poll) (struct net_device *dev, int *quota);
 int   quota;
 int   weight;
 unsigned long  last_rx; /* Time of last Rx */
 /* Interface address info used in eth_type_trans() */
 unsigned char  dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast
       because most packets are unicast) */

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

/*
 * Cache line mostly used on queue transmit path (qdisc)
 */
 /* device queue lock */
 spinlock_t  queue_lock ____cacheline_aligned_in_smp;
 struct Qdisc  *qdisc;
 struct Qdisc  *qdisc_sleeping;
 struct list_head qdisc_list;
 unsigned long  tx_queue_len; /* Max frames per queue allowed */

 /* Partially transmitted GSO packet. */
 struct sk_buff  *gso_skb;

 /* ingress path synchronizer */
 spinlock_t  ingress_lock;
 struct Qdisc  *qdisc_ingress;

/*
 * One part is mostly used on xmit path (device)
 */
 /* hard_start_xmit synchronizer */
 spinlock_t  _xmit_lock ____cacheline_aligned_in_smp;
 /* cpu id of processor entered to hard_start_xmit or -1,
    if nobody entered there.
  */
 int   xmit_lock_owner;
 void   *priv; /* pointer to private data */
 int   (*hard_start_xmit) (struct sk_buff *skb,
          struct net_device *dev);
 /* These may be needed for future network-power-down code. */
 unsigned long  trans_start; /* Time (in jiffies) of last Tx */

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

/*
 * refcnt is a very hot point, so align it on SMP
 */
 /* 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 net_device *link_watch_next;

 /* 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 */
 } reg_state;

 /* Called after device is detached from network. */
 void   (*uninit)(struct net_device *dev);
 /* Called after last user reference disappears. */
 void   (*destructor)(struct net_device *dev);

 /* Pointers to interface service routines. */
 int   (*open)(struct net_device *dev);
 int   (*stop)(struct net_device *dev);
#define HAVE_NETDEV_POLL
 int   (*hard_header) (struct sk_buff *skb,
      struct net_device *dev,
      unsigned short type,
      void *daddr,
      void *saddr,
      unsigned len);
 int   (*rebuild_header)(struct sk_buff *skb);
#define HAVE_MULTICAST   
 void   (*set_multicast_list)(struct net_device *dev);
#define HAVE_SET_MAC_ADDR    
 int   (*set_mac_address)(struct net_device *dev,
         void *addr);
#define HAVE_PRIVATE_IOCTL
 int   (*do_ioctl)(struct net_device *dev,
         struct ifreq *ifr, int cmd);
#define HAVE_SET_CONFIG
 int   (*set_config)(struct net_device *dev,
           struct ifmap *map);
#define HAVE_HEADER_CACHE
 int   (*hard_header_cache)(struct neighbour *neigh,
           struct hh_cache *hh);
 void   (*header_cache_update)(struct hh_cache *hh,
             struct net_device *dev,
             unsigned char *  haddr);
#define HAVE_CHANGE_MTU
 int   (*change_mtu)(struct net_device *dev, int new_mtu);

#define HAVE_TX_TIMEOUT
 void   (*tx_timeout) (struct net_device *dev);

 void   (*vlan_rx_register)(struct net_device *dev,
          struct vlan_group *grp);
 void   (*vlan_rx_add_vid)(struct net_device *dev,
         unsigned short vid);
 void   (*vlan_rx_kill_vid)(struct net_device *dev,
          unsigned short vid);

 int   (*hard_header_parse)(struct sk_buff *skb,
           unsigned char *haddr);
 int   (*neigh_setup)(struct net_device *dev, struct neigh_parms *);
#ifdef CONFIG_NETPOLL
 struct netpoll_info *npinfo;
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER
 void                    (*poll_controller)(struct net_device *dev);
#endif

 /* bridge stuff */
 struct net_bridge_port *br_port;

 /* class/net/name entry */
 struct device  dev;
 /* space for optional statistics and wireless sysfs groups */
 struct attribute_group  *sysfs_groups[3];
};
红色是基本字段
蓝色是fops相关
绿色是ethtool支持用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值