char cb[40]---"control buffer"
include/linux/skbuff.h
struct sk_buff {
char cb[80] __aligned(8);
}
http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-2-SECT-1.html
char cb[40]
This is a "control buffer," or storage for private information, maintained by each layer for internal use. It is statically allocated within the sk_buff
struct tcp_skb_cb { ... ... ... _ _u32 seq; /* Starting sequence number */ _ _u32 end_seq; /* SEQ + FIN + SYN + datalen*/ _ _u32 when; /* used to compute rtt's */ _ _u8 flags; /* TCP header flags. */ ... ... ... };
And this is the macro used by the TCP code to access the structure. The macro consists simply of a pointer cast:
#define TCP_SKB_CB(_ _skb) ((struct tcp_skb_cb *)&((_ _skb)->cb[0]))
Here is an example where the TCP subsystem fills in the structure upon receipt of a segment:
int tcp_v4_rcv(struct sk_buff *skb) { ... ... ... th = skb->h.th; TCP_SKB_CB(skb)->seq = ntohl(th->seq); TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + skb->len - th->doff * 4); TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq); TCP_SKB_CB(skb)->when = 0; TCP_SKB_CB(skb)->flags = skb->nh.iph->tos; TCP_SKB_CB(skb)->sacked = 0; ... ... ... }
To see how the parameters in the cb buffer are retrieved, take a look at the function tcp_transmit_skb in net/ipv4/tcp_output.c. That function is used by TCP to push a data segment down to the IP layer for transmission.
In Chapter 22, you will also see how IPv4 uses cb to store information about IP fragmentation.