From 10dd1f0ef0408668b48abdeaa93b50d15fe3edb6 Mon Sep 17 00:00:00 2001 From: Mohamed Mahmoud Date: Wed, 3 Jan 2024 10:54:41 -0500 Subject: [PATCH] change rtt logic to use kprobe and get rtt from tcp socket Signed-off-by: Mohamed Mahmoud --- bpf/configs.h | 1 - bpf/flows.c | 11 -- bpf/maps_definition.h | 12 -- bpf/rtt_tracker.h | 231 +++++++++++++++++++------------------- bpf/types.h | 1 - pkg/ebpf/bpf_bpfeb.go | 16 +-- pkg/ebpf/bpf_bpfeb.o | Bin 93000 -> 91760 bytes pkg/ebpf/bpf_bpfel.o | Bin 94760 -> 0 bytes pkg/ebpf/bpf_bpfel_x86.go | 204 +++++++++++++++++++++++++++++++++ pkg/ebpf/bpf_bpfel_x86.o | Bin 0 -> 98584 bytes pkg/ebpf/tracer.go | 70 +++--------- 11 files changed, 343 insertions(+), 203 deletions(-) delete mode 100644 pkg/ebpf/bpf_bpfel.o create mode 100644 pkg/ebpf/bpf_bpfel_x86.go create mode 100644 pkg/ebpf/bpf_bpfel_x86.o diff --git a/bpf/configs.h b/bpf/configs.h index fcf55db55..cbec7a1f7 100644 --- a/bpf/configs.h +++ b/bpf/configs.h @@ -5,7 +5,6 @@ // Constant definitions, to be overridden by the invoker volatile const u32 sampling = 0; volatile const u8 trace_messages = 0; -volatile const u8 enable_rtt = 0; volatile const u16 pca_port = 0; volatile const u8 pca_proto = 0; volatile const u8 enable_dns_tracking = 0; diff --git a/bpf/flows.c b/bpf/flows.c index 8e633a12a..30c7b2c97 100644 --- a/bpf/flows.c +++ b/bpf/flows.c @@ -66,12 +66,6 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { id.if_index = skb->ifindex; id.direction = direction; - // We calculate the RTT before looking up aggregated_flows map because we want - // to keep the critical section between map lookup and update consume minimum time. - if (enable_rtt) { - // This is currently not to be enabled by default. - calculate_flow_rtt(&pkt, direction, data_end); - } int dns_errno = 0; if (enable_dns_tracking) { dns_errno = track_dns_packet(skb, &pkt); @@ -90,10 +84,6 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { } aggregate_flow->flags |= pkt.flags; aggregate_flow->dscp = pkt.dscp; - // Does not matter the gate. Will be zero if not enabled. - if (pkt.rtt > aggregate_flow->flow_rtt) { - aggregate_flow->flow_rtt = pkt.rtt; - } aggregate_flow->dns_record.id = pkt.dns_id; aggregate_flow->dns_record.flags = pkt.dns_flags; aggregate_flow->dns_record.latency = pkt.dns_latency; @@ -115,7 +105,6 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { .start_mono_time_ts = pkt.current_ts, .end_mono_time_ts = pkt.current_ts, .flags = pkt.flags, - .flow_rtt = pkt.rtt, .dscp = pkt.dscp, .dns_record.id = pkt.dns_id, .dns_record.flags = pkt.dns_flags, diff --git a/bpf/maps_definition.h b/bpf/maps_definition.h index d49743bb6..69ead7faa 100644 --- a/bpf/maps_definition.h +++ b/bpf/maps_definition.h @@ -18,18 +18,6 @@ struct { __uint(map_flags, BPF_F_NO_PREALLOC); } aggregated_flows SEC(".maps"); -// Common hashmap to keep track of all flow sequences. -// Key is flow_seq_id which is standard 4 tuple and a sequence id -// sequence id is specific to the type of transport protocol -// Value is u64 which represents the occurrence timestamp of the packet. -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, 1 << 20); // Will take around 64MB of space. - __type(key, flow_seq_id); - __type(value, u64); - __uint(map_flags, BPF_F_NO_PREALLOC); -} flow_sequences SEC(".maps"); - //PerfEvent Array for Packet Payloads struct { __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); diff --git a/bpf/rtt_tracker.h b/bpf/rtt_tracker.h index a5cd98f8e..36dd1e9d6 100644 --- a/bpf/rtt_tracker.h +++ b/bpf/rtt_tracker.h @@ -1,143 +1,148 @@ /* - A simple RTT tracker implemented to be used at the ebpf layer inside the flow_monitor hookpoint. - This tracker currently tracks RTT for TCP flows by looking at the TCP start sequence and estimates - RTT by perform (timestamp of receiveing ack packet - timestamp of sending syn packet) + A simple RTT tracker implemented to be using eBPF kprobe hook. */ #ifndef __RTT_TRACKER_H__ #define __RTT_TRACKER_H__ +#include +#include #include "utils.h" #include "maps_definition.h" -const u64 MIN_RTT = 50000; //50 micro seconds +static __always_inline void rtt_fill_in_l2(struct sk_buff *skb, flow_id *id) { + struct ethhdr eth; -static __always_inline void fill_flow_seq_id(flow_seq_id *seq_id, pkt_info *pkt, u32 seq, bool reverse) { - flow_id *id = pkt->id; - if (reverse) { - __builtin_memcpy(seq_id->src_ip, id->dst_ip, IP_MAX_LEN); - __builtin_memcpy(seq_id->dst_ip, id->src_ip, IP_MAX_LEN); - seq_id->src_port = id->dst_port; - seq_id->dst_port = id->src_port; - } else { - __builtin_memcpy(seq_id->src_ip, id->src_ip, IP_MAX_LEN); - __builtin_memcpy(seq_id->dst_ip, id->dst_ip, IP_MAX_LEN); - seq_id->src_port = id->src_port; - seq_id->dst_port = id->dst_port; - } - seq_id->transport_protocol = id->transport_protocol; - seq_id->seq_id = seq; - seq_id->if_index = id->if_index; -} + __builtin_memset(ð, 0, sizeof(eth)); -static __always_inline void reverse_flow_id_struct(flow_id *src, flow_id *dst) { - // Fields which remain same - dst->eth_protocol = src->eth_protocol; - dst->transport_protocol = src->transport_protocol; - dst->if_index = src->if_index; - - // Fields which should be reversed - dst->direction = (src->direction == INGRESS) ? EGRESS : INGRESS; - __builtin_memcpy(dst->src_mac, src->dst_mac, ETH_ALEN); - __builtin_memcpy(dst->dst_mac, src->src_mac, ETH_ALEN); - __builtin_memcpy(dst->src_ip, src->dst_ip, IP_MAX_LEN); - __builtin_memcpy(dst->dst_ip, src->src_ip, IP_MAX_LEN); - dst->src_port = src->dst_port; - dst->dst_port = src->src_port; - /* ICMP type can be ignore for now. We only deal with TCP packets for now.*/ -} + u8 *skb_head = BPF_CORE_READ(skb, head); + u16 skb_mac_header = BPF_CORE_READ(skb, mac_header); -static __always_inline void update_reverse_flow_rtt(pkt_info *pkt, u32 seq) { - flow_id rev_flow_id; - __builtin_memset(&rev_flow_id, 0, sizeof(rev_flow_id)); - reverse_flow_id_struct(pkt->id, &rev_flow_id); - - flow_metrics *reverse_flow = (flow_metrics *)bpf_map_lookup_elem(&aggregated_flows, &rev_flow_id); - if (reverse_flow != NULL) { - if (pkt->rtt > reverse_flow->flow_rtt) { - reverse_flow->flow_rtt = pkt->rtt; - long ret = bpf_map_update_elem(&aggregated_flows, &rev_flow_id, reverse_flow, BPF_EXIST); - if (trace_messages && ret != 0) { - bpf_printk("error updating rtt value in flow %d\n", ret); - } - } - } + bpf_probe_read(ð, sizeof(eth), (struct ethhdr *)(skb_head + skb_mac_header)); + __builtin_memcpy(id->dst_mac, eth.h_dest, ETH_ALEN); + __builtin_memcpy(id->src_mac, eth.h_source, ETH_ALEN); + id->eth_protocol = bpf_ntohs(eth.h_proto); } -static __always_inline void __calculate_tcp_rtt(pkt_info *pkt, struct tcphdr *tcp, flow_seq_id *seq_id) { - // Stored sequence should be ack_seq - 1 - u32 seq = bpf_ntohl(tcp->ack_seq) - 1; - // check reversed flow - fill_flow_seq_id(seq_id, pkt, seq, true); - - u64 *prev_ts = (u64 *)bpf_map_lookup_elem(&flow_sequences, seq_id); - if (prev_ts != NULL) { - u64 rtt = pkt->current_ts - *prev_ts; - /** - * FIXME: Because of SAMPLING the way it is done if we miss one of SYN/SYN+ACK/ACK - * then we can get RTT values which are the process response time rather than actual RTT. - * This check below clears them out but needs to be modified with a better solution or change - * the algorithm for calculating RTT so it doesn't interact with SAMPLING like this. - */ - if (rtt < MIN_RTT) { - return; +static __always_inline void rtt_fill_in_l3(struct sk_buff *skb, flow_id *id, u16 family, u8 *dscp) { + u16 skb_network_header = BPF_CORE_READ(skb, network_header); + u8 *skb_head = BPF_CORE_READ(skb, head); + + switch (family) { + case AF_INET: { + struct iphdr ip; + __builtin_memset(&ip, 0, sizeof(ip)); + bpf_probe_read(&ip, sizeof(ip), (struct iphdr *)(skb_head + skb_network_header)); + __builtin_memcpy(id->src_ip, ip4in6, sizeof(ip4in6)); + __builtin_memcpy(id->dst_ip, ip4in6, sizeof(ip4in6)); + __builtin_memcpy(id->src_ip + sizeof(ip4in6), &ip.saddr, sizeof(ip.saddr)); + __builtin_memcpy(id->dst_ip + sizeof(ip4in6), &ip.daddr, sizeof(ip.daddr)); + *dscp = ipv4_get_dscp(&ip); + break; } - pkt->rtt = rtt; - // Delete the flow from flow sequence map so if it - // restarts we have a new RTT calculation. - long ret = bpf_map_delete_elem(&flow_sequences, seq_id); - if (trace_messages && ret != 0) { - bpf_printk("error evicting flow sequence: %d", ret); + case AF_INET6: { + struct ipv6hdr ip; + __builtin_memset(&ip, 0, sizeof(ip)); + bpf_probe_read(&ip, sizeof(ip), (struct ipv6hdr *)(skb_head + skb_network_header)); + __builtin_memcpy(id->src_ip, ip.saddr.in6_u.u6_addr8, IP_MAX_LEN); + __builtin_memcpy(id->dst_ip, ip.daddr.in6_u.u6_addr8, IP_MAX_LEN); + *dscp = ipv6_get_dscp(&ip); + break; } - // This is an ACK packet with valid sequence id so a SYN must - // have been sent. We can safely update the reverse flow RTT here. - update_reverse_flow_rtt(pkt, seq); + default: + return; } - return; } -static __always_inline void __store_tcp_ts(pkt_info *pkt, struct tcphdr *tcp, flow_seq_id *seq_id) { - // store timestamp of syn packets. - u32 seq = bpf_ntohl(tcp->seq); - fill_flow_seq_id(seq_id, pkt, seq, false); - long ret = bpf_map_update_elem(&flow_sequences, seq_id, &pkt->current_ts, BPF_NOEXIST); - if (trace_messages && ret != 0) { - bpf_printk("err saving flow sequence record %d", ret); - } - return; +static __always_inline void rtt_fill_in_tcp(struct sk_buff *skb, flow_id *id, u16 *flags) { + u16 skb_transport_header = BPF_CORE_READ(skb, transport_header); + u8 *skb_head = BPF_CORE_READ(skb, head); + struct tcphdr tcp; + u16 sport, dport; + + __builtin_memset(&tcp, 0, sizeof(tcp)); + + bpf_probe_read(&tcp, sizeof(tcp), (struct tcphdr *)(skb_head + skb_transport_header)); + sport = bpf_ntohs(tcp.source); + dport = bpf_ntohs(tcp.dest); + id->src_port = sport; + id->dst_port = dport; + set_flags(&tcp, flags); + id->transport_protocol = IPPROTO_TCP; } -static __always_inline void calculate_flow_rtt_tcp(pkt_info *pkt, u8 direction, void *data_end, flow_seq_id *seq_id) { - struct tcphdr *tcp = (struct tcphdr *) pkt->l4_hdr; - if ( !tcp || ((void *)tcp + sizeof(*tcp) > data_end) ) { - return; - } +static __always_inline int calculate_flow_rtt_tcp(struct sock *sk, struct sk_buff *skb) { + struct tcp_sock *ts; + u16 family, flags; + u64 rtt, len; + int ret = 0; + flow_id id; + u8 dscp; - /* We calculate RTT for both SYN/SYN+ACK and SYN+ACK/ACK and take the maximum of both.*/ - if (tcp->syn && tcp->ack) { // SYN ACK Packet - __calculate_tcp_rtt(pkt, tcp, seq_id); - __store_tcp_ts(pkt, tcp, seq_id); + if (skb == NULL) { + return 0; } - else if (tcp->ack) { - __calculate_tcp_rtt(pkt, tcp, seq_id); - } - else if (tcp->syn) { - __store_tcp_ts(pkt, tcp, seq_id); + + __builtin_memset(&id, 0, sizeof(id)); + + id.if_index = BPF_CORE_READ(skb, skb_iif); + len = BPF_CORE_READ(skb, len); + + // read L2 info + rtt_fill_in_l2(skb, &id); + + family = BPF_CORE_READ(sk, __sk_common.skc_family); + + // read L3 info + rtt_fill_in_l3(skb, &id, family, &dscp); + + // read TCP info + rtt_fill_in_tcp(skb, &id, &flags); + + // read TCP socket rtt and store it in nanoseconds + ts = (struct tcp_sock *)(sk); + rtt = BPF_CORE_READ(ts, srtt_us) >> 3; + rtt *= 1000u; + u64 current_ts = bpf_ktime_get_ns(); + flow_metrics *aggregate_flow = bpf_map_lookup_elem(&aggregated_flows, &id); + if (aggregate_flow != NULL) { + aggregate_flow->end_mono_time_ts = current_ts; + aggregate_flow->flow_rtt = rtt; + aggregate_flow->dscp = dscp; + aggregate_flow->flags |= flags; + aggregate_flow->packets ++; + aggregate_flow->bytes += len; + ret = bpf_map_update_elem(&aggregated_flows, &id, aggregate_flow, BPF_ANY); + if (trace_messages && ret != 0) { + bpf_printk("error rtt track updating flow %d\n", ret); + } + } else { + flow_metrics new_flow = { + .packets = 1, + .bytes = len, + .start_mono_time_ts = current_ts, + .end_mono_time_ts = current_ts, + .flags = flags, + .flow_rtt = rtt, + .dscp = dscp, + }; + ret = bpf_map_update_elem(&aggregated_flows, &id, &new_flow, BPF_ANY); + if (trace_messages && ret != 0) { + bpf_printk("error creating rtt flow %d\n", ret); + } } + return ret; } -static __always_inline void calculate_flow_rtt(pkt_info *pkt, u8 direction, void *data_end) { - flow_seq_id seq_id; - __builtin_memset(&seq_id, 0, sizeof(flow_seq_id)); +SEC("kprobe/tcp_rcv_established") +int tcp_rcv_kprobe(struct pt_regs *regs) { + struct sock *sk; + struct sk_buff *skb; - switch (pkt->id->transport_protocol) - { - case IPPROTO_TCP: - calculate_flow_rtt_tcp(pkt, direction, data_end, &seq_id); - break; - default: - break; - } + sk = (struct sock *)PT_REGS_PARM1_CORE(regs); + skb = (struct sk_buff *)PT_REGS_PARM2_CORE(regs); + + return calculate_flow_rtt_tcp(sk, skb); } #endif /* __RTT_TRACKER_H__ */ \ No newline at end of file diff --git a/bpf/types.h b/bpf/types.h index 7d50bcc59..4b544c439 100644 --- a/bpf/types.h +++ b/bpf/types.h @@ -158,7 +158,6 @@ typedef struct pkt_info_t { u64 current_ts; // ts recorded when pkt came. u16 flags; // TCP specific void *l4_hdr; // Stores the actual l4 header - u64 rtt; // rtt calculated from the flow if possible. else zero u8 dscp; // IPv4/6 DSCP value u16 dns_id; u16 dns_flags; diff --git a/pkg/ebpf/bpf_bpfeb.go b/pkg/ebpf/bpf_bpfeb.go index 7f6ceebd8..4be831d3e 100644 --- a/pkg/ebpf/bpf_bpfeb.go +++ b/pkg/ebpf/bpf_bpfeb.go @@ -65,16 +65,6 @@ type BpfFlowRecordT struct { Metrics BpfFlowMetrics } -type BpfFlowSeqId struct { - SrcPort uint16 - DstPort uint16 - SrcIp [16]uint8 - DstIp [16]uint8 - SeqId uint32 - TransportProtocol uint8 - IfIndex uint32 -} - type BpfPktDropsT struct { Packets uint32 Bytes uint64 @@ -129,6 +119,7 @@ type BpfProgramSpecs struct { IngressFlowParse *ebpf.ProgramSpec `ebpf:"ingress_flow_parse"` IngressPcaParse *ebpf.ProgramSpec `ebpf:"ingress_pca_parse"` KfreeSkb *ebpf.ProgramSpec `ebpf:"kfree_skb"` + TcpRcvKprobe *ebpf.ProgramSpec `ebpf:"tcp_rcv_kprobe"` } // BpfMapSpecs contains maps before they are loaded into the kernel. @@ -138,7 +129,6 @@ type BpfMapSpecs struct { AggregatedFlows *ebpf.MapSpec `ebpf:"aggregated_flows"` DirectFlows *ebpf.MapSpec `ebpf:"direct_flows"` DnsFlows *ebpf.MapSpec `ebpf:"dns_flows"` - FlowSequences *ebpf.MapSpec `ebpf:"flow_sequences"` PacketRecord *ebpf.MapSpec `ebpf:"packet_record"` } @@ -164,7 +154,6 @@ type BpfMaps struct { AggregatedFlows *ebpf.Map `ebpf:"aggregated_flows"` DirectFlows *ebpf.Map `ebpf:"direct_flows"` DnsFlows *ebpf.Map `ebpf:"dns_flows"` - FlowSequences *ebpf.Map `ebpf:"flow_sequences"` PacketRecord *ebpf.Map `ebpf:"packet_record"` } @@ -173,7 +162,6 @@ func (m *BpfMaps) Close() error { m.AggregatedFlows, m.DirectFlows, m.DnsFlows, - m.FlowSequences, m.PacketRecord, ) } @@ -187,6 +175,7 @@ type BpfPrograms struct { IngressFlowParse *ebpf.Program `ebpf:"ingress_flow_parse"` IngressPcaParse *ebpf.Program `ebpf:"ingress_pca_parse"` KfreeSkb *ebpf.Program `ebpf:"kfree_skb"` + TcpRcvKprobe *ebpf.Program `ebpf:"tcp_rcv_kprobe"` } func (p *BpfPrograms) Close() error { @@ -196,6 +185,7 @@ func (p *BpfPrograms) Close() error { p.IngressFlowParse, p.IngressPcaParse, p.KfreeSkb, + p.TcpRcvKprobe, ) } diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o index 0af59e932379b347f41e3564b964d6d3cb0ded49..ae955b9d6daf4043ff1072d6d063c2e278d0a4fa 100644 GIT binary patch literal 91760 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

