This allows the user to specify the LWTUNNEL_IP_SRC/LWTUNNEL_IP6_SRC when setting an lwtunnel encapsulation route.
Signed-off-by: Shmulik Ladkani <shmulik.ladk...@gmail.com> --- 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 740da7c6..20d5545c 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -671,7 +671,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; @@ -694,6 +694,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; @@ -805,7 +814,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; @@ -828,6 +837,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.18.0