邻居表项的app_solicit数量

2023-12-19 09:38
文章标签 数量 app 邻居 表项 solicit

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

app_solicit控制上层应用发送邻居地址探测报文的数量,对于arp协议,内核默认的app_solicit为零,在arp邻居表arp_tbl中没有对NEIGH_VAR_APP_PROBES索引所对应的表项赋值,即将app_solict对于的值设置为了零,如果上层应用可完成地址探测,可将app_solicit修改为非零。

通过PROC文件app_solicit可查看和修改其值,如下,修改为1。

$ cat /proc/sys/net/ipv4/neigh/ens33/app_solicit 
0 
$ echo  > /proc/sys/net/ipv4/neigh/ens33/app_solicit 
$     
$ cat /proc/sys/net/ipv4/neigh/ens33/app_solicit       
1

内核中静态变量neigh_sysctl_table定义了app_solicit的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_ZERO_INTMAX_ENTRY(APP_PROBES, "app_solicit"),

netlink接口

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

# $ ip ntable show dev ens33
inet arp_cache dev ens33 refcnt 1 reachable 37268 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 101 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 1000 inet6 ndisc_cache dev ens33 refcnt 1 reachable 31516 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 101 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 0 

与PROC文件不同,这里使用的名称为app_probes,其值等于零。如下将设备ens33的邻居表参数app_probes修改为1。

# ip ntable change name arp_cache dev ens33 app_probes 1

内核函数neightbl_set负责以上ip ntable change命令的处理。函数nla_get_u32读取IP命令行设置的app_probes的值。对于arp协议,宏NEIGH_VAR_SET将修改全局变量arp_tbl的成员parms的data数组,具体为以NEIGH_VAR_APP_PROBES为所对应的成员的值。

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++) {if (tbp[i] == NULL) continue;switch (i) {...case NDTPA_APP_PROBES:NEIGH_VAR_SET(p, APP_PROBES,nla_get_u32(tbp[i]));break;

显示命令ip ntable show由内核中的函数neightbl_fill_parms处理,,负责填充内核参数值,对于app_probes的值,由nla_put_u32函数由邻居表参数中取出并进行填充。

static int neightbl_fill_parms(struct sk_buff *skb, struct neigh_parms *parms)
{...if ((parms->dev &&...nla_put_u32(skb, NDTPA_APP_PROBES, NEIGH_VAR(parms, APP_PROBES)) ||

app_solicit处理

在邻居表项定时处理函数中,如果表项处于NUD_INCOMPLETE和/或NUD_PROBE状态,并且发送的probes数量没有超出设定的最大值(由函数neigh_max_probes计算而来),调用函数neigh_probe发送probe探测邻居项。

static void neigh_timer_handler(struct timer_list *t)
{...if ((neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) &&atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) {neigh->nud_state = NUD_FAILED;notify = 1;neigh_invalidate(neigh);goto out;}...if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {neigh_probe(neigh);

对于arp协议,最终将调用arp_solicit函数处理,如果还可以发送UCAST_PROBES(单播)类型的probe,优先发送。否则,如果UCAST_PROBES的数量用尽,但是APP_PROBES还有剩余,将调用函数neigh_app_ns处理。

static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
{int probes = atomic_read(&neigh->probes);...probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);if (probes < 0) {if (!(neigh->nud_state & NUD_VALID))pr_debug("trying to ucast probe in NUD_INVALID\n");neigh_ha_snapshot(dst_ha, neigh, dev);dst_hw = dst_ha;} else {probes -= NEIGH_VAR(neigh->parms, APP_PROBES);if (probes < 0) {neigh_app_ns(neigh);return;

如下函数neigh_app_ns通过netlink向应用层发送NLM_F_REQUEST消息,通知上次发送邻居请求报文。

void neigh_app_ns(struct neighbour *n)
{           __neigh_notify(n, RTM_GETNEIGH, NLM_F_REQUEST, 0);
} 

不同于以上的邻居表项定时处理,在数据处理流程中,如果邻居表项的状态为NUD_FAILED或者NUD_NONE等不可以状态,并且多播类型(MCAST_PROBES)和APP_PROBES类型的probes数量之和不等于零,由于报文发送需要邻居地址,需要立即发送probe报文(设置immediate_probe为真)。这里不确定邻居的地址,使用多播或者APP方式获取地址。

注意这里在调用neigh_proe之前,将表项中成员probes设置为UCAST_PROBES对应的值,这样可直接跳过单播发送,如果app_probes有值,由上层应用发送地址探测报文,否则内核执行多播发送探测邻居地址。

int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
{bool immediate_probe = false;...if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) {if (NEIGH_VAR(neigh->parms, MCAST_PROBES) +NEIGH_VAR(neigh->parms, APP_PROBES)) {unsigned long next, now = jiffies;atomic_set(&neigh->probes, NEIGH_VAR(neigh->parms, UCAST_PROBES));neigh->nud_state     = NUD_INCOMPLETE;neigh->updated = now;next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), HZ/2);neigh_add_timer(neigh, next);immediate_probe = true;} else {...return 1;}} else if (neigh->nud_state & NUD_STALE) {...
out_unlock_bh:if (immediate_probe)neigh_probe(neigh);

内核版本 5.0

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



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

相关文章

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

ConstraintLayout布局里的一个属性app:layout_constraintDimensionRatio

ConstraintLayout 这是一个约束布局,可以尽可能的减少布局的嵌套。有一个属性特别好用,可以用来动态限制宽或者高app:layout_constraintDimensionRatio 关于app:layout_constraintDimensionRatio参数 app:layout_constraintDimensionRatio=“h,1:1” 表示高度height是动态变化

App Store最低版本要求汇总

1,自此日期起: 2024 年 4 月 29 日 自 2024 年 4 月 29 日起,上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2,最低XCode版本 Xcod

一个统计文件中关键词数量的小程序-优化版本

public class computeWxxFileNum{public static void main(String[] args) throws IOException {//读文件File sourceFile = new File("e:\\55-tmp\\xxx.log");FileReader in = new FileReader(sourceFile); LineNumber

一个统计文件中关键词数量的小程序

public class computeFileNum{public static void main(String[] args) throws IOException {File sourceFile = new File("e:\\55-tmp\\xxx.log"); FileReader in = new FileReader(sourceFile); LineNumberReader

pytorch计算网络参数量和Flops

from torchsummary import summarysummary(net, input_size=(3, 256, 256), batch_size=-1) 输出的参数是除以一百万(/1000000)M, from fvcore.nn import FlopCountAnalysisinputs = torch.randn(1, 3, 256, 256).cuda()fl

鸿蒙自动化发布测试版本app

创建API客户端 API客户端是AppGallery Connect用于管理用户访问AppGallery Connect API的身份凭据,您可以给不同角色创建不同的API客户端,使不同角色可以访问对应权限的AppGallery Connect API。在访问某个API前,必须创建有权访问该API的API客户端。 1.登录AppGallery Connect网站,选择“用户与访问”。选择左侧

Xinstall助力App全渠道统计,参数传递下载提升用户体验!

在移动互联网时代,App已成为我们日常生活中不可或缺的一部分。然而,对于App开发者来说,如何有效地推广和运营自己的应用,却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下,如何精准地触达目标用户,提升用户的下载、安装和活跃度,更是考验着每一个运营者的智慧。 今天,我们就来揭秘一个能够帮助App开发者解决这些痛点的神器——Xinstall。作为一家一站式App全渠道

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_