$Karaba: skb.txt,v 1.2 2004/01/16 03:00:53 mk Exp $ struct sk_buff { struct sk_buff *next; struct sk_buff *prev; struct sk_buff_head *list; struct sock *sk; struct timeval stamp; struct net_device *dev; union { ... +------------------------------+<<- head } h; | headroom = skb_headroom() | +------------------------------+<<- mac union { | | ... | Ether header | } nh; +------------------------------+<<- nh | | union { | IP header | ... +------------------------------+<<- h } mac; | | /|\ | TCP header | | skb_push(*skb, len) struct dst_entry *dst; +------------------------------+<<- data --|-- | /|\ | | skb_pull(*skb, len) ... | | | \|/ unsigned int len; | | | unsigned int data_len; | | | unsigned int csum; | | | unsigned char __unused, | | | cloned, | Data len (= tail - data) | pkt_type, | | | ip_summed; | | | __u32 priority; | | | atomic_t users; | | | unsigned short protocol; | | | unsigned short security; | | | unsigned int truesize; | \|/ | +------------------------------+<<- tail --+-- unsigned char *head; | | | skb_put(*skb, len) unsigned char *data; | tailroom = skb_tailroom() | \|/ unsigned char *tail; | | unsigned char *end; | +--------------------------+ | | |sk_shared_info{} | | +-+--------------------------+-+<<- end void (*destructor)(struct sk_buff *); ... }; sk_buff functions alloc_skb() パケットを確保 kfree_skb() パケットを解放 skb_trim() パケットのデータ長を切りつめる skb_rescrve() data、tail ポインタを進める(ヘッダ格納用領域の確保) skb_copy() sk_buff{}のコピー(全体) skb_clone パケット(sk_buff)のヘッダのみコピーし、データは共有 skb_cow() 必要があればパケット領域を取り直し、コピーし古いものを廃棄 skb_tailroom パケットのデータ域に空きがあるかチェック skb+headroom() ヘッダ域の先頭に空きがあるかチェック skb_peek() キューから外さずつながっているパケットを参照 skb_peek_tail() same as above skb_orphan() ソケットのリンクを切る dev_alloc_skb() パケットを確保、16バイト余分の領域(デバドラ用ヘッダ)の確保、予約 dev_kfree_skb() パケットを解放 sock functions sock_alloc() socket{}の確保 sock_release() socket{}の解散 sock_lookup() ファイルディスクリプタからsocket{}を求め参照数をincrement sockfd_putc() socket{}の参照数をdecrement sock_def_wakeup() socketで待ちに入っているプロセスを起床 socketのstate changeメソッドとして登録 sock_def_readable() socketで待ちに入っているプロセスを起床 (指定があれば)SIGIO発生。 socketのdata_readyメソッドとして登録 sock_def_write_space() 送信バッファに空きがあれば、socketで待ちに入っているプロセスを起床 (指定があれば)SIGIO発生。socketのwrite_spaceメソッドとして登録 sock_wake_async() (指定があれば)SIGIO発生 sk_alloc() sock{}確保 sk_free() sock{}解放 lock_sock() sock{}のロック release_sock() sock{}のロック解除 sys_socketcall() socket(2)のエントリポイント