@@ -299,9 +299,10 @@ void skb_flow_dissect_meta(const struct sk_buff *skb,
299299EXPORT_SYMBOL (skb_flow_dissect_meta );
300300
301301static void
302- skb_flow_dissect_set_enc_addr_type (enum flow_dissector_key_id type ,
303- struct flow_dissector * flow_dissector ,
304- void * target_container )
302+ skb_flow_dissect_set_enc_control (enum flow_dissector_key_id type ,
303+ u32 ctrl_flags ,
304+ struct flow_dissector * flow_dissector ,
305+ void * target_container )
305306{
306307 struct flow_dissector_key_control * ctrl ;
307308
@@ -312,6 +313,7 @@ skb_flow_dissect_set_enc_addr_type(enum flow_dissector_key_id type,
312313 FLOW_DISSECTOR_KEY_ENC_CONTROL ,
313314 target_container );
314315 ctrl -> addr_type = type ;
316+ ctrl -> flags = ctrl_flags ;
315317}
316318
317319void
@@ -367,6 +369,7 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
367369{
368370 struct ip_tunnel_info * info ;
369371 struct ip_tunnel_key * key ;
372+ u32 ctrl_flags = 0 ;
370373
371374 /* A quick check to see if there might be something to do. */
372375 if (!dissector_uses_key (flow_dissector ,
@@ -382,9 +385,7 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
382385 !dissector_uses_key (flow_dissector ,
383386 FLOW_DISSECTOR_KEY_ENC_IP ) &&
384387 !dissector_uses_key (flow_dissector ,
385- FLOW_DISSECTOR_KEY_ENC_OPTS ) &&
386- !dissector_uses_key (flow_dissector ,
387- FLOW_DISSECTOR_KEY_ENC_FLAGS ))
388+ FLOW_DISSECTOR_KEY_ENC_OPTS ))
388389 return ;
389390
390391 info = skb_tunnel_info (skb );
@@ -393,11 +394,20 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
393394
394395 key = & info -> key ;
395396
397+ if (test_bit (IP_TUNNEL_CSUM_BIT , key -> tun_flags ))
398+ ctrl_flags |= FLOW_DIS_F_TUNNEL_CSUM ;
399+ if (test_bit (IP_TUNNEL_DONT_FRAGMENT_BIT , key -> tun_flags ))
400+ ctrl_flags |= FLOW_DIS_F_TUNNEL_DONT_FRAGMENT ;
401+ if (test_bit (IP_TUNNEL_OAM_BIT , key -> tun_flags ))
402+ ctrl_flags |= FLOW_DIS_F_TUNNEL_OAM ;
403+ if (test_bit (IP_TUNNEL_CRIT_OPT_BIT , key -> tun_flags ))
404+ ctrl_flags |= FLOW_DIS_F_TUNNEL_CRIT_OPT ;
405+
396406 switch (ip_tunnel_info_af (info )) {
397407 case AF_INET :
398- skb_flow_dissect_set_enc_addr_type (FLOW_DISSECTOR_KEY_IPV4_ADDRS ,
399- flow_dissector ,
400- target_container );
408+ skb_flow_dissect_set_enc_control (FLOW_DISSECTOR_KEY_IPV4_ADDRS ,
409+ ctrl_flags , flow_dissector ,
410+ target_container );
401411 if (dissector_uses_key (flow_dissector ,
402412 FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS )) {
403413 struct flow_dissector_key_ipv4_addrs * ipv4 ;
@@ -410,9 +420,9 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
410420 }
411421 break ;
412422 case AF_INET6 :
413- skb_flow_dissect_set_enc_addr_type (FLOW_DISSECTOR_KEY_IPV6_ADDRS ,
414- flow_dissector ,
415- target_container );
423+ skb_flow_dissect_set_enc_control (FLOW_DISSECTOR_KEY_IPV6_ADDRS ,
424+ ctrl_flags , flow_dissector ,
425+ target_container );
416426 if (dissector_uses_key (flow_dissector ,
417427 FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS )) {
418428 struct flow_dissector_key_ipv6_addrs * ipv6 ;
@@ -424,6 +434,10 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
424434 ipv6 -> dst = key -> u .ipv6 .dst ;
425435 }
426436 break ;
437+ default :
438+ skb_flow_dissect_set_enc_control (0 , ctrl_flags , flow_dissector ,
439+ target_container );
440+ break ;
427441 }
428442
429443 if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_ENC_KEYID )) {
@@ -477,18 +491,6 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
477491 IP_TUNNEL_GENEVE_OPT_BIT );
478492 enc_opt -> dst_opt_type = val < __IP_TUNNEL_FLAG_NUM ? val : 0 ;
479493 }
480-
481- if (dissector_uses_key (flow_dissector , FLOW_DISSECTOR_KEY_ENC_FLAGS )) {
482- struct flow_dissector_key_enc_flags * enc_flags ;
483- IP_TUNNEL_DECLARE_FLAGS (flags ) = {};
484-
485- enc_flags = skb_flow_dissector_target (flow_dissector ,
486- FLOW_DISSECTOR_KEY_ENC_FLAGS ,
487- target_container );
488- ip_tunnel_set_encflags_present (flags );
489- ip_tunnel_flags_and (flags , flags , info -> key .tun_flags );
490- enc_flags -> flags = bitmap_read (flags , IP_TUNNEL_CSUM_BIT , 32 );
491- }
492494}
493495EXPORT_SYMBOL (skb_flow_dissect_tunnel_info );
494496
0 commit comments