@@ -179,6 +179,7 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
179179
180180 return segs ;
181181}
182+ EXPORT_SYMBOL (skb_udp_tunnel_segment );
182183
183184static struct sk_buff * udp4_ufo_fragment (struct sk_buff * skb ,
184185 netdev_features_t features )
@@ -304,13 +305,13 @@ void udp_del_offload(struct udp_offload *uo)
304305EXPORT_SYMBOL (udp_del_offload );
305306
306307struct sk_buff * * udp_gro_receive (struct sk_buff * * head , struct sk_buff * skb ,
307- struct udphdr * uh )
308+ struct udphdr * uh , udp_lookup_t lookup )
308309{
309- struct udp_offload_priv * uo_priv ;
310310 struct sk_buff * p , * * pp = NULL ;
311311 struct udphdr * uh2 ;
312312 unsigned int off = skb_gro_offset (skb );
313313 int flush = 1 ;
314+ struct sock * sk ;
314315
315316 if (NAPI_GRO_CB (skb )-> encap_mark ||
316317 (skb -> ip_summed != CHECKSUM_PARTIAL &&
@@ -322,13 +323,11 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
322323 NAPI_GRO_CB (skb )-> encap_mark = 1 ;
323324
324325 rcu_read_lock ();
325- uo_priv = rcu_dereference (udp_offload_base );
326- for (; uo_priv != NULL ; uo_priv = rcu_dereference (uo_priv -> next )) {
327- if (net_eq (read_pnet (& uo_priv -> net ), dev_net (skb -> dev )) &&
328- uo_priv -> offload -> port == uh -> dest &&
329- uo_priv -> offload -> callbacks .gro_receive )
330- goto unflush ;
331- }
326+ sk = (* lookup )(skb , uh -> source , uh -> dest );
327+
328+ if (sk && udp_sk (sk )-> gro_receive )
329+ goto unflush ;
330+
332331 goto out_unlock ;
333332
334333unflush :
@@ -352,16 +351,15 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
352351
353352 skb_gro_pull (skb , sizeof (struct udphdr )); /* pull encapsulating udp header */
354353 skb_gro_postpull_rcsum (skb , uh , sizeof (struct udphdr ));
355- NAPI_GRO_CB (skb )-> proto = uo_priv -> offload -> ipproto ;
356- pp = uo_priv -> offload -> callbacks .gro_receive (head , skb ,
357- uo_priv -> offload );
354+ pp = udp_sk (sk )-> gro_receive (sk , head , skb );
358355
359356out_unlock :
360357 rcu_read_unlock ();
361358out :
362359 NAPI_GRO_CB (skb )-> flush |= flush ;
363360 return pp ;
364361}
362+ EXPORT_SYMBOL (udp_gro_receive );
365363
366364static struct sk_buff * * udp4_gro_receive (struct sk_buff * * head ,
367365 struct sk_buff * skb )
@@ -383,39 +381,28 @@ static struct sk_buff **udp4_gro_receive(struct sk_buff **head,
383381 inet_gro_compute_pseudo );
384382skip :
385383 NAPI_GRO_CB (skb )-> is_ipv6 = 0 ;
386- return udp_gro_receive (head , skb , uh );
384+ return udp_gro_receive (head , skb , uh , udp4_lib_lookup_skb );
387385
388386flush :
389387 NAPI_GRO_CB (skb )-> flush = 1 ;
390388 return NULL ;
391389}
392390
393- int udp_gro_complete (struct sk_buff * skb , int nhoff )
391+ int udp_gro_complete (struct sk_buff * skb , int nhoff ,
392+ udp_lookup_t lookup )
394393{
395- struct udp_offload_priv * uo_priv ;
396394 __be16 newlen = htons (skb -> len - nhoff );
397395 struct udphdr * uh = (struct udphdr * )(skb -> data + nhoff );
398396 int err = - ENOSYS ;
397+ struct sock * sk ;
399398
400399 uh -> len = newlen ;
401400
402401 rcu_read_lock ();
403-
404- uo_priv = rcu_dereference (udp_offload_base );
405- for (; uo_priv != NULL ; uo_priv = rcu_dereference (uo_priv -> next )) {
406- if (net_eq (read_pnet (& uo_priv -> net ), dev_net (skb -> dev )) &&
407- uo_priv -> offload -> port == uh -> dest &&
408- uo_priv -> offload -> callbacks .gro_complete )
409- break ;
410- }
411-
412- if (uo_priv ) {
413- NAPI_GRO_CB (skb )-> proto = uo_priv -> offload -> ipproto ;
414- err = uo_priv -> offload -> callbacks .gro_complete (skb ,
415- nhoff + sizeof (struct udphdr ),
416- uo_priv -> offload );
417- }
418-
402+ sk = (* lookup )(skb , uh -> source , uh -> dest );
403+ if (sk && udp_sk (sk )-> gro_complete )
404+ err = udp_sk (sk )-> gro_complete (sk , skb ,
405+ nhoff + sizeof (struct udphdr ));
419406 rcu_read_unlock ();
420407
421408 if (skb -> remcsum_offload )
@@ -426,6 +413,7 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff)
426413
427414 return err ;
428415}
416+ EXPORT_SYMBOL (udp_gro_complete );
429417
430418static int udp4_gro_complete (struct sk_buff * skb , int nhoff )
431419{
@@ -440,7 +428,7 @@ static int udp4_gro_complete(struct sk_buff *skb, int nhoff)
440428 skb_shinfo (skb )-> gso_type |= SKB_GSO_UDP_TUNNEL ;
441429 }
442430
443- return udp_gro_complete (skb , nhoff );
431+ return udp_gro_complete (skb , nhoff , udp4_lib_lookup_skb );
444432}
445433
446434static const struct net_offload udpv4_offload = {
0 commit comments