邻居表项的locktime时长

2023-12-19 09:38
文章标签 邻居 时长 表项 locktime

本文主要是介绍邻居表项的locktime时长,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果内核在locktime时间内接收到多个ARP报文,仅首个报文生效。对于arp协议,内核默认的locktime时长为1秒钟,可通过PROC文件或者ip命令进行修改。

struct neigh_table arp_tbl = {.family     = AF_INET,.key_len    = 4,.protocol   = cpu_to_be16(ETH_P_IP),.hash       = arp_hash,.key_eq     = arp_key_eq,.constructor    = arp_constructor,.proxy_redo = parp_redo,.id     = "arp_cache",.parms      = {.tbl            = &arp_tbl,.reachable_time     = 30 * HZ,.data   = {...[NEIGH_VAR_LOCKTIME] = 1 * HZ,

通过PROC文件locktime可查看和修改此值,如下,默认为100,对应于1秒钟。

$ cat /proc/sys/net/ipv4/neigh/eth0/locktime 
100

内核中静态变量neigh_sysctl_table定义了locktime的PROC文件信息。

static struct neigh_sysctl_table {struct ctl_table_header *sysctl_header;struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1];
} neigh_sysctl_template __read_mostly = {.neigh_vars = {...NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(LOCKTIME, "locktime"),

如下定义,locktime的处理有neigh_proc_dointvec_userhz_jiffies,其负责将内核使用的jiffies值转换为用户层面的HZ(值为100),即内核locktime初始化为1000,用户层面显示为100。

#define NEIGH_SYSCTL_USERHZ_JIFFIES_ENTRY(attr, name) \NEIGH_SYSCTL_ENTRY(attr, attr, name, 0644, neigh_proc_dointvec_userhz_jiffies)

netlink接口

除了以上的PROC文件外,还可使用ip ntable命令查看和修改设备的邻居表参数。

# ip ntable show dev eth0
inet arp_cache dev eth0refcnt 12 reachable 28884 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 31 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 1000 

与PROC文件不同,这里显示的locktime单位为毫秒值。如下将设备eth0的邻居表参数locktime修改为2秒钟。

# ip ntable change name arp_cache dev eth0 base_reachable 2000

内核函数neigh_init初始化了以上ip ntable change命令的处理函数neightbl_set。

static int __init neigh_init(void)
{...rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, 0);

如下为neightbl_set的实现,函数nla_get_msecs读取IP命令行设置的locktime的毫秒值参数,转换为内核使用的jiffies值,设置到邻居表的参数中。对于arp协议,将设置到arp_tbl成员parms的子成员data数组中,索引位置为NEIGH_VAR_LOCKTIME。

static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{struct neigh_table *tbl;struct nlattr *tb[NDTA_MAX+1];if (tb[NDTA_PARMS]) {struct neigh_parms *p;p = lookup_neigh_parms(tbl, net, ifindex);...for (i = 1; i <= NDTPA_MAX; i++) {switch (i) {...case NDTPA_LOCKTIME:NEIGH_VAR_SET(p, LOCKTIME, nla_get_msecs(tbp[i]));

显示命令ip ntable show由内核中的函数neightbl_fill_parms填充值,对于locktime的值,由nla_put_msecs填充。

static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
{...if ((parms->dev &&...nla_put_msecs(skb, NDTPA_LOCKTIME,NEIGH_VAR(parms, LOCKTIME), NDTPA_PAD)

如下函数nla_put_msecs,其需要将内核使用locktime的jiffies值转换为ip ntable show显示时的毫秒值,通过jiffies_to_msecs实现。

static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,unsigned long njiffies, int padattr)
{u64 tmp = jiffies_to_msecs(njiffies);return nla_put_64bit(skb, attrtype, sizeof(u64), &tmp, padattr);
}

locktime处理

在arp报文处理函数arp_process中,对于连续(back-to-back)接收到的ARP回复,内核选择使用首个回复报文,因为,如果链路上存在多个活动的ARP代理,这样就选择了其中速度较快的一个,也可屏蔽一些无用的ARP回复。

内核判断连续报文的依据为locktime时长,在此段时间内接收到的ARP报文,进行更新时不设置覆盖标志位NEIGH_UPDATE_F_OVERRIDE(garp的情况除外)。

static int arp_process(struct net *net, struct sock *sk, struct sk_buff *skb)
{.../* Update our ARP tables */n = __neigh_lookup(&arp_tbl, &sip, dev, 0);...if (n) {int state = NUD_REACHABLE;int override;/* If several different ARP replies follows back-to-back,use the FIRST one. It is possible, if several proxyagents are active. Taking the first reply preventsarp trashing and chooses the fastest router.*/override = time_after(jiffies,n->updated +NEIGH_VAR(n->parms, LOCKTIME)) || is_garp;/* Broadcast replies and request packetsdo not assert neighbour reachability.*/if (arp->ar_op != htons(ARPOP_REPLY) || skb->pkt_type != PACKET_HOST)state = NUD_STALE;neigh_update(n, sha, state,override ? NEIGH_UPDATE_F_OVERRIDE : 0, 0);

内核版本 5.0

这篇关于邻居表项的locktime时长的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511717

相关文章

JobScheduler 调用导致的运行时长30分钟的功耗问题

一、SDK 的使用情况与功耗影响 案例是否导致功耗变大onStartJob return true 且子线程没有调用jobFinished()告知系统功耗变大,最长带来30分钟的partial wakelock 长持锁onStartJob return true 且子线程调用jobFinished()告知系统功耗有影响,主要线程执行时长,标准是30秒内onStartJob return fals

前端vue中怎么判断接口请求返回的时长

废话不多上代码:亲测有效 import axios from 'axios';const httpPlugin = {install(Vue, options) {// 创建axios实例const http = axios.create({baseURL: options.baseURL, // 基础URLtimeout: 10000, // 请求超时时间// 其他配置...});// 请求拦

PCL 基于八叉树获取体素邻居

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 基于一个指定的体素,通过八叉树获取该体素周围的体素点云。 二、实现代码 //标准文件#include <iostream>#include <thread>//PCL#include <pcl/common/common.h>#include

《自定义QTreeView表项颜色、字体、背景色、对齐方式》:系列教程之六

本文属于《QTreeView使用系列教程》之一,欢迎查看其它文章。 在自定义model中修改表项item的文本颜色、字体、背景色以及对齐方式。 1、TreeModel中data函数修改 首先在自定义model类TreeModel中,data()中添加处理font、color、Background、TextAlignment4个role处理逻辑。 QVariant TreeModel::da

【Redis】Redis实现分布式锁合理的控制锁的有效时长的方法

在分布式系统中,合理地控制 Redis 分布式锁的有效时长(即过期时间)非常重要,以确保锁既能防止死锁又能提供高可用性。设置合理的过期时间可以防止客户端在持有锁期间崩溃而导致其他客户端无法获取锁的情况,同时也能确保锁在操作未完成时不会过早失效。 以下是实现合理控制 Redis 分布式锁有效时长的方法和注意事项: 方法一:估算操作时间并加上缓冲时间 最简单的方法是根据操作的预期时间设置锁的有效

基于用户的协同过滤推荐算法单机版代码实现(包含输出用户-评分矩阵模型、用户间相似度、最近邻居、推荐结果、平均绝对误差MAE、查准率、召回率)

基于用户的协同过滤推荐算法单机版代码实现(包含输出用户-评分矩阵模型、用户间相似度、最近邻居、推荐结果、平均绝对误差MAE、查准率、召回率) 一、开发工具及使用技术 MyEclipse10、jdk1.7、mahout API、movielens数据集。 二、实现过程 1、定义用户-电影评分矩阵: /**  * 用户-电影评分矩阵工具类  */ public class DataMo

【python】多线程(3)queue队列之不同延时时长的参数调用问题

链接1:【python】多线程(笔记)(1) 链接2:【python】多线程(笔记)(2)Queue队列 0.问题描述 两个线程,但是不同延时时长,导致数据输出频率不同,但是又想基于其中的最大频率实时输出数据(比如线程一与线程二均用来描述某个物体的运动,但是线程一每2秒输出数据,线程二每1秒输出数据,输出数据方式为[线程一数据,线程二数据],希望屏幕每1秒打印出该数据),但是队列中,以后进先出

2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成 输入描述: 第一个参数为GPU一

CentOS 系统常用信息查询:CPU、内存、硬盘、系统运行时长等

CentOS 是基于 Red Hat Enterprise Linux(RHEL)源代码构建的,是一种流行的 Linux 操作系统。在 CentOS 中,我们可以通过一些命令来查询系统的各种常用信息,包括 CPU 使用情况、内存使用情况、硬盘容量、系统运行时长等。这些信息对系统管理和故障排查非常重要,下面将介绍如何通过命令来查询这些信息。 查询 CPU 信息 查看 CPU 型号: cat

iOS全埋点:事件发生的时间(事件发生的时间戳、事件持续的时长)

文章目录 前言I 事件发生的时间1.1 同步策略1.2 时间纠正策略1.3 事件发生的时间戳1.4 统计事件持续时长 II 统计事件持续时长2.1 实现步骤2.2 记录事件开始发生的时间戳2.3 事件的暂停和恢复2.4 后台状态下的事件时长 III 全埋点事件时长3.1 AppEnd事件时长3.2 AppViewScreen事件时长 see also