协议转换表是一个包含一组处理函数的数据结构,它使得IP层能够将输入的分组分发给合适的上层协议,同时使得应用程序
能够使用需要的传输层协议来发送数据。对IPv6而言,协议转换表 ip6protosw{}定义如下:
struct ip6protosw {
short pr_type; /* socket type used for */
struct nps_domain *pr_domain; /* domain protocol a member of */
short pr_protocol; /* protocol number */
short pr_flags; /* see below */
/* protocol-protocol hooks */
int (*pr_input) /* input to protocol (from below) */
__P ((struct nps_mbuf **, int *, int));
int (*pr_output) /* output to protocol (from above) */
__P ((struct nps_mbuf *, ...));
void (*pr_ctlinput) /* control input (from below) */
__P ((int, struct nps_sockaddr *, void *));
int (*pr_ctloutput) /* control output (from above) */
__P ((struct nps_socket *, struct nps_sockopt *));
/* user-protocol hook */
int (*pr_usrreq) /* user request: see list below */
__P ((struct nps_socket *, int, struct nps_mbuf *, struct nps_mbuf *, struct nps_mbuf *));
/* utility hooks */
void (*pr_init) /* initialization hook */
__P ((void));
void (*pr_fasttimo) /* fast timeout (200ms) */
__P ((void));
void (*pr_slowtimo) /* slow timeout (500ms) */
__P ((void));
void (*pr_drain) /* flush any excess space possible */
__P ((void));
struct pr_usrreqs *pr_usrreqs; /* supersedes pr_usrreq() */
};
pr_type 表示通信类型,KAME实现中支持的通信如表1所示。TCP使用SOCK_STREAM,UDP使用SOCK_DGRAM,其他的协议如ICMPv6使用SOCK_RAW。目前SCTP(Stream Control Transmission Protocol)实现定义了一个新的通信类型SOCK_SEQPACKET(sequential packet delivery)。
pr_domain 指定协议族,在IPv6中指向inet6domain域。
pr_protocol 保存协议号
pr_flags 定义socket 操作行为,KAME实现支持的标志如表2所示。
pr_input 指向每个协议的分组输入处理函数。
pr_outpt 在IPv6域中并没有使用,尽管在一些协议中设置了这个成员变量。
pr_ctlinput 是一个指向 。被一个接口用来向相应的应用处理发送ICMPv6错误
pr_ctloutput 指向操作socket 选项的控制函数。
pr_usrreq FreeBSD不使用。而是使用pr_usrreqs 从用户处理进程向相应的内部内核模块分发请求消息。
pr_init 指向协议初始化函数的指针。
pr_fasttimo 指向用于快速超时处理(200ms调用一次)的定时器函数的指针。
pr_slowtimo 指向用于慢超时处理(500ms调用一次)的定时器函数的中指针。
pr_drain 指向当系统的mbuf块耗尽时内核调用的函数。pr_drain尝试从每个协议栈释放mbufs