-
-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Why is the XDP_TX packet dropped by the kernel? #5
Comments
感谢耐心测试!这个问题很奇怪,让我研究一下~ |
感激你的答复,[Jamesits] 之前那次,也是感觉xdp-tx发包了,但是因为当时,缺乏调试手段(dropwatch,xdpdump,nettrace这几个工具,都不会用) 并且,还碰到一个比较奇怪的问题。(原因不明) |
不能正常解包的kernel如下的版本,测试过的如下: 可以正常解包的kernel版本如下: |
感谢推荐调试工具,这几个工具我之前也不了解,得看一下文档~ Packet size too small 是因为包长度小于 |
(dropwatch,xdpdump,nettrace这几个工具都很好用) 最好用的是nettrace,可以直接打印出drop包的堆栈。(也最好需要核心支持btf),有安装包,可以直接装了,开箱即用。 |
一个正常的。来自remote ip的keepalive包的长度如下: #包体长度如下 debian11 5.10.0-25-cloud-amd64版本的核心下。 DEBUG_PRINT_HEADER_SIZE这里,我最大可以配置成48都是正常的。 但是,5.14.0-352.el9.x86_64版本下。 DEBUG_PRINT_HEADER_SIZE这里,我最大只能配置成24。 配置成24后,不会提示"Packet size too small, dump failed\n"了。 DEBUG_PRINT_HEADER_SIZE这里的限制,是kernel的哪里控制的呢?疑问!!! |
新的实验结果 测试环境如下: ###验证的结果:(必要的条件,必须要配置;是否需要加载xdp相关的程序:不需要) #配置如下的时候 sysctl -w net.ipv4.conf.gre2.accept_local=1 #有正常的gre keepalive 回包。 #tcpdump (结果) #配置如下的时候 ##无正常的gre keepalive 回包。 #nettrace的trace结果如下: #配置如下的时候 ##无正常的gre keepalive 回包。 #配置 ##无正常的gre keepalive 回包。 |
###使用linux kernel 自带的 gre keepalive 回包(必要的条件,必须要配置;) 测试通过的环境如下: Centos 9 Debian11 Debian10 |
Jamesits 你好,我又来了:)
测试环境:
debian11
iproute2/oldstable,now 5.10.0-4 amd64 [installed,automatic]
root@debian11:~# cat /boot/config-5.10.0-25-cloud-amd64 |grep BTF
CONFIG_DEBUG_INFO_BTF=y
root@debian11:~# ip -V
ip utility, iproute2-5.9.0, libbpf 0.3.0
gre tunnel config:
local ip:172.19.92.248
remote ip:172.19.100.254
1.//bpftool prog traclog的结果(libbpf测试过0.0.8的版本,1.2.0的版本,情况一样)
处理in的数据包 ,然后截取head后,xdp_tx 。
但是。
#xdp_tx的包,有问题,导致gre2卡的dropped队列增加。
gre2: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1476
inet 6.6.6.2 netmask 255.255.255.0 destination 6.6.6.2
inet6 fe80::5efe:ac13:5cf8 prefixlen 64 scopeid 0x20
unspec AC-13-5C-F8-00-00-00-55-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 13839 bytes 332136 (324.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36 bytes 2240 (2.1 KiB)
TX errors 0 dropped 9457 overruns 0 carrier 0 collisions 0
3.通过nettrace 对核心丢包,进行分析,如下
//[69535.293726] [enqueue_to_backlog ] ether protocol: 44051
***************** ffff88fec0aeb900 ***************
[69535.293595] [__netif_receive_skb_core] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293618] [ip_rcv_core ] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293631] [ip_route_input_slow ] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293661] [fib_validate_source ] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293674] [ip_local_deliver ] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293684] [ip_local_deliver_finish] GRE: 172.19.100.254 -> 172.19.92.248
[69535.293726] [enqueue_to_backlog ] ether protocol: 44051
[69535.293740] [__netif_receive_skb_core] ether protocol: 44051
[69535.293754] [netif_receive_generic_xdp] ether protocol: 44051
[69535.293904] [kfree_skb ] ether protocol: 44051
***************** ffff88fec0aeb900 ***************
xdpdump 抓包的数据如下:
XDP_TX的是
异常数据?
这里type是ac 13(十进制的44051)
0000 45 c0 00 30 aa f4 00 00 ff 2f f5 cc ac 13 64 fe
0010 ac 13 5c f8 00 00 08 00 45 c0 00 18 aa f3 00 00
0020 ff 2f f5 e5 ac 13 5c f8 ac 13 64 fe 00 00 00 00
5.问题:为什么
if (bpf_xdp_adjust_head(ctx, (int)(cutoff_pos - data_start))) return -1;
action = XDP_TX;
拆解head后的包,是异常包。
导致kernel处理的时候,作为异常包给直接drop了。
The text was updated successfully, but these errors were encountered: