linux网络协议栈分析笔记8-arp邻居子系统1

LINUX邻居子系统(一) 邻居子系统是linux网络协议栈中非常庞大的一块,也是比较混乱复杂的一块,不过有一点感觉挺好玩的就是 它不涉及太多具体协议的内容,所以阅读起来还不算太复杂 而且它很多时候自成一个小小的系统运转(所以才叫子系统),不需要外界太多的管理(ARP,ND等协议的管理),这也是它的一个特色。 不过感觉它也承担了一部分第二层的功能(二层协议首部的封装) 它嵌入在网络层和数据链路层之间(但是又不能把它叫 阅读详情
我们进入arp协议,我们看看linux中号称邻居子系统是啥样的
static struct  packet_type arp_packet_type __read_mostly = {
     .type =     cpu_to_be16( ETH_P_ARP),   
     .func =      arp_rcv,
};

还记得那个netif_receive_skb吧,选择三层协议处理的地方,arp通过 dev_add_pack注册了上述的packet_type结构
#define  ETH_P_ARP     0x0806          /* Address Resolution packet     */

void __init  arp_init (void)
{
     neigh_table_init(& arp_tbl );               初始化arp邻居表

     dev_add_pack(&arp_packet_type);   注册三层处理协议类型 arp
     arp_proc_init();                     /proc文件系统相关arp部分创建
#ifdef CONFIG_SYSCTL
     neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4,
                     NET_IPV4_NEIGH, "ipv4", NULL, NULL);
#endif
     register_netdevice_notifier(&arp_netdev_notifier);        注册通知链
}

neigh_table_init(& arp_tbl);        其实就是把arp_tbl挂在全局的neigh_tables变量上
          for (tmp = neigh_tables; tmp; tmp = tmp->next) {
          if (tmp->family == tbl->family)        用协议族在区分  arp类型为AF_INET   IPV6的ND协议为AF_INET6
               break;
     }
     tbl->next     = neigh_tables; 
     neigh_tables     = tbl; 

