From: Phil Sutter <phil@nwl.cc>
To: Matthias Tafelmeier <matthias.tafelmeier@gmx.net>
Cc: netdev@vger.kernel.org, hagen@jauu.net, shemminger@osdl.org,
fw@strlen.de, edumazet@google.com, daniel@iogearbox.net
Subject: Re: [PATCH v7 08/10] ss: symmetrical formatter extension example
Date: Tue, 27 Oct 2015 14:17:58 +0100 [thread overview]
Message-ID: <20151027131758.GG26876@orbit.nwl.cc> (raw)
In-Reply-To: <1441913708-15532-9-git-send-email-matthias.tafelmeier@gmx.net>
On Thu, Sep 10, 2015 at 09:35:06PM +0200, Matthias Tafelmeier wrote:
> This commit shall show shortly where to place changes when one wants to
> extend an ss output formatter with a new handler (format print
> procedure). The extension is done symmetrically. That means, every up to
> now existing formatter is extended with a semantically equivalent
> handler (hr and json formatter).
>
> Signed-off-by: Matthias Tafelmeier <matthias.tafelmeier@gmx.net>
> Suggested-by: Hagen Paul Pfeifer <hagen@jauu.net>
> ---
> misc/ss_hr_fmt.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++--
> misc/ss_json_fmt.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
> misc/ss_out_fmt.c | 10 ++++++++
> misc/ss_out_fmt.h | 10 ++++++++
> 4 files changed, 150 insertions(+), 4 deletions(-)
>
> diff --git a/misc/ss_hr_fmt.c b/misc/ss_hr_fmt.c
> index 4046ebf..a2bef60 100644
> --- a/misc/ss_hr_fmt.c
> +++ b/misc/ss_hr_fmt.c
> @@ -85,8 +85,8 @@ static void tcp_stats_hr_fmt(struct tcpstat *s)
> if (s->rcv_space)
> printf(" rcv_space:%d", s->rcv_space);
>
> - CHECK_FMT_ADAPT(s->rcv_space, s,
> - hr_handler_must_be_adapted_accordingly_when_json_fmt_is_extended);
> + /*hr handler must be adapted accordingly when json fmt is extended*/
> + CHECK_FMT_ADAPT(s->rcv_space, s);
Unrelated change? Patch 02/10 introduces CHECK_FMT_ADAPT macro which
takes just two parameters. Quite confusing, especially since this patch
is meant to be documentation.
> }
>
> static void tcp_timer_hr_fmt(struct tcpstat *s)
> @@ -242,6 +242,66 @@ static void packet_show_ring_hr_fmt(struct packet_diag_ring *ring)
> printf(",features:0x%x", ring->pdr_features);
> }
>
> +static void packet_details_hr_fmt(struct packet_diag_info *pinfo,
> + struct packet_diag_ring *ring_rx,
> + struct packet_diag_ring *ring_tx,
> + uint32_t fanout,
> + bool has_fanout)
> +{
> + if (pinfo) {
> + printf("\n\tver:%d", pinfo->pdi_version);
> + printf(" cpy_thresh:%d", pinfo->pdi_copy_thresh);
> + printf(" flags( ");
> + if (pinfo->pdi_flags & PDI_RUNNING)
> + printf("running");
> + if (pinfo->pdi_flags & PDI_AUXDATA)
> + printf(" auxdata");
> + if (pinfo->pdi_flags & PDI_ORIGDEV)
> + printf(" origdev");
> + if (pinfo->pdi_flags & PDI_VNETHDR)
> + printf(" vnethdr");
> + if (pinfo->pdi_flags & PDI_LOSS)
> + printf(" loss");
> + if (!pinfo->pdi_flags)
> + printf("0");
> + printf(" )");
> + }
> + if (ring_rx) {
> + printf("\n\tring_rx(");
> + packet_show_ring_fmt(ring_rx);
> + printf(")");
> + }
> + if (ring_tx) {
> + printf("\n\tring_tx(");
> + packet_show_ring_fmt(ring_tx);
> + printf(")");
> + }
> + if (has_fanout) {
> + uint16_t type = (fanout >> 16) & 0xffff;
> +
> + printf("\n\tfanout(");
> + printf("id:%d,", fanout & 0xffff);
> + printf("type:");
> +
> + if (type == 0)
> + printf("hash");
> + else if (type == 1)
> + printf("lb");
> + else if (type == 2)
> + printf("cpu");
> + else if (type == 3)
> + printf("roll");
> + else if (type == 4)
> + printf("random");
> + else if (type == 5)
> + printf("qm");
> + else
> + printf("0x%x", type);
> +
> + printf(")");
> + }
> +}
> +
> const struct fmt_op_hub hr_output_op = {
> .tcp_stats_fmt = tcp_stats_hr_fmt,
> .tcp_timer_fmt = tcp_timer_hr_fmt,
> @@ -257,4 +317,5 @@ const struct fmt_op_hub hr_output_op = {
> .opt_fmt = opt_hr_fmt,
> .proc_fmt = proc_hr_fmt,
> .packet_show_ring_fmt = packet_show_ring_hr_fmt,
> + .packet_details_fmt = packet_details_hr_fmt
> };
> diff --git a/misc/ss_json_fmt.c b/misc/ss_json_fmt.c
> index 1dff57a..9b50832 100644
> --- a/misc/ss_json_fmt.c
> +++ b/misc/ss_json_fmt.c
> @@ -166,8 +166,8 @@ static void tcp_stats_json_fmt(struct tcpstat *s)
> /*deal with special case */
> res_json_fmt_branch(s->ss.state == SS_LISTEN, ' ');
>
> - CHECK_FMT_ADAPT(s->rcv_space, s,
> - json_handler_must_be_adapted_accordingly_when_hr_fmt_is_extended);
> + /*json handler must be adapted accordingly when hr fmt is extended*/
> + CHECK_FMT_ADAPT(s->rcv_space, s);
> }
>
> static void tcp_timer_json_fmt(struct tcpstat *s)
> @@ -392,6 +392,70 @@ static void packet_show_ring_json_fmt(struct packet_diag_ring *ring)
> jsonw_hex_field_outp(json_wr, "features_0x", ring->pdr_features);
> }
>
> +static void packet_details_json_fmt(struct packet_diag_info *pinfo,
> + struct packet_diag_ring *ring_rx,
> + struct packet_diag_ring *ring_tx,
> + uint32_t fanout,
> + bool has_fanout)
> +{
> + char tmp_out[16];
> +
> + if (pinfo) {
> + jsonw_int_field(json_wr, "ver", pinfo->pdi_version);
> + jsonw_int_field(json_wr, "cpy_thresh", pinfo->pdi_copy_thresh);
> + if (pinfo->pdi_flags & PDI_RUNNING)
> + sprintf(tmp_out, "running");
> + if (pinfo->pdi_flags & PDI_AUXDATA)
> + sprintf(tmp_out, "_auxdata");
> + if (pinfo->pdi_flags & PDI_ORIGDEV)
> + sprintf(tmp_out, "_origdev");
> + if (pinfo->pdi_flags & PDI_VNETHDR)
> + sprintf(tmp_out, "_vnethdr");
> + if (pinfo->pdi_flags & PDI_LOSS)
> + sprintf(tmp_out, "_loss");
> + if (!pinfo->pdi_flags)
> + sprintf(tmp_out, "0");
> + jsonw_string_field(json_wr, "flags", tmp_out);
> + }
> + if (ring_rx) {
> + jsonw_name(json_wr, "ring_rx");
> + jsonw_start_object(json_wr);
> + packet_show_ring_fmt(ring_rx);
> + jsonw_end_object(json_wr);
> + }
> + if (ring_tx) {
> + jsonw_name(json_wr, "ring_tx");
> + jsonw_start_object(json_wr);
> + packet_show_ring_fmt(ring_tx);
> + jsonw_end_object(json_wr);
> + }
> + if (has_fanout) {
> + uint16_t type = (fanout >> 16) & 0xffff;
> +
> + jsonw_name(json_wr, "fanout");
> + jsonw_start_object(json_wr);
> + jsonw_int_field(json_wr, "id", fanout & 0xffff);
> +
> + if (type == 0)
> + sprintf(tmp_out, "hash");
> + else if (type == 1)
> + sprintf(tmp_out, "lb");
> + else if (type == 2)
> + sprintf(tmp_out, "cpu");
> + else if (type == 3)
> + sprintf(tmp_out, "roll");
> + else if (type == 4)
> + sprintf(tmp_out, "random");
> + else if (type == 5)
> + sprintf(tmp_out, "qm");
> + else
> + sprintf(tmp_out, "0x%x", type);
> +
> + jsonw_string_field(json_wr, "type", tmp_out);
> + jsonw_end_object(json_wr);
> + }
> +}
> +
> const struct fmt_op_hub json_output_op = {
> .tcp_stats_fmt = tcp_stats_json_fmt,
> .tcp_timer_fmt = tcp_timer_json_fmt,
> @@ -407,4 +471,5 @@ const struct fmt_op_hub json_output_op = {
> .opt_fmt = opt_json_fmt,
> .proc_fmt = proc_json_fmt,
> .packet_show_ring_fmt = packet_show_ring_json_fmt,
> + .packet_details_fmt = packet_details_json_fmt
> };
> diff --git a/misc/ss_out_fmt.c b/misc/ss_out_fmt.c
> index 57bc24e..6d92201 100644
> --- a/misc/ss_out_fmt.c
> +++ b/misc/ss_out_fmt.c
> @@ -125,3 +125,13 @@ void packet_show_ring_fmt(struct packet_diag_ring *ring)
> {
> fmt_op_hub[fmt_type]->packet_show_ring_fmt(ring);
> }
> +void packet_details_fmt(struct packet_diag_info *pinfo,
> + struct packet_diag_ring *ring_rx,
> + struct packet_diag_ring *ring_tx,
> + uint32_t fanout,
> + bool has_fanout)
> +{
> + fmt_op_hub[fmt_type]->packet_details_fmt(pinfo,
> + ring_rx, ring_tx, fanout, has_fanout);
> +}
> +
> diff --git a/misc/ss_out_fmt.h b/misc/ss_out_fmt.h
> index 8608cde..bdc786b 100644
> --- a/misc/ss_out_fmt.h
> +++ b/misc/ss_out_fmt.h
> @@ -55,6 +55,11 @@ struct fmt_op_hub {
> void (*opt_fmt)(char *opt);
> void (*proc_fmt)(int serv_width, char *pid_ctx);
> void (*packet_show_ring_fmt)(struct packet_diag_ring *ring);
> + void (*packet_details_fmt)(struct packet_diag_info *pinfo,
> + struct packet_diag_ring *ring_rx,
> + struct packet_diag_ring *ring_tx,
> + uint32_t fanout,
> + bool has_fanout);
> };
>
> void tcp_stats_fmt(struct tcpstat *s);
> @@ -75,6 +80,11 @@ void bpf_filter_fmt(struct sock_filter *f, int num);
> void opt_fmt(char *opt);
> void proc_fmt(int serv_width, char *pid_ctx);
> void packet_show_ring_fmt(struct packet_diag_ring *ring);
> +void packet_details_fmt(struct packet_diag_info *pinfo,
> + struct packet_diag_ring *ring_rx,
> + struct packet_diag_ring *ring_tx,
> + uint32_t fanout,
> + bool has_fanout);
>
> /*unisonly utilized formatting parts*/
> char *sprint_bw(char *buf, double bw);
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2015-10-27 13:18 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-10 19:34 iproute2 v7: full ss json support and general output simplification Matthias Tafelmeier
2015-09-10 19:34 ` [PATCH v7 01/10] ss: rooted out ss type declarations for output formatters Matthias Tafelmeier
2015-09-10 19:35 ` [PATCH v7 02/10] ss: created formatters for json and hr Matthias Tafelmeier
2015-09-23 23:26 ` Stephen Hemminger
2015-09-24 17:43 ` Matthias Tafelmeier
[not found] ` <bc9cacb94de24857a7d9e13960bfae56@HQ1WP-EXMB11.corp.brocade.com>
2015-09-24 22:16 ` Stephen Hemminger
2015-09-25 6:01 ` Matthias Tafelmeier
2015-10-28 8:07 ` Matthias Tafelmeier
2015-10-28 8:28 ` Phil Sutter
2015-10-28 11:57 ` Matthias Tafelmeier
2015-10-28 15:05 ` Phil Sutter
2015-10-28 15:50 ` Matthias Tafelmeier
[not found] ` <b114412a541d4273a9a7a1c0ae4777df@HQ1WP-EXMB11.corp.brocade.com>
2015-11-02 23:06 ` Stephen Hemminger
2015-11-03 6:54 ` Matthias Tafelmeier
2015-10-27 12:21 ` Phil Sutter
2015-10-27 13:47 ` David Miller
2015-10-27 13:35 ` Phil Sutter
2015-09-10 19:35 ` [PATCH v7 03/10] ss: removed obsolet fmt functions Matthias Tafelmeier
2015-09-10 19:35 ` [PATCH v7 04/10] ss: prepare timer for output handler usage Matthias Tafelmeier
2015-09-10 19:35 ` [PATCH v7 05/10] ss: replaced old output with new generic output mechanisms Matthias Tafelmeier
2015-10-27 13:04 ` Phil Sutter
2015-09-10 19:35 ` [PATCH v7 06/10] ss: renaming and export of current_filter Matthias Tafelmeier
2015-10-27 13:10 ` Phil Sutter
2015-09-10 19:35 ` [PATCH v7 07/10] ss: symmetrical subhandler output extension example Matthias Tafelmeier
2015-10-27 13:13 ` Phil Sutter
2015-09-10 19:35 ` [PATCH v7 08/10] ss: symmetrical formatter " Matthias Tafelmeier
2015-10-27 13:17 ` Phil Sutter [this message]
2015-09-10 19:35 ` [PATCH v7 09/10] ss: fixed free on local array for valid json output Matthias Tafelmeier
2015-10-27 13:19 ` Phil Sutter
2015-09-10 19:35 ` [PATCH v7 10/10] ss: activate json_writer excluded logic Matthias Tafelmeier
2015-10-27 13:21 ` Phil Sutter
2015-10-28 2:39 ` Stephen Hemminger
2015-10-28 8:17 ` Phil Sutter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151027131758.GG26876@orbit.nwl.cc \
--to=phil@nwl.cc \
--cc=daniel@iogearbox.net \
--cc=edumazet@google.com \
--cc=fw@strlen.de \
--cc=hagen@jauu.net \
--cc=matthias.tafelmeier@gmx.net \
--cc=netdev@vger.kernel.org \
--cc=shemminger@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.