diff mbox series

[iproute2-next,v2] tc: full JSON support for 'bpf' filter

Message ID 0f53a3a2bf42de2ff399c8396c3d0bc76c8344ea.1588269623.git.dcaratti@redhat.com
State Accepted
Delegated to: David Ahern
Headers show
Series [iproute2-next,v2] tc: full JSON support for 'bpf' filter | expand

Commit Message

Davide Caratti April 30, 2020, 6:03 p.m. UTC
example using eBPF:

 # tc filter add dev dummy0 ingress bpf \
 > direct-action obj ./bpf/filter.o sec tc-ingress
 # tc  -j filter show dev dummy0 ingress | jq
 [
   {
     "protocol": "all",
     "pref": 49152,
     "kind": "bpf",
     "chain": 0
   },
   {
     "protocol": "all",
     "pref": 49152,
     "kind": "bpf",
     "chain": 0,
     "options": {
       "handle": "0x1",
       "bpf_name": "filter.o:[tc-ingress]",
       "direct-action": true,
       "not_in_hw": true,
       "prog": {
         "id": 101,
         "tag": "a04f5eef06a7f555",
         "jited": 1
       }
     }
   }
 ]

v2:
 - use print_nl(), thanks to Andrea Claudi
 - use print_0xhex() for filter handle, thanks to Stephen Hemminger

Signed-off-by: Davide Caratti <dcaratti@redhat.com>
---
 tc/f_bpf.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

Comments

Andrea Claudi April 30, 2020, 6:06 p.m. UTC | #1
On Thu, Apr 30, 2020 at 8:03 PM Davide Caratti <dcaratti@redhat.com> wrote:
>
> example using eBPF:
>
>  # tc filter add dev dummy0 ingress bpf \
>  > direct-action obj ./bpf/filter.o sec tc-ingress
>  # tc  -j filter show dev dummy0 ingress | jq
>  [
>    {
>      "protocol": "all",
>      "pref": 49152,
>      "kind": "bpf",
>      "chain": 0
>    },
>    {
>      "protocol": "all",
>      "pref": 49152,
>      "kind": "bpf",
>      "chain": 0,
>      "options": {
>        "handle": "0x1",
>        "bpf_name": "filter.o:[tc-ingress]",
>        "direct-action": true,
>        "not_in_hw": true,
>        "prog": {
>          "id": 101,
>          "tag": "a04f5eef06a7f555",
>          "jited": 1
>        }
>      }
>    }
>  ]
>
> v2:
>  - use print_nl(), thanks to Andrea Claudi
>  - use print_0xhex() for filter handle, thanks to Stephen Hemminger
>
> Signed-off-by: Davide Caratti <dcaratti@redhat.com>
> ---
>  tc/f_bpf.c | 29 +++++++++++++++--------------
>  1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/tc/f_bpf.c b/tc/f_bpf.c
> index 135271aa1697..fa3552aefffd 100644
> --- a/tc/f_bpf.c
> +++ b/tc/f_bpf.c
> @@ -203,22 +203,24 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
>         parse_rtattr_nested(tb, TCA_BPF_MAX, opt);
>
>         if (handle)
> -               fprintf(f, "handle 0x%x ", handle);
> +               print_0xhex(PRINT_ANY, "handle", "handle %#llx ", handle);
>
>         if (tb[TCA_BPF_CLASSID]) {
>                 SPRINT_BUF(b1);
> -               fprintf(f, "flowid %s ",
> +               print_string(PRINT_ANY, "flowid", "flowid %s ",
>                         sprint_tc_classid(rta_getattr_u32(tb[TCA_BPF_CLASSID]), b1));
>         }
>
>         if (tb[TCA_BPF_NAME])
> -               fprintf(f, "%s ", rta_getattr_str(tb[TCA_BPF_NAME]));
> +               print_string(PRINT_ANY, "bpf_name", "%s ",
> +                            rta_getattr_str(tb[TCA_BPF_NAME]));
>
>         if (tb[TCA_BPF_FLAGS]) {
>                 unsigned int flags = rta_getattr_u32(tb[TCA_BPF_FLAGS]);
>
>                 if (flags & TCA_BPF_FLAG_ACT_DIRECT)
> -                       fprintf(f, "direct-action ");
> +                       print_bool(PRINT_ANY,
> +                                  "direct-action", "direct-action ", true);
>         }
>
>         if (tb[TCA_BPF_FLAGS_GEN]) {
> @@ -226,14 +228,14 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
>                         rta_getattr_u32(tb[TCA_BPF_FLAGS_GEN]);
>
>                 if (flags & TCA_CLS_FLAGS_SKIP_HW)
> -                       fprintf(f, "skip_hw ");
> +                       print_bool(PRINT_ANY, "skip_hw", "skip_hw ", true);
>                 if (flags & TCA_CLS_FLAGS_SKIP_SW)
> -                       fprintf(f, "skip_sw ");
> -
> +                       print_bool(PRINT_ANY, "skip_sw", "skip_sw ", true);
>                 if (flags & TCA_CLS_FLAGS_IN_HW)
> -                       fprintf(f, "in_hw ");
> +                       print_bool(PRINT_ANY, "in_hw", "in_hw ", true);
>                 else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
> -                       fprintf(f, "not_in_hw ");
> +                       print_bool(PRINT_ANY,
> +                                  "not_in_hw", "not_in_hw ", true);
>         }
>
>         if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN])
> @@ -245,14 +247,13 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
>         if (!dump_ok && tb[TCA_BPF_TAG]) {
>                 SPRINT_BUF(b);
>
> -               fprintf(f, "tag %s ",
> -                       hexstring_n2a(RTA_DATA(tb[TCA_BPF_TAG]),
> -                                     RTA_PAYLOAD(tb[TCA_BPF_TAG]),
> -                                     b, sizeof(b)));
> +               print_string(PRINT_ANY, "tag", "tag %s ",
> +                            hexstring_n2a(RTA_DATA(tb[TCA_BPF_TAG]),
> +                            RTA_PAYLOAD(tb[TCA_BPF_TAG]), b, sizeof(b)));
>         }
>
>         if (tb[TCA_BPF_POLICE]) {
> -               fprintf(f, "\n");
> +               print_nl();
>                 tc_print_police(f, tb[TCA_BPF_POLICE]);
>         }
>
> --
> 2.26.2
>