重要数据结构:
struct neigh_table
{
     struct neigh_table     *next;
     int               family;                      协议族          
     int               entry_size;              邻居项的大小    为sizeof(struct neighbour) + 4  考虑到有零长数组
     int               key_len;                    hash关键字的长度 为4
     __u32               (*hash)(const void *pkey, const struct net_device *);          hash函数
     int               (*constructor)(struct neighbour *);
     int               (*pconstructor)(struct pneigh_entry *);
     void               (*pdestructor)(struct pneigh_entry *);
     void               (*proxy_redo)(struct sk_buff *skb);
     char               *id;
     struct neigh_parms     parms;
     /* HACK. gc_* shoul follow parms without a gap! */
     int               gc_interval;                常规的垃圾回收间隔时间  默认30秒
     int               gc_thresh1;                门限
     int               gc_thresh2;
     int               gc_thresh3;                    
     unsigned long          last_flush;
     struct delayed_work     gc_work;             常规的垃圾回收定时器
     struct timer_list      proxy_timer;
     struct sk_buff_head     proxy_queue;
     atomic_t          entries;       整个表中邻居项的个数  当entries大于hash_mask+1,哈希桶增长为原来的两倍
     rwlock_t          lock;
     unsigned long          last_rand;
     struct kmem_cache          *kmem_cachep;
     struct neigh_statistics     *stats;
     struct neighbour     **hash_buckets;               存放邻居项的哈希桶
     unsigned int          hash_mask;                         hash桶大
linux之网络子系统(11)- 地址解析协议arp 源码分析和邻居通用框架 框架图:(在一本书上的图)为什么需要邻居子系统?因为在网络上发送报文的时候除了需要知道目的IP地址还需要知道邻居的L2 MAC地址,为什么是邻居的L2 MAC地址而不是目的地的L2地址?这是因为目的地网络可能和源主机不在同一个网段,因此需要借助其他离目的地近的网关帮我们传输,此时网关就是邻居。如果目的地和源主机在同一个LAN上的话,它们就是邻居。邻居子系统的核心功能 就是完成L3地址到L2地址的映射,也即使ARP协议,并提供网络层和驱动程序底层之间的接口。 阅读详情

相关推荐

linux内核协议栈 邻居协议之通用邻居项的创建、查找、删除等相关函数

目录 前言 1邻居表项创建neigh_create() 1.1邻居表项内存申请与初始化neigh_alloc() 1.2邻居hash表扩容 neigh_hash_grow() 2邻居表项查找 2.1neigh_lookup() 2.2neigh_lookup_nodev() 2.3查找+条件创建 __neigh_lookup() 2.4查找+默认创建 __neigh_lookup_errno() 3邻居表项销毁neigh_destroy() 3.1邻居表项条件...

1402

探索Linux内核网络协议栈:自定义协议与IPv6邻居发现的交互分析

协议交互诊断通过和精准日志定位触发源,区分标准协议与自定义协议。选择性禁用功能禁用IPv6前评估对网络服务的影响,尤其是依赖IPv6的组件。防御性编码在内核调试工具结合ftracekdump等工具深入分析内核行为,提升调试效率。通过上述方法,开发者既能理解内核协议栈的底层机制,又能有效调试自定义协议模块,确保网络功能的稳定性和可维护性。1. 问题背景:周期性调用的函数在Linux内核网络模块开发中,开发者可能会发现自定义的发送函数(如)被频繁调用。

数字人生 260

arptable_filter.rar_hook ip_netfilter_netfilter a_内核HOOK

Netfilter的内核源代码,可以作为研究ARP,IP的HOOK的前提。

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 443

《深入浅出图神经网络:GNN原理解析》学习笔记

期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 2048

IGS精密星历高效获取与解析指南

本文详细介绍了IGS精密星历在高精度定位中的核心作用,对比了IGS Final、IGR和IGU等不同产品的精度与时效性差异。指南提供了从武汉大学、NASA CDDIS等数据中心高效下载数据的实战方法,并深入解析了SP3文件格式,帮助用户掌握精密星历的获取、解析与自动化处理技巧,以支持厘米级定位应用。

garlic的博客 839

2024年全国大学生电子设计竞赛H题_自动行驶小车

自动行驶小车(H题)【本科组/高职高专组】

qq_74395263的博客 1万+

你的Wi-Fi总断网?可能是DHCP租约到期惹的祸!手把手教你用Windows/路由器设置永久IP或延长租期

本文深入解析家庭Wi-Fi频繁断网的常见原因——DHCP租约到期问题,并提供Windows和路由器设置永久IP或延长租期的详细教程。通过对比静态IP配置与延长租期两种方案,帮助用户有效解决网络不稳定问题,特别适合游戏玩家和远程工作者优化家庭网络环境。

weixin_29305313的博客 1423

【自适应滤波】自适应UKF,基于新息自适应调节Q和R,场景为雷达跟踪与滤波、MATLAB实现

本文提出了一种基于新息协方差匹配的自适应UKF(CM-AUKF)算法,用于解决噪声统计未知或时变场景下的目标跟踪问题。通过实时调整过程噪声协方差Q和观测噪声协方差R,CM-AUKF显著提升了跟踪精度和稳定性。仿真结果表明,相比传统UKF,CM-AUKF在位置和速度估计误差上分别降低了约50%和30%,且无需人工调参。该算法适用于无人机导航、雷达跟踪等动态环境,MATLAB代码可直接运行复现结果。自适应曲线显示算法能有效收敛到真实噪声参数,验证了其自适应能力。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 329

unity从3D升级到urp管线,打包ab包后,材质全部变紫色

确保材质中的被转换为 URP 兼容的着色器。在打包 AssetBundle 时,确保所需的着色器被正确打包。确保运行 AB 包的目标项目中正确配置了 URP 渲染管线。如果加载后材质丢失,检查 AB 包的加载逻辑,确保材质正确应用了着色器。通过这些步骤,你应该能够解决从标准渲染管线切换到 URP 渲染管线后,材质在 AB 包中变紫色的问题。如果问题仍然存在,请根据具体错误日志进一步排查。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1962

《C/C++等级考试(1~8级)历届真题解析》专栏总目录

中国电子学会《全国青少年软件编程等级考试》C/C++编程(1~8级)历届真题解析。订阅后可阅读专栏内所有真题解析,真题持续更新中!

人生就是一个不断学习的过程 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: linux网络协议栈分析笔记7-VLAN的处理
下一篇: linux网络协议栈分析笔记9-arp邻居子系统2
白水煮鸡蛋
博客等级 码龄15年 106粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值