static int nft_rule_expr_nat_json_parse(struct nft_rule_expr *e, json_t *root, struct nft_parse_err *err) { #ifdef JSON_PARSING const char *nat_type, *family_str; uint32_t reg, flags; int val32; nat_type = nft_jansson_parse_str(root, "nat_type", err); if (nat_type == NULL) return -1; val32 = nft_str2nat(nat_type); if (val32 < 0) return -1; nft_rule_expr_set_u32(e, NFT_EXPR_NAT_TYPE, val32); family_str = nft_jansson_parse_str(root, "family", err); if (family_str == NULL) return -1; val32 = nft_str2family(family_str); if (val32 < 0) return -1; nft_rule_expr_set_u32(e, NFT_EXPR_NAT_FAMILY, val32); if (nft_jansson_parse_reg(root, "sreg_addr_min", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_NAT_REG_ADDR_MIN, reg); if (nft_jansson_parse_reg(root, "sreg_addr_max", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_NAT_REG_ADDR_MAX, reg); if (nft_jansson_parse_reg(root, "sreg_proto_min", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_NAT_REG_PROTO_MIN, reg); if (nft_jansson_parse_reg(root, "sreg_proto_max", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_NAT_REG_PROTO_MAX, reg); if (nft_jansson_parse_val(root, "flags", NFT_TYPE_U32, &flags, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_NAT_FLAGS, flags); return 0; #else errno = EOPNOTSUPP; return -1; #endif }
static int nft_rule_expr_ct_json_parse(struct nft_rule_expr *e, json_t *root, struct nft_parse_err *err) { #ifdef JSON_PARSING const char *key_str, *dir_str; uint32_t reg; uint8_t dir; int key; if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_CT_DREG, reg); if (nft_jansson_parse_reg(root, "sreg", NFT_TYPE_U32, ®, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_CT_SREG, reg); key_str = nft_jansson_parse_str(root, "key", err); if (key_str != NULL) { key = str2ctkey(key_str); if (key < 0) return -1; nft_rule_expr_set_u32(e, NFT_EXPR_CT_KEY, key); } dir_str = nft_jansson_parse_str(root, "dir", err); if (dir_str != NULL) { if (str2ctdir(dir_str, &dir) != 0) { err->node_name = "dir"; err->error = NFT_PARSE_EBADTYPE; goto err; } nft_rule_expr_set_u8(e, NFT_EXPR_CT_DIR, dir); } return 0; err: errno = EINVAL; return -1; #else errno = EOPNOTSUPP; return -1; #endif }
static int nft_rule_expr_match_json_parse(struct nft_rule_expr *e, json_t *root, struct nft_parse_err *err) { #ifdef JSON_PARSING const char *name; name = nft_jansson_parse_str(root, "name", err); if (name != NULL) nft_rule_expr_set_str(e, NFT_EXPR_MT_NAME, name); return 0; #else errno = EOPNOTSUPP; return -1; #endif }
static int nft_rule_expr_log_json_parse(struct nft_rule_expr *e, json_t *root, struct nft_parse_err *err) { #ifdef JSON_PARSING const char *prefix; uint32_t snaplen, level, flags; uint16_t group, qthreshold; prefix = nft_jansson_parse_str(root, "prefix", err); if (prefix != NULL) nft_rule_expr_set_str(e, NFT_EXPR_LOG_PREFIX, prefix); if (nft_jansson_parse_val(root, "group", NFT_TYPE_U16, &group, err) == 0) nft_rule_expr_set_u16(e, NFT_EXPR_LOG_GROUP, group); if (nft_jansson_parse_val(root, "snaplen", NFT_TYPE_U32, &snaplen, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_LOG_SNAPLEN, snaplen); if (nft_jansson_parse_val(root, "qthreshold", NFT_TYPE_U16, &qthreshold, err) == 0) nft_rule_expr_set_u16(e, NFT_EXPR_LOG_QTHRESHOLD, qthreshold); if (nft_jansson_parse_val(root, "level", NFT_TYPE_U32, &level, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_LOG_LEVEL, level); if (nft_jansson_parse_val(root, "flags", NFT_TYPE_U32, &flags, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_LOG_FLAGS, flags); return 0; #else errno = EOPNOTSUPP; return -1; #endif }
static int nft_rule_expr_byteorder_json_parse(struct nft_rule_expr *e, json_t *root, struct nft_parse_err *err) { #ifdef JSON_PARSING const char *op; uint32_t sreg, dreg, len, size; int ntoh; if (nft_jansson_parse_reg(root, "sreg", NFT_TYPE_U32, &sreg, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_BYTEORDER_SREG, sreg); if (nft_jansson_parse_reg(root, "dreg", NFT_TYPE_U32, &dreg, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_BYTEORDER_DREG, dreg); op = nft_jansson_parse_str(root, "op", err); if (op != NULL) { ntoh = nft_str2ntoh(op); if (ntoh < 0) return -1; nft_rule_expr_set_u32(e, NFT_EXPR_BYTEORDER_OP, ntoh); } if (nft_jansson_parse_val(root, "len", NFT_TYPE_U32, &len, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_BYTEORDER_LEN, len); if (nft_jansson_parse_val(root, "size", NFT_TYPE_U32, &size, err) == 0) nft_rule_expr_set_u32(e, NFT_EXPR_BYTEORDER_SIZE, size); return 0; #else errno = EOPNOTSUPP; return -1; #endif }