From 94a8722f2f78f04c47678cf864ac234a38366709 Mon Sep 17 00:00:00 2001 From: Shmulik Ladkani Date: Fri, 17 Aug 2018 10:31:34 +0300 Subject: [PATCH] iproute_lwtunnel: allow specifying 'src' for 'encap ip' / 'encap ip6' This allows the user to specify the LWTUNNEL_IP_SRC/LWTUNNEL_IP6_SRC when setting an lwtunnel encapsulation route. Signed-off-by: Shmulik Ladkani Signed-off-by: David Ahern --- ip/iproute_lwtunnel.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index e60448114..14fdd8ed0 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -765,7 +765,7 @@ static int parse_encap_mpls(struct rtattr *rta, size_t len, static int parse_encap_ip(struct rtattr *rta, size_t len, int *argcp, char ***argvp) { - int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0; + int id_ok = 0, dst_ok = 0, src_ok = 0, tos_ok = 0, ttl_ok = 0; char **argv = *argvp; int argc = *argcp; @@ -788,6 +788,15 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, get_addr(&addr, *argv, AF_INET); rta_addattr_l(rta, len, LWTUNNEL_IP_DST, &addr.data, addr.bytelen); + } else if (strcmp(*argv, "src") == 0) { + inet_prefix addr; + + NEXT_ARG(); + if (src_ok++) + duparg2("src", *argv); + get_addr(&addr, *argv, AF_INET); + rta_addattr_l(rta, len, LWTUNNEL_IP_SRC, + &addr.data, addr.bytelen); } else if (strcmp(*argv, "tos") == 0) { __u32 tos; @@ -899,7 +908,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, static int parse_encap_ip6(struct rtattr *rta, size_t len, int *argcp, char ***argvp) { - int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0; + int id_ok = 0, dst_ok = 0, src_ok = 0, tos_ok = 0, ttl_ok = 0; char **argv = *argvp; int argc = *argcp; @@ -922,6 +931,15 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, get_addr(&addr, *argv, AF_INET6); rta_addattr_l(rta, len, LWTUNNEL_IP6_DST, &addr.data, addr.bytelen); + } else if (strcmp(*argv, "src") == 0) { + inet_prefix addr; + + NEXT_ARG(); + if (src_ok++) + duparg2("src", *argv); + get_addr(&addr, *argv, AF_INET6); + rta_addattr_l(rta, len, LWTUNNEL_IP6_SRC, + &addr.data, addr.bytelen); } else if (strcmp(*argv, "tc") == 0) { __u32 tc; -- 2.47.2