int print_gact(struct action_util *au,FILE * f, struct rtattr *arg) { SPRINT_BUF(b1); #ifdef CONFIG_GACT_PROB SPRINT_BUF(b2); struct tc_gact_p *pp = NULL; struct tc_gact_p pp_dummy; #endif struct tc_gact *p = NULL; struct rtattr *tb[TCA_GACT_MAX + 1]; if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_GACT_MAX, arg); if (tb[TCA_GACT_PARMS] == NULL) { fprintf(f, "[NULL gact parameters]"); return -1; } p = RTA_DATA(tb[TCA_GACT_PARMS]); fprintf(f, "gact action %s", action_n2a(p->action, b1, sizeof (b1))); #ifdef CONFIG_GACT_PROB if (NULL != tb[TCA_GACT_PROB]) { pp = RTA_DATA(tb[TCA_GACT_PROB]); } else { /* need to keep consistent output */ memset(&pp_dummy, 0, sizeof (pp_dummy)); pp = &pp_dummy; } fprintf(f, "\n\t random type %s %s val %d",prob_n2a(pp->ptype), action_n2a(pp->paction, b2, sizeof (b2)), pp->pval); #endif fprintf(f, "\n\t index %d ref %d bind %d",p->index, p->refcnt, p->bindcnt); if (show_stats) { if (tb[TCA_GACT_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_GACT_TM]); print_tm(f,tm); } } fprintf(f, "\n "); return 0; }
static int bpf_print_opt(struct action_util *au, FILE *f, struct rtattr *arg) { struct rtattr *tb[TCA_ACT_BPF_MAX + 1]; struct tc_act_bpf *parm; SPRINT_BUF(action_buf); if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_ACT_BPF_MAX, arg); if (!tb[TCA_ACT_BPF_PARMS]) { fprintf(f, "[NULL bpf parameters]"); return -1; } parm = RTA_DATA(tb[TCA_ACT_BPF_PARMS]); fprintf(f, "bpf "); if (tb[TCA_ACT_BPF_NAME]) fprintf(f, "%s ", rta_getattr_str(tb[TCA_ACT_BPF_NAME])); else if (tb[TCA_ACT_BPF_FD]) fprintf(f, "pfd %u ", rta_getattr_u32(tb[TCA_ACT_BPF_FD])); if (tb[TCA_ACT_BPF_OPS] && tb[TCA_ACT_BPF_OPS_LEN]) { bpf_print_ops(f, tb[TCA_ACT_BPF_OPS], rta_getattr_u16(tb[TCA_ACT_BPF_OPS_LEN])); fprintf(f, " "); } fprintf(f, "default-action %s\n", action_n2a(parm->action, action_buf, sizeof(action_buf))); fprintf(f, "\tindex %d ref %d bind %d", parm->index, parm->refcnt, parm->bindcnt); if (show_stats) { if (tb[TCA_ACT_BPF_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_ACT_BPF_TM]); print_tm(f, tm); } } fprintf(f, "\n "); return 0; }
int print_pedit(struct action_util *au,FILE * f, struct rtattr *arg) { struct tc_pedit_sel *sel; struct rtattr *tb[TCA_PEDIT_MAX + 1]; SPRINT_BUF(b1); if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_PEDIT_MAX, arg); if (tb[TCA_PEDIT_PARMS] == NULL) { fprintf(f, "[NULL pedit parameters]"); return -1; } sel = RTA_DATA(tb[TCA_PEDIT_PARMS]); fprintf(f, " pedit action %s keys %d\n ", action_n2a(sel->action, b1, sizeof (b1)),sel->nkeys); fprintf(f, "\t index %d ref %d bind %d", sel->index,sel->refcnt, sel->bindcnt); if (show_stats) { if (tb[TCA_PEDIT_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_PEDIT_TM]); print_tm(f,tm); } } if (sel->nkeys) { int i; struct tc_pedit_key *key = sel->keys; for (i=0; i<sel->nkeys; i++, key++) { fprintf(f, "\n\t key #%d",i); fprintf(f, " at %d: val %08x mask %08x", (unsigned int)key->off, (unsigned int)ntohl(key->val), (unsigned int)ntohl(key->mask)); } } else { fprintf(f, "\npedit %x keys %d is not LEGIT", sel->index,sel->nkeys); } fprintf(f, "\n "); return 0; }
int print_mirred(struct action_util *au,FILE * f, struct rtattr *arg) { struct tc_mirred *p; struct rtattr *tb[TCA_MIRRED_MAX + 1]; const char *dev; SPRINT_BUF(b1); if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_MIRRED_MAX, arg); if (tb[TCA_MIRRED_PARMS] == NULL) { fprintf(f, "[NULL mirred parameters]"); return -1; } p = RTA_DATA(tb[TCA_MIRRED_PARMS]); /* ll_init_map(&rth); */ if ((dev = ll_index_to_name(p->ifindex)) == 0) { my_printf("Cannot find device %d\n", p->ifindex); return -1; } fprintf(f, "mirred (%s to device %s) %s", mirred_n2a(p->eaction), dev,action_n2a(p->action, b1, sizeof (b1))); fprintf(f, "\n "); fprintf(f, "\tindex %d ref %d bind %d",p->index,p->refcnt,p->bindcnt); if (show_stats) { if (tb[TCA_MIRRED_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_MIRRED_TM]); print_tm(f,tm); } } fprintf(f, "\n "); return 0; }
static int print_nat(struct action_util *au,FILE * f, struct rtattr *arg) { struct tc_nat *sel; struct rtattr *tb[TCA_NAT_MAX + 1]; char buf1[256]; char buf2[256]; SPRINT_BUF(buf3); int len; if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_NAT_MAX, arg); if (tb[TCA_NAT_PARMS] == NULL) { fprintf(f, "[NULL nat parameters]"); return -1; } sel = RTA_DATA(tb[TCA_NAT_PARMS]); len = ffs(sel->mask); len = len ? 33 - len : 0; fprintf(f, " nat %s %s/%d %s %s", sel->flags & TCA_NAT_FLAG_EGRESS ? "egress" : "ingress", format_host(AF_INET, 4, &sel->old_addr, buf1, sizeof(buf1)), len, format_host(AF_INET, 4, &sel->new_addr, buf2, sizeof(buf2)), action_n2a(sel->action, buf3, sizeof (buf3))); if (show_stats) { if (tb[TCA_NAT_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_NAT_TM]); print_tm(f,tm); } } return 0; }
static int print_csum(struct action_util *au, FILE * f, struct rtattr *arg) { struct tc_csum *sel; struct rtattr *tb[TCA_CSUM_MAX + 1]; char *uflag_1 = ""; char *uflag_2 = ""; char *uflag_3 = ""; char *uflag_4 = ""; char *uflag_5 = ""; char *uflag_6 = ""; SPRINT_BUF(action_buf); int uflag_count = 0; if (arg == NULL) return -1; parse_rtattr_nested(tb, TCA_CSUM_MAX, arg); if (tb[TCA_CSUM_PARMS] == NULL) { fprintf(f, "[NULL csum parameters]"); return -1; } sel = RTA_DATA(tb[TCA_CSUM_PARMS]); if (sel->update_flags & TCA_CSUM_UPDATE_FLAG_IPV4HDR) { uflag_1 = "iph"; uflag_count++; } #define CSUM_UFLAG_BUFFER(flag_buffer, flag_value, flag_string) \ do { \ if (sel->update_flags & flag_value) { \ flag_buffer = uflag_count > 0 ? \ ", " flag_string : flag_string; \ uflag_count++; \ } \ } while(0) CSUM_UFLAG_BUFFER(uflag_2, TCA_CSUM_UPDATE_FLAG_ICMP, "icmp"); CSUM_UFLAG_BUFFER(uflag_3, TCA_CSUM_UPDATE_FLAG_IGMP, "igmp"); CSUM_UFLAG_BUFFER(uflag_4, TCA_CSUM_UPDATE_FLAG_TCP, "tcp"); CSUM_UFLAG_BUFFER(uflag_5, TCA_CSUM_UPDATE_FLAG_UDP, "udp"); CSUM_UFLAG_BUFFER(uflag_6, TCA_CSUM_UPDATE_FLAG_UDPLITE, "udplite"); if (!uflag_count) { uflag_1 = "?empty"; } fprintf(f, "csum (%s%s%s%s%s%s) action %s\n", uflag_1, uflag_2, uflag_3, uflag_4, uflag_5, uflag_6, action_n2a(sel->action, action_buf, sizeof(action_buf))); fprintf(f, "\tindex %d ref %d bind %d", sel->index, sel->refcnt, sel->bindcnt); if (show_stats) { if (tb[TCA_CSUM_TM]) { struct tcf_t *tm = RTA_DATA(tb[TCA_CSUM_TM]); print_tm(f,tm); } } fprintf(f, "\n"); return 0; }