LGTM.
Acked-by: Andrea Claudi <aclaudi@redhat.com>
David Ahern May 5, 2020, 4:21 p.m. UTC | #2
On 4/30/20 12:03 PM, Davide Caratti wrote:
> example using eBPF:
> 
>  # tc filter add dev dummy0 ingress bpf \
>  > direct-action obj ./bpf/filter.o sec tc-ingress
>  # tc  -j filter show dev dummy0 ingress | jq
>  [
>    {
>      "protocol": "all",
>      "pref": 49152,
>      "kind": "bpf",
>      "chain": 0
>    },
>    {
>      "protocol": "all",
>      "pref": 49152,
>      "kind": "bpf",
>      "chain": 0,
>      "options": {
>        "handle": "0x1",
>        "bpf_name": "filter.o:[tc-ingress]",
>        "direct-action": true,
>        "not_in_hw": true,
>        "prog": {
>          "id": 101,
>          "tag": "a04f5eef06a7f555",
>          "jited": 1
>        }
>      }
>    }
>  ]
> 
> v2:
>  - use print_nl(), thanks to Andrea Claudi
>  - use print_0xhex() for filter handle, thanks to Stephen Hemminger
> 
> Signed-off-by: Davide Caratti <dcaratti@redhat.com>
> ---
>  tc/f_bpf.c | 29 +++++++++++++++--------------
>  1 file changed, 15 insertions(+), 14 deletions(-)
> 
>

applied to iproute2-next. Thanks,
diff mbox series

Patch

diff --git a/tc/f_bpf.c b/tc/f_bpf.c
index 135271aa1697..fa3552aefffd 100644
--- a/tc/f_bpf.c
+++ b/tc/f_bpf.c
@@ -203,22 +203,24 @@  static int bpf_print_opt(struct filter_util *qu, FILE *f,
 	parse_rtattr_nested(tb, TCA_BPF_MAX, opt);
 
 	if (handle)
-		fprintf(f, "handle 0x%x ", handle);
+		print_0xhex(PRINT_ANY, "handle", "handle %#llx ", handle);
 
 	if (tb[TCA_BPF_CLASSID]) {
 		SPRINT_BUF(b1);
-		fprintf(f, "flowid %s ",
+		print_string(PRINT_ANY, "flowid", "flowid %s ",
 			sprint_tc_classid(rta_getattr_u32(tb[TCA_BPF_CLASSID]), b1));
 	}
 
 	if (tb[TCA_BPF_NAME])
-		fprintf(f, "%s ", rta_getattr_str(tb[TCA_BPF_NAME]));
+		print_string(PRINT_ANY, "bpf_name", "%s ",
+			     rta_getattr_str(tb[TCA_BPF_NAME]));
 
 	if (tb[TCA_BPF_FLAGS]) {
 		unsigned int flags = rta_getattr_u32(tb[TCA_BPF_FLAGS]);
 
 		if (flags & TCA_BPF_FLAG_ACT_DIRECT)
-			fprintf(f, "direct-action ");
+			print_bool(PRINT_ANY,
+				   "direct-action", "direct-action ", true);
 	}
 
 	if (tb[TCA_BPF_FLAGS_GEN]) {
@@ -226,14 +228,14 @@  static int bpf_print_opt(struct filter_util *qu, FILE *f,
 			rta_getattr_u32(tb[TCA_BPF_FLAGS_GEN]);
 
 		if (flags & TCA_CLS_FLAGS_SKIP_HW)
-			fprintf(f, "skip_hw ");
+			print_bool(PRINT_ANY, "skip_hw", "skip_hw ", true);
 		if (flags & TCA_CLS_FLAGS_SKIP_SW)
-			fprintf(f, "skip_sw ");
-
+			print_bool(PRINT_ANY, "skip_sw", "skip_sw ", true);
 		if (flags & TCA_CLS_FLAGS_IN_HW)
-			fprintf(f, "in_hw ");
+			print_bool(PRINT_ANY, "in_hw", "in_hw ", true);
 		else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
-			fprintf(f, "not_in_hw ");
+			print_bool(PRINT_ANY,
+				   "not_in_hw", "not_in_hw ", true);
 	}
 
 	if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN])
@@ -245,14 +247,13 @@  static int bpf_print_opt(struct filter_util *qu, FILE *f,
 	if (!dump_ok && tb[TCA_BPF_TAG]) {
 		SPRINT_BUF(b);
 
-		fprintf(f, "tag %s ",
-			hexstring_n2a(RTA_DATA(tb[TCA_BPF_TAG]),
-				      RTA_PAYLOAD(tb[TCA_BPF_TAG]),
-				      b, sizeof(b)));
+		print_string(PRINT_ANY, "tag", "tag %s ",
+			     hexstring_n2a(RTA_DATA(tb[TCA_BPF_TAG]),
+			     RTA_PAYLOAD(tb[TCA_BPF_TAG]), b, sizeof(b)));
 	}
 
 	if (tb[TCA_BPF_POLICE]) {
-		fprintf(f, "\n");
+		print_nl();
 		tc_print_police(f, tb[TCA_BPF_POLICE]);
 	}