http://hi.baidu.com/joinhack/blog/item/33de0b08a81112d163d986ef.html

查看文章

 
(linux -2.6.12.3)阅读inet_init函数
2006-08-26 16:52

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模块等等.


类别:tcp/ip | 添加到搜藏 | 浏览(473) | 评 论 (0)
 
上一篇:看linux/list.h的心得    下一篇:重新定向阅读方向
 

Reply via email to