linux 内核MAC 地址解析

以太网通讯的一个有趣的方面是如何将 MAC 地址( 接口的唯一硬件 ID )和 IP 编号结合
起来. 大部分协议有类似的问题, 但我们这里集中于类以太网的情况. 我们试图提供这个
问题的完整描述, 因此我们展示三个情形: ARP, 无 ARP 的以太网头部( 例如 plip), 以
及非以太网头部.

以太网使用 ARP

处理地址解析的通常方法是使用 Address Resolution Protocol (ARP). 幸运的是, ARP
由内核来管理, 并且一个以太网接口不需要做特别的事情来支持 ARP. 只要 dev->addr
和 dev->addr_len 在 open 时正确的赋值了, 驱动就不需要担心解决 IP 编号对应于
MAC 地址; ether_setup 安排正确的设备方法给 dev->hard_header 和
dev_rebuild_header.
尽管通常内核处理地址解析的细节(并且缓存结果), 它需要接口驱动来帮助建立报文. 毕
竟, 驱动知道物理层头部细节, 然而网络代码的作者已经试图隔离内核其他部分. 为此,

内核调用驱动的 hard_header 方法使用 ARP 查询的结果来布置报文. 正常地, 以太网驱
动编写者不需要知道这个过程 -- 公共的以太网代码负责了所有事情.

 不考虑 ARP

简单的点对点网络接口, 例如 plip, 可能从使用以太网头部中受益, 而避免来回发送
ARP 报文的开销. snull 中的例子代码也属于这一类的网络设备. snull 不能使用 ARP
因为驱动改变发送报文中的 IP 地址, ARP 报文也交换 IP 地址. 尽管我们可能轻易实现
了一个简单 ARP 应答发生器, 更多的是演示性的来展示如何直接处理网络层头部.
如果你的设备想使用通常的硬件头而不运行 ARP, 你需要重写缺省的 dev->hard_header
方法. 这是 snull 的实现, 作为一个非常短的函数:
int snull_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, void *daddr, void *saddr,
unsigned int len)
{
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);
eth->h_proto = htons(type);
memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
memcpy(eth->h_dest, daddr ? daddr : dev->dev_addr, dev->addr_len);
eth->h_dest[ETH_ALEN-1] ^= 0x01; /* dest is us xor 1 */
return (dev->hard_header_len);
}
这个函数仅仅用内核提供的信息并把它格式成标准以太网头. 它也翻转目的以太网地址的
1 位, 理由下面叙述.
当接口收到一个报文, eth_type_trans 以几种方法来使用硬件头部. 我们已经在
snull_rx 看到这个调用.
skb->protocol = eth_type_trans(skb, dev);
这个函数抽取协议标识( ETH_P_IP, 在这个情况下 )从以太网头; 它也赋值 skb-
>mac.raw, 从报文 data (使用 skb_pull)去掉硬件头部, 并且设置 skb->pkt_type. 最
后一项在 skb 分配是缺省为 PACKET_HOST(指示报文是发向这个主机的),
eth_type_trans 改变它来反映以太网目的地址: 如果这个地址不匹配接收它的接口地址,
pkt_type 成员被设为 PACKET_OTHERHOST. 结果, 除非接口处于混杂模式或者内核打开了
报文转发, netif_rx 丢弃任何类型为 PACKET_OTHERHOST 的报文. 因为这样,
snull_header 小心地使目的硬件地址匹配接收接口.
如果你的接口是点对点连接, 你不会想收到不希望的多播报文. 为避免这个问题, 记住,
第一个字节的最低位(LSB)为 0 的目的地址是方向一个单个主机(即, 要么 PACKET_HOST,
要么 PACKET_OTHERHOST). plip 驱动使用 0xfc 作为它的硬件地址的第一个字节, 而
snull 使用 0x00. 两个地址都导致一个工作中的类似以太网的点对点连接.

非以太网头部

