http://ftp.gnumonks.org/pub/doc/skb-doc.html
skb - Linux network buffers
1.3, 2000/10/14 21:27:02
Short description about the linux network buffers (skb's)
At the time I wanted to know more about the Linux network stack, I
always wanted a document like this to exist. But unfortunately I never
found one. After I gained some basic knowledge about the Linux network
stack internals, I wrote one.
I'm happy if this document is of any use for other people trying to
learn about the Linux kernel.
Please let me know of any bugs in this document. It should resemble
kernel revision 2.4.0-test4
skbuffs are the buffers in which the linux kernel handles network
packets. The packet is received by the network card, put into a skbuff
and then passed to the network stack, which uses the skbuff all the
time.
2.1 struct sk_buff
The struct sk_buff is defined in <linux/skbuff.h> as follows:
- next
-
next buffer in list
- prev
-
previous buffer in list
- list
-
list we are on
- sk
-
socket we belong to
- stamp
-
timeval we arrived at
- dev
-
device we are leaving by
- rx_dev
-
device we arrived at
- h
-
transport layer header (tcp,udp,icmp,igmp,spx,raw)
- nh
-
network layer header (ip,ipv6,arp,ipx,raw)
- mac
-
link layer header
- dst
-
FIXME:
- cb
-
control buffer, used internally
- len
-
length of actual data
- csum
-
checksum
- used
-
FIXME: data moved to user and not MSG_PEEK
- is_clone
-
we are a clone
- cloned
-
head may be cloned
- pkt_type
-
packet class
- ip_summed
-
driver fed us ip checksum
- priority
-
packet queuing priority
- users
-
user count
- protocol
-
packet protocol from driver
- security
-
security level of packet
- truesize
-
real size of the buffer
- head
-
pointer to head of buffer
- data
-
data head pointer
- tail
-
tail pointer
- end
-
end pointer
- destructor
-
destructor function
- nfmark
-
netfilter mark
- nfcache
-
netfilter internal caching info
- nfct
-
associated connection, if any
- tc_index
-
traffic control index
2.2 skb support functions
There are a bunch of skb support functions provided by the sk_buff
layer. I briefly describe the most important ones in this section.
allocation / free / copy / clone and expansion functions
- struct sk_buff *alloc_skb(unsigned int size, int gfp_mask)
-
This function allocates a new skb. This is provided by the skb
layer to initialize some privat data and do memory statistics. The
returned buffer has no headroom and a tailroom of /size/ bytes.
- void kfree_skb(struct sk_buff *skb)
-
Decrement the skb's usage count by one and free the skb if no
references left.
- struct sk_buff *skb_get(struct sk_buff *skb)
-
Increments the skb's usage count by one and returns a pointer to
it.
- struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
-
This
function clones a skb. Both copies share the packet data but have their
own struct sk_buff. The new copy is not owned by any socket, reference
count is 1.
- struct sk_buff *skb_copy(const struct sk_buff *skb, int
gfp_mask)
-
Makes
a real copy of the skb, including packet data. This is needed, if You
wish to modify the packet data. Reference count of the new skb is 1.
- struct skb_copy_expand(const struct sk_buff *skb, int
new_headroom, int new_tailroom, int gfp_mask)
-
Make
a copy of the skb, including packet data. Additionally the new skb has
a haedroom of /new_headroom/ bytes size and a tailroom of
/new_tailroom/ bytes.
anciliary functions
- int skb_cloned(struct sk_buff *skb)
-
Is the skb a clone?
- int skb_shared(struct sk_Buff *skb)
-
Is this skb shared? (is the reference count > 1)?
operations on lists of skb's
- struct sk_buff *skb_peek(struct sk_buff_head *list_)
-
peek a skb from front of the list; does not remove skb from the
list
- struct sk_buff *skb_peek_tail(struct sk_buff_head *list_)
-
peek a skb from tail of the list; does not remove sk from the
list
- __u32 skb_queue_len(sk_buff_head *list_)
-
return the length of the given skb list
- void skb_queue_head(struct sk_buff_head *list_, struct sk_buff
*newsk)
-
enqueue a skb at the head of a given list
- void skb_queue_tail(struct sk_buff_head *list_, struct sk_buff
*newsk)
-
enqueue a skb at the end of a given list.
struct sk_buff *skb_dequeue(struct sk_buff_head *list_)
dequeue a skb from the head of the given list.
struct sk_buff *sbk_dequeue_tail(struct sk_buff_head *list_)
dequeue a skb from the tail of the given list
operations on skb data
- unsigned char *skb_put(struct sk_buff *sbk, int len)
-
extends
the data area of the skb. if the total size exceeds the size of the
skb, the kernel will panic. A pointer to the first byte of new data is
returned.
- unsigned char *skb_push(struct sk_buff *skb, int len)
-
extends
the data area of the skb. if the total size exceeds the size of the
skb, the kernel will panic. A pointer to the first byte of new data is
returned.
- unsigned char *skb_pull(struct sk_buff *skb, int len)
-
remove data from the start of a buffer, returning the bytes to
headroom. A pointr to the next data in the buffer is returned.
- int skb_headroom(struct sk_buff *skb)
-
return the amount of bytes of free space at the head of skb
- int skb_tailroom(struct sk_buff *skb)
-
return the amount of bytes of free space at the end of skb
- struct sk_buff *skb_cow(struct sk_buff *skb, int headroom)
-
if the buffer passed lacks sufficient headroom or is a clone it
is copied and additional headroom made available.
|