static int nftnl_expr_payload_snprintf(char *buf, size_t len, uint32_t type, uint32_t flags, struct nftnl_expr *e) { struct nftnl_expr_payload *payload = nftnl_expr_data(e); switch (type) { case NFTNL_OUTPUT_DEFAULT: if (payload->sreg) return snprintf(buf, len, "write reg %u => %ub @ %s header + %u csum_type %u csum_off %u ", payload->sreg, payload->len, base2str(payload->base), payload->offset, payload->csum_type, payload->csum_offset); else return snprintf(buf, len, "load %ub @ %s header + %u => reg %u ", payload->len, base2str(payload->base), payload->offset, payload->dreg); case NFTNL_OUTPUT_XML: case NFTNL_OUTPUT_JSON: return nftnl_expr_payload_export(buf, len, flags, e, type); default: break; } return -1; }
static int nftnl_expr_payload_export(char *buf, size_t size, uint32_t flags, struct nftnl_expr *e, int type) { struct nftnl_expr_payload *payload = nftnl_expr_data(e); NFTNL_BUF_INIT(b, buf, size); if (e->flags & (1 << NFTNL_EXPR_PAYLOAD_DREG)) nftnl_buf_u32(&b, type, payload->dreg, DREG); if (e->flags & (1 << NFTNL_EXPR_PAYLOAD_OFFSET)) nftnl_buf_u32(&b, type, payload->offset, OFFSET); if (e->flags & (1 << NFTNL_EXPR_PAYLOAD_LEN)) nftnl_buf_u32(&b, type, payload->len, LEN); if (e->flags & (1 << NFTNL_EXPR_PAYLOAD_BASE)) nftnl_buf_str(&b, type, base2str(payload->base), BASE); return nftnl_buf_done(&b); }