inet_init是整个
ipv4的module的初始化函数.整个函数如下:
proto_register
函数是在我前面已经说到了,是将tcp协议,udp协议,raw协议注册到协议list里面,该协议list是一个私有链.
该函数的参数是(在以后将逐
步讲到这个结构体):
struct proto
{
void (*close)(struct sock
*sk, //协议关闭函数指针
long timeout);
int (*connect)(struct sock *sk,
//协议连接函数指针
struct sockaddr *uaddr,
int addr_len);
int (*disconnect)(struct sock *sk, int flags); //协议断开函数指针
struct sock
* (*accept) (struct sock *sk, int flags, int *err);
//协议接受函数指针
int (*ioctl)(struct
sock *sk, int cmd,
//ioctl函数指针
unsigned long arg);
int (*init)(struct sock
*sk); //初始化函数指针
int (*destroy)(struct sock
*sk); //销毁函数指针
void (*shutdown)(struct sock *sk, int how);
//关闭函数指针 udp协议没有这个的函数,因为udp是无连接状态协议
int (*setsockopt)(struct sock *sk, int
level, //设置sockopt选项函数指针
int optname, char __user *optval,
int optlen);
int (*getsockopt)(struct sock *sk, int level,
//得到sock选项函数指针
int optname, char __user *optval,
int __user *option);
int (*sendmsg)(struct kiocb *iocb, struct sock
*sk, //发送消息函数指针
struct msghdr *msg, size_t len);
int (*recvmsg)(struct kiocb *iocb, struct sock
*sk, //得到消息函数指针
struct msghdr *msg,
size_t len, int noblock, int flags,
int *addr_len);
int (*sendpage)(struct sock *sk, struct page
*page,
int offset, size_t size, int flags);
int (*bind)(struct sock *sk,
struct sockaddr *uaddr, int
addr_len); //bind函数指针,udp没有该项
int (*backlog_rcv)
(struct sock *sk,
struct sk_buff *skb);
/* Keeping
track of sk's, looking them up, and port selection methods. */
void (*hash)(struct sock *sk);
void (*unhash)(struct sock *sk);
int (*get_port)(struct sock *sk, unsigned short snum);
/* Memory
pressure */
void (*enter_memory_pressure)(void);
atomic_t *memory_allocated; /* Current allocated memory. */
atomic_t *sockets_allocated; /* Current number of sockets. */
/*
* Pressure flag: try to collapse.
* Technical note: it is used by multiple contexts non atomically.
* All the sk_stream_mem_schedule() is of this nature: accounting
* is strict, actions are advisory and have some latency.
*/
int *memory_pressure;
int *sysctl_mem;
int *sysctl_wmem;
int *sysctl_rmem;
int max_header;
kmem_cache_t *slab;
unsigned int obj_size;
struct
module *owner;
char name[32];
struct
list_head node;
struct {
int inuse;
u8 __pad[SMP_CACHE_BYTES - sizeof(int)];
} stats[NR_CPUS];
};
在这里,我们看到
rc =
proto_register(&tcp_prot, 1);
if (rc)
goto out;
rc =
proto_register(&udp_prot, 1);
if (rc)
goto out_unregister_tcp_proto;
rc =
proto_register(&raw_prot, 1);
if (rc)
goto out_unregister_udp_proto;
这里的tcp_port是在
tcp.h声明的外部struct prot 结构 extern struct proto
tcp_prot;,该tcp_prot的初始化在tcp_ipv4.c中进行的初始化.
注册完协议后,初始化函数通
知socket协议站初始化完成,(void)sock_register(&inet_family_ops);
inet_family_ops
是struct net_proto_family结构体的实例,被初始化为:
static
struct net_proto_family inet_family_ops = {
.family = PF_INET,
.create = inet_create,
.owner = THIS_MODULE,
};
紧接着增加给个基本协议到协
议数组当中去,struct net_protocol *inet_protos[MAX_INET_PROTOS];
在这之后,接着为
inet_create注册socket信息
接着启动,arp模块,ip
模块,tcp模块等等.