1 #define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB))) 1. skb_shared_info结构: AI检测代码解析 1 /* include/linux/skbuff.h */ 2 struct skb_shared_info { 3 unsigned char nr_frags; /*表示有多少分片结构*/ 4 __u8 tx_flags; 5 unsigned short gso_size; 6 /...
WARN(1, "%s: caps=(%pNF, %pNF) len=%d data_len=%d gso_size=%d " "gso_type=%d ip_summed=%d\n", driver, dev ? &dev->features : &null_features, skb->sk ? &skb->sk->sk_route_caps : &null_features, skb->len, skb->data_len, skb_shinfo(skb)->gso_size, skb_shinfo(skb...
1#defineskb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB))) skb_shared_info结构: 1/*include/linux/skbuff.h*/2structskb_shared_info {3unsignedcharnr_frags;/*表示有多少分片结构*/4__u8 tx_flags;5unsignedshortgso_size;6/*Warning: this field is not always filled in (UF...
因此需要释放frags,frag_list中被拷贝过的数据//计算从frags数组中拷贝的数据量eat =delta;for(i =0; i < skb_shinfo(skb)->nr_frags; i++) {//寻找到满足eat这么多数据量的最后一个pageif(skb_shinfo(skb)->frags[i].size >=eat)//在frags数组中的数据量可以满足delta时,则只...
skb_frag_t*frag=skb_shinfo(skb)->frags; unsignedintmss=skb_shinfo(skb)->gso_size; unsignedintdoffset=skb->data-skb_mac_header(skb); structsk_buff*fskb=skb_shinfo(head_skb)->frag_list; skb_frag_t*frag=skb_shinfo(head_skb)->frags; ...
SKB_GSO_TCPV6 = 1 << 4, }; +#if BITS_PER_LONG > 32 +#define NET_SKBUFF_DATA_USES_OFFSET 1 +#endif + +#ifdef NET_SKBUFF_DATA_USES_OFFSET +typedef unsigned int sk_buff_data_t; +#else +typedef unsigned char *sk_buff_data_t; ...
- "shinfo(txflags=%u nr_frags=%u gso(size=%hu type=%u segs=%hu))\n" - "csum(0x%x ip_summed=%u complete_sw=%u valid=%u level=%u)\n" - "hash(0x%x sw=%u l4=%u) proto=0x%04x pkttype=%u iif=%d\n", - level, skb->len, headroom, skb_headlen(skb), tailroom, ...
We can at least make sure the transport header is after the end of the network header (with a estimated minimal size). [1] [ 67.873027] skb len=4096 headroom=16 headlen=14 tailroom=0 mac=(-1,-1) mac_len=0 net=(16,-6) trans=10 shinfo(txflags=0 nr_frags=1 gso(size=0 typ...
(unsigned int size, gfp_t gfp_mask, int fclone, int node) { struct kmem_cache *cache; struct skb_shared_info *shinfo; struct sk_buff *skb; u8 *data; cache = fclone ? skbuff_fclone_cache : skbuff_head_cache; /* 获取头 */ skb = kmem_cache_alloc_node(cache, gfp_mask & ~__...
首先,该函数 会申请 sk_buff 结构体自身的内存,如上图左侧,用两种颜色展示了该结构体最重要的4个成员指针信息: Head/End, Data/Tail。 接着,会申请 data buffer 的内存,如上图右侧,Buffer 的总长度 buffer length = NET_SKB_PAD + length + sizeof(struct skb_shared_info) ...