Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371404
  • 博文数量: 56
  • 博客积分: 1449
  • 博客等级: 中尉
  • 技术积分: 822
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 10:24
文章分类

全部博文(56)

文章存档

2014年(7)

2012年(13)

2011年(10)

2010年(26)

分类: LINUX

2012-05-22 18:51:10


点击(此处)折叠或打开

  1. /* 如果忽略掉原始套接字和IPSec,则该函数仅仅是根据IP头部中的协议字段选择上层L4协议,并交给它来处理 */
  2. static int ip_local_deliver_finish(struct sk_buff *skb)
  3. {
  4.     /* 跳过IP头部 */
  5.     __skb_pull(skb, ip_hdrlen(skb));

  6.     /* Point into the IP datagram, just past the header. */
  7.     /* 设置传输层头部位置 */
  8.     skb_reset_transport_header(skb);

  9.     rcu_read_lock();
  10.     {
  11.         /* Note: See raw.c and net/raw.h, RAWV4_HTABLE_SIZE==MAX_INET_PROTOS */
  12.         int protocol = ip_hdr(skb)->protocol;
  13.         int hash;
  14.         struct sock *raw_sk;
  15.         struct net_protocol *ipprot;

  16.     resubmit:
  17.     /* 这个hash根本不是哈希值,仅仅只是inet_protos数组中的下表而已 */
  18.         hash = protocol & (MAX_INET_PROTOS - 1);
  19.         raw_sk = sk_head(&raw_v4_htable[hash]);

  20.         /* If there maybe a raw socket we must check - if not we
  21.          * don't care less
  22.          */
  23.     /* 原始套接字?? 忽略... */
  24.         if (raw_sk && !raw_v4_input(skb, ip_hdr(skb), hash))
  25.             raw_sk = NULL;
  26.     /* 查找注册的L4层协议处理结构。 */
  27.         if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
  28.             int ret;
  29.     /* 启用了安全策略,则交给IPSec */
  30.             if (!ipprot->no_policy) {
  31.                 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
  32.                     kfree_skb(skb);
  33.                     goto out;
  34.                 }
  35.                 nf_reset(skb);
  36.             }
  37.     /* 调用L4层协议处理函数 */
  38.     /* 通常会是tcp_v4_rcv, udp_rcv, icmp_rcv和igmp_rcv */
  39.     /* 如果注册了其他的L4层协议处理,则会进行相应的调用。 */
  40.             ret = ipprot->handler(skb);
  41.             if (ret < 0) {
  42.                 protocol = -ret;
  43.                 goto resubmit;
  44.             }
  45.             IP_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);
  46.         } else {
  47.             if (!raw_sk) {    /* 无原始套接字,提交给IPSec */
  48.                 if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
  49.                     IP_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS);
  50.                     icmp_send(skb, ICMP_DEST_UNREACH,
  51.                          ICMP_PROT_UNREACH, 0);
  52.                 }
  53.             } else
  54.                 IP_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);
  55.             kfree_skb(skb);
  56.         }
  57.     }
  58.  out:
  59.     rcu_read_unlock();

  60.     return 0;
  61. }

阅读(5705) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~