static int nftnl_expr_queue_snprintf_default(char *buf, size_t len, struct nftnl_expr *e) { struct nftnl_expr_queue *queue = nftnl_expr_data(e); int ret, size = len, offset = 0; uint16_t total_queues; total_queues = queue->queuenum + queue->queues_total -1; ret = snprintf(buf + offset, len, "num %u", queue->queuenum); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); if (queue->queues_total && total_queues != queue->queuenum) { ret = snprintf(buf + offset, len, "-%u", total_queues); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (e->flags & (1 << NFTNL_EXPR_QUEUE_FLAGS)) { if (queue->flags & (NFT_QUEUE_FLAG_BYPASS)) { ret = snprintf(buf + offset, len, " bypass"); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (queue->flags & (NFT_QUEUE_FLAG_CPU_FANOUT)) { ret = snprintf(buf + offset, len, " fanout"); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } } return offset; }
static int nft_expr_ct_snprintf_default(char *buf, size_t size, struct nft_rule_expr *e) { int ret, len = size, offset = 0; struct nft_expr_ct *ct = nft_expr_data(e); if (e->flags & (1 << NFT_EXPR_CT_SREG)) { ret = snprintf(buf, size, "set %s with reg %u ", ctkey2str(ct->key), ct->sreg); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (e->flags & (1 << NFT_EXPR_CT_DREG)) { ret = snprintf(buf, len, "load %s => reg %u ", ctkey2str(ct->key), ct->dreg); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (nft_rule_expr_is_set(e, NFT_EXPR_CT_DIR)) { ret = snprintf(buf+offset, len, ", dir %s ", ctdir2str(ct->dir)); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } return offset; }
static int nft_rule_expr_nat_snprintf_default(char *buf, size_t size, struct nft_rule_expr *e) { struct nft_expr_nat *nat = nft_expr_data(e); int len = size, offset = 0, ret = 0; ret = snprintf(buf, len, "%s ", nat2str(nat->type)); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = snprintf(buf+offset, len, "%s ", nft_family2str(nat->family)); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); if (e->flags & (1 << NFT_EXPR_NAT_REG_ADDR_MIN)) { ret = snprintf(buf+offset, len, "addr_min reg %u addr_max reg %u ", nat->sreg_addr_min, nat->sreg_addr_max); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (e->flags & (1 << NFT_EXPR_NAT_REG_PROTO_MIN)) { ret = snprintf(buf+offset, len, "proto_min reg %u proto_max reg %u ", nat->sreg_proto_min, nat->sreg_proto_max); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (e->flags & (1 << NFT_EXPR_NAT_FLAGS)) { ret = snprintf(buf+offset, len, "flags %u", nat->flags); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } return offset; }
static int nftnl_expr_lookup_snprintf_default(char *buf, size_t size, struct nftnl_expr *e) { int len = size, offset = 0, ret; struct nftnl_expr_lookup *l = nftnl_expr_data(e); ret = snprintf(buf, len, "reg %u set %s ", l->sreg, l->set_name); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); if (e->flags & (1 << NFTNL_EXPR_LOOKUP_DREG)) { ret = snprintf(buf+offset, len, "dreg %u ", l->dreg); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } return offset; }
static int nft_rule_expr_cmp_snprintf_json(char *buf, size_t size, struct nft_expr_cmp *cmp) { int len = size, offset = 0, ret; ret = snprintf(buf, len, "\"sreg\" : %u ,\"op\" : \"%s\", \"cmpdata\" : \"", cmp->sreg, expr_cmp_str[cmp->op]); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = nft_data_reg_snprintf(buf+offset, len, &cmp->data, NFT_RULE_O_XML, 0, DATA_VALUE); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = snprintf(buf+offset, len, "\""); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); return offset; }
static int nft_rule_expr_nat_snprintf_json(char *buf, size_t size, struct nft_rule_expr *e) { struct nft_expr_nat *nat = (struct nft_expr_nat *)e->data; int len = size, offset = 0, ret = 0; switch (nat->type) { case NFT_NAT_SNAT: ret = snprintf(buf, len, "\"type\" : \"NFT_NAT_SNAT\","); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); break; case NFT_NAT_DNAT: ret = snprintf(buf, len, "\"type\" : \"NFT_NAT_DNAT\","); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); break; } ret = snprintf(buf, len, "\"family\" : \"%s\",", nat->family == AF_INET ? "AF_INET" : "AF_INET6"); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); if (e->flags & (1 << NFT_EXPR_NAT_REG_ADDR_MIN)) { ret = snprintf(buf, len, "\"sreg_addr_min_v4\" : %u," " \"sreg_addr_max_v4\" : %u,", nat->sreg_addr_min, nat->sreg_addr_max); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } if (e->flags & (1 << NFT_EXPR_NAT_REG_PROTO_MIN)) { ret = snprintf(buf, len, "\"sreg_proto_min\" : %u," "\"sreg_proto_max\" : %u", nat->sreg_proto_min, nat->sreg_proto_max); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } return offset; }
static int nft_rule_expr_log_snprintf_default(char *buf, size_t size, struct nft_rule_expr *e) { struct nft_expr_log *log = nft_expr_data(e); int ret, offset = 0, len = size; ret = snprintf(buf, len, "prefix %s ", log->prefix); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); if (e->flags & (1 << NFT_EXPR_LOG_GROUP)) { ret = snprintf(buf + offset, len, "group %u snaplen %u qthreshold %u", log->group, log->snaplen, log->qthreshold); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } else if (e->flags & (1 << NFT_EXPR_LOG_LEVEL)) { ret = snprintf(buf + offset, len, "level %u flags %u", log->level, log->flags); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); } return offset; }
static int nft_rule_expr_byteorder_snprintf_default(char *buf, size_t size, struct nft_rule_expr *e) { struct nft_expr_byteorder *byteorder = nft_expr_data(e); int len = size, offset = 0, ret; ret = snprintf(buf, len, "reg %u = %s(reg %u, %u, %u) ", byteorder->dreg, bo2str(byteorder->op), byteorder->sreg, byteorder->size, byteorder->len); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); return offset; }
static int nft_rule_expr_bitwise_snprintf_default(char *buf, size_t size, struct nft_rule_expr *e) { struct nft_expr_bitwise *bitwise = nft_expr_data(e); int len = size, offset = 0, ret; ret = snprintf(buf, len, "reg %u = (reg=%u & ", bitwise->dreg, bitwise->sreg); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = nft_data_reg_snprintf(buf+offset, len, &bitwise->mask, NFT_OUTPUT_DEFAULT, 0, DATA_VALUE); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = snprintf(buf+offset, len, ") ^ "); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = nft_data_reg_snprintf(buf+offset, len, &bitwise->xor, NFT_OUTPUT_DEFAULT, 0, DATA_VALUE); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); return offset; }
static int nftnl_gen_cmd_snprintf(char *buf, size_t size, const struct nftnl_gen *gen, uint32_t cmd, uint32_t type, uint32_t flags) { int ret, len = size, offset = 0; ret = nftnl_cmd_header_snprintf(buf + offset, len, cmd, type, flags); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); switch(type) { case NFTNL_OUTPUT_DEFAULT: ret = nftnl_gen_snprintf_default(buf + offset, len, gen); break; default: return -1; } SNPRINTF_BUFFER_SIZE(ret, size, len, offset); ret = nftnl_cmd_footer_snprintf(buf + offset, len, cmd, type, flags); SNPRINTF_BUFFER_SIZE(ret, size, len, offset); return offset; }