Recent Posts
-
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> ...
-
April 11, 2023
Golang编程tcp连接绑定指定网络出口bindtodevice
像ping -I 命令一样指定 ip 或者网卡名字,golang里面指定源ip是比较方便的,但指定源接口作为出口就不太方便了。需要 为Dialer的Control里面对原始fd进行原始的syscall系统调用。看了源码研究了好一会才好到换个方法 s.tcpDialer = &net.Dialer{ LocalAddr: tcpSource, Timeout: 30 * time.Second, ...
-
March 21, 2023
Golang的简单webdav服务器
windows 默认好不支持 http basicauth,只支持https,好像需要改一下注册表才行。但如果不用密码的话,直接“映射网络驱动器”是可以的。package mainimport ( "flag" "net/http" "golang.org/x/net/webdav")func main() { flagRootDir := flag.String("dir", "/", "webdav root dir") flagHttpAddr := flag.String("add...