On Fri, 17 Aug 2018 10:31:34 +0300 Shmulik Ladkani <shmu...@metanetworks.com> wrote:
> 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; > If you accept an attribute on input you need to parse it and display it the same way in the show command.