网络子系统53_ip协议分片重组_内存阈值
//调用路径:ip_defrag->ip_evictor
// 分片重组时,可使用内存上下限:
// 1.sysctl_ipfrag_high_thresh 可用内存上限
// 2.sysctl_ipfrag_low_thresh 内存超过上限后,需要释放内存到此限
1.1 static void ip_evictor(void)
{
struct ipq *qp;
struct list_head *tmp;
int work;
//计算需要释放的内存
work = atomic_read(&ip_frag_mem) - sysctl_ipfrag_low_thresh;
if (work <= 0)
return; while (work > 0) {
read_lock(&ipfrag_lock);
if (list_empty(&ipq_lru_list)) {//最近最久没有没有被使用的链表,链表头的ipq最久没有被使用
read_unlock(&ipfrag_lock);
return;
}
//在获取锁的情况下,释放ipq
tmp = ipq_lru_list.next;
qp = list_entry(tmp, struct ipq, lru_list);
atomic_inc(&qp->refcnt);//增加ipq的引用计数,防止其突然消失
read_unlock(&ipfrag_lock); spin_lock(&qp->lock);
if (!(qp->last_in&COMPLETE))//ipq没有接收完全
ipq_kill(qp);//
spin_unlock(&qp->lock); ipq_put(qp, &work);
IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);
}
}
//调用路径:ip_evictor->ipq_kill
1.2 static void ipq_kill(struct ipq *ipq)
{
if (del_timer(&ipq->timer))//删除ipq的定时器
atomic_dec(&ipq->refcnt);//递减定时器持有的引用计数 if (!(ipq->last_in & COMPLETE)) {//ipq没有接收完全
ipq_unlink(ipq);//将ipq从ipq hash表bucket的链表上摘下来
atomic_dec(&ipq->refcnt);//递减ipq hash表bucket对其持有的引用计数
ipq->last_in |= COMPLETE;//标记ipq接收完全,防止其被更新
}
} 1.3 static __inline__ void ipq_put(struct ipq *ipq, int *work)
{
if (atomic_dec_and_test(&ipq->refcnt))//递减在ip_evictor中对ipq的引用
ip_frag_destroy(ipq, work);//释放关联到此ipq的skb
} 1.4 static void ip_frag_destroy(struct ipq *qp, int *work)
{
struct sk_buff *fp;
//此ipq接收到的所有分片
fp = qp->fragments;
while (fp) {
struct sk_buff *xp = fp->next; frag_kfree_skb(fp, work);//释放skb,从work中减去此skb的大小
fp = xp;
} frag_free_queue(qp, work);//释放ipq结构
}
网络子系统53_ip协议分片重组_内存阈值的更多相关文章
- 网络子系统54_ip协议分片重组_定位ipq
//为分片确定正确的ipq结构 // 定位5元组 // 1.<id, 源ip, 目的ip, l4协议> 可通过ip报文获取 // 2.user 通过ip_defrag给出,指出重组是由谁发 ...
- 网络子系统55_ip协议分片重组_加入ipq
//ip分片加入到正确的ipq结构 //调用路径:ip_defrag->ip_frag_queue // 处理过程: // 1.正在被释放的ipq,不处理新加入的分片(ipq正在被释放由last ...
- 网络子系统42_ip协议处理函数_数据帧的接收
//向协议栈注册l3处理函数 1.1 void dev_add_pack(struct packet_type *pt) { int hash; //ptype_all ptype_base共用一把锁 ...
- 网络子系统48_ip协议数据帧的发送
//ip协议与l4协议接口,l4通过此接口向下l3传递数据帧 //函数主要任务: // 1.通过路由子系统路由封包 // 2.填充l3报头 // 3.ip分片 // 4.计算校验和 // 5.衔接邻居 ...
- 网络子系统45_ip协议tos处理
//ip报头tos字段,一个字节 // 二进制位:[0 1 2] [3] [4] [5] [6] [7] // 1.[0 1 2] 表示优先级: // 000 路由 // 001 优先级 // 010 ...
- 网络子系统46_ip协议数据帧的转发
//调用路径ip_rcv->ip_rcv_finish->dst_input->(skb->dst->input) //ip_forward以回调函数的形式,保存在skb ...
- Linux 网络子系统之网络协议接口层(一)
Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_ ...
- Linux内核笔记--网络子系统初探
内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...
- 《Linux 性能及调优指南》1.5 网络子系统
翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...
随机推荐
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- bzoj3926
题目的意思是叶子不超过20个……听说当初zjoi不少人被坑 分别对每个叶子以它为根dfs出20个dfs树,这样整个树的任何一个子串,都是某个dfs树上一个点到它的一个子孙的路径 每个dfs树,根到叶子 ...
- iOS开发:插件记录
进入沙盒的插件 https://github.com/TongeJie/ZLGotoSandboxPlugin 图片提示的插件 https://github.com/ksuther/KSImageNa ...
- EASYUI+MVC4通用权限管理平台
通用权限案例平台在经过几年的实际项目使用,并取得了不错的用户好评.在平台开发完成后,特抽空总结一下平台知识,请各位在以后的时间里,关注博客的更新. 1.EASYUI+MVC4通用权限管理平台--前言 ...
- SharePoint CMAL方式处理的 增,删,查,改
SPContext.Current.Web.Lists["UserInfo"]:获取网站的List,名称是:UserInfo userlist.AddItem():添加数据到Lis ...
- UVa 1220 (树的最大独立集) Party at Hali-Bula
题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...
- UVa 1347 (双线程DP) Tour
题意: 平面上有n个坐标均为正数的点,按照x坐标从小到大一次给出.求一条最短路线,从最左边的点出发到最右边的点,再回到最左边的点.除了第一个和最右一个点其他点恰好只经过一次. 分析: 可以等效为两个人 ...
- UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!
题意: 斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0) 输入a.b.n,求f(ab)%n 分析: 构造一个新数列F(i) = f(i) ...
- OK335xS mac address hacking
/*********************************************************************** * OK335xS mac address hacki ...
- PHP单元测试工具PHPUnit初体验
今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查. 看了PHPUnit的文档之后 ...