1. //调用路径:ip_defrag->ip_evictor
  2. // 分片重组时,可使用内存上下限:
  3. // 1.sysctl_ipfrag_high_thresh 可用内存上限
  4. // 2.sysctl_ipfrag_low_thresh 内存超过上限后,需要释放内存到此限
  5. 1.1 static void ip_evictor(void)
  6. {
  7. struct ipq *qp;
  8. struct list_head *tmp;
  9. int work;
  10. //计算需要释放的内存
  11. work = atomic_read(&ip_frag_mem) - sysctl_ipfrag_low_thresh;
  12. if (work <= 0)
  13. return;
  14.  
  15. while (work > 0) {
  16. read_lock(&ipfrag_lock);
  17. if (list_empty(&ipq_lru_list)) {//最近最久没有没有被使用的链表,链表头的ipq最久没有被使用
  18. read_unlock(&ipfrag_lock);
  19. return;
  20. }
  21. //在获取锁的情况下,释放ipq
  22. tmp = ipq_lru_list.next;
  23. qp = list_entry(tmp, struct ipq, lru_list);
  24. atomic_inc(&qp->refcnt);//增加ipq的引用计数,防止其突然消失
  25. read_unlock(&ipfrag_lock);
  26.  
  27. spin_lock(&qp->lock);
  28. if (!(qp->last_in&COMPLETE))//ipq没有接收完全
  29. ipq_kill(qp);//
  30. spin_unlock(&qp->lock);
  31.  
  32. ipq_put(qp, &work);
  33. IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);
  34. }
  35. }
  36. //调用路径:ip_evictor->ipq_kill
  37. 1.2 static void ipq_kill(struct ipq *ipq)
  38. {
  39. if (del_timer(&ipq->timer))//删除ipq的定时器
  40. atomic_dec(&ipq->refcnt);//递减定时器持有的引用计数
  41.  
  42. if (!(ipq->last_in & COMPLETE)) {//ipq没有接收完全
  43. ipq_unlink(ipq);//将ipq从ipq hash表bucket的链表上摘下来
  44. atomic_dec(&ipq->refcnt);//递减ipq hash表bucket对其持有的引用计数
  45. ipq->last_in |= COMPLETE;//标记ipq接收完全,防止其被更新
  46. }
  47. }
  48.  
  49. 1.3 static __inline__ void ipq_put(struct ipq *ipq, int *work)
  50. {
  51. if (atomic_dec_and_test(&ipq->refcnt))//递减在ip_evictor中对ipq的引用
  52. ip_frag_destroy(ipq, work);//释放关联到此ipq的skb
  53. }
  54.  
  55. 1.4 static void ip_frag_destroy(struct ipq *qp, int *work)
  56. {
  57. struct sk_buff *fp;
  58. //此ipq接收到的所有分片
  59. fp = qp->fragments;
  60. while (fp) {
  61. struct sk_buff *xp = fp->next;
  62.  
  63. frag_kfree_skb(fp, work);//释放skb,从work中减去此skb的大小
  64. fp = xp;
  65. }
  66.  
  67. frag_free_queue(qp, work);//释放ipq结构
  68. }

网络子系统53_ip协议分片重组_内存阈值的更多相关文章

  1. 网络子系统54_ip协议分片重组_定位ipq

    //为分片确定正确的ipq结构 // 定位5元组 // 1.<id, 源ip, 目的ip, l4协议> 可通过ip报文获取 // 2.user 通过ip_defrag给出,指出重组是由谁发 ...

  2. 网络子系统55_ip协议分片重组_加入ipq

    //ip分片加入到正确的ipq结构 //调用路径:ip_defrag->ip_frag_queue // 处理过程: // 1.正在被释放的ipq,不处理新加入的分片(ipq正在被释放由last ...

  3. 网络子系统42_ip协议处理函数_数据帧的接收

    //向协议栈注册l3处理函数 1.1 void dev_add_pack(struct packet_type *pt) { int hash; //ptype_all ptype_base共用一把锁 ...

  4. 网络子系统48_ip协议数据帧的发送

    //ip协议与l4协议接口,l4通过此接口向下l3传递数据帧 //函数主要任务: // 1.通过路由子系统路由封包 // 2.填充l3报头 // 3.ip分片 // 4.计算校验和 // 5.衔接邻居 ...

  5. 网络子系统45_ip协议tos处理

    //ip报头tos字段,一个字节 // 二进制位:[0 1 2] [3] [4] [5] [6] [7] // 1.[0 1 2] 表示优先级: // 000 路由 // 001 优先级 // 010 ...

  6. 网络子系统46_ip协议数据帧的转发

    //调用路径ip_rcv->ip_rcv_finish->dst_input->(skb->dst->input) //ip_forward以回调函数的形式,保存在skb ...

  7. Linux 网络子系统之网络协议接口层(一)

    Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_ ...

  8. Linux内核笔记--网络子系统初探

    内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...

  9. 《Linux 性能及调优指南》1.5 网络子系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

随机推荐

  1. hdu 4691 Front compression

    暴力水过,剪一下枝= =果断是数据水了 #include<cstdio> #include<cstring> #include<algorithm> #define ...

  2. Android 仿百度网页音乐播放器圆形图片转圈播放效果

    百度网页音乐播放器的效果  如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ...

  3. win10 enterprise 10240激活:

    win10 enterprise 10240激活: 以管理员命令:slmgr /upkslmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43slmgr /skms kms.x ...

  4. Winfrom 开发系统导航菜单

    先上图看效果在说. 效果图如上,在Web中这个一点难度都没有,几行Css+JS就搞定了.但是在Winfrom中.本来就是半杯水的水准,想做这个个导航菜单,发现真难找,找了很多都不合胃口,只能自己写个了 ...

  5. IPy的使用

    IPy - class and tools for handling of IPv4 and IPv6 addresses and networks. Website: https://github. ...

  6. HDU 5114 Collision

    Collision Time Limit: 15000/15000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Total ...

  7. [转载] python+Eclipse+pydev环境搭建

    转自:http://www.cnblogs.com/Bonker/p/3584707.html 编辑器:Python 自带的 IDLE 简单快捷, 学习Python或者编写小型软件的时候.非常有用. ...

  8. 22、TTS技术

    Android对TTS技术的支持 Android 1.6开始支持TTS(Text To Speech)技术,通过该技术可以将文本转换成语音. TTS技术的核心是android.speech.tts.T ...

  9. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  10. 【转】javascript-图片预加载技术

    1,脚本代码: /** * 图片头数据加载就绪事件 - 更快获取图片尺寸 * @version 2011.05.27 * @author TangBin * @see http://www.plane ...