ip_init,udp_init,tcp_init
ip_init
在domaininit中会一次调用inetsw中注册的协议初始化接口pr_init。
先来看下ip_init函数:
void
ip_init()
{
register struct protosw *pr;
register int i;
/*根据域类型,协议类型和sock类型获取相应的protosw中的成员*/
pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW);
if (pr == 0)
panic("ip_init");
for (i = 0; i < IPPROTO_MAX; i++)
ip_protox[i] = pr - inetsw;//ip_protox这是啥?
for (pr = inetdomain.dom_protosw;
pr < inetdomain.dom_protoswNPROTOSW; pr++)
if (pr->pr_domain->dom_family == PF_INET &&
pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW)
ip_protox[pr->pr_protocol] = pr - inetsw;//这是干啥
ipq.next = ipq.prev = &ipq;//?
ip_id = time.tv_sec & 0xffff;//?
ipintrq.ifq_maxlen = ipqmaxlen//?;
#ifdef GATEWAY //这个宏是路由器使用的么?
i = (if_index + 1) * (if_index + 1) * sizeof (u_long);
ip_ifmatrix = (u_long *) malloc(i, M_RTABLE, M_WAITOK);
bzero((char *)ip_ifmatrix, i);
#endif
}
udp_init
udp_init很简单,只是将udp的指针做了个初始化,都指向自己
void
udp_init()
{
udb.inp_next = udb.inp_prev = &udb;
}
tcp_init
void
tcp_init()
{
tcp_iss = 1; /* wrong */ /*初始化初始序列号为1*/
tcb.inp_next = tcb.inp_prev = &tcb; /*将tcp的cb初始化*/
if (max_protohdr < sizeof(struct tcpiphdr))
max_protohdr = sizeof(struct tcpiphdr); /*初始化最大的协议头长度:ip头+tcp头*/
if (max_linkhdr + sizeof(struct tcpiphdr) > MHLEN) /*确保加上链路层头长度不能超过MHLEN*/
panic("tcp_init");
}