我们刚刚看过硬件头部除目的地址外包含了一些信息, 最重要的是通讯协议. 我们现在描
述硬件头部如何用来封装相关的信息. 如果你需要知道细节, 你可从内核源码里抽取它们
或者从特定传送媒介的技术文档中. 大部分驱动编写者能够忽略这个讨论只是使用以太网
实现.
值得一提的是不是所有信息都由每个协议提供. 一个点对点连接例如 plip 或者 snull
可能在不失去通用性的情况下避免传送这个以太网头部. hard_header 设备方法, 由
snull_header 实现所展示的, 接收自内核的递交的信息( 协议级别和硬件地址 ). 它也
在 type 参数中接收 16 位协议编号; IP, 例如, 标识为 ETH_P_IP. 驱动应该正确递交
报文数据和协议编号给接收主机. 一个点对点连接可能它的硬件头部的地址, 只传送协议
编号, 因为保证递交是独立于源和目的地址的. 一个只有 IP 的连接甚至可能不发送任何
硬件头部.
当报文在连接的另一端被收到, 接收函数应当正确设置成员 skb->protocol, skb-
>pkt_type, 和 skb->mac.raw.
skb->mac.raw 是一个字符指针, 由在高层的网络代码(例如, net/ipv4/arp.c)所实现的
地址解析机制使用. 它必须指向一个匹配 dev->type 的机器地址. 设备类型的可能的值
在 <linux/if_arp.h> 中定义; 以太网接口使用 ARPHRD_ETHER. 例如, 这是
eth_type_trans 如何处理收到的报文的以太网头:
skb->mac.raw = skb->data;
skb_pull(skb, dev->hard_header_len);
在最简单的情况下( 一个没有头的点对点连接 ), skb->mac.raw 可指向一个静态缓存,
包含接口的硬件地址, protocol 可设置为 ETH_P_IP, 并且 packet_type 可让它是缺省
的值 PACKET_HOST.
因为每个硬件类型是独特的, 给出超出已经讨论的特别的设备是困难的. 内核中满是例子,
但是. 例如, 可查看 AppleTalk 驱动( drivers/net/appletalk/cops.c), 红外驱动(例
如, driver/net/irds/smc_ircc.c), 或者 PPP 驱动( drivers/net/ppp_generic.c).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短剧小程序分销系统开发:创新与机遇的融合

一、引言 随着移动互联网的快速发展&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;正逐渐成为人们生活中的一部分。短剧小程序分销系统的开发&#xff0c;不仅为短剧的传播提供了新的渠道&#xff0c;同时也为相关产业带来了新的商业机会。本文将探讨短剧小程序分销系统…

web架构师编辑器内容-图层拖动排序功能的开发

新的学习方法 用手写简单方法实现一个功能然后用比较成熟的第三方解决方案即能学习原理又能学习第三方库的使用 从两个DEMO开始 Vue Draggable Next: Vue Draggable NextReact Sortable HOC: React Sortable HOC 列表排序的三个阶段 拖动开始&#xff08;dragstart&#x…

将本地项目通过git上传到仓库

首先在github 或者 gitlab新建一个仓库&#xff0c;复制git clone的链接 在本地文件夹下面&#xff0c;打开git bash 步骤&#xff1a; 打开我们的项目&#xff0c;此时项目中是没有 .git 文件的 在你的项目文件夹里面【鼠标右击】弹出菜单 在【鼠标右击】弹出的菜单中&#…

[BJDCTF2020]ZJCTF,不过如此(特详解)

php特性 1.先看代码&#xff0c;提示了next.php&#xff0c;绕过题目的要求去回显next.php 2.可以看到要求存在text内容而且text内容强等于后面的字符串&#xff0c;而且先通过这个if才能执行下面的file参数。 3.看到用的是file_get_contents()函数打开text。想到用data://协…

缓存高并发问题

Redis 做缓存虽减轻了 DBMS 的压力&#xff0c;减小了 RT&#xff0c;但在高并发情况下也是可能会出现各种问题的。 缓存穿透 当用户访问的数据既不在缓存也不在数据库中时&#xff0c;就会导致每个用户查询都会“穿透”缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-后台管理主页面实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

