On 7/9/19 9:59 AM, John Hurley wrote: > +static void explain(void) > +{ > + fprintf(stderr, > + "Usage: mpls pop [ protocol MPLS_PROTO ]\n" > + " mpls push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] > [ tc MPLS_TC ] [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL]\n"
that makes for a very long line to the user. Break at the ttl option and make a newline: mpls push [ protocol MPLS_PROTO ] [ label MPLS_LABEL ] [ tc MPLS_TC ] [ ttl MPLS_TTL ] [ bos MPLS_BOS ] [CONTROL] > + " mpls modify [ label MPLS_LABEL ] [ tc MPLS_TC ] [ ttl > MPLS_TTL ] [CONTROL]\n" > + " for pop MPLS_PROTO is next header of packet - e.g. ip > or mpls_uc\n" > + " for push MPLS_PROTO is one of mpls_uc or mpls_mc\n" > + " with default: mpls_uc\n" > + " CONTROL := reclassify | pipe | drop | continue | pass > |\n" > + " goto chain <CHAIN_INDEX>\n"); > +} > + ... > +static int print_mpls(struct action_util *au, FILE *f, struct rtattr *arg) > +{ > + struct rtattr *tb[TCA_MPLS_MAX + 1]; > + struct tc_mpls *parm; > + SPRINT_BUF(b1); > + __u32 val; > + > + if (!arg) > + return -1; > + > + parse_rtattr_nested(tb, TCA_MPLS_MAX, arg); > + > + if (!tb[TCA_MPLS_PARMS]) { > + print_string(PRINT_FP, NULL, "%s", "[NULL mpls parameters]"); > + return -1; > + } > + parm = RTA_DATA(tb[TCA_MPLS_PARMS]); > + > + print_string(PRINT_ANY, "kind", "%s ", "mpls"); > + print_string(PRINT_ANY, "mpls_action", " %s", > + action_names[parm->m_action]); > + > + switch (parm->m_action) { > + case TCA_MPLS_ACT_POP: > + if (tb[TCA_MPLS_PROTO]) { > + __u16 proto; > + > + proto = rta_getattr_u16(tb[TCA_MPLS_PROTO]); > + print_string(PRINT_ANY, "protocol", " protocol %s", > + ll_proto_n2a(proto, b1, sizeof(b1))); > + } > + break; > + case TCA_MPLS_ACT_PUSH: > + if (tb[TCA_MPLS_PROTO]) { > + __u16 proto; > + > + proto = rta_getattr_u16(tb[TCA_MPLS_PROTO]); > + print_string(PRINT_ANY, "protocol", " protocol %s", > + ll_proto_n2a(proto, b1, sizeof(b1))); > + } > + /* Fallthrough */ > + case TCA_MPLS_ACT_MODIFY: > + if (tb[TCA_MPLS_LABEL]) { > + val = rta_getattr_u32(tb[TCA_MPLS_LABEL]); > + print_uint(PRINT_ANY, "label", " label %u", val); > + } > + if (tb[TCA_MPLS_TC]) { > + val = rta_getattr_u8(tb[TCA_MPLS_TC]); > + print_uint(PRINT_ANY, "tc", " tc %u", val); > + } > + if (tb[TCA_MPLS_BOS]) { > + val = rta_getattr_u8(tb[TCA_MPLS_BOS]); > + print_uint(PRINT_ANY, "bos", " bos %u", val); > + } > + if (tb[TCA_MPLS_TTL]) { > + val = rta_getattr_u8(tb[TCA_MPLS_TTL]); > + print_uint(PRINT_ANY, "ttl", " ttl %u", val); > + } > + break; > + } > + print_action_control(f, " ", parm->action, ""); > + > + print_uint(PRINT_ANY, "index", "\n\t index %u", parm->index); > + print_int(PRINT_ANY, "ref", " ref %d", parm->refcnt); > + print_int(PRINT_ANY, "bind", " bind %d", parm->bindcnt); > + > + if (show_stats) { > + if (tb[TCA_MPLS_TM]) { > + struct tcf_t *tm = RTA_DATA(tb[TCA_MPLS_TM]); > + > + print_tm(f, tm); > + } > + } > + > + print_string(PRINT_FP, NULL, "%s", "\n"); s/"\n"/_SL_/ ?