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相关推荐

  1. 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例

    图信息文件一        CityGraph.txt NodeNum = 25 Node0 = (1,242) Node1 = (0,242)(2,305) Node2 = (1,305)(3,39 ...

  2. 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 ...

  3. kepp-alive的作用?keep-alive的属性?路由元信息?白名单黑名单?keep-alive的钩子函数

    keep-alive它自身不会渲染一个dom元素,也不会出现在父组件中,作为标签使用包裹在需要缓存的组件外 路由元信息 如果要缓存部分页面可以使用路由元信息 <keep-alive>< ...

  4. vue3.0+ts+element-plus多页签应用模板:多级路由缓存

    目录 系列文章 一.先说点啥 1. 为啥需要路由缓存? 2. 怎么实现路由缓存? 二.路由扁平化 三.定义tag模块处理路由缓存 四.切换路由时加入缓存 五.使用keep-alive 系列文章 vue ...

  5. lwip路由实现_基于LWIP协议栈对路由缓存数据结构实现改进设计

    LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of C++omputer Science)AdamDunkels等人开 ...

  6. arcgis 散瓦片发布服务_利用已有的缓存地图文件发布ArcGIS Server瓦片服务

    1.拷贝缓存地图文件夹至ArcGIS Server缓存目录. 2.确认缓存文件夹目录结构,如果不是如下文件目录结构,可手动调整. 注意,Layers的上一级目录,建议直接以服务名来命名. 3.ArcM ...

  7. 如何在nginx中缓存静态文件

    这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设置一个 ...

  8. windows 技巧篇-清除共享地址访问缓存信息,共享路径临时访问用户切换方法

    有时我们访问某个共享地址,但是用了没有权限的用户临时登录,也没有保存用户信息. [windows 凭证里没有记录,我们直接删不了] 再重新访问发现没有重新登录的窗口了,默认之前的用户就进来了.这就是缓 ...

  9. Vue项目实战03 : vue中 meta 路由元信息

    路由元信息 meta: 每个路由的标识信息,是路由独有的一个信息,无论在路由中是否定义meta,在组件中都可以通过this.$route.meta访问到,如果没有定义,返回{} 在组件中: this. ...

最新文章

  1. 自定义mac的ll命令
  2. 腾讯机器狗,站起来了!
  3. python asyncio 异步编程-协程 2
  4. 大数据上云第一课:MaxCompute授权和外表操作躲坑指南
  5. (需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端
  6. ValueError: invalid literal for int() with base 10:Python报错及其解决办法
  7. firefox ie 鼠标事件 坐标 兼容问题
  8. Python连接SQL Server数据获取2
  9. 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
  10. raster包—projectRaster函数
  11. 1899 用迭代法求平方根
  12. nodejs 结合 wechaty 实现你的微信群聊机器人二(iPad 协议)
  13. 深入浅出的CSS项目开发总结
  14. CF983E NN country
  15. php 极简 新闻,开源极简新闻信息分享工具
  16. 服务器迁移实践,物理服务器迁移到阿里云服务器
  17. 神州战神电脑关闭触摸板
  18. 关于近几年嵌入式软件工程师的就业和前景问题
  19. 使用Android Studio调试系统应用之TvSettings(一):移植
  20. h264基础知识 宏块,片

热门文章

  1. Matlab Online Tutorial
  2. 【BAT】查询局域内所有的IP
  3. Refinitiv推出Qual-ID,整合数字身份技术与了解你的客户(KYC)尽职调查
  4. python验证角谷_6.4验证角谷猜想
  5. Transformer(4)
  6. 微信开发者工具经常打不开怎么办?
  7. MTK芯片功能机改IMEI+智能机,合并软件工具介绍
  8. 网络编程-JavaScript中发送网络请求汇总
  9. c语言 读取 256级 灰度 bmp,256级灰度BMP文件读写源代码c语言图像处理.doc
  10. docker RabbitMQ:修改Channel limit