rk?yd?>js!OpA8 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 diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o deleted file mode 100644 index f938b3e4570b74b99c7b31e183abbd731f169f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94760 zcmeFa3w&KibuYXnOR*gCP;4u9L_)UTvalW7acrSD&T(w{726ViBn}0Rj*pJ4W66?^ zwq#jW00jaGT*@_kv~ejEJ4wN5p}0Jnz@=C%X$g;lZwU}+D5ee6JX%Z%;I@?9|9`DD zdymeM?4@MFORDp78s*r=pniSeysTngXU5=*t-I~@^&J&=p zUh!A0*eF2Fq)UT)0o6>pD!2;i?n&!|OOX0fVGHs%S~^$LnH1W)@>DLar$Mhqdfi+d z=U2_q0@u%w?BI<^sM1p$9Hs?L_kleGIB02RuhJLKQpU_a#ZP4{?bDR?Ex>&W<#-j_ z&+fA6LeFICBprUsd9kf*?Kw>kKP%}zs3~N5)Z^PqQ~@ofJ5Aa zmY%Y4y4B{v4VGR{CS1FNAF+7wDEiH7xOP6CO3{p3`O8oR7Ma>1TVze#`R&X{X{VJ@u+;HtrVTI}^+M@j}tay>->-ZN| zTxz)5L1Bf;6>ZURFRV~U6m8M*FRT#pphvZX!V0tJEou*i6=ttn)Gi7u&=FkG7PXJU z3Y!mG)J_U3Y`$z!dnw%L=7ZWzVUD$L_QQ3L<6Ej1Cx_ZqBB$D0B8S>pBB$D4B8S>t zBB$D8VJ=%`KhzEjD@@KUYM;qCs68a(q;`{xgW5?lPG%?ZIOzOK#!2U8G7f6@E{=&B zbw1?hhJyCU&QK^4GN^@Vlp84<=l1g!%t9hPX1AFSuJDqT1Js z-A1+dSgQU%s(qc|+Rv!g=0mOaE2`E0Mz!W&YPEk+t599i{FBmyF?4jWru^eVA8rh+{Y6sIK9u21 zE=+r=;LXb=0nVs42=<{J$)CPh@aA=r1cjP90rtVIX#N7tZ?gR9jA~Kd{AHnfq2SHx zc7j6nT+PRSDL-S5=J!ex6lSQMGY*vene#ONKFueccOu6i^%({B*|Ld{Z5t93tBn4tz8HJ%eWxE~6^!Fh%0 z^IW$6heCID=Ip8Su+CREZp~)bov-+u_GjuUZD$(2IosF$U*W0-!K2!r2w${C{Y2FG zW5w(LS<+Jv3Y*CB1mr08J8wibC+w*c#)rXw8hoeTZ}{XO_yX{n;OjydLVtJ-9X~4d zU$5pFJPLZtr{O=QJ}LRbwI`o<`%tayzoel3OZ*|V4!JNt*akY6

_GEt8e!%&$&U)o{{x+(=S;`lt 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 diff --git a/pkg/ebpf/bpf_bpfel_x86.go b/pkg/ebpf/bpf_bpfel_x86.go new file mode 100644 index 000000000..207e720f5 --- /dev/null +++ b/pkg/ebpf/bpf_bpfel_x86.go @@ -0,0 +1,204 @@ +// Code generated by bpf2go; DO NOT EDIT. +//go:build 386 || amd64 + +package ebpf + +import ( + "bytes" + _ "embed" + "fmt" + "io" + + "github.com/cilium/ebpf" +) + +type BpfDnsFlowId struct { + SrcPort uint16 + DstPort uint16 + SrcIp [16]uint8 + DstIp [16]uint8 + Id uint16 + Protocol uint8 +} + +type BpfDnsRecordT struct { + Id uint16 + Flags uint16 + Latency uint64 + Errno uint8 +} + +type BpfFlowId BpfFlowIdT + +type BpfFlowIdT struct { + EthProtocol uint16 + Direction uint8 + SrcMac [6]uint8 + DstMac [6]uint8 + SrcIp [16]uint8 + DstIp [16]uint8 + SrcPort uint16 + DstPort uint16 + TransportProtocol uint8 + IcmpType uint8 + IcmpCode uint8 + IfIndex uint32 +} + +type BpfFlowMetrics BpfFlowMetricsT + +type BpfFlowMetricsT struct { + Packets uint32 + Bytes uint64 + StartMonoTimeTs uint64 + EndMonoTimeTs uint64 + Flags uint16 + Errno uint8 + Dscp uint8 + PktDrops BpfPktDropsT + DnsRecord BpfDnsRecordT + FlowRtt uint64 +} + +type BpfFlowRecordT struct { + Id BpfFlowId + Metrics BpfFlowMetrics +} + +type BpfPktDropsT struct { + Packets uint32 + Bytes uint64 + LatestFlags uint16 + LatestState uint8 + LatestDropCause uint32 +} + +// LoadBpf returns the embedded CollectionSpec for Bpf. +func LoadBpf() (*ebpf.CollectionSpec, error) { + reader := bytes.NewReader(_BpfBytes) + spec, err := ebpf.LoadCollectionSpecFromReader(reader) + if err != nil { + return nil, fmt.Errorf("can't load Bpf: %w", err) + } + + return spec, err +} + +// LoadBpfObjects loads Bpf and converts it into a struct. +// +// The following types are suitable as obj argument: +// +// *BpfObjects +// *BpfPrograms +// *BpfMaps +// +// See ebpf.CollectionSpec.LoadAndAssign documentation for details. +func LoadBpfObjects(obj interface{}, opts *ebpf.CollectionOptions) error { + spec, err := LoadBpf() + if err != nil { + return err + } + + return spec.LoadAndAssign(obj, opts) +} + +// BpfSpecs contains maps and programs before they are loaded into the kernel. +// +// It can be passed ebpf.CollectionSpec.Assign. +type BpfSpecs struct { + BpfProgramSpecs + BpfMapSpecs +} + +// BpfSpecs contains programs before they are loaded into the kernel. +// +// It can be passed ebpf.CollectionSpec.Assign. +type BpfProgramSpecs struct { + EgressFlowParse *ebpf.ProgramSpec `ebpf:"egress_flow_parse"` + EgressPcaParse *ebpf.ProgramSpec `ebpf:"egress_pca_parse"` + IngressFlowParse *ebpf.ProgramSpec `ebpf:"ingress_flow_parse"` + IngressPcaParse *ebpf.ProgramSpec `ebpf:"ingress_pca_parse"` + KfreeSkb *ebpf.ProgramSpec `ebpf:"kfree_skb"` + TcpRcvKprobe *ebpf.ProgramSpec `ebpf:"tcp_rcv_kprobe"` +} + +// BpfMapSpecs contains maps before they are loaded into the kernel. +// +// It can be passed ebpf.CollectionSpec.Assign. +type BpfMapSpecs struct { + AggregatedFlows *ebpf.MapSpec `ebpf:"aggregated_flows"` + DirectFlows *ebpf.MapSpec `ebpf:"direct_flows"` + DnsFlows *ebpf.MapSpec `ebpf:"dns_flows"` + PacketRecord *ebpf.MapSpec `ebpf:"packet_record"` +} + +// BpfObjects contains all objects after they have been loaded into the kernel. +// +// It can be passed to LoadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. +type BpfObjects struct { + BpfPrograms + BpfMaps +} + +func (o *BpfObjects) Close() error { + return _BpfClose( + &o.BpfPrograms, + &o.BpfMaps, + ) +} + +// BpfMaps contains all maps after they have been loaded into the kernel. +// +// It can be passed to LoadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. +type BpfMaps struct { + AggregatedFlows *ebpf.Map `ebpf:"aggregated_flows"` + DirectFlows *ebpf.Map `ebpf:"direct_flows"` + DnsFlows *ebpf.Map `ebpf:"dns_flows"` + PacketRecord *ebpf.Map `ebpf:"packet_record"` +} + +func (m *BpfMaps) Close() error { + return _BpfClose( + m.AggregatedFlows, + m.DirectFlows, + m.DnsFlows, + m.PacketRecord, + ) +} + +// BpfPrograms contains all programs after they have been loaded into the kernel. +// +// It can be passed to LoadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. +type BpfPrograms struct { + EgressFlowParse *ebpf.Program `ebpf:"egress_flow_parse"` + EgressPcaParse *ebpf.Program `ebpf:"egress_pca_parse"` + IngressFlowParse *ebpf.Program `ebpf:"ingress_flow_parse"` + IngressPcaParse *ebpf.Program `ebpf:"ingress_pca_parse"` + KfreeSkb *ebpf.Program `ebpf:"kfree_skb"` + TcpRcvKprobe *ebpf.Program `ebpf:"tcp_rcv_kprobe"` +} + +func (p *BpfPrograms) Close() error { + return _BpfClose( + p.EgressFlowParse, + p.EgressPcaParse, + p.IngressFlowParse, + p.IngressPcaParse, + p.KfreeSkb, + p.TcpRcvKprobe, + ) +} + +func _BpfClose(closers ...io.Closer) error { + for _, closer := range closers { + if err := closer.Close(); err != nil { + return err + } + } + return nil +} + +// Do not access this directly. +// +//go:embed bpf_bpfel_x86.o +var _BpfBytes []byte diff --git a/pkg/ebpf/bpf_bpfel_x86.o b/pkg/ebpf/bpf_bpfel_x86.o new file mode 100644 index 0000000000000000000000000000000000000000..6a2fac565c6fc933377fcbd7ae764336f5f79b66 GIT binary patch literal 98584 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 literal 0 HcmV?d00001 diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go index cf213ce6e..2d04c0671 100644 --- a/pkg/ebpf/tracer.go +++ b/pkg/ebpf/tracer.go @@ -26,18 +26,16 @@ import ( ) // $BPF_CLANG and $BPF_CFLAGS are set by the Makefile. -//go:generate bpf2go -cc $BPF_CLANG -cflags $BPF_CFLAGS -type flow_metrics_t -type flow_id_t -type flow_record_t -type pkt_drops_t -type dns_record_t Bpf ../../bpf/flows.c -- -I../../bpf/headers +//go:generate bpf2go -cc $BPF_CLANG -cflags $BPF_CFLAGS -target $GOARCH -type flow_metrics_t -type flow_id_t -type flow_record_t -type pkt_drops_t -type dns_record_t Bpf ../../bpf/flows.c -- -I../../bpf/headers const ( qdiscType = "clsact" // ebpf map names as defined in bpf/maps_definition.h aggregatedFlowsMap = "aggregated_flows" - flowSequencesMap = "flow_sequences" dnsLatencyMap = "dns_flows" // constants defined in flows.c as "volatile const" constSampling = "sampling" constTraceMessages = "trace_messages" - constEnableRtt = "enable_rtt" constEnableDNSTracking = "enable_dns_tracking" pktDropHook = "kfree_skb" constPcaPort = "pca_port" @@ -62,6 +60,7 @@ type FlowFetcher struct { enableIngress bool enableEgress bool pktDropsTracePoint link.Link + rttKprobeLink link.Link } type FlowFetcherConfig struct { @@ -88,30 +87,12 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { // Resize maps according to user-provided configuration spec.Maps[aggregatedFlowsMap].MaxEntries = uint32(cfg.CacheMaxSize) - spec.Maps[flowSequencesMap].MaxEntries = uint32(cfg.CacheMaxSize) traceMsgs := 0 if cfg.Debug { traceMsgs = 1 } - enableRtt := 0 - if cfg.EnableRTT { - if !(cfg.EnableEgress && cfg.EnableIngress) { - log.Warnf("ENABLE_RTT is set to true. But both Ingress AND Egress are not enabled. Disabling ENABLE_RTT") - enableRtt = 0 - } else { - enableRtt = 1 - } - } - - if enableRtt == 0 { - // Cannot set the size of map to be 0 so set it to 1. - spec.Maps[flowSequencesMap].MaxEntries = uint32(1) - } else { - log.Debugf("RTT calculations are enabled") - } - enableDNSTracking := 0 if cfg.DNSTracker { enableDNSTracking = 1 @@ -124,7 +105,6 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { if err := spec.RewriteConstants(map[string]interface{}{ constSampling: uint32(cfg.Sampling), constTraceMessages: uint8(traceMsgs), - constEnableRtt: uint8(enableRtt), constEnableDNSTracking: uint8(enableDNSTracking), }); err != nil { return nil, fmt.Errorf("rewriting BPF constants definition: %w", err) @@ -154,6 +134,14 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { } } + var rttKprobeLink link.Link + if cfg.EnableRTT { + rttKprobeLink, err = link.Kprobe("tcp_rcv_established", objects.TcpRcvKprobe, nil) + if err != nil { + return nil, fmt.Errorf("failed to attach the BPF program to tcpReceiveKprobe: %w", err) + } + } + // read events from igress+egress ringbuffer flows, err := ringbuf.NewReader(objects.DirectFlows) if err != nil { @@ -169,6 +157,7 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) { enableIngress: cfg.EnableIngress, enableEgress: cfg.EnableEgress, pktDropsTracePoint: pktDropsLink, + rttKprobeLink: rttKprobeLink, }, nil } @@ -297,6 +286,11 @@ func (m *FlowFetcher) Close() error { errs = append(errs, err) } } + if m.rttKprobeLink != nil { + if err := m.rttKprobeLink.Close(); err != nil { + errs = append(errs, err) + } + } // m.ringbufReader.Read is a blocking operation, so we need to close the ring buffer // from another goroutine to avoid the system not being able to exit if there // isn't traffic in a given interface @@ -321,9 +315,6 @@ func (m *FlowFetcher) Close() error { if err := m.objects.DnsFlows.Close(); err != nil { errs = append(errs, err) } - if err := m.objects.FlowSequences.Close(); err != nil { - errs = append(errs, err) - } if len(errs) == 0 { m.objects = nil } @@ -425,7 +416,6 @@ func (m *FlowFetcher) LookupAndDeleteMap() map[BpfFlowId][]BpfFlowMetrics { // DeleteMapsStaleEntries Look for any stale entries in the features maps and delete them func (m *FlowFetcher) DeleteMapsStaleEntries(timeOut time.Duration) { m.lookupAndDeleteDNSMap(timeOut) - m.lookupAndDeleteRTTMap(timeOut) } // lookupAndDeleteDNSMap iterate over DNS queries map and delete any stale DNS requests @@ -449,28 +439,6 @@ func (m *FlowFetcher) lookupAndDeleteDNSMap(timeOut time.Duration) { } } -// lookupAndDeleteRTTMap iterate over flows sequence map and delete any -// stale flows that we never get responses for. -func (m *FlowFetcher) lookupAndDeleteRTTMap(timeOut time.Duration) { - monotonicTimeNow := monotime.Now() - rttMap := m.objects.FlowSequences - var rttKey BpfFlowSeqId - var rttVal uint64 - - if rttMap != nil { - iterator := rttMap.Iterate() - for iterator.Next(&rttKey, &rttVal) { - if time.Duration(uint64(monotonicTimeNow)-rttVal) >= timeOut { - if err := rttMap.Delete(rttKey); err != nil { - log.WithError(err).WithField("rttKey", rttKey). - Warnf("couldn't delete RTT record entry") - } - } - } - } - -} - // kernelSpecificLoadAndAssign based on kernel version it will load only the supported ebPF hooks func kernelSpecificLoadAndAssign(oldKernel bool, spec *ebpf.CollectionSpec) (BpfObjects, error) { objects := BpfObjects{} @@ -482,6 +450,7 @@ func kernelSpecificLoadAndAssign(oldKernel bool, spec *ebpf.CollectionSpec) (Bpf type NewBpfPrograms struct { EgressFlowParse *ebpf.Program `ebpf:"egress_flow_parse"` IngressFlowParse *ebpf.Program `ebpf:"ingress_flow_parse"` + TCPRcvKprobe *ebpf.Program `ebpf:"tcp_rcv_kprobe"` } type NewBpfObjects struct { NewBpfPrograms @@ -504,9 +473,9 @@ func kernelSpecificLoadAndAssign(oldKernel bool, spec *ebpf.CollectionSpec) (Bpf // Note for any future maps or programs make sure to copy them manually here objects.DirectFlows = newObjects.DirectFlows objects.AggregatedFlows = newObjects.AggregatedFlows - objects.FlowSequences = newObjects.FlowSequences objects.EgressFlowParse = newObjects.EgressFlowParse objects.IngressFlowParse = newObjects.IngressFlowParse + objects.TcpRcvKprobe = newObjects.TCPRcvKprobe objects.KfreeSkb = nil } else { if err := spec.LoadAndAssign(&objects, nil); err != nil { @@ -562,12 +531,9 @@ func NewPacketFetcher( objects.IngressFlowParse = nil objects.DirectFlows = nil objects.AggregatedFlows = nil - objects.FlowSequences = nil delete(spec.Programs, aggregatedFlowsMap) - delete(spec.Programs, flowSequencesMap) delete(spec.Programs, constSampling) delete(spec.Programs, constTraceMessages) - delete(spec.Programs, constEnableRtt) delete(spec.Programs, constEnableDNSTracking) pcaPort := 0