From 76bee7a9df2411c6e36a801115818d4e4d8c7fa7 Mon Sep 17 00:00:00 2001 From: "M. Mert Yildiran" Date: Wed, 1 Jun 2022 14:36:03 +0300 Subject: [PATCH] Make hash map names more meaningful --- tap/tlstapper/bpf/golang_uprobes.c | 8 ++++---- tap/tlstapper/bpf/include/maps.h | 4 ++-- tap/tlstapper/tlstapper_bpfeb.go | 12 ++++++------ tap/tlstapper/tlstapper_bpfeb.o | Bin 127072 -> 127096 bytes tap/tlstapper/tlstapper_bpfel.go | 12 ++++++------ tap/tlstapper/tlstapper_bpfel.o | Bin 127072 -> 127096 bytes 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tap/tlstapper/bpf/golang_uprobes.c b/tap/tlstapper/bpf/golang_uprobes.c index bdb0e322f..6a5c7db48 100644 --- a/tap/tlstapper/bpf/golang_uprobes.c +++ b/tap/tlstapper/bpf/golang_uprobes.c @@ -38,7 +38,7 @@ static __always_inline int golang_crypto_tls_write_uprobe(struct pt_regs *ctx) { } __u64 key_dial_full = (pid << 32) + key_dial; - struct socket *s = bpf_map_lookup_elem(&golang_dial_writes, &key_dial_full); + struct socket *s = bpf_map_lookup_elem(&golang_socket_to_write, &key_dial_full); if (s == NULL) { bpf_printk("[golang_crypto_tls_write_uprobe] error getting socket"); return 0; @@ -155,7 +155,7 @@ static __always_inline int golang_net_socket_uprobe(struct pt_regs *ctx) { __u64 pid = pid_tgid >> 32; // ctx->r14 is common between golang_net_socket_uprobe and golang_net_http_dialconn_uprobe __u64 key_socket = (pid << 32) + ctx->r14; - struct socket *s = bpf_map_lookup_elem(&golang_socket_dials, &key_socket); + struct socket *s = bpf_map_lookup_elem(&golang_dial_to_socket, &key_socket); if (s == NULL) { return 0; } @@ -163,7 +163,7 @@ static __always_inline int golang_net_socket_uprobe(struct pt_regs *ctx) { struct socket b = { .pid = s->pid, .fd = ctx->rax, .key_dial = s->key_dial }; __u64 key_dial_full = (pid << 32) + s->key_dial; - __u32 status = bpf_map_update_elem(&golang_dial_writes, &key_dial_full, &b, BPF_ANY); + __u32 status = bpf_map_update_elem(&golang_socket_to_write, &key_dial_full, &b, BPF_ANY); if (status != 0) { bpf_printk("[golang_net_socket_uprobe] error updating socket file descriptor: %d", status); } @@ -188,7 +188,7 @@ static __always_inline int golang_net_http_dialconn_uprobe(struct pt_regs *ctx) __u64 pid = b.pid; // ctx->r14 is common between golang_net_socket_uprobe and golang_net_http_dialconn_uprobe __u64 key_socket = (pid << 32) + ctx->r14; - status = bpf_map_update_elem(&golang_socket_dials, &key_socket, &b, BPF_ANY); + status = bpf_map_update_elem(&golang_dial_to_socket, &key_socket, &b, BPF_ANY); if (status != 0) { bpf_printk("[golang_net_http_dialconn_uprobe] error setting socket: %d", status); } diff --git a/tap/tlstapper/bpf/include/maps.h b/tap/tlstapper/bpf/include/maps.h index 3b5815014..4dc3f4996 100644 --- a/tap/tlstapper/bpf/include/maps.h +++ b/tap/tlstapper/bpf/include/maps.h @@ -89,8 +89,8 @@ BPF_LRU_HASH(file_descriptor_to_ipv4, __u64, struct fd_info); BPF_PERF_OUTPUT(chunks_buffer); BPF_PERF_OUTPUT(log_buffer); -BPF_LRU_HASH(golang_socket_dials, __u64, struct socket); -BPF_LRU_HASH(golang_dial_writes, __u64, struct socket); +BPF_LRU_HASH(golang_dial_to_socket, __u64, struct socket); +BPF_LRU_HASH(golang_socket_to_write, __u64, struct socket); BPF_RINGBUF(golang_read_writes); #endif /* __MAPS__ */ diff --git a/tap/tlstapper/tlstapper_bpfeb.go b/tap/tlstapper/tlstapper_bpfeb.go index e96693e4c..a2333bbe8 100644 --- a/tap/tlstapper/tlstapper_bpfeb.go +++ b/tap/tlstapper/tlstapper_bpfeb.go @@ -105,9 +105,9 @@ type tlsTapperMapSpecs struct { ChunksBuffer *ebpf.MapSpec `ebpf:"chunks_buffer"` ConnectSyscallInfo *ebpf.MapSpec `ebpf:"connect_syscall_info"` FileDescriptorToIpv4 *ebpf.MapSpec `ebpf:"file_descriptor_to_ipv4"` - GolangDialWrites *ebpf.MapSpec `ebpf:"golang_dial_writes"` + GolangDialToSocket *ebpf.MapSpec `ebpf:"golang_dial_to_socket"` GolangReadWrites *ebpf.MapSpec `ebpf:"golang_read_writes"` - GolangSocketDials *ebpf.MapSpec `ebpf:"golang_socket_dials"` + GolangSocketToWrite *ebpf.MapSpec `ebpf:"golang_socket_to_write"` Heap *ebpf.MapSpec `ebpf:"heap"` LogBuffer *ebpf.MapSpec `ebpf:"log_buffer"` PidsMap *ebpf.MapSpec `ebpf:"pids_map"` @@ -138,9 +138,9 @@ type tlsTapperMaps struct { ChunksBuffer *ebpf.Map `ebpf:"chunks_buffer"` ConnectSyscallInfo *ebpf.Map `ebpf:"connect_syscall_info"` FileDescriptorToIpv4 *ebpf.Map `ebpf:"file_descriptor_to_ipv4"` - GolangDialWrites *ebpf.Map `ebpf:"golang_dial_writes"` + GolangDialToSocket *ebpf.Map `ebpf:"golang_dial_to_socket"` GolangReadWrites *ebpf.Map `ebpf:"golang_read_writes"` - GolangSocketDials *ebpf.Map `ebpf:"golang_socket_dials"` + GolangSocketToWrite *ebpf.Map `ebpf:"golang_socket_to_write"` Heap *ebpf.Map `ebpf:"heap"` LogBuffer *ebpf.Map `ebpf:"log_buffer"` PidsMap *ebpf.Map `ebpf:"pids_map"` @@ -154,9 +154,9 @@ func (m *tlsTapperMaps) Close() error { m.ChunksBuffer, m.ConnectSyscallInfo, m.FileDescriptorToIpv4, - m.GolangDialWrites, + m.GolangDialToSocket, m.GolangReadWrites, - m.GolangSocketDials, + m.GolangSocketToWrite, m.Heap, m.LogBuffer, m.PidsMap, diff --git a/tap/tlstapper/tlstapper_bpfeb.o b/tap/tlstapper/tlstapper_bpfeb.o index 88dd55a64b43e0415297f9eef9dcdb3bebf1c128..8156b52338b12a37ab4a4b85af3797e261225228 100644 GIT binary patch delta 12439 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 VWRrbGp$lluJnpoHsPcl&{XbRju8{x$ delta 10136 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 Qgx-N5$_