@@ -212,6 +212,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
212
212
struct genevehdr * gnvh = geneve_hdr (skb );
213
213
struct metadata_dst * tun_dst = NULL ;
214
214
struct pcpu_sw_netstats * stats ;
215
+ unsigned int len ;
215
216
int err = 0 ;
216
217
void * oiph ;
217
218
@@ -225,17 +226,22 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
225
226
tun_dst = udp_tun_rx_dst (skb , geneve_get_sk_family (gs ), flags ,
226
227
vni_to_tunnel_id (gnvh -> vni ),
227
228
gnvh -> opt_len * 4 );
228
- if (!tun_dst )
229
+ if (!tun_dst ) {
230
+ geneve -> dev -> stats .rx_dropped ++ ;
229
231
goto drop ;
232
+ }
230
233
/* Update tunnel dst according to Geneve options. */
231
234
ip_tunnel_info_opts_set (& tun_dst -> u .tun_info ,
232
235
gnvh -> options , gnvh -> opt_len * 4 );
233
236
} else {
234
237
/* Drop packets w/ critical options,
235
238
* since we don't support any...
236
239
*/
237
- if (gnvh -> critical )
240
+ if (gnvh -> critical ) {
241
+ geneve -> dev -> stats .rx_frame_errors ++ ;
242
+ geneve -> dev -> stats .rx_errors ++ ;
238
243
goto drop ;
244
+ }
239
245
}
240
246
241
247
skb_reset_mac_header (skb );
@@ -246,8 +252,10 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
246
252
skb_dst_set (skb , & tun_dst -> dst );
247
253
248
254
/* Ignore packet loops (and multicast echo) */
249
- if (ether_addr_equal (eth_hdr (skb )-> h_source , geneve -> dev -> dev_addr ))
255
+ if (ether_addr_equal (eth_hdr (skb )-> h_source , geneve -> dev -> dev_addr )) {
256
+ geneve -> dev -> stats .rx_errors ++ ;
250
257
goto drop ;
258
+ }
251
259
252
260
oiph = skb_network_header (skb );
253
261
skb_reset_network_header (skb );
@@ -279,13 +287,15 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
279
287
}
280
288
}
281
289
282
- stats = this_cpu_ptr (geneve -> dev -> tstats );
283
- u64_stats_update_begin (& stats -> syncp );
284
- stats -> rx_packets ++ ;
285
- stats -> rx_bytes += skb -> len ;
286
- u64_stats_update_end (& stats -> syncp );
287
-
288
- gro_cells_receive (& geneve -> gro_cells , skb );
290
+ len = skb -> len ;
291
+ err = gro_cells_receive (& geneve -> gro_cells , skb );
292
+ if (likely (err == NET_RX_SUCCESS )) {
293
+ stats = this_cpu_ptr (geneve -> dev -> tstats );
294
+ u64_stats_update_begin (& stats -> syncp );
295
+ stats -> rx_packets ++ ;
296
+ stats -> rx_bytes += len ;
297
+ u64_stats_update_end (& stats -> syncp );
298
+ }
289
299
return ;
290
300
drop :
291
301
/* Consume bad packet */
@@ -334,7 +344,7 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
334
344
struct geneve_sock * gs ;
335
345
int opts_len ;
336
346
337
- /* Need Geneve and inner Ethernet header to be present */
347
+ /* Need UDP and Geneve header to be present */
338
348
if (unlikely (!pskb_may_pull (skb , GENEVE_BASE_HLEN )))
339
349
goto drop ;
340
350
@@ -357,8 +367,10 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
357
367
opts_len = geneveh -> opt_len * 4 ;
358
368
if (iptunnel_pull_header (skb , GENEVE_BASE_HLEN + opts_len ,
359
369
htons (ETH_P_TEB ),
360
- !net_eq (geneve -> net , dev_net (geneve -> dev ))))
370
+ !net_eq (geneve -> net , dev_net (geneve -> dev )))) {
371
+ geneve -> dev -> stats .rx_dropped ++ ;
361
372
goto drop ;
373
+ }
362
374
363
375
geneve_rx (geneve , gs , skb );
364
376
return 0 ;
0 commit comments