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