问题标签 [raw-ethernet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - Linux 原始套接字:阻止数据包?
我已经在 Linux 中编写了自己的数据包嗅探器。
我打开一个套接字,socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
然后处理以太网数据包——解包 ARP 数据包、IP 数据包(以及其中的 ICMP / TCP / UDP 数据包)。
到目前为止,这一切都很好。
现在我可以像这样读取数据包 - 我还可以通过包装合适的以太网数据包并发送它来注入数据包。
但我想要的是一种阻止数据包的方法——可以说是消耗它们,这样它们就不会被进一步传递到系统中。
也就是说,如果一个 TCP 数据包被发送到端口 80,那么我可以用我的数据包嗅探器看到这个数据包,它会以通常的方式传递到 Web 服务器。
但是,基本上,我希望如果我发现数据包有问题——不是来自正确的 MAC 地址、格式不正确或只是破坏了安全策略——我可以“消费”数据包,然后不会进一步传送到 Web 服务器上。
因为我可以读取数据包和写入数据包 - 如果我也可以阻止数据包,那么我将拥有我需要的一切。
基本上,我不只是想监控网络流量,有时还可以控制它。例如,通过消耗原始传入数据包,然后将新的稍微改变的数据包写入不同的地址来“重新路由”数据包。或者只是根本不应该发送的普通块数据包。
我的应用程序是一个通用的“网络流量管理”程序。监控和记录流量。但也可以控制它 - 阻止数据包作为防火墙,重新路由数据包作为负载平衡器。
换句话说,我有一个数据包嗅探器——但如果它嗅到了难闻的东西,那么我希望它能够阻止那个数据包。尽早丢弃它,因此它不会进一步交付任何地方。
(能够在途中更改数据包也可能很方便 - 但如果我可以阻止,那么总是有可能完全阻止原始数据包,然后在其位置写出一个新的更改数据包。)
ethernet - 以太网通讯中RGMII与MDI的关系
假设我正在通过 RGMII 与 PHY 芯片交谈。
RGMII 上传输的串行信息与输出到 MDI 的信号之间有什么关系?
我从RGMII的时序图中了解到,上升沿为4位,下降沿为4位。因此,对于每个给出 8 位的时钟。
对于 100Mbps,所需的时钟为 25MHz。因此,对于每 25MHz 时钟周期,传输 8 位。
PHY 芯片是否简单地立即通过 MDI 发送每个 8 位?
如果是这种情况,那么我如何正确地将这些串行 8 位数据打包到适当的以太网帧中?
我试图对 PHY 无法正常工作的硬件进行故障排除,但唯一的故障排除方法是我是否可以控制 RGMII。但是,我不明白 RGMII 之间的这种关系以及它如何影响 MDI。
我假设如果我查看wireshark,它不会显示任何信息包,除非我在适当的以太网帧中发送一串序列化数据。
c - 带有原始以太网套接字的实时数据
我正在尝试将原始以太网数据包从 linux 机器传输到微控制器。我必须使用原始数据包,因为微发送原始帧并且它没有任何 tcp/ip 堆栈。
虽然我可以正确发送和接收所有帧,但我无法实时完成。例如,我在 linux 机器上有一个数据包,应该每 20 毫秒发送一次。我观察到的是,虽然我平均每 20 毫秒传输一个数据包,但我不是每20 毫秒看到一次。我认为这是因为处理器在发送之前试图缓冲一些消息。我像这样更改了缓冲区-
仍然没有看到任何效果。有没有办法在原始套接字中有信息时立即清除原始套接字的传输缓冲区,而不是等待一些消息缓冲?还是我对延迟的理解是错误的?
linux - libpcap是否使用了linux的流量控制层?
我正在创建一个单独的网络堆栈,我正在使用 libpcap,或者特别是 pcap_inject 函数将数据包直接发送到链路层。但是,当我查看tc -s qdisc show dev eth0
命令时,我看到我发送的数据包正在计入从队列发送的数据包中。所以我的问题是,pcap_inject 会调用linux的流量控制层来发送数据包吗?还是直接发送给设备驱动程序?
提前致谢
python - 使用 scapy (python) 删除以太网标头
我正在尝试使用 pcap 文件。对于预处理阶段,我正在尝试使用 scapy 删除以太网标头,但不确定这是否是正确的方法。任何想法都会非常感激。谢谢
我正在研究 Jupyter notebook,我使用 python 和 scapy 来读取 pcap 文件。
linux-kernel - 如何在 Linux 内核驱动程序 (stmmac) 中访问以太网帧
对于以太网流量,在内核stmmac
驱动程序中,当接收到以太网帧时,会在此处stmmac_rx
调用该函数:
我想访问内核中每一帧的内容。如何访问框架内容?
ethernet - 以太网通信是否需要互联网连接?
用于 2 个点之间的以太网连接,将用作点对点通信(用于嵌入式设备)。互联网连接、集线器或交换机真的有必要吗?或者我们仍然可以通过以太网在不使用任何互联网连接、集线器或交换机的情况下从一个 MCU 向另一个 MCU 发送和接收数据吗?
checksum - 如何计算以太网帧中的 FCS 字段?
我看到了一些实现,但我决定看看规范是如何调用 FCS 进行编码的。
所以说我的输入如下:
以似乎在格式中指定的顺序(以及稍后在规范中表达的顺序)连接它似乎表明我的输入是:
a) “帧的前 32 位被补码。”
b) “然后,受保护字段的 n 位被认为是 n – 1 次多项式 M(x) 的系数。(目标地址字段的第一位对应于 x(n–1) 项和MAC 客户端数据字段(或填充字段,如果存在)的最后一位对应于 x0 项。)"
我以前做过这个。见 M(x)
c) “M(x) 乘以 x^32 并除以 G(x),产生度数 <=31 的余数 R(x)。”
网上的一些选项似乎忽略了第 33 位来表示 x^32。我将忽略本练习的那些简化快捷方式,因为它似乎没有在规范中指定。它说将 M(x) 乘以 x^32。所以这只是在 LSB 上填充 32 个零。(即如果m(x) = 1x^3 + 1
,那么m(x) * x^2 = 1x^5 + 1x^2 + 0
)
下一步是划分。我正在划分整个 M(x) / G(x)。可以直接使用异或移位吗?我看到一些二进制除法示例的除数为 101,除数为 110,余数为 11。其他示例说明通过转换为十进制,您不能除法。该标准的术语是哪一个?
我的余数结果是选项 1(使用 XOR 而不考虑进位、移位、无填充)是:
d) “R(x) 的系数被认为是一个 32 位序列。”
e) “位序列被补码,结果是CRC。”
所以我的整个以太网帧应该是:
其中我的 dst 地址是它的原始值。
当我使用在线 CRC32 BZIP2 计算器检查我的工作时,我看到了以下结果:0xCACF4F01
是否有其他选项或在线工具来计算以太网 FCS 字段?(不仅仅是众多 CRC32 计算器之一)
我错过了哪些步骤?我应该填充 M(x) 吗?我应该补充 32 个 LSB 吗?
更新
我的软件中的 CRC 输出出现错误。复制矢量是一个小问题。我对 CRC 的最新结果是(补码前)35 30 B0 FE
。
后补是:(CA CF 4F 01
匹配大多数在线 CRC32 BZIP2 版本)。
所以根据我的编程,我的以太网目前是:
arm - 无 phy 的 SGMII - Xlinix Zynq UltraScale+ RFSoC 板上的外部环回
我有一个带有 Xilinx Zynq UltraScale+ RFSoC 的服装板。我正在使用 3 个 PS_GTR 收发器作为 sgmii。其中 2 个连接到外部 Marvell phy,第三个直接连接(固定链接 - 没有 phy)。
在制造阶段,我想确保直接 sgmii 接口正确组装 - 所以我在 tx 和 rx sgmii 信号之间进行了外部环回。现在,是否可以通过这个外部环回传输一些东西并与接收到的数据进行比较?可以自己ping通吗?(简单的 ping 命令不起作用:“ping -I eth2”)
也许“macb”内核驱动程序下有一个“补丁”,有人可以指导我完成吗?
谢谢大家, Tzipi Kluska
driver - 使用 EtherType 0x88A4 (EtherCat) 时,WriteFile 函数 (NDIS) 中出现错误 87
我正在尝试使用 C 中 NDIS 驱动程序的prottest.c 示例代码在第 2 层上发送原始以太网帧。该示例可以正常工作,但是当我修改以太网类型(0x88A4 EtherCat)并使用必要的结构和信息,Writefile 函数总是返回错误 87(不正确的参数)。
如果没有 TCP/IP 堆栈,是否无法在第 2 层、Raw 中使用此函数编写此函数,可能有什么问题?
谢谢你的帮助。此致。