state.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. #ifndef IPPROTO_TCP
  2. #define IPPROTO_TCP 6
  3. #endif
  4. #define MAX_CONNECTIONS 1000000
  5. struct tcp_event {
  6. __u64 fd;
  7. __u64 timestamp;
  8. __u64 duration;
  9. __u64 first_read_time;
  10. __u64 first_write_time;
  11. __u64 new_read_time;
  12. __u32 type;
  13. __u32 pid;
  14. __u64 bytes_sent;
  15. __u64 bytes_received;
  16. __u16 sport;
  17. __u16 dport;
  18. __u8 saddr[16];
  19. __u8 daddr[16];
  20. };
  21. struct {
  22. __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
  23. __uint(key_size, sizeof(int));
  24. __uint(value_size, sizeof(int));
  25. } tcp_listen_events SEC(".maps");
  26. struct {
  27. __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
  28. __uint(key_size, sizeof(int));
  29. __uint(value_size, sizeof(int));
  30. } tcp_connect_events SEC(".maps");
  31. struct {
  32. __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
  33. __uint(key_size, sizeof(int));
  34. __uint(value_size, sizeof(int));
  35. } tcp_accept_events SEC(".maps");
  36. struct trace_event_raw_inet_sock_set_state__stub {
  37. __u64 unused;
  38. void *skaddr;
  39. int oldstate;
  40. int newstate;
  41. __u16 sport;
  42. __u16 dport;
  43. __u16 family;
  44. #if __KERNEL_FROM >= 506
  45. __u16 protocol;
  46. #else
  47. __u8 protocol;
  48. #endif
  49. __u8 saddr[4];
  50. __u8 daddr[4];
  51. __u8 saddr_v6[16];
  52. __u8 daddr_v6[16];
  53. };
  54. struct {
  55. __uint(type, BPF_MAP_TYPE_HASH);
  56. __uint(key_size, sizeof(__u64));
  57. __uint(value_size, sizeof(__u64));
  58. __uint(max_entries, 10240);
  59. } fd_by_pid_tgid SEC(".maps");
  60. struct connection_id {
  61. __u64 fd;
  62. __u32 pid;
  63. };
  64. struct {
  65. __uint(type, BPF_MAP_TYPE_LRU_HASH);
  66. __uint(key_size, sizeof(void *));
  67. __uint(value_size, sizeof(struct connection_id));
  68. __uint(max_entries, MAX_CONNECTIONS);
  69. } connection_id_by_socket SEC(".maps");
  70. struct connection {
  71. __u64 timestamp;
  72. __u64 bytes_sent;
  73. __u64 bytes_received;
  74. __u64 first_read_time;
  75. __u64 first_write_time;
  76. __u64 new_read_time;
  77. };
  78. struct accept_connection {
  79. __u16 sport;
  80. __u16 dport;
  81. __u8 saddr[16];
  82. __u8 daddr[16];
  83. };
  84. struct {
  85. __uint(type, BPF_MAP_TYPE_LRU_HASH);
  86. __uint(key_size, sizeof(struct connection_id));
  87. __uint(value_size, sizeof(struct connection));
  88. __uint(max_entries, MAX_CONNECTIONS);
  89. } active_connections SEC(".maps");
  90. struct {
  91. __uint(type, BPF_MAP_TYPE_LRU_HASH);
  92. __uint(key_size, sizeof(struct connection_id));
  93. __uint(value_size, sizeof(struct accept_connection));
  94. __uint(max_entries, MAX_CONNECTIONS);
  95. } active_accepts SEC(".maps");
  96. SEC("tracepoint/sock/inet_sock_set_state")
  97. int inet_sock_set_state(void *ctx)
  98. {
  99. struct trace_event_raw_inet_sock_set_state__stub args = {};
  100. if (bpf_probe_read(&args, sizeof(args), ctx) < 0) {
  101. return 0;
  102. }
  103. if (args.protocol != IPPROTO_TCP) {
  104. return 0;
  105. }
  106. __u64 id = bpf_get_current_pid_tgid();
  107. __u32 pid = id >> 32;
  108. cw_bpf_debug("fucksocket pid=%lld inet_sock_set_state -- args.oldstate=%lld, args.newstate=%lld\n", pid, args.oldstate, args.newstate);
  109. cw_bpf_debug("fucksocket pid=%lld inet_sock_set_state -- id=%lld\n", pid, id);
  110. if (args.oldstate == BPF_TCP_CLOSE && args.newstate == BPF_TCP_SYN_SENT) {
  111. __u64 *fdp = bpf_map_lookup_elem(&fd_by_pid_tgid, &id);
  112. if (!fdp) {
  113. return 0;
  114. }
  115. struct connection_id cid = {};
  116. cid.pid = pid;
  117. cid.fd = *fdp;
  118. struct connection conn = {};
  119. conn.timestamp = bpf_ktime_get_ns();
  120. conn.first_read_time = 0;
  121. conn.first_write_time = 0;
  122. conn.new_read_time = 0;
  123. bpf_map_delete_elem(&fd_by_pid_tgid, &id);
  124. bpf_map_update_elem(&connection_id_by_socket, &args.skaddr, &cid, BPF_ANY);
  125. bpf_map_update_elem(&active_connections, &cid, &conn, BPF_ANY);
  126. return 0;
  127. }
  128. __u64 fd = 0;
  129. __u32 type = 0;
  130. __u64 timestamp = 0;
  131. __u64 duration = 0;
  132. void *map = &tcp_connect_events;
  133. struct tcp_event e = {};
  134. if (args.oldstate == BPF_TCP_SYN_SENT) {
  135. struct connection_id *cid = bpf_map_lookup_elem(&connection_id_by_socket, &args.skaddr);
  136. if (!cid) {
  137. return 0;
  138. }
  139. struct connection *conn = bpf_map_lookup_elem(&active_connections, cid);
  140. if (!conn) {
  141. return 0;
  142. }
  143. if (args.newstate == BPF_TCP_ESTABLISHED) {
  144. timestamp = conn->timestamp;
  145. type = EVENT_TYPE_CONNECTION_OPEN;
  146. } else if (args.newstate == BPF_TCP_CLOSE) {
  147. bpf_map_delete_elem(&active_connections, cid);
  148. type = EVENT_TYPE_CONNECTION_ERROR;
  149. }
  150. duration = bpf_ktime_get_ns() - conn->timestamp;
  151. pid = cid->pid;
  152. fd = cid->fd;
  153. }
  154. if (args.oldstate == BPF_TCP_ESTABLISHED && (args.newstate == BPF_TCP_FIN_WAIT1 || args.newstate == BPF_TCP_CLOSE_WAIT)) {
  155. bpf_map_delete_elem(&connection_id_by_socket, &args.skaddr);
  156. }
  157. if (args.oldstate == BPF_TCP_CLOSE && args.newstate == BPF_TCP_LISTEN) {
  158. type = EVENT_TYPE_LISTEN_OPEN;
  159. map = &tcp_listen_events;
  160. }
  161. if (args.oldstate == BPF_TCP_LISTEN && args.newstate == BPF_TCP_CLOSE) {
  162. type = EVENT_TYPE_LISTEN_CLOSE;
  163. map = &tcp_listen_events;
  164. }
  165. if (type == 0) {
  166. return 0;
  167. }
  168. e.type = type;
  169. e.duration = duration;
  170. e.timestamp = timestamp;
  171. e.first_read_time = 0;
  172. e.first_write_time = 0;
  173. e.new_read_time = 0;
  174. e.pid = pid;
  175. e.sport = args.sport;
  176. e.dport = args.dport;
  177. // e.sport = bpf_ntohs(args.sport);
  178. // e.dport = bpf_ntohs(args.dport);
  179. e.fd = fd;
  180. __builtin_memcpy(&e.saddr, &args.saddr_v6, sizeof(e.saddr));
  181. __builtin_memcpy(&e.daddr, &args.daddr_v6, sizeof(e.saddr));
  182. bpf_perf_event_output(ctx, map, BPF_F_CURRENT_CPU, &e, sizeof(e));
  183. return 0;
  184. }
  185. struct trace_event_raw_args_with_fd__stub {
  186. __u64 unused;
  187. long int id;
  188. __u64 fd;
  189. };
  190. SEC("tracepoint/syscalls/sys_enter_connect")
  191. int sys_enter_connect(void *ctx) {
  192. struct trace_event_raw_args_with_fd__stub args = {};
  193. if (bpf_probe_read(&args, sizeof(args), ctx) < 0) {
  194. return 0;
  195. }
  196. __u64 id = bpf_get_current_pid_tgid();
  197. __u64 pid = id >> 32;
  198. cw_bpf_debug("fucksocket pid=%lld sys_enter_connect -- id=%lld, fd=%lld\n", pid, id, args.fd);
  199. bpf_map_update_elem(&fd_by_pid_tgid, &id, &args.fd, BPF_ANY);
  200. return 0;
  201. }
  202. SEC("tracepoint/syscalls/sys_exit_connect")
  203. int sys_exit_connect(struct trace_event_raw_sys_exit__stub* ctx) {
  204. __u64 id = bpf_get_current_pid_tgid();
  205. __u64 *fdp = bpf_map_lookup_elem(&fd_by_pid_tgid, &id);
  206. if (!fdp) {
  207. return 0;
  208. }
  209. struct connection_id cid = {};
  210. cid.pid = id >> 32;
  211. cid.fd = *fdp;
  212. struct connection *conn = bpf_map_lookup_elem(&active_connections, &cid);
  213. if (!conn && ctx->ret == 0) { // non-TCP connection
  214. struct connection conn = {};
  215. conn.timestamp = bpf_ktime_get_ns();
  216. conn.first_read_time = 0;
  217. conn.first_write_time = 0;
  218. cw_bpf_debug("fucksocket pid=%lld sys_exit_connect -- id=%lld, fd=%lld\n", cid.pid, id, cid.fd);
  219. bpf_map_update_elem(&active_connections, &cid, &conn, BPF_ANY);
  220. }
  221. bpf_map_delete_elem(&fd_by_pid_tgid, &id);
  222. return 0;
  223. }
  224. SEC("tracepoint/syscalls/sys_enter_close")
  225. int sys_enter_close(void *ctx) {
  226. struct trace_event_raw_args_with_fd__stub args = {};
  227. if (bpf_probe_read(&args, sizeof(args), ctx) < 0) {
  228. return 0;
  229. }
  230. __u64 id = bpf_get_current_pid_tgid();
  231. struct connection_id cid = {};
  232. cid.pid = id >> 32;
  233. cid.fd = args.fd;
  234. struct connection *conn = bpf_map_lookup_elem(&active_connections, &cid);
  235. if (cid.pid == 3269744) {
  236. cw_bpf_debug("fucksocket pid=%lld sys_enter_close -- id=%lld, fd=%lld\n", cid.pid, id, cid.fd);
  237. }
  238. cw_bpf_debug("socket accept socket sys_enter_close connection before -- cid.pid=%lld, cid.fd=%lld\n", cid.pid, cid.fd);
  239. if (conn) {
  240. if (cid.pid == 3269744) {
  241. cw_bpf_debug("fucksocket pid=%lld sys_enter_close2 -- id=%lld, fd=%lld\n", cid.pid, id, cid.fd);
  242. }
  243. cw_bpf_debug("socket accept socket sys_enter_close connection before cid.pid=%lld, cid.fd=%lld\n", conn->bytes_sent, conn->bytes_received);
  244. struct tcp_event e = {};
  245. e.type = EVENT_TYPE_CONNECTION_CLOSE;
  246. e.pid = cid.pid;
  247. e.fd = cid.fd;
  248. e.bytes_sent = conn->bytes_sent;
  249. e.bytes_received = conn->bytes_received;
  250. e.timestamp = conn->timestamp;
  251. e.first_read_time = conn->first_read_time;
  252. e.first_write_time = conn->first_write_time;
  253. e.new_read_time = conn->new_read_time;
  254. bpf_perf_event_output(ctx, &tcp_connect_events, BPF_F_CURRENT_CPU, &e, sizeof(e));
  255. bpf_map_delete_elem(&active_connections, &cid);
  256. }
  257. cw_bpf_debug("socket accept socket sys_enter_close accept_Connection before cid.pid=%d, cid.fd=%d\n", cid.pid, cid.fd);
  258. struct accept_connection *acceptConn = bpf_map_lookup_elem(&active_accepts, &cid);
  259. if (acceptConn) {
  260. // struct tcp_event e = {};
  261. // e.type = EVENT_TYPE_ACCEPT_CLOSE;
  262. // e.pid = cid.pid;
  263. // e.fd = cid.fd;
  264. // e.bytes_sent = acceptConn->bytes_sent;
  265. // e.bytes_received = acceptConn->bytes_received;
  266. // e.timestamp = acceptConn->timestamp;
  267. // bpf_perf_event_output(ctx, &tcp_accept_events, BPF_F_CURRENT_CPU, &e, sizeof(e));
  268. bpf_map_delete_elem(&active_accepts, &cid);
  269. // cw_bpf_debug("socket accept socket sys_enter_close accept_Connection cid.pid=%d, cid.fd=%d\n", cid.pid, cid.fd);
  270. // cw_bpf_debug("socket accept socket sys_enter_close accept_Connection cid.bytes_sent=%d, cid.bytes_received=%d\n", e.bytes_sent, e.bytes_received);
  271. }
  272. //TODO 2,增加active_accept 对应的判断,类比234行操作,新增EVENT_TYPE_accept_conn_CLOSE类型
  273. //TODO 3 bpf_map_delete_elem(&active_accept, &cid);
  274. return 0;
  275. }
  276. void u32_to_ip(__u32 ip, unsigned char* bytes) {
  277. // 将32位整数拆分为四个8位整数
  278. // unsigned char bytes[4];
  279. bytes[15] = (ip >> 24) & 0xFF;
  280. bytes[14] = (ip >> 16) & 0xFF;
  281. bytes[13] = (ip >> 8) & 0xFF;
  282. bytes[12] = ip & 0xFF;
  283. bytes[11] = 0xFF;
  284. bytes[10] = 0xFF;
  285. // 使用sprintf将这些整数格式化为字符串
  286. cw_bpf_debug("[Go] [socket/IP: %u.%u", bytes[15], bytes[14]);
  287. cw_bpf_debug("[Go] [socket/IP: %u.%u", bytes[13], bytes[12]);
  288. }
  289. // 用于存储文件描述符和套接字指针的 map
  290. struct {
  291. __uint(type, BPF_MAP_TYPE_HASH);
  292. __type(key, __u64); // 使用进程 ID 作为键
  293. __type(value, struct sock *);
  294. __uint(max_entries, 1024);
  295. } socket_map SEC(".maps");
  296. struct ipv4_tuple_t {
  297. __u32 saddr;
  298. __u32 daddr;
  299. __u16 sport;
  300. __u16 dport;
  301. __u8 protocol;
  302. };
  303. SEC("kretprobe/inet_csk_accept")
  304. int kprobeinet_csk_accept(struct pt_regs *ctx) {
  305. cw_bpf_debug("socket inet_csk_accept Connection exit pid_tgid: pid_tgid=\n");
  306. __u64 pid_tgid = bpf_get_current_pid_tgid();
  307. cw_bpf_debug("socket inet_csk_accept Connection exit pid_tgid: pid_tgid=%d\n", pid_tgid);
  308. struct sock *sk = (struct sock *)PT_REGS_RC(ctx);
  309. // __u16 family = 0;
  310. // bpf_probe_read(&family, sizeof(family), &sk->__sk_common.skc_family);
  311. // cw_bpf_debug("socket inet_csk_accept Connection family: family=%d\n", family);
  312. // if (family == AF_INET)
  313. // {
  314. // cw_bpf_debug("socket inet_csk_accept Connection family: IPv4=%d\n", family);
  315. // }
  316. // struct ipv4_tuple_t tuple = {};
  317. // // 从 __sk_common 获取信息
  318. // bpf_probe_read(&tuple.saddr, sizeof(tuple.saddr), &sk->__sk_common.skc_rcv_saddr);
  319. // bpf_probe_read(&tuple.daddr, sizeof(tuple.daddr), &sk->__sk_common.skc_daddr);
  320. // bpf_probe_read(&tuple.sport, sizeof(tuple.sport), &sk->__sk_common.skc_num);
  321. // bpf_probe_read(&tuple.dport, sizeof(tuple.dport), &sk->__sk_common.skc_dport);
  322. // tuple.sport = bpf_ntohs(tuple.sport);
  323. // tuple.dport = bpf_ntohs(tuple.dport);
  324. // __u64 hash;
  325. // bpf_probe_read(&hash, sizeof(hash), &sk->__sk_common.skc_hash);
  326. // cw_bpf_debug("socket inet_csk_accept Connection accepted: sk=%x, hash: %lld\n", sk, hash);
  327. // cw_bpf_debug("socket inet_csk_accept Connection accepted: dport=%d, lport=%d\n", tuple.dport, tuple.sport);
  328. // cw_bpf_debug("socket inet_csk_accept Connection accepted: saddr=%lld, daddr=%lld\n", tuple.saddr, tuple.daddr);
  329. // u32_to_ip(tuple.saddr);
  330. // u32_to_ip(tuple.daddr);
  331. // 将进程 ID 关联到 `struct sock` 指针
  332. bpf_map_update_elem(&socket_map, &pid_tgid, &sk, BPF_ANY);
  333. return 0;
  334. }
  335. struct sys_exit_accept4_ctx {
  336. __u64 __unused_syscall_header;
  337. __u32 __unused_syscall_nr;
  338. long ret;
  339. };
  340. struct sys_enter_accept4_ctx {
  341. __u64 __unused_syscall_header;
  342. __u32 __unused_syscall_nr;
  343. long fd;
  344. __u64 *sockaddr;
  345. int addrlen;
  346. };
  347. struct sys_exit_accept_ctx {
  348. __u64 __unused_syscall_header;
  349. __u32 __unused_syscall_nr;
  350. long ret;
  351. };
  352. // 在系统调用accept返回时挂钩获取文件描述符
  353. SEC("tracepoint/syscalls/sys_enter_accept4")
  354. int tracepoint__sys_enter_accept4(struct sys_enter_accept4_ctx *ctx) {
  355. __u64 pid_tgid = bpf_get_current_pid_tgid();
  356. cw_bpf_debug("[Go] [socket/tracepoint__sys_entry_accept4]getget: rdi_ptr::pid: %d,-- %d\n", pid_tgid, ctx->fd);
  357. return 0;
  358. }
  359. SEC("tracepoint/syscalls/sys_enter_accept")
  360. int tracepoint__sys_enter_accept(struct trace_event_raw_sys_enter *ctx) {
  361. __u64 pid_tgid = bpf_get_current_pid_tgid();
  362. cw_bpf_debug("[Go] [socket/tracepoint__sys_entry_accept----]getget: rdi_ptr::pid: %d\n", pid_tgid);
  363. return 0;
  364. }
  365. SEC("tracepoint/syscalls/sys_exit_accept")
  366. int sys_exit_accept(struct sys_exit_accept_ctx *ctx)
  367. {
  368. long fd = ctx->ret;
  369. __u64 pid_tgid = bpf_get_current_pid_tgid();
  370. cw_bpf_debug("[Go] [socket/tracepoint__sys_exit_accept-----]getget: rdi_ptr::pid: %d,-- %d\n", pid_tgid, fd);
  371. // bpf_map_update_elem(&fd_by_pid_tgid, &pid_tgid, &fd, BPF_ANY);
  372. struct sock **skp;
  373. // 从 map 中获取 `struct sock` 指针
  374. skp = bpf_map_lookup_elem(&socket_map, &pid_tgid);
  375. if (skp && fd > 0) {
  376. struct sock *sk = *skp;
  377. __u16 family = 0;
  378. bpf_probe_read(&family, sizeof(family), &sk->__sk_common.skc_family);
  379. cw_bpf_debug("socket sys_exit_accept--- family: family=%d\n", family);
  380. if (family == AF_INET)
  381. {
  382. cw_bpf_debug("socket sys_exit_accept--- family: IPv4=%d\n", family);
  383. }
  384. struct ipv4_tuple_t tuple = {};
  385. // 从 __sk_common 获取信息
  386. bpf_probe_read(&tuple.saddr, sizeof(tuple.saddr), &sk->__sk_common.skc_rcv_saddr);
  387. bpf_probe_read(&tuple.daddr, sizeof(tuple.daddr), &sk->__sk_common.skc_daddr);
  388. bpf_probe_read(&tuple.sport, sizeof(tuple.sport), &sk->__sk_common.skc_num);
  389. bpf_probe_read(&tuple.dport, sizeof(tuple.dport), &sk->__sk_common.skc_dport);
  390. // tuple.sport = bpf_ntohs(tuple.sport);
  391. tuple.dport = bpf_ntohs(tuple.dport);
  392. __u64 hash;
  393. bpf_probe_read(&hash, sizeof(hash), &sk->__sk_common.skc_hash);
  394. cw_bpf_debug("socket sys_exit_accept--- sk=%x, hash: %lld\n", sk, hash);
  395. cw_bpf_debug("socket sys_exit_accept--- dport=%d, lport=%d\n", tuple.dport, tuple.sport);
  396. cw_bpf_debug("socket sys_exit_accept--- saddr=%lld, daddr=%lld\n", tuple.saddr, tuple.daddr);
  397. unsigned char saddr[16] = {};
  398. unsigned char daddr[16] = {};
  399. u32_to_ip(tuple.saddr, saddr);
  400. u32_to_ip(tuple.daddr, daddr);
  401. void *map = &tcp_accept_events;
  402. struct tcp_event e = {};
  403. e.type = EVENT_TYPE_ACCEPT_OPEN;
  404. e.duration = 0;
  405. e.timestamp = 0;
  406. e.pid = pid_tgid >> 32;
  407. e.sport = tuple.sport;
  408. e.dport = tuple.dport;
  409. e.fd = fd;
  410. __builtin_memcpy(&e.saddr, &saddr, sizeof(e.saddr));
  411. __builtin_memcpy(&e.daddr, &daddr, sizeof(e.daddr));
  412. cw_bpf_debug("socket sys_exit_accept--- addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[10], e.saddr[11]);
  413. cw_bpf_debug("socket sys_exit_accept--- addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[12], e.saddr[13]);
  414. cw_bpf_debug("socket sys_exit_accept--- addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[14], e.saddr[15]);
  415. cw_bpf_debug("socket sys_exit_accept--- addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[10], e.daddr[11]);
  416. cw_bpf_debug("socket sys_exit_accept--- addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[12], e.daddr[13]);
  417. cw_bpf_debug("socket sys_exit_accept--- addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[14], e.daddr[15]);
  418. bpf_perf_event_output(ctx, map, BPF_F_CURRENT_CPU, &e, sizeof(e));
  419. struct connection_id cid = {};
  420. cid.pid = pid_tgid >> 32;
  421. cid.fd = fd;
  422. struct accept_connection conn = {};
  423. conn.sport = tuple.sport;
  424. conn.dport = tuple.dport;
  425. __builtin_memcpy(&conn.saddr, &saddr, sizeof(conn.saddr));
  426. __builtin_memcpy(&conn.daddr, &daddr, sizeof(conn.daddr));
  427. cw_bpf_debug("socket accept update active_accepts before cid.pid=%d, cid.fd=%lld\n", cid.pid, cid.fd);
  428. bpf_map_update_elem(&active_accepts, &cid, &conn, BPF_ANY);
  429. cw_bpf_debug("socket accept update active_accepts after cid.pid=%d, cid.fd=%lld\n", cid.pid, cid.fd);
  430. // TODO 1: tcp_accept_events 把数据发到go层。update active_accept 定义一个 e.type
  431. }
  432. // 从地图中移除项目,避免泄漏
  433. bpf_map_delete_elem(&socket_map, &pid_tgid);
  434. return 0;
  435. }
  436. // 在系统调用accept返回时挂钩获取文件描述符
  437. SEC("tracepoint/syscalls/sys_exit_accept4")
  438. int tracepoint__sys_exit_accept4(struct sys_exit_accept4_ctx *ctx) {
  439. long fd = ctx->ret;
  440. __u64 pid_tgid = bpf_get_current_pid_tgid();
  441. cw_bpf_debug("[Go] [socket/tracepoint__sys_exit_accept4]getget: rdi_ptr::pid: %d,-- %d\n", pid_tgid, fd);
  442. // bpf_map_update_elem(&fd_by_pid_tgid, &pid_tgid, &fd, BPF_ANY);
  443. struct sock **skp;
  444. // 从 map 中获取 `struct sock` 指针
  445. skp = bpf_map_lookup_elem(&socket_map, &pid_tgid);
  446. if (skp && fd > 0) {
  447. struct sock *sk = *skp;
  448. __u16 family = 0;
  449. bpf_probe_read(&family, sizeof(family), &sk->__sk_common.skc_family);
  450. cw_bpf_debug("socket sys_exit_accept4 family: family=%d\n", family);
  451. if (family == AF_INET)
  452. {
  453. cw_bpf_debug("socket sys_exit_accept4 family: IPv4=%d\n", family);
  454. }
  455. struct ipv4_tuple_t tuple = {};
  456. // 从 __sk_common 获取信息
  457. bpf_probe_read(&tuple.saddr, sizeof(tuple.saddr), &sk->__sk_common.skc_rcv_saddr);
  458. bpf_probe_read(&tuple.daddr, sizeof(tuple.daddr), &sk->__sk_common.skc_daddr);
  459. bpf_probe_read(&tuple.sport, sizeof(tuple.sport), &sk->__sk_common.skc_num);
  460. bpf_probe_read(&tuple.dport, sizeof(tuple.dport), &sk->__sk_common.skc_dport);
  461. // tuple.sport = bpf_ntohs(tuple.sport);
  462. tuple.dport = bpf_ntohs(tuple.dport);
  463. __u64 hash;
  464. bpf_probe_read(&hash, sizeof(hash), &sk->__sk_common.skc_hash);
  465. cw_bpf_debug("socket sys_exit_accept4 sk=%x, hash: %lld\n", sk, hash);
  466. cw_bpf_debug("socket sys_exit_accept4 dport=%d, lport=%d\n", tuple.dport, tuple.sport);
  467. cw_bpf_debug("socket sys_exit_accept4 saddr=%lld, daddr=%lld\n", tuple.saddr, tuple.daddr);
  468. unsigned char saddr[16] = {};
  469. unsigned char daddr[16] = {};
  470. u32_to_ip(tuple.saddr, saddr);
  471. u32_to_ip(tuple.daddr, daddr);
  472. void *map = &tcp_accept_events;
  473. struct tcp_event e = {};
  474. e.type = EVENT_TYPE_ACCEPT_OPEN;
  475. e.duration = 0;
  476. e.timestamp = 0;
  477. e.pid = pid_tgid >> 32;
  478. e.sport = tuple.sport;
  479. e.dport = tuple.dport;
  480. e.fd = fd;
  481. __builtin_memcpy(&e.saddr, &saddr, sizeof(e.saddr));
  482. __builtin_memcpy(&e.daddr, &daddr, sizeof(e.daddr));
  483. cw_bpf_debug("socket sys_exit_accept4 addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[10], e.saddr[11]);
  484. cw_bpf_debug("socket sys_exit_accept4 addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[12], e.saddr[13]);
  485. cw_bpf_debug("socket sys_exit_accept4 addraddraddr saddr=%llu, saddr=%llu\n", e.saddr[14], e.saddr[15]);
  486. cw_bpf_debug("socket sys_exit_accept4 addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[10], e.daddr[11]);
  487. cw_bpf_debug("socket sys_exit_accept4 addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[12], e.daddr[13]);
  488. cw_bpf_debug("socket sys_exit_accept4 addraddraddr daddr=%llu, daddr=%llu\n", e.daddr[14], e.daddr[15]);
  489. bpf_perf_event_output(ctx, map, BPF_F_CURRENT_CPU, &e, sizeof(e));
  490. struct connection_id cid = {};
  491. cid.pid = pid_tgid >> 32;
  492. cid.fd = fd;
  493. struct accept_connection conn = {};
  494. conn.sport = tuple.sport;
  495. conn.dport = tuple.dport;
  496. __builtin_memcpy(&conn.saddr, &saddr, sizeof(conn.saddr));
  497. __builtin_memcpy(&conn.daddr, &daddr, sizeof(conn.daddr));
  498. cw_bpf_debug("socket accept update active_accepts before cid.pid=%d, cid.fd=%lld\n", cid.pid, cid.fd);
  499. bpf_map_update_elem(&active_accepts, &cid, &conn, BPF_ANY);
  500. cw_bpf_debug("socket accept update active_accepts after cid.pid=%d, cid.fd=%lld\n", cid.pid, cid.fd);
  501. // TODO 1: tcp_accept_events 把数据发到go层。update active_accept 定义一个 e.type
  502. }
  503. // 从地图中移除项目,避免泄漏
  504. bpf_map_delete_elem(&socket_map, &pid_tgid);
  505. return 0;
  506. }