Recent Posts
-
December 11, 2023
Linux发送网络包前的网卡特性检查
发现tcpdump的 ‘host ' 这样表达式有时不支持vlan 802.1q的包,如果网卡支持vlan硬件加速,那ip过滤的还能抓到吧。如果网卡不支持vlan硬件加速,__vlan_hwaccel_push_inside 处理过后改了包头的话, dev_queue_xmit_nit -> deliver_skb PACKET_OUTGOING ->packet_rcv 就处理不了这种带了vlan头的解析了。bpf那里不支持vlan 协议解析。__dev_queue_...
-
September 14, 2023
Linux内核conntrack的helper和expect
helper是一些连接跟踪的辅助,可以认为是dpi的功能,会深入解析协议细节比如 nf_conntrack_pptp.c 就是PPTP协议的dpi解析,解析PPTP里面的call_id 和 其他会话建立过程等等,然后nf_nat_pptp可以替换pptp包里面call id,避免内网多个用户使用同一个call-id冲突,这样NAT内网的用户也正常PPTP拨号。这些辅助模块,主要通过 nf_conntrack_helper_register 注册内核helper模块, conntrack在合...
-
July 27, 2023
Linux内核网络包结构sk_buff的rxhash
sk_buff 有几个字段是标识了这条网络连接(流)的hash。 * @hash: the packet hash * @l4_hash: indicate hash is a canonical 4-tuple hash over transport * ports. * @sw_hash: indicates hash was computed in software stack这里通常是网卡硬件在硬件里面计算出来的了。使用ethtool命令可以查看和设置 网卡用哪些字段来计算哈希。...
-
July 26, 2023
调试linux协议栈丢包等问题的利器pwru和perf Probe
https://github.com/cilium/pwru可以把满足“ tcpdump 抓包语法的” 网络包经过的 内核函数都打印出来,很直观的看到内核里面处理这个网络包的流程。perf probe 利用kprobe可以 在任意函数的含行号上打印变量,可以定位到某个函数的执行流程吧。Usage: ./pwru [options] [pcap-filter] Availble pcap-filter: see "man 7 pcap-filter" Availble opt...
-
July 21, 2023
Linux的组播路由实现pim Sm
由pimd这样的后台应用程序和内核交互,控制内核里面的组播路由转发表吧。https://flylib.com/books/en/3.475.1.88/1/https://www.man7.org/linux/man-pages/man8/ip-mroute.8.htmlhttps://github.com/troglobit/pimd/tree/masterhttps://elixir.bootlin.com/linux/latest/source/include/uapi/linux/m...
-
July 21, 2023
Btf版本不匹配导致内核模块加载失败的问题
rocky linux 9上面,内核编译设置默认打开了DEBUG_INFO_BTF_MODULES,这样所有模块里面都带有BTF信息。运行时内核的BTF这个机制,如果模块缺少BTF信息(ELF的BTF段)那可以加载成功,但如果BTF的版本不匹配就拒绝加载。使用源码自己编译内核时,虽然内核源码是一样的但生成的BTF还是不匹配的。 这样自己使用内核源码目录( 不是系统的/lib/modules/uname -r/build )编译一个模块出来, 在rocky linux的官方内核系统里面就没法...
-
May 09, 2023
Linux的蓝牙socket编程
关键字bluez libbluetooth AF_BLUETOOTH RFCOMM SDP参考资料 “An Introduction to Bluetooth Programming” Albert Huang https://people.csail.mit.edu/albert/bluez-intro/ 讲了基本概念和c语言例子代码都有 Bluez的文档 https://git.kernel.org/pub/scm/bluetooth/bluez.git...
-
May 06, 2023
Vim的ale插件给c语言加上clang的静态检查
https://github.com/dense-analysis/ale这儿插件比较简单,widnows上安装 llvm后,自动给C语言加上 lint 语法检查了,golang的也有检查的,这样可以比较一些低级语法错误了。但LLVM默认的缺少c语言头文件的,按照官方文档 https://clangd.llvm.org/guides/system-headers 是要自己安装c语言的头文件的。 但我不按照VC,用到了linux环境,自己根据“clang.exe -v -c -xc++ nu...
-
May 02, 2023
机械键盘按键开关原理和手工修复机械键盘按键轴体不灵的问题
去年京东上买的”雷柏V500Pro“,没怎么用过,前段时间广州回南天之后好几个按键都失灵了,按了没反应或者按键重复的。根据之前鼠标按键3失灵的经验,感觉是按键开关里面的弹簧片接触点的地方发霉、氧化了,要用螺丝刀挂掉接触点的氧化层或者发层就可以了吧。但网上没有找到相关的信息,知乎里面有一个帖子有人说用针推几下弹片会解决问题,按照方法试了不是很管用,偶尔恢复正常了,马上又不行了,感觉那个弹片不是接触的地方,不然不会用针把上面黑色的霉层刮了不起作用。 今天有空把这个轴体拆出来看了一下,果然是位置...
-
April 23, 2023
glibc获取机器上所有接口所有ip的getifaddrs函数
https://www.man7.org/linux/man-pages/man3/getifaddrs.3.html官方的例子 #define _GNU_SOURCE /* To get defns of NI_MAXSERV and NI_MAXHOST */ #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> ...