]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/ipila.c
rdma: Properly mark RDMAtool license
[mirror_iproute2.git] / ip / ipila.c
index 0403fc4238b9d8b301c6e08e704f07bfce7c53e8..11fbb5fae805e44c4a640512143dc809557c05b2 100644 (file)
 #include "libgenl.h"
 #include "utils.h"
 #include "ip_common.h"
+#include "ila_common.h"
+#include "json_print.h"
 
 static void usage(void)
 {
-       fprintf(stderr, "Usage: ip ila add loc_match LOCATOR_MATCH "
-               "loc LOCATOR [ dev DEV ]\n");
-       fprintf(stderr, "       ip ila del loc_match LOCATOR_MATCH "
-               "[ loc LOCATOR ] [ dev DEV ]\n");
-       fprintf(stderr, "       ip ila list\n");
-       fprintf(stderr, "\n");
+       fprintf(stderr,
+"Usage: ip ila add loc_match LOCATOR_MATCH loc LOCATOR [ dev DEV ] OPTIONS\n"
+"       ip ila del loc_match LOCATOR_MATCH [ loc LOCATOR ] [ dev DEV ]\n"
+"       ip ila list\n"
+"OPTIONS := [ csum-mode { adj-transport | neutral-map | neutral-map-auto | no-action } ]\n"
+"           [ ident-type { luid | use-format } ]\n");
 
        exit(-1);
 }
@@ -46,9 +48,7 @@ static int genl_family = -1;
 #define ILA_RTA(g) ((struct rtattr *)(((char *)(g)) +  \
        NLMSG_ALIGN(sizeof(struct genlmsghdr))))
 
-#define ADDR_BUF_SIZE sizeof("xxxx:xxxx:xxxx:xxxx")
-
-static int print_addr64(__u64 addr, char *buff, size_t len)
+static void print_addr64(__u64 addr, char *buff, size_t len)
 {
        __u16 *words = (__u16 *)&addr;
        __u16 v;
@@ -63,38 +63,26 @@ static int print_addr64(__u64 addr, char *buff, size_t len)
                        sep = "";
 
                ret = snprintf(&buff[written], len - written, "%x%s", v, sep);
-               if (ret < 0)
-                       return ret;
-
                written += ret;
        }
-
-       return written;
 }
 
-static void print_ila_locid(FILE *fp, int attr, struct rtattr *tb[], int space)
+static void print_ila_locid(const char *tag, int attr, struct rtattr *tb[])
 {
        char abuf[256];
-       size_t blen;
-       int i;
 
-       if (tb[attr]) {
-               blen = print_addr64(rta_getattr_u32(tb[attr]),
-                                   abuf, sizeof(abuf));
-               fprintf(fp, "%s", abuf);
-       } else {
-               fprintf(fp, "-");
-               blen = 1;
-       }
+       if (tb[attr])
+               print_addr64(rta_getattr_u64(tb[attr]),
+                            abuf, sizeof(abuf));
+       else
+               snprintf(abuf, sizeof(abuf), "-");
 
-       for (i = 0; i < space - blen; i++)
-               fprintf(fp, " ");
+       /* 20 = sizeof("xxxx:xxxx:xxxx:xxxx") */
+       print_string(PRINT_ANY, tag, "%-20s", abuf);
 }
 
-static int print_ila_mapping(const struct sockaddr_nl *who,
-                            struct nlmsghdr *n, void *arg)
+static int print_ila_mapping(struct nlmsghdr *n, void *arg)
 {
-       FILE *fp = (FILE *)arg;
        struct genlmsghdr *ghdr;
        struct rtattr *tb[ILA_ATTR_MAX + 1];
        int len = n->nlmsg_len;
@@ -109,14 +97,38 @@ static int print_ila_mapping(const struct sockaddr_nl *who,
        ghdr = NLMSG_DATA(n);
        parse_rtattr(tb, ILA_ATTR_MAX, (void *) ghdr + GENL_HDRLEN, len);
 
-       print_ila_locid(fp, ILA_ATTR_LOCATOR_MATCH, tb, ADDR_BUF_SIZE);
-       print_ila_locid(fp, ILA_ATTR_LOCATOR, tb, ADDR_BUF_SIZE);
+       open_json_object(NULL);
+       print_ila_locid("locator_match", ILA_ATTR_LOCATOR_MATCH, tb);
+       print_ila_locid("locator", ILA_ATTR_LOCATOR, tb);
+
+       if (tb[ILA_ATTR_IFINDEX]) {
+               __u32 ifindex
+                       = rta_getattr_u32(tb[ILA_ATTR_IFINDEX]);
 
-       if (tb[ILA_ATTR_IFINDEX])
-               fprintf(fp, "%s", ll_index_to_name(rta_getattr_u32(tb[ILA_ATTR_IFINDEX])));
+               print_color_string(PRINT_ANY, COLOR_IFNAME,
+                                  "interface", "%-16s",
+                                  ll_index_to_name(ifindex));
+       } else {
+               print_string(PRINT_FP, NULL, "%-10s ", "-");
+       }
+
+       if (tb[ILA_ATTR_CSUM_MODE]) {
+               __u8 csum = rta_getattr_u8(tb[ILA_ATTR_CSUM_MODE]);
+
+               print_string(PRINT_ANY, "csum_mode", "%s",
+                            ila_csum_mode2name(csum));
+       } else
+               print_string(PRINT_FP, NULL, "%-10s ", "-");
+
+       if (tb[ILA_ATTR_IDENT_TYPE])
+               print_string(PRINT_ANY, "ident_type", "%s",
+                       ila_ident_type2name(rta_getattr_u8(
+                                               tb[ILA_ATTR_IDENT_TYPE])));
        else
-               fprintf(fp, "-");
-       fprintf(fp, "\n");
+               print_string(PRINT_FP, NULL, "%s", "-");
+
+       print_nl();
+       close_json_object();
 
        return 0;
 }
@@ -138,10 +150,13 @@ static int do_list(int argc, char **argv)
                exit(1);
        }
 
+       new_json_obj(json);
        if (rtnl_dump_filter(&genl_rth, print_ila_mapping, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
                return 1;
        }
+       delete_json_obj();
+       fflush(stdout);
 
        return 0;
 }
@@ -152,9 +167,13 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n,
        __u64 locator = 0;
        __u64 locator_match = 0;
        int ifindex = 0;
+       int csum_mode = 0;
+       int ident_type = 0;
        bool loc_set = false;
        bool loc_match_set = false;
        bool ifindex_set = false;
+       bool csum_mode_set = false;
+       bool ident_type_set = false;
 
        while (argc > 0) {
                if (!matches(*argv, "loc")) {
@@ -174,6 +193,26 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n,
                                return -1;
                        }
                        loc_match_set = true;
+               } else if (!matches(*argv, "csum-mode")) {
+                       NEXT_ARG();
+
+                       csum_mode = ila_csum_name2mode(*argv);
+                       if (csum_mode < 0) {
+                               fprintf(stderr, "Bad csum-mode: %s\n",
+                                       *argv);
+                               return -1;
+                       }
+                       csum_mode_set = true;
+               } else if (!matches(*argv, "ident-type")) {
+                       NEXT_ARG();
+
+                       ident_type = ila_ident_name2type(*argv);
+                       if (ident_type < 0) {
+                               fprintf(stderr, "Bad ident-type: %s\n",
+                                       *argv);
+                               return -1;
+                       }
+                       ident_type_set = true;
                } else if (!matches(*argv, "dev")) {
                        NEXT_ARG();
 
@@ -211,6 +250,12 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n,
        if (ifindex_set)
                addattr32(n, 1024, ILA_ATTR_IFINDEX, ifindex);
 
+       if (csum_mode_set)
+               addattr8(n, 1024, ILA_ATTR_CSUM_MODE, csum_mode);
+
+       if (ident_type_set)
+               addattr8(n, 1024, ILA_ATTR_IDENT_TYPE, ident_type);
+
        return 0;
 }