问题
近期遇到松散源路由报文通信失败,通过systemtap可以很快定位报文丢弃在何处。
直接上探测脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| probe begin() { print("Begin probe..\n") } probe end() { print("End probe.\n") } probe kernel.function("icmp_echo") { print_backtrace()//调用栈回溯 printf("%s\n",pp())//调用点 } probe kernel.statement("*@net/ipv4/ip_input.c:341") { printf("%s\n",pp()) } probe kernel.function("ip_options_compile").return { printf("ip_options_compile return:%d\n",$return) } probe timer.ms(10000) { exit() }
|
在报文路径上增加探测点直接定位出丢包位置。
分析
这个具体问题是在函数static inline bool ip_rcv_options(struct sk_buff *skb)中如果源路由未打开则直接drop。
打开内核中源路由选项,通信正常。