From 6d9d2e7dabdd291f81bc212b7bc2a7b38c6dc7fa Mon Sep 17 00:00:00 2001
From: Dushyant Behl <dushyantbehl@users.noreply.github.com>
Date: Fri, 4 Aug 2023 20:42:11 +0530
Subject: [PATCH] NETOBSERV-1112: This patch fixes a bug where RTT was not
 visible for flow logs at times. (#159)

* Make RTT values show up on both flow directions

* Fix RTT calculation error for container hooks.

Signed-off-by: Dushyant Behl <dushyantbehl@hotmail.com>
Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com>

---------

Signed-off-by: Dushyant Behl <dushyantbehl@hotmail.com>
Signed-off-by: Dushyant Behl <dushyantbehl@users.noreply.github.com>
---
 bpf/dns_tracker.h                             |   2 +-
 bpf/flows.c                                   |  33 ++---
 bpf/rtt_tracker.h                             | 128 +++++++++++++-----
 bpf/types.h                                   |   7 +-
 .../server/flowlogs-dump-collector.go         |   8 +-
 pkg/ebpf/bpf_bpfeb.go                         |  12 +-
 pkg/ebpf/bpf_bpfeb.o                          | Bin 81168 -> 92800 bytes
 pkg/ebpf/bpf_bpfel.go                         |  12 +-
 pkg/ebpf/bpf_bpfel.o                          | Bin 83128 -> 94768 bytes
 pkg/ebpf/tracer.go                            |   2 +
 10 files changed, 130 insertions(+), 74 deletions(-)

diff --git a/bpf/dns_tracker.h b/bpf/dns_tracker.h
index 97e124ea..48506eba 100644
--- a/bpf/dns_tracker.h
+++ b/bpf/dns_tracker.h
@@ -97,7 +97,7 @@ static inline int trace_dns(struct sk_buff *skb) {
         if ((bpf_ntohs(dns.flags) & DNS_QR_FLAG) == 0) { /* dns query */
             fill_dns_id(&id, &dns_req, bpf_ntohs(dns.id), false);
             if (bpf_map_lookup_elem(&dns_flows, &dns_req) == NULL) {
-               u64 ts = bpf_ktime_get_ns();
+                u64 ts = bpf_ktime_get_ns();
                 bpf_map_update_elem(&dns_flows, &dns_req, &ts, BPF_ANY);
             }
             id.direction = EGRESS;
diff --git a/bpf/flows.c b/bpf/flows.c
index 4aa3931d..373bc561 100644
--- a/bpf/flows.c
+++ b/bpf/flows.c
@@ -40,17 +40,14 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
         return TC_ACT_OK;
     }
 
-    // Record the current time first.
-    u64 current_time = bpf_ktime_get_ns();
+    pkt_info pkt;
+    __builtin_memset(&pkt, 0, sizeof(pkt));
 
     flow_id id;
     __builtin_memset(&id, 0, sizeof(id));
 
-    pkt_info pkt;
-    __builtin_memset(&pkt, 0, sizeof(pkt));
-
+    pkt.current_ts = bpf_ktime_get_ns(); // Record the current time first.
     pkt.id = &id;
-    pkt.current_ts = current_time;
 
     void *data_end = (void *)(long)skb->data_end;
     void *data = (void *)(long)skb->data;
@@ -60,30 +57,28 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
         return TC_ACT_OK;
     }
 
-    if (enable_rtt) {
-        // This is currently gated as its not to be enabled by default.
-        calculate_flow_rtt(&pkt, direction, data_end);
-    }
-
     //Set extra fields
     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);
