Linux解析内核源代码——传输控制块诞生
生活随笔
收集整理的這篇文章主要介紹了
Linux解析内核源代码——传输控制块诞生
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原創文章是freas_1990,轉載請注明出處:http://blog.csdn.net/freas_1990/article/details/23795587
在Linux 2.6一旦(不包含2.6,對于更詳細的調查是不是版本號),控制塊的概念,各種協議的狀態管理還出于比較混亂的狀態。
Linux 2.6以后。傳輸控制塊機制使代碼看起來比較規整了。
創建傳輸控制塊:
/** Create an inet socket.*/static int inet_create(struct socket *sock, int protocol) {struct sock *sk;struct list_head *p;struct inet_protosw *answer;struct inet_opt *inet;int err = -ENOBUFS;sock->state = SS_UNCONNECTED;sk = sk_alloc(PF_INET, GFP_KERNEL, inet_sk_size(protocol),inet_sk_slab(protocol));if (!sk)goto out;/* Look for the requested type/protocol pair. */answer = NULL;rcu_read_lock();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;}answer = NULL;}err = -ESOCKTNOSUPPORT;if (!answer)goto out_sk_free;err = -EPERM;if (answer->capability > 0 && !capable(answer->capability))goto out_sk_free;err = -EPROTONOSUPPORT;if (!protocol)goto out_sk_free;err = 0;sock->ops = answer->ops;sk->sk_prot = answer->prot;sk->sk_no_check = answer->no_check;if (INET_PROTOSW_REUSE & answer->flags)sk->sk_reuse = 1;rcu_read_unlock();inet = inet_sk(sk);if (SOCK_RAW == sock->type) {inet->num = protocol;if (IPPROTO_RAW == protocol)inet->hdrincl = 1;}if (ipv4_config.no_pmtu_disc)inet->pmtudisc = IP_PMTUDISC_DONT;elseinet->pmtudisc = IP_PMTUDISC_WANT;inet->id = 0;sock_init_data(sock, sk);sk_set_owner(sk, THIS_MODULE);sk->sk_destruct = inet_sock_destruct;sk->sk_zapped = 0;sk->sk_family = PF_INET;sk->sk_protocol = protocol;sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;inet->uc_ttl = -1;inet->mc_loop = 1;inet->mc_ttl = 1;inet->mc_index = 0;inet->mc_list = NULL;#ifdef INET_REFCNT_DEBUGatomic_inc(&inet_sock_nr); #endifif (inet->num) {/* It assumes that any protocol which allows* the user to assign a number at socket* creation time automatically* shares.*/inet->sport = htons(inet->num);/* Add to protocol hash chains. */sk->sk_prot->hash(sk);}if (sk->sk_prot->init) {err = sk->sk_prot->init(sk);if (err)inet_sock_release(sk);} out:return err; out_sk_free:rcu_read_unlock();sk_free(sk);goto out; }這里的sk_alloc是重點: sk = sk_alloc(PF_INET, GFP_KERNEL, inet_sk_size(protocol),inet_sk_slab(protocol));
inet_sk_size定義例如以下: static __inline__ int inet_sk_size(int protocol) {int rc = sizeof(struct tcp_sock);if (protocol == IPPROTO_UDP)rc = sizeof(struct udp_sock);else if (protocol == IPPROTO_RAW)rc = sizeof(struct raw_sock);return rc; }
它會依據詳細的傳輸層協議定義返回對應的傳輸控制塊的大小。
在socket里,sock指針僅僅是一個“泛型”,它可能指向struct sock,struct tcp_sock,struct udp_sock,根據該協議的細節。
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的Linux解析内核源代码——传输控制块诞生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细说新一代HTML5/JavaScrip
- 下一篇: Linux mint 17中文输入法安装