static int xfrm_policy_flush_print(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { struct rtattr *tb[XFRMA_MAX+1]; FILE *fp = (FILE *)arg; int len = n->nlmsg_len; len -= NLMSG_SPACE(0); if (len < 0) { fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); return -1; } fprintf(fp, "Flushed policy "); parse_rtattr(tb, XFRMA_MAX, NLMSG_DATA(n), len); if (tb[XFRMA_POLICY_TYPE]) { struct xfrm_userpolicy_type *upt; fprintf(fp, "ptype "); if (RTA_PAYLOAD(tb[XFRMA_POLICY_TYPE]) < sizeof(*upt)) fprintf(fp, "(ERROR truncated)"); upt = (struct xfrm_userpolicy_type *)RTA_DATA(tb[XFRMA_POLICY_TYPE]); fprintf(fp, "%s ", strxf_ptype(upt->type)); } fprintf(fp, "%s", _SL_); if (oneline) fprintf(fp, "\n"); fflush(fp); return 0; }
void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo, struct rtattr *tb[], FILE *fp, const char *prefix, const char *title) { char buf[STRBUF_SIZE]; memset(buf, '\0', sizeof(buf)); xfrm_selector_print(&xpinfo->sel, preferred_family, fp, title); if (prefix) STRBUF_CAT(buf, prefix); STRBUF_CAT(buf, "\t"); fputs(buf, fp); fprintf(fp, "dir "); switch (xpinfo->dir) { case XFRM_POLICY_IN: fprintf(fp, "in"); break; case XFRM_POLICY_OUT: fprintf(fp, "out"); break; case XFRM_POLICY_FWD: fprintf(fp, "fwd"); break; default: fprintf(fp, "%u", xpinfo->dir); break; } fprintf(fp, " "); switch (xpinfo->action) { case XFRM_POLICY_ALLOW: if (show_stats > 0) fprintf(fp, "action allow "); break; case XFRM_POLICY_BLOCK: fprintf(fp, "action block "); break; default: fprintf(fp, "action %u ", xpinfo->action); break; } if (show_stats) fprintf(fp, "index %u ", xpinfo->index); fprintf(fp, "priority %u ", xpinfo->priority); if (tb[XFRMA_POLICY_TYPE]) { struct xfrm_userpolicy_type *upt; fprintf(fp, "ptype "); if (RTA_PAYLOAD(tb[XFRMA_POLICY_TYPE]) < sizeof(*upt)) fprintf(fp, "(ERROR truncated)"); upt = (struct xfrm_userpolicy_type *)RTA_DATA(tb[XFRMA_POLICY_TYPE]); fprintf(fp, "%s ", strxf_ptype(upt->type)); } if (show_stats > 0) fprintf(fp, "share %s ", strxf_share(xpinfo->share)); if (show_stats > 0 || xpinfo->flags) { __u8 flags = xpinfo->flags; fprintf(fp, "flag "); XFRM_FLAG_PRINT(fp, flags, XFRM_POLICY_LOCALOK, "localok"); if (flags) fprintf(fp, "%x", flags); } if (show_stats > 0) fprintf(fp, " (0x%s)", strxf_mask8(xpinfo->flags)); fprintf(fp, "%s", _SL_); if (show_stats > 0) xfrm_lifetime_print(&xpinfo->lft, &xpinfo->curlft, fp, buf); xfrm_xfrma_print(tb, xpinfo->sel.family, fp, buf); }