This patch adds support for the L2ENCAP seg6 mode, enabling to encapsulate L2 frames within SRv6 packets.
Signed-off-by: David Lebrun <david.leb...@uclouvain.be> --- ip/iproute_lwtunnel.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index 14294c6..f125670 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -110,6 +110,30 @@ static void print_srh(FILE *fp, struct ipv6_sr_hdr *srh) } } +static const char *format_seg6mode_type(int mode) +{ + if (mode == SEG6_IPTUN_MODE_ENCAP) + return "encap"; + else if (mode == SEG6_IPTUN_MODE_INLINE) + return "inline"; + else if (mode == SEG6_IPTUN_MODE_L2ENCAP) + return "l2encap"; + + return "<unknown>"; +} + +static int read_seg6mode_type(const char *mode) +{ + if (strcmp(mode, "encap") == 0) + return SEG6_IPTUN_MODE_ENCAP; + else if (strcmp(mode, "inline") == 0) + return SEG6_IPTUN_MODE_INLINE; + else if (strcmp(mode, "l2encap") == 0) + return SEG6_IPTUN_MODE_L2ENCAP; + + return -1; +} + static void print_encap_seg6(FILE *fp, struct rtattr *encap) { struct rtattr *tb[SEG6_IPTUNNEL_MAX+1]; @@ -121,8 +145,7 @@ static void print_encap_seg6(FILE *fp, struct rtattr *encap) return; tuninfo = RTA_DATA(tb[SEG6_IPTUNNEL_SRH]); - fprintf(fp, "mode %s ", - (tuninfo->mode == SEG6_IPTUN_MODE_ENCAP) ? "encap" : "inline"); + fprintf(fp, "mode %s ", format_seg6mode_type(tuninfo->mode)); print_srh(fp, tuninfo->srh); } @@ -457,11 +480,8 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp, NEXT_ARG(); if (mode_ok++) duparg2("mode", *argv); - if (strcmp(*argv, "encap") == 0) - encap = 1; - else if (strcmp(*argv, "inline") == 0) - encap = 0; - else + encap = read_seg6mode_type(*argv); + if (encap < 0) invarg("\"mode\" value is invalid\n", *argv); } else if (strcmp(*argv, "segs") == 0) { NEXT_ARG(); @@ -490,10 +510,7 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp, tuninfo = malloc(sizeof(*tuninfo) + srhlen); memset(tuninfo, 0, sizeof(*tuninfo) + srhlen); - if (encap) - tuninfo->mode = SEG6_IPTUN_MODE_ENCAP; - else - tuninfo->mode = SEG6_IPTUN_MODE_INLINE; + tuninfo->mode = encap; memcpy(tuninfo->srh, srh, srhlen); -- 2.10.2