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

全部博文(56)

文章存档

2014年(7)

2012年(13)

2011年(10)

2010年(26)

分类: LINUX

2012-05-22 19:08:26


点击(此处)折叠或打开

  1. /* Process an incoming IP datagram fragment. */
  2. int ip_defrag(struct sk_buff *skb, u32 user)
  3. {
  4.     struct ipq *qp;

  5.     IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS);

  6.     /* Start by cleaning up the memory. */
  7.     /*
  8.      * 首先检查所有IP分片所消耗的内存是否大于系统允许的最高阀值,如果是,则调用
  9.      * ip_evictor()丢弃未完全到达的IP分片,从最旧的分片开始释放。此举一来是为了节
  10.      * 约内存,二来是未了防止黑客的恶意攻击。使分片在系统中累计,降低系统性能。
  11.      */
  12.     if (atomic_read(&ip4_frags.mem) > ip4_frags_ctl.high_thresh)
  13.         ip_evictor();

  14.     /* Lookup (or create) queue header */
  15.     /* 如果该分片是数据报的第一个分片,则ip_find返回一个新的队列来搜集分片,否则
  16.      * 返回其所属于的分片队列。 */
  17.     if ((qp = ip_find(ip_hdr(skb), user)) != NULL) {
  18.         int ret;

  19.         spin_lock(&qp->q.lock);
  20.     /* 将该分片加入到队列中,重组分片队列,如果所有的包都收到了,则该函数
  21.      * 负责重组IP包 */
  22.         ret = ip_frag_queue(qp, skb);

  23.         spin_unlock(&qp->q.lock);
  24.         ipq_put(qp);    /* 引用计数减1 */
  25.         return ret;
  26.     }

  27.     IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);
  28.     kfree_skb(skb);
  29.     return -ENOMEM;
  30. }

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