From: wenxu <we...@ucloud.cn> ip l add dev tun type gretap external ip r a 10.0.0.1 encap ip dst 192.168.152.171 id 1000 dev gretap
For gretap example when the command set the id but don't set the TUNNEL_KEY flags. There is no key field in the send packet Signed-off-by: wenxu <we...@ucloud.cn> --- include/uapi/linux/if_tunnel.h | 20 ++++++++++++++++++++ ip/iproute_lwtunnel.c | 11 ++++++++++- 2 files changed, 30 insertions(+), 1 deletions(-) diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h index ecdc766..c7f0a5e 100644 --- a/include/uapi/linux/if_tunnel.h +++ b/include/uapi/linux/if_tunnel.h @@ -160,4 +160,24 @@ enum { }; #define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1) + +#define TUNNEL_CSUM __cpu_to_be16(0x01) +#define TUNNEL_ROUTING __cpu_to_be16(0x02) +#define TUNNEL_KEY __cpu_to_be16(0x04) +#define TUNNEL_SEQ __cpu_to_be16(0x08) +#define TUNNEL_STRICT __cpu_to_be16(0x10) +#define TUNNEL_REC __cpu_to_be16(0x20) +#define TUNNEL_VERSION __cpu_to_be16(0x40) +#define TUNNEL_NO_KEY __cpu_to_be16(0x80) +#define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) +#define TUNNEL_OAM __cpu_to_be16(0x0200) +#define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) +#define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) +#define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) +#define TUNNEL_NOCACHE __cpu_to_be16(0x2000) +#define TUNNEL_ERSPAN_OPT __cpu_to_be16(0x4000) + +#define TUNNEL_OPTIONS_PRESENT \ + (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT | TUNNEL_ERSPAN_OPT) + #endif /* _IF_TUNNEL_H_ */ diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index aee18ac..c659035 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -18,6 +18,7 @@ #include <string.h> #include <linux/ila.h> #include <linux/lwtunnel.h> +#include <linux/if_tunnel.h> #include <linux/mpls_iptunnel.h> #include <errno.h> @@ -31,7 +32,6 @@ #include <linux/seg6_iptunnel.h> #include <linux/seg6_hmac.h> #include <linux/seg6_local.h> -#include <net/if.h> static const char *format_encap_type(int type) { @@ -780,12 +780,14 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, char **argv = *argvp; int argc = *argcp; int ret = 0; + __u16 flags = 0; while (argc > 0) { if (strcmp(*argv, "id") == 0) { __u64 id; NEXT_ARG(); + flags |= TUNNEL_KEY; if (id_ok++) duparg2("id", *argv); if (get_be64(&id, *argv, 0)) @@ -835,6 +837,9 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, argc--; argv++; } + if (flags) + ret = rta_addattr16(rta, len, LWTUNNEL_IP_FLAGS, flags); + /* argv is currently the first unparsed argument, * but the lwt_parse_encap() caller will move to the next, * so step back @@ -930,12 +935,14 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, char **argv = *argvp; int argc = *argcp; int ret = 0; + __u16 flags = 0; while (argc > 0) { if (strcmp(*argv, "id") == 0) { __u64 id; NEXT_ARG(); + flags |= TUNNEL_KEY; if (id_ok++) duparg2("id", *argv); if (get_be64(&id, *argv, 0)) @@ -987,6 +994,8 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, argc--; argv++; } + if (flags) + ret = rta_addattr16(rta, len, LWTUNNEL_IP_FLAGS, flags); /* argv is currently the first unparsed argument, * but the lwt_parse_encap() caller will move to the next, * so step back -- 1.7.1