From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shmulik Ladkani Subject: [PATCH iproute2-next] iproute_lwtunnel: allow specifying 'src' for 'encap ip' / 'encap ip6' Date: Fri, 17 Aug 2018 10:31:34 +0300 Message-ID: <20180817073134.19569-1-shmulik.ladkani@gmail.com> Cc: netdev@vger.kernel.org, shmulik.ladkani@metanetworks.com, Shmulik Ladkani To: stephen@networkplumber.org, dsahern@gmail.com Return-path: Received: from mail-wr1-f68.google.com ([209.85.221.68]:40550 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726504AbeHQKeI (ORCPT ); Fri, 17 Aug 2018 06:34:08 -0400 Received: by mail-wr1-f68.google.com with SMTP id h15-v6so6227848wrs.7 for ; Fri, 17 Aug 2018 00:31:49 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: This allows the user to specify the LWTUNNEL_IP_SRC/LWTUNNEL_IP6_SRC when setting an lwtunnel encapsulation route. Signed-off-by: Shmulik Ladkani --- 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