路由缓存信息文件rt_acct和rt_cache
PROC文件/proc/net/rt_acct和PROC文件/proc/net/stat/rt_cache。
rt_acct 文件
PROC文件/proc/net/rt_acct,基于路由的QoS控制,
static int __net_init ip_rt_do_proc_init(struct net *net)
{#ifdef CONFIG_IP_ROUTE_CLASSIDpde = proc_create("rt_acct", 0, net->proc_net, &rt_acct_proc_fops);if (!pde)goto err3;
#endifreturn 0;
在路由初始化时,分配ip_rt_acct结构的没处理器变量空间。
int __init ip_rt_init(void)
{#ifdef CONFIG_IP_ROUTE_CLASSIDip_rt_acct = __alloc_percpu(256 * sizeof(struct ip_rt_acct), __alignof__(struct ip_rt_acct));if (!ip_rt_acct)panic("IP: failed to allocate ip_rt_acct\n");
#endif
如下PROC处理函数rt_acct_proc_show,将所有的处理器项进行累加,并且每处理器变量实际为一个256元素的ip_rt_acct结构数组,全部进行累加。
#ifdef CONFIG_IP_ROUTE_CLASSID
static int rt_acct_proc_show(struct seq_file *m, void *v)
{struct ip_rt_acct *dst, *src;dst = kcalloc(256, sizeof(struct ip_rt_acct), GFP_KERNEL);for_each_possible_cpu(i) {src = (struct ip_rt_acct *)per_cpu_ptr(ip_rt_acct, i);for (j = 0; j < 256; j++) {dst[j].o_bytes += src[j].o_bytes;dst[j].o_packets += src[j].o_packets;dst[j].i_bytes += src[j].i_bytes;dst[j].i_packets += src[j].i_packets;}}seq_write(m, dst, 256 * sizeof(struct ip_rt_acct));
#endif
在报文接收处理过程中,如果路由项指定了realm值,如下IP命令。ip_rcv_finish_core函数根据tclassid值的低8位值,作为索引保存output放行的统计;而tclassid值的8-16位,作为索引保存input放行的统计值。每处理器变量ip_rt_acct为256个元素的数组。
# ip route add 192.168.2.0/24 dev eth0 realm 2static int ip_rcv_finish_core(struct net *net, struct sock *sk,struct sk_buff *skb, struct net_device *dev,const struct sk_buff *hint)
{/** Initialise the virtual path cache for the packet. It describes* how the packet travels inside Linux networking.*/if (!skb_valid_dst(skb)) {err = ip_route_input_noref(skb, iph->daddr, iph->saddr, iph->tos, dev);if (unlikely(err))goto drop_error;}#ifdef CONFIG_IP_ROUTE_CLASSIDif (unlikely(skb_dst(skb)->tclassid)) {struct ip_rt_acct *st = this_cpu_ptr(ip_rt_acct);u32 idx = skb_dst(skb)->tclassid;st[idx&0xFF].o_packets++;st[idx&0xFF].o_bytes += skb->len;st[(idx>>16)&0xFF].i_packets++;st[(idx>>16)&0xFF].i_bytes += skb->len;}
#endif
rt_cache文件
PROC文件/proc/net/rt_cache,查看系统的cache项。其与cache统计项不同(/proc/net/stat/rt_cache)。
static int __net_init ip_rt_do_proc_init(struct net *net)
{ struct proc_dir_entry *pde;pde = proc_create("rt_cache", 0444, net->proc_net,&rt_cache_proc_ops);if (!pde)goto err1;pde = proc_create("rt_cache", 0444,net->proc_net_stat, &rt_cpu_proc_ops);if (!pde)goto err2;
有如下的处理函数可见,此/proc/net/rt_cache文件,内核已不再处理。
static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
{if (*pos)return NULL;return SEQ_START_TOKEN;
}
static void *rt_cache_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{++*pos;return NULL;
}
static void rt_cache_seq_stop(struct seq_file *seq, void *v)
{
}
static int rt_cache_seq_show(struct seq_file *seq, void *v)
{if (v == SEQ_START_TOKEN)seq_printf(seq, "%-127s\n","Iface\tDestination\tGateway \tFlags\t\tRefCnt\tUse\t""Metric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\t""HHUptod\tSpecDst");return 0;
}
static const struct seq_operations rt_cache_seq_ops = {.start = rt_cache_seq_start,.next = rt_cache_seq_next,.stop = rt_cache_seq_stop,.show = rt_cache_seq_show,
};
static int rt_cache_seq_open(struct inode *inode, struct file *file)
{return seq_open(file, &rt_cache_seq_ops);
}
static const struct proc_ops rt_cache_proc_ops = {.proc_open = rt_cache_seq_open,.proc_read = seq_read,.proc_lseek = seq_lseek,.proc_release = seq_release,
};
内核版本 5.10
路由缓存信息文件rt_acct和rt_cache相关推荐
- 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例
图信息文件一 CityGraph.txt NodeNum = 25 Node0 = (1,242) Node1 = (0,242)(2,305) Node2 = (1,305)(3,39 ...
- Vue.js-Day05【安装路由(vue-router)、如何使用vue-router、404配置、激活class、动态路由、编程式导航、路由嵌套、路由元信息、导航拦截】
Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 目 录 1.单页面应用 1.1.多页面应用 1.2.单页面应用 1.3.vue-router 2.安装vue-rout ...
- kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数
keep-alive它自身不会渲染一个dom元素,也不会出现在父组件中,作为标签使用包裹在需要缓存的组件外 路由元信息 如果要缓存部分页面可以使用路由元信息 <keep-alive>< ...
- vue3.0+ts+element-plus多页签应用模板:多级路由缓存
目录 系列文章 一.先说点啥 1. 为啥需要路由缓存? 2. 怎么实现路由缓存? 二.路由扁平化 三.定义tag模块处理路由缓存 四.切换路由时加入缓存 五.使用keep-alive 系列文章 vue ...
- lwip路由实现_基于LWIP协议栈对路由缓存数据结构实现改进设计
LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of C++omputer Science)AdamDunkels等人开 ...
- arcgis 散瓦片发布服务_利用已有的缓存地图文件发布ArcGIS Server瓦片服务
1.拷贝缓存地图文件夹至ArcGIS Server缓存目录. 2.确认缓存文件夹目录结构,如果不是如下文件目录结构,可手动调整. 注意,Layers的上一级目录,建议直接以服务名来命名. 3.ArcM ...
- 如何在nginx中缓存静态文件
这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设置一个 ...
- windows 技巧篇-清除共享地址访问缓存信息,共享路径临时访问用户切换方法
有时我们访问某个共享地址,但是用了没有权限的用户临时登录,也没有保存用户信息. [windows 凭证里没有记录,我们直接删不了] 再重新访问发现没有重新登录的窗口了,默认之前的用户就进来了.这就是缓 ...
- Vue项目实战03 : vue中 meta 路由元信息
路由元信息 meta: 每个路由的标识信息,是路由独有的一个信息,无论在路由中是否定义meta,在组件中都可以通过this.$route.meta访问到,如果没有定义,返回{} 在组件中: this. ...
最新文章
- 自定义mac的ll命令
- 腾讯机器狗,站起来了!
- python asyncio 异步编程-协程 2
- 大数据上云第一课:MaxCompute授权和外表操作躲坑指南
- (需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端
- ValueError: invalid literal for int() with base 10:Python报错及其解决办法
- firefox ie 鼠标事件 坐标 兼容问题
- Python连接SQL Server数据获取2
- 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
- raster包—projectRaster函数
- 1899 用迭代法求平方根
- nodejs 结合 wechaty 实现你的微信群聊机器人二(iPad 协议)
- 深入浅出的CSS项目开发总结
- CF983E NN country
- php 极简 新闻,开源极简新闻信息分享工具
- 服务器迁移实践,物理服务器迁移到阿里云服务器
- 神州战神电脑关闭触摸板
- 关于近几年嵌入式软件工程师的就业和前景问题
- 使用Android Studio调试系统应用之TvSettings(一):移植
- h264基础知识 宏块,片
热门文章
- Matlab Online Tutorial
- 【BAT】查询局域内所有的IP
- Refinitiv推出Qual-ID,整合数字身份技术与了解你的客户(KYC)尽职调查
- python验证角谷_6.4验证角谷猜想
- Transformer(4)
- 微信开发者工具经常打不开怎么办?
- MTK芯片功能机改IMEI+智能机,合并软件工具介绍
- 网络编程-JavaScript中发送网络请求汇总
- c语言 读取 256级 灰度 bmp,256级灰度BMP文件读写源代码c语言图像处理.doc
- docker RabbitMQ:修改Channel limit