+    }
+
     // TODO: we need to add spinlock here when we deprecate versions prior to 5.1, or provide
     // a spinlocked alternative version and use it selectively https://lwn.net/Articles/779120/
     flow_metrics *aggregate_flow = (flow_metrics *)bpf_map_lookup_elem(&aggregated_flows, &id);
     if (aggregate_flow != NULL) {
         aggregate_flow->packets += 1;
         aggregate_flow->bytes += skb->len;
-        aggregate_flow->end_mono_time_ts = current_time;
+        aggregate_flow->end_mono_time_ts = pkt.current_ts;
         aggregate_flow->flags |= pkt.flags;
 
         // Does not matter the gate. Will be zero if not enabled.
-        if (pkt.rtt > 0) {
-            /* Since RTT is calculated for few packets we need to check if it is non zero value then only we update
-             * the flow. If we remove this check a packet which fails to calculate RTT will override the previous valid
-             * RTT with 0.
-             */
+        if (pkt.rtt > aggregate_flow->flow_rtt) {
             aggregate_flow->flow_rtt = pkt.rtt;
         }
 
@@ -101,8 +96,8 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) {
         flow_metrics new_flow = {
             .packets = 1,
             .bytes = skb->len,
-            .start_mono_time_ts = current_time,
-            .end_mono_time_ts = current_time,
+            .start_mono_time_ts = pkt.current_ts,
+            .end_mono_time_ts = pkt.current_ts,
             .flags = pkt.flags,
             .flow_rtt = pkt.rtt
         };
diff --git a/bpf/rtt_tracker.h b/bpf/rtt_tracker.h
index d4c81b72..a5cd98f8 100644
--- a/bpf/rtt_tracker.h
+++ b/bpf/rtt_tracker.h
@@ -10,9 +10,11 @@
 #include "utils.h"
 #include "maps_definition.h"
 
-static __always_inline void fill_flow_seq_id(flow_seq_id *seq_id, pkt_info *pkt, u32 seq, u8 reversed) {
+const u64 MIN_RTT = 50000; //50 micro seconds
+
+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 (reversed) {
+    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;
@@ -23,49 +25,104 @@ static __always_inline void fill_flow_seq_id(flow_seq_id *seq_id, pkt_info *pkt,
         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;
 }
 
-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 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.*/
+}
 
-    switch (direction) {
-    case EGRESS: {
-        if (IS_SYN_PACKET(pkt)) {
-            // Record the outgoing syn sequence number
-            u32 seq = bpf_ntohl(tcp->seq);
-            fill_flow_seq_id(seq_id, pkt, seq, 0);
+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);
 
-            long ret = bpf_map_update_elem(&flow_sequences, seq_id, &pkt->current_ts, BPF_ANY);
+    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("err saving flow sequence record %d", ret);
+                bpf_printk("error updating rtt value in flow %d\n", ret);
             }
         }
-        break;
     }
-    case INGRESS: {
-        if (IS_ACK_PACKET(pkt)) {
-            // 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, 1);
-
-            u64 *prev_ts = (u64 *)bpf_map_lookup_elem(&flow_sequences, seq_id);
-            if (prev_ts != NULL) {
-                pkt->rtt = pkt->current_ts - *prev_ts;
-                // 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);
-                }
-            }
+}
+
+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;
         }
-        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);
+        }
+        // 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);
     }
+    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 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;
+    }
+
+    /* 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);
+    }
+    else if (tcp->ack) {
+        __calculate_tcp_rtt(pkt, tcp, seq_id);
+    }
+    else if (tcp->syn) {
+        __store_tcp_ts(pkt, tcp, seq_id);
     }
 }
 
@@ -83,5 +140,4 @@ static __always_inline void calculate_flow_rtt(pkt_info *pkt, u8 direction, void
     }
 }
 
-#endif /* __RTT_TRACKER_H__ */
-
+#endif /* __RTT_TRACKER_H__ */
\ No newline at end of file
diff --git a/bpf/types.h b/bpf/types.h
index dcc2a316..db460886 100644
--- a/bpf/types.h
+++ b/bpf/types.h
@@ -22,9 +22,6 @@
 #define FIN_ACK_FLAG 0x200
 #define RST_ACK_FLAG 0x400
 
-#define IS_SYN_PACKET(pkt)    ((pkt->flags & SYN_FLAG) || (pkt->flags & SYN_ACK_FLAG))
-#define IS_ACK_PACKET(pkt)    ((pkt->flags & ACK_FLAG) || (pkt->flags & SYN_ACK_FLAG))
-
 #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
     __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
 #define bpf_ntohs(x)        __builtin_bswap16(x)
