@@ -59,23 +59,6 @@ struct eth_hdr {
5959 __be16 proto ;
6060} __attribute__((packed ));
6161
62- struct packetHeaders {
63- uint64_t srcMac ;
64- uint64_t dstMac ;
65- uint16_t vlan ;
66- bool vlan_present ;
67- bool ip ;
68- uint32_t srcIp ;
69- uint32_t dstIp ;
70- uint8_t l4proto ;
71- uint16_t srcPort ;
72- uint16_t dstPort ;
73- };
74-
75- /*
76- * BPF map where a single element, the packet header
77- */
78- BPF_ARRAY (pkt_header , struct packetHeaders , 1 );
7962
8063/*
8164 * BPF map where a single element, packet timestamp
@@ -104,12 +87,6 @@ static __always_inline int handle_rx(struct CTXTYPE *ctx, struct pkt_metadata *m
10487 if (* status == OFF ){
10588 return RX_OK ;
10689 }
107-
108- struct packetHeaders * pkt ;
109- pkt = pkt_header .lookup (& key );
110- if (pkt == NULL ) {
111- return RX_DROP ;
112- }
11390
11491 /* Parsing L2 */
11592 void * data = (void * )(long )ctx -> data ;
@@ -118,20 +95,16 @@ static __always_inline int handle_rx(struct CTXTYPE *ctx, struct pkt_metadata *m
11895 if (data + sizeof (* ethernet ) > data_end )
11996 return RX_DROP ;
12097
121- pkt -> srcMac = ethernet -> src ;
122- pkt -> dstMac = ethernet -> dst ;
12398 uint16_t ether_type = ethernet -> proto ;
12499
125100 if (ctx -> vlan_present ) {
126101 ether_type = ctx -> vlan_proto ;
127- pkt -> vlan = (uint16_t )(ctx -> vlan_tci & 0x0fff );
128102 }
129103
130104 /* Parsing L3 */
131105 struct iphdr * ip = NULL ;
132106 struct tcphdr * tcp = NULL ;
133107 struct udphdr * udp = NULL ;
134- pkt -> ip = 0 ;
135108
136109 if (ether_type == bpf_htons (ETH_P_IP )) {
137110 ip = data + sizeof (* ethernet );
@@ -166,14 +139,11 @@ static __always_inline int handle_rx(struct CTXTYPE *ctx, struct pkt_metadata *m
166139 }
167140 }
168141
169- pkt -> ip = 1 ;
170- pkt -> srcIp = ip -> saddr ;
171- pkt -> dstIp = ip -> daddr ;
142+ uint8_t header_len = 4 * ip -> ihl ;
172143 if (ip -> protocol == IPPROTO_TCP ) {
173- tcp = data + sizeof (* ethernet ) + sizeof ( * ip ) ;
174- if (data + sizeof (* ethernet ) + sizeof ( * ip ) + sizeof (* tcp ) > data_end )
144+ tcp = data + sizeof (* ethernet ) + header_len ;
145+ if (data + sizeof (* ethernet ) + header_len + sizeof (* tcp ) > data_end )
175146 return RX_DROP ;
176- pkt -> l4proto = IPPROTO_TCP ;
177147
178148 /* src port filter */
179149 if ((filters_tab -> src_port_flag == true) && (filters_tab -> src_port_filter != ntohs (tcp -> source ))){
@@ -184,21 +154,18 @@ static __always_inline int handle_rx(struct CTXTYPE *ctx, struct pkt_metadata *m
184154 if ((filters_tab -> dst_port_flag == true) && (filters_tab -> dst_port_filter != ntohs (tcp -> dest ))){
185155 return RX_OK ;
186156 }
187-
188- pkt -> srcPort = tcp -> source ;
189- pkt -> dstPort = tcp -> dest ;
190157 } else if (ip -> protocol == IPPROTO_UDP ) {
191- udp = data + sizeof (* ethernet ) + sizeof ( * ip ) ;
192- if (data + sizeof (* ethernet ) + sizeof ( * ip ) + sizeof (* udp ) > data_end )
158+ udp = data + sizeof (* ethernet ) + header_len ;
159+ if (data + sizeof (* ethernet ) + header_len + sizeof (* udp ) > data_end )
193160 return RX_DROP ;
194- pkt -> l4proto = IPPROTO_UDP ;
195- pkt -> srcPort = udp -> source ;
196- pkt -> dstPort = udp -> dest ;
197161 }
198162
199163 }
200164
201- /* Getting packet timestamp */
165+ /* Getting packet timestamp
166+ *
167+ * see line 61 in Packetcapture.cpp for more details about timestamping algorithm
168+ */
202169 uint64_t * pkt_timestamp = packet_timestamp .lookup (& key );
203170 if (!pkt_timestamp ){
204171 return RX_DROP ;
0 commit comments