首先看一下網路驅動必用結構體struct sk_buff
不怎麼使用的就沒有出現解釋:
struct sk_buff ;
};__u32 priority; //包的優先順序
kmemcheck_bitfield_begin(flags1);
__u8 local_df:1, //是否允許分片
cloned:1, //頭部被複製到子分片
ip_summed:2, //ip校驗和
nohdr:1, //有效載荷的參考
nfctinfo:3;
__u8 pkt_type:3, //包的型別
fclone:2, //skbuff clone狀態
ipvs_property:1, //ipvs擁有
peeked:1, //此包已傳送過
nf_trace:1; //網路過濾包的追蹤標誌
__be16 protocol:16; //協議版本
kmemcheck_bitfield_end(flags1);
void (*destructor)(struct sk_buff *skb); //自動釋放
#if defined(config_nf_conntrack) || defined(config_nf_conntrack_module)
struct nf_conntrack *nfct;
struct sk_buff *nfct_reasm;
#endif
#ifdef config_bridge_netfilter
struct nf_bridge_info *nf_bridge;
#endif
int iif;
#ifdef config_net_sched
__u16 tc_index; /* traffic control index */
#ifdef config_net_cls_act
__u16 tc_verd; /* traffic control verdict */
#endif
#endif
/* 0/14 bit hole */
#ifdef config_net_dma
dma_cookie_t dma_cookie;
#endif
#ifdef config_network_secmark
__u32 secmark;
#endif
__u32 mark;
__u16 vlan_tci;
sk_buff_data_t transport_header; //如tcp/udp頭部
sk_buff_data_t network_header; //ip頭部
sk_buff_data_t mac_header; //資料鏈路層頭部 mac頭部
/* these elements must be at the end, see alloc_skb() for details. */
sk_buff_data_t tail; //有效資料指標尾部
sk_buff_data_t end; //緩衝區結束處
unsigned char *head, //緩衝區頭部
*data; //緩衝真正的資料頭部指標
unsigned int truesize; //緩衝的真正資料的長度
atomic_t users; //使用的人數};
下乙個就是struct net_device,這個裡面的確較為麻煩,連linux核心都這麼注釋
* 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.
在使用中用到後,再注釋其他的
struct net_device
reg_state;
/* 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;
/* bridge stuff */
struct net_bridge_port *br_port;
/* macvlan */
struct macvlan_port *macvlan_port;
/* garp */
struct garp_port *garp_port;
/* class/net/name entry */
struct device dev;
/* space for optional statistics and wireless sysfs groups */
const struct attribute_group *sysfs_groups[3];
/* 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 */
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};
結構體對齊的具體含義
結構體對齊的具體含義 關於位元組對齊,這可能是我找到的解釋最為準確的一篇文章了,尤其對於 pragma pack的解釋.之前看了好幾篇文章,都解釋為是設定預設對齊位元組數.唯有該篇指出是設定位元組對齊時所允許的最大值.經linux下驗證,符合事實.似乎網上的文章以訛傳訛的情況越來越多了.以至於關於集...
結構體對齊的具體含義( pragma pack)
結構體對齊的具體含義 pragma pack 現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯...
結構體對齊的具體含義( pragma pack)
結構體對齊的具體含義 pragma pack 朋友帖了如下一段 pragma pack 4 class testb int nsize sizeof testb 這裡nsize結果為12,在預料之中。現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize...