]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - lib/bpf.c
tc: full JSON support for 'bpf' actions
[mirror_iproute2.git] / lib / bpf.c
index 5e85cfc0bdd5b607f57bbc03a8f131e028c400d1..dfc4f4f522c311a67b89f26515f19cd1fac85f41 100644 (file)
--- a/lib/bpf.c
+++ b/lib/bpf.c
@@ -339,7 +339,7 @@ out:
        return ret;
 }
 
-void bpf_print_ops(FILE *f, struct rtattr *bpf_ops, __u16 len)
+void bpf_print_ops(struct rtattr *bpf_ops, __u16 len)
 {
        struct sock_filter *ops = RTA_DATA(bpf_ops);
        int i;
@@ -347,14 +347,24 @@ void bpf_print_ops(FILE *f, struct rtattr *bpf_ops, __u16 len)
        if (len == 0)
                return;
 
-       fprintf(f, "bytecode \'%u,", len);
-
-       for (i = 0; i < len - 1; i++)
-               fprintf(f, "%hu %hhu %hhu %u,", ops[i].code, ops[i].jt,
-                       ops[i].jf, ops[i].k);
+       open_json_object("bytecode");
+       print_uint(PRINT_ANY, "length", "bytecode \'%u,", len);
+       open_json_array(PRINT_JSON, "insns");
+
+       for (i = 0; i < len; i++) {
+               open_json_object(NULL);
+               print_uint(PRINT_ANY, "code", "%hu ", ops[i].code);
+               print_uint(PRINT_ANY, "jt", "%hhu ", ops[i].jt);
+               print_uint(PRINT_ANY, "jf", "%hhu ", ops[i].jf);
+               if (i == len - 1)
+                       print_uint(PRINT_ANY, "k", "%u\'", ops[i].k);
+               else
+                       print_uint(PRINT_ANY, "k", "%u,", ops[i].k);
+               close_json_object();
+       }
 
-       fprintf(f, "%hu %hhu %hhu %u\'", ops[i].code, ops[i].jt,
-               ops[i].jf, ops[i].k);
+       close_json_array(PRINT_JSON, NULL);
+       close_json_object();
 }
 
 static void bpf_map_pin_report(const struct bpf_elf_map *pin,