程序员手把手教你参与开源!拿捏!

一、前言 有一些同学提问&#xff0c;希望在自己的简历上增加一些有含金量的项目经历&#xff0c;最好能够去参与一些开源项目的开发&#xff0c;但由于对一个庞大的开源项目缺乏认知&#xff0c;难以着手。同时也担心自己能力不足&#xff0c;不知道自己写的代码是否会被接纳。…

flutter 五点一点四:MaterialApp Theme 给你一堆颜色看看

ColorScheme colorScheme, // 拥有30种颜色(这个数可能过几个版本会变化吧)&#xff0c;可用于配置大多数组件的颜色。 A set of 30 colors based on the[Material spec] that can be used to configure the color properties of most components.Color canvasColor, // Mater…

五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试。 接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架如何搭建&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发…

05.Elasticsearch应用(五)

Elasticsearch应用&#xff08;五&#xff09; 1.Mapping介绍 Mapping是对索引库中文档的约束&#xff0c;类似于数据表结构&#xff0c;作用如下&#xff1a; 定义索引中的字段的名称定义字段的数据类型&#xff0c;例如字符串&#xff0c;数字&#xff0c;布尔等字段&…

FreeRFTOS中的临界段(代码)

前言 本片文章记录我学习FreeRTOS中的“临界段”知识点&#xff0c;同时也希望我的分享能给你带来帮助 目录 前言 一、临界段&#xff08;临界区&#xff09; 二、任务级临界段代码 三、中断级临界段代码保护 四、结语 一、临界段&#xff08;临界区&#xff09; 在Fr…

仅使用 Python 创建的 Web 应用程序(前端版本)第06章_登录页面

从本章开始,我们将创建每个页面。 本栏的例子 可以访问这里, WTS 首先是登录页面。 完成后的图像如下 创建过程如下 No类型内容1Model创建继承BaseDataModel的数据类User、Session2MockDB创建用户表并添加管理员/成员用户3Service创建AuthAPIClient、UserAPIClient4Page定义…

程序员必备的20个学习网站

今天好学编程小编整理了20个程序员必备的学习网站&#xff0c;此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01; 技术网站类 1、博客园 一个面向开发者的…

SpringBoot 3.1.7 集成Kafka 3.5.0

一、背景 写这边篇文章的目的&#xff0c;是记录我在集成kafka客户端遇到的一些问题&#xff0c;文章会记录整个接入的过程&#xff0c;其中会遇到几个坑&#xff0c;如果需要最终版本&#xff0c;直接看最后一节就行了&#xff0c;感觉Spring-Kafka的文档太少了&#xff0c;如…

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像&#xff0c;如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外&#xff0c;不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

React16源码: React中的unwindWork的源码实现

unwindWork 1 &#xff09;概述 在 renderRoot 的 throw Exception 里面, 对于被捕获到错误的组件进行了一些处理并且向上去寻找能够处理这些异常的组件&#xff0c;比如说 class component 里面具有getDerivedStateFromError 或者 componentDidCatch 这样的生命周期方法这个c…

前端学习-0125

工具 VscodeChrome mac-vs code实用快捷键 格式&#xff1a;shiftoptionf快速移动一行&#xff1a;option上下箭快速复制一行&#xff1a;shiftoption上下箭快速保存&#xff1a;commands文件内查找&#xff1a;commandf文件内快速替换&#xff1a;optioncommandf HTML5 标…

QT发生弹出警告窗口

QTC开发程序弹出警告窗口&#xff0c;如上图 实施代码&#xff1a; #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误&#xff0c;请检查您的操作。");}上面的文字可以更改&#x…

【学网攻】 第(5)节 -- Cisco VTP的使用

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资…

前端语音识别(webkitSpeechRecognition)

前端语音识别(webkitSpeechRecognition)-CSDN博客 Excerpt 文章浏览阅读1.8k次,点赞4次,收藏4次。浏览器实现语音转文字_webkitspeechrecognition webkitSpeechRecognition(语音识别) <span class="token comment">// 创建一个webkitSpeechRecognition实…