- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 xdp(使用 XDP_TX 操作)构建 icmp resv 数据包。
Linux:centos8
内核4.18.0-80.el8.x86_64
LLVM:7.0.1
clang:clang 版本 7.0.1(tags/RELEASE_701/final)
这是我的代码:
SEC("xdp_icmp")
int _xdp_icmp(struct xdp_md *xdp)
{
void *data_end = (void *)(long)xdp->data_end;
void *data = (void *)(long)xdp->data;
struct ethhdr *eth = data;
struct iphdr *iph;
struct icmphdr *icmph;
__u16 h_proto;
__be32 raddr;
....
icmph = data + sizeof(*eth) + sizeof(*iph);
if (icmph + 1 > data_end)
return XDP_DROP;
if (icmph -> type != ICMP_ECHO)
{
return XDP_PASS;
}
if (handle_ipv4(xdp) != XDP_TX)
{
return XDP_PASS;
}
raddr = iph->saddr;
swap_src_dst_mac(data);
iph->saddr = iph->daddr;
iph->daddr = raddr;
icmph->type = ICMP_ECHOREPLY;
icmph->checksum = 0;
__u32 sum = 0;
sum = bpf_csum_diff(0, 0, icmph, ICMP_ECHO_LEN, 0);
icmph->checksum = csum_fold_helper(sum);
return XDP_TX;
}
但是编译结果告诉我“验证程序失败”:
错误:
libbpf: load bpf program failed: Permission denied
libbpf: -- BEGIN DUMP LOG ---
libbpf:
...
48: (b7) r5 = 0
49: (85) call bpf_csum_diff#28
invalid access to packet, off=34 size=64, R3(id=0,off=34,r=42)
R3 offset is outside of the packet
最佳答案
我相信打电话时:
// s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed)
sum = bpf_csum_diff(0, 0, icmph, ICMP_ECHO_LEN, 0);
作为第三个参数传递的to_size
应该是字节数。假设您从内核自测试中复制了 ICMP_ECHO_LEN
,我怀疑它的值是 64,从而要求内核在 64 字节长的缓冲区上计算校验和。但您从未检查过您的数据包是否有那么长(您有 if (icmph + 1 > data_end)
,这对我来说看起来是正确的)。
我怀疑您应该尝试将 header 的长度作为第三个参数传递,如下所示(未测试):
um = bpf_csum_diff(0, 0, icmph, sizeof(struct icmphdr), 0);
struct icmphdr
在 include/uapi/linux/icmp.h
中定义,似乎有 8 个字节的长度,尽管您不需要知道这一点并且只要您传递正确的 header 长度就应该没问题。
关于c - xdp 代码计算 icmp 校验和时验证器失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60053570/
我正在尝试重定向 NIC 和 WIFI 之间的流量。我正在尝试从 eth0 转发数据包,通过 wlan0 发送偶数数据包,通过 wlan1 发送奇数数据包。 我无法成功地将数据包从一个接口(inter
我有一个简单的布局。这是一个带有以下代码的按钮: 我在两台设备上运行它,一台比另一台小。我注意到按钮的大小没有变化。我虽然在使用 dip 时, View 的大小会根据屏幕大小而变化。我错了吗? 最佳
我需要编写一个位于两台服务器之间的应用程序,并通过向每个数据包添加特定的 HTTP header 来修改从一台服务器发送到另一台服务器的 HTTP 数据包。 显然它必须尽可能快地完成,我发现通过使用
我确实对 DPDK 有一些经验,但目前我正在阅读许多关于 XDP 的博客。我试图比较这两种技术并了解 DPDK 和 XDP 之间的差异。这提出了一些问题。我希望有人可以帮助我解决以下问题: 使用 DP
我正在使用 xdp(使用 XDP_TX 操作)构建 icmp resv 数据包。 Linux:centos8 内核4.18.0-80.el8.x86_64 LLVM:7.0.1 clang:clang
关于AF-XDP套接字框架(+ libbpf)中的数据包大小是否存在已知(或未知)错误? 我的应用程序遇到奇怪的数据包丢失: 所有数据包都具有相同大小(1442字节)的IPv4/UDP/RTP数据包流
我想在XDP程序中收到的数据包中插入时间戳。我知道如何获取时间戳的唯一方法是调用bpf_ktime_get_ns。 但是,创建可比较时间戳的用户空间等效函数是什么?据我所知,ktime_get_ns返
我使用 Adobe LiveCycle Designer 创建了一个 PDF 表单。我现在正努力在填写完 PDF 后以编程方式从 PDF 中提取数据。 我尝试使用 poppler (qt4 绑定(
我的团队有一个使用 Adobe LiveCycle 设计器创建的模板 (XDP)。 情况: 我们正在替换旧的 Acrobat 表单(XFDF 格式)使用此 LiveCycle作为更大升级的一部分
所以,根据标题,我正在尝试加载 XDP 程序,令人惊讶的是 bpf 验证器向我吐口水,并出现著名的后沿错误: libbpf: load bpf program failed: Invalid argu
主要问题是我无法在网络接口(interface) (XDP) 中加载 eBPF 代码。 我尝试在 Raspberry Pi 3 上加载,配置如下: Raspbian GNU/Linux 10(巴斯特)
升级 Ubuntu 16.04 后,无法再编译 eBPF。 bpf.h文件缺少关键结构和 uapi似乎没有安装 header 。 示例代码: #include int main() { re
我有:LiveCycle 服务器(ES3、JBOSS)、Workbench、Designer。 我使用 LC Desginer 将 PDF 转换为 XDP - 现在是模板。 现在我需要将该 XDP 文
Note: I have installed AEM_6.4_Quickstart.jar and AEM-FORMS-6.4-OSX-5.0.86.zip installed into it to
我是一名优秀的程序员,十分优秀!