Add configuration of ila LWT tunnels for checksum mode including
checksum neutral translation.

Signed-off-by: Tom Herbert <t...@herbertland.com>
---
 ip/iproute_lwtunnel.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 56 insertions(+), 2 deletions(-)

diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
index bdbb15d..b656143 100644
--- a/ip/iproute_lwtunnel.c
+++ b/ip/iproute_lwtunnel.c
@@ -90,6 +90,32 @@ static void print_encap_ip(FILE *fp, struct rtattr *encap)
                fprintf(fp, "tos %d ", rta_getattr_u8(tb[LWTUNNEL_IP_TOS]));
 }
 
+static char *ila_csum_mode2name(__u8 csum_mode)
+{
+       switch (csum_mode) {
+       case ILA_CSUM_ADJUST_TRANSPORT:
+               return "adj-transport";
+       case ILA_CSUM_NEUTRAL_MAP:
+               return "neutral-map";
+       case ILA_CSUM_NO_ACTION:
+               return "no-action";
+       default:
+               return "unknown";
+       }
+}
+
+static __u8 ila_csum_name2mode(char *name)
+{
+       if (strcmp(name, "adj-transport") == 0)
+               return ILA_CSUM_ADJUST_TRANSPORT;
+       else if (strcmp(name, "neutral-map") == 0)
+               return ILA_CSUM_NEUTRAL_MAP;
+       else if (strcmp(name, "no-action") == 0)
+               return ILA_CSUM_NO_ACTION;
+       else
+               return -1;
+}
+
 static void print_encap_ila(FILE *fp, struct rtattr *encap)
 {
        struct rtattr *tb[ILA_ATTR_MAX+1];
@@ -103,6 +129,10 @@ static void print_encap_ila(FILE *fp, struct rtattr *encap)
                           abuf, sizeof(abuf));
                fprintf(fp, " %s ", abuf);
        }
+
+       if (tb[ILA_ATTR_CSUM_MODE])
+               fprintf(fp, " csum-mode %s ",
+                       
ila_csum_mode2name(rta_getattr_u8(tb[ILA_ATTR_CSUM_MODE])));
 }
 
 static void print_encap_ip6(FILE *fp, struct rtattr *encap)
@@ -246,10 +276,34 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
                exit(1);
        }
 
+       argc--; argv++;
+
        rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator);
 
-       *argcp = argc;
-       *argvp = argv;
+       while (argc > 0) {
+               if (strcmp(*argv, "csum-mode") == 0) {
+                       __u8 csum_mode;
+
+                       NEXT_ARG();
+
+                       csum_mode = ila_csum_name2mode(*argv);
+                       if (csum_mode < 0)
+                               invarg("\"csum-mode\" value is invalid\n", 
*argv);
+
+                       rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, csum_mode);
+
+                       argc--; argv++;
+               } else {
+                       break;
+               }
+       }
+
+       /* argv is currently the first unparsed argument,
+        * but the lwt_parse_encap() caller will move to the next,
+        * so step back
+        */
+       *argcp = argc + 1;
+       *argvp = argv - 1;
 
        return 0;
 }
-- 
2.8.0.rc2

Reply via email to