o Structures and Constants sk_buff{} パケット。 sock{} inode{}中のsocket{}の入りきらないデータを格納。 hh_cache{} hardware header cache net_device{} packet_type{} proto_ops{} inet6_dev{} net_device ifaddrなど各種情報。 inet6_ifaddr{} inet6_skb_parm{} exthdrs を解析した結果をskb->nhからオフセットで表す。 inet6_protocol{} ipv6hdr{} IPv6のヘッダ。 payload_len => network byte order ipv6_opt_hdr{} ipv6_destopt_hdr{} ipv6_opt_hdr{}のこと。 ipv6_hopopt_hdr{} ipv6_opt_hdr{}のこと。 ipv6_txoptions{} データを解析しIPv6に渡すときに、 プロトコルによって準備される構造体。 ipv6_pinfo{} パケットの情報(socketオプション、アドレス情報、対応sk_buff{})。 PACKET_XXX GFP_XXX NEXTHDR_XXX rt6_info{} fib6_node{} ルーティング情報。 fn_bit は prefix長。 dst_entry{} destination情報のエントリ pmtuなんていう変数もある。 neighbour{} rt6_info{} 経路情報。 in6_addr{} IPv6 アドレス。 flowi{} flow based forwarding rule in6_rtmsg{} 宛先、送信、gatewary、アドレス、タイプ、metric、 インターフェースインデックスなどが格納。 RTF_XXX , RTN_XXX IP6_RT_PRIO_XXX udphdr{} UDPポートなど。(network byte order) o Packet functions struct sk_buff *dev_alloc_skb(unsigned int length) struct sk_buff *alloc_skb(unsigned int size, int priority) 指定されたサイズのパケットを確保。 void kfree_skb(struct sk_buff *skb) 指定されたパケットを解放。 unsigned char *skb_put(struct sk_buff *skb, unsigned int len) パケット内のtailポインタを進め、その分サイズ(len)を増す。 skb->tail を返す。 unsigned char * skb_pull(struct sk_buff *skb, unsigned int len) パケット内のlenを減らし、その分dataポインタを進める。 skb->data を返す。 unsigned char *skb_push(struct sk_buff *skb, unsigned int len) skb_pull()の逆、dataポインタを戻し、その分lenを増す。 skb->dataを返す。 void skb_trim(struct sk_buff *skb, unsigned int len) パケットのデータ長を指定された長さlenに(後ろから)切り詰める。 void skb_reserve(struct sk_buff *skb, unsigned int len) パケット(skb)内のポインタ(data,tail)を進める。 パケット内に後の処理で必要になるヘッダ格納用の領域を予約するために 使用される(空のバッファ用)。 skb_copy() パケット(sk_buff)全体の複製を作る。 int skb_cloned(struct sk_buff *skb) パケットのヘッダだけをコピーし、データ本体は共有する。 int skb_shared(struct sk_buff *skb) skbが共有されているかのチェック。 共有されていたら1を返す。 struct sk_buff *skb_share_check(struct sk_buff *skb, int pri) skb_shared()にて他のプロトコルと共有しているかチェックし、 共有していたら複製を生成(skb_clone()する。 skb_cow() 必要があればパケット領域を取り直しデータをコピー。 古いものは捨てる。(クローンの場合新たなヘッダ領域が不足するとき) int skb_tailroom(const struct sk_buff *skb) パケットのデータ域に空きがあるかチェック。 skb->end - skb->tail int skb_headroom(const struct sk_buff *skb) ヘッダ域の先頭に空きがあるかチェック。 skb->data - skb->head skb_realloc_headroom(skb, nhr) マクロ skb_copy_expand(skb, nhr, skb_tailroom(skb), GFP_ATOMIC) skb_peek() skb_peektal() キューから外さず、つながっているパケット(sk_buff)を参照する。 skb_orphan() ソケットのリンクを切る。 dev_alloc_skb() パケット(sk_buff)を確保し、16byte余分の領域(デバドラ用のヘッダなどのため) を確保し予約する。 dev_kfree_skb() パケット(sk_buff)を解放する。 o Socket functions sock_alloc() socket構造体の確保。 sock_release() socket構造体の解放。 sockfd_lookup() ファイルディスクリプタからsocket構造体を求める。 参照数のインクリメント。 scokfd_put9) socket構造体の参照数をデクリメント。 sock_def_wakeup() socketで待ちに入っているプロセスを起床する。 ソケットのstate_changeメソッドとして登録される。 sock_def_readable() socketで待ちに入っているプロセスを起床する。 指定があればSIGIOシグナルを発生。 ソケットのdata_readyメソッドとして登録される。 sock_def_write_space() 送信バッファに空きがあれば、socketで待ちに入っているプロセスを 起床する。 指定があればSIGIOシグナルを発生。 ソケットのwrite_spaceメソッドとして登録される。 sock_wake_async() 指定があればSIGIOシグナルを発生。 sk_alloc() sock構造体を確保する。 sk_free() sock構造体を解放する。 lock_sock(), release_sock() sock構造体のロック、およびロック解除を行う。 sys_socketcall() ソケットシステムコールエントリ。 o ipv6 (ipv6_input.c) int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) (net/addrconf.h) struct inet6_dev *in6_dev_get(struct net_device *dev) lockして, dev->ip6_ptr を返す。 (net/addrconf.h) void in6_dev_put(struct inet6_dev *idev) idevの参照数を確認して参照されていなければ、idevを解放する。 IP6_INC_STATS_BH(idev, field) snmpのフィールドfieldをインクリメント。 (ipv6/exthdr.c) int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff *skb, __u8 *nhptr) tlvエンコードオプションヘッダを解析。 (ipv6/route.c) void ip6_route_input(struct sk_buff *skb) (ipv6.ip6_output.c) int ip6_output(struct sk_buff *skb) ipv6_build_exthdr void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto) パケット(skb)にfragment header以降の拡張ヘッダを作成する。 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto, struct in6_addr **daddr) パケット(skb)にfragment headrより前の拡張ヘッダを作成する。 (net/ip6_route.h) void ip6_dst_store(struct sock *sk, struct dst_entry *dst, struct in6_addr *daddr) Store a destination cache entry in a socket For UDP/RAW sockets this is done on udp_connect. (ipv6/addrconf.c) int ipv6_addr_type(const struct in6_addr *addr) void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) a2 を a1にコピーする。 (ipv6/route.c) struct rt6_info *rt6_lookup(const struct in6_addr *daddr, const struct in6_addr *saddr, int oif, int strict) (ipv6/ip6_fib.c) struct fib6_node * fib6_lookup(struct fib6_node *root, const struct in6_addr *daddr, const struct in6_addr *saddr)