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 | 6 ++++++ ip/iproute_lwtunnel.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletions(-) diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h index ecdc766..40b8009 100644 --- a/include/uapi/linux/if_tunnel.h +++ b/include/uapi/linux/if_tunnel.h @@ -160,4 +160,10 @@ enum { }; #define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1) + +#define TUNNEL_CSUM __cpu_to_be16(0x01) +#define TUNNEL_KEY __cpu_to_be16(0x04) +#define TUNNEL_SEQ __cpu_to_be16(0x08) +#define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) + #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