@@ -124,7 +121,7 @@ typedef struct flow_id_t {
 // Force emitting struct flow_id into the ELF.
 const struct flow_id_t *unused2 __attribute__((unused));
 
-// Standard 4 tuple and a sequence identifier.
+// Standard 4 tuple, transport protocol and a sequence identifier.
 // No need to emit this struct. It's used only in kernel space
 typedef struct flow_seq_id_t {
     u16 src_port;
@@ -132,6 +129,8 @@ typedef struct flow_seq_id_t {
     u8 src_ip[IP_MAX_LEN];
     u8 dst_ip[IP_MAX_LEN];
     u32 seq_id;
+    u8 transport_protocol;
+    u32 if_index; // OS interface index
 } __attribute__((packed)) flow_seq_id;
 
 // Flow record is a tuple containing both flow identifier and metrics. It is used to send
diff --git a/examples/flowlogs-dump/server/flowlogs-dump-collector.go b/examples/flowlogs-dump/server/flowlogs-dump-collector.go
index c8c6f2f6..bed9028f 100644
--- a/examples/flowlogs-dump/server/flowlogs-dump-collector.go
+++ b/examples/flowlogs-dump/server/flowlogs-dump-collector.go
@@ -72,7 +72,7 @@ func main() {
 	for records := range receivedRecords {
 		for _, record := range records.Entries {
 			if record.EthProtocol == ipv6 {
-				log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt %v\n",
+				log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v\n",
 					ipProto[record.EthProtocol],
 					record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"),
 					record.Interface,
@@ -91,10 +91,10 @@ func main() {
 					record.GetDnsId(),
 					record.GetDnsFlags(),
 					record.DnsLatency.AsDuration().Milliseconds(),
-					record.TimeFlowRtt.AsDuration().Microseconds(),
+					record.TimeFlowRtt.AsDuration().Nanoseconds(),
 				)
 			} else {
-				log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt %v\n",
+				log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v\n",
 					ipProto[record.EthProtocol],
 					record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"),
 					record.Interface,
@@ -113,7 +113,7 @@ func main() {
 					record.GetDnsId(),
 					record.GetDnsFlags(),
 					record.DnsLatency.AsDuration().Milliseconds(),
-					record.TimeFlowRtt.AsDuration().Microseconds(),
+					record.TimeFlowRtt.AsDuration().Nanoseconds(),
 				)
 			}
 		}
diff --git a/pkg/ebpf/bpf_bpfeb.go b/pkg/ebpf/bpf_bpfeb.go
index b2295c91..bd6a95c7 100644
--- a/pkg/ebpf/bpf_bpfeb.go
+++ b/pkg/ebpf/bpf_bpfeb.go
@@ -64,11 +64,13 @@ type BpfFlowRecordT struct {
 }
 
 type BpfFlowSeqId struct {
-	SrcPort uint16
-	DstPort uint16
-	SrcIp   [16]uint8
-	DstIp   [16]uint8
-	SeqId   uint32
+	SrcPort           uint16
+	DstPort           uint16
+	SrcIp             [16]uint8
+	DstIp             [16]uint8
+	SeqId             uint32
+	TransportProtocol uint8
+	IfIndex           uint32
 }
 
 type BpfPktDropsT struct {
diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o
index 96f86b75e0c0741ebfb37639f83ad9140471d613..b7d0979401747cc2a100c166a54cac0156314c5b 100644
GIT binary patch
delta 29048
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
L!2nVR!*KNgyTr@V

delta 18250
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
H1Y-dJ^xp9S

diff --git a/pkg/ebpf/bpf_bpfel.go b/pkg/ebpf/bpf_bpfel.go
index 890682d5..cfc06c8f 100644
--- a/pkg/ebpf/bpf_bpfel.go
+++ b/pkg/ebpf/bpf_bpfel.go
@@ -64,11 +64,13 @@ type BpfFlowRecordT struct {
 }
 
 type BpfFlowSeqId struct {
-	SrcPort uint16
-	DstPort uint16
-	SrcIp   [16]uint8
-	DstIp   [16]uint8
-	SeqId   uint32
+	SrcPort           uint16
+	DstPort           uint16
+	SrcIp             [16]uint8
+	DstIp             [16]uint8
+	SeqId             uint32
+	TransportProtocol uint8
+	IfIndex           uint32
 }
 
 type BpfPktDropsT struct {
diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o
index 91758a5b344832ea6dad8ff7b92cd097a515c560..6cc2976532c7ce9021e109fa087c940ab959b188 100644
GIT binary patch
delta 27349
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

delta 17103
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
BnG65`

diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go
index 0db9308c..acdea31e 100644
--- a/pkg/ebpf/tracer.go
+++ b/pkg/ebpf/tracer.go
@@ -101,6 +101,8 @@ func NewFlowFetcher(cfg *FlowFetcherConfig) (*FlowFetcher, error) {
 	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")
 	}
 
 	if !cfg.DNSTracker {
-- 
GitLab