日期:2014-05-16  浏览次数:20683 次

Linux内核网络协议栈4-创建socket(续)

接上篇“创建socket” 一文;

?

5、分配sock结构:

本文中的例子会调用inet_family_ops.create方法即inet_create方法完成socket的创建工作;其调用链如下:

net/Socket.c:sys_socket()->sock_create()->__sock_create()->net/ipv4/Af_inet.c:inet_create();

inet_create()主要完成以下几个工作:

1) 设置socket的状态为SS_UNCONNECTED;

sock->state = SS_UNCONNECTED;

?


2) 根据socket的type找到对应的套接字类型:

list_for_each_rcu(p, &inetsw[sock->type]) {
    answer = list_entry(p, struct inet_protosw, list);

    /* Check the non-wild match. */
    if (protocol == answer->protocol) {
        if (protocol != IPPROTO_IP)
            break;
    } else {
        /* Check for the two wild cases. */
        if (IPPROTO_IP == protocol) {
            protocol = answer->protocol;
            break;
        }
        if (IPPROTO_IP == answer->protocol)
            break;
    }
    err = -EPROTONOSUPPORT;
    answer = NULL;
}
由于同一type不同protocol的套接字保存在inetsw中的同一链表中,因此需要遍历链表来查找;在上面的例子中,会将protocol重新赋值为answer->protocol,即IPPROTO_TCP,其值为6;

3) 使用匹配的协议族操作集初始化socket;