parse_rule_cmp: promote repeated code in cases outside the switch
This commit is contained in:
parent
dbdaabd21e
commit
48f2339759
|
@ -426,108 +426,96 @@ parse_rule_cmp(struct nftnl_expr *e, rule_t *r) {
|
||||||
in_addr_t *addrp;
|
in_addr_t *addrp;
|
||||||
struct in6_addr *addrp6;
|
struct in6_addr *addrp6;
|
||||||
|
|
||||||
data_val = (void *)nftnl_expr_get(e, NFTNL_EXPR_CMP_DATA, &data_len);
|
|
||||||
sreg = nftnl_expr_get_u32(e, NFTNL_EXPR_CMP_SREG);
|
|
||||||
op = nftnl_expr_get_u32(e, NFTNL_EXPR_CMP_OP);
|
op = nftnl_expr_get_u32(e, NFTNL_EXPR_CMP_OP);
|
||||||
|
|
||||||
|
if (op != NFT_CMP_EQ) {
|
||||||
|
/* not a cmp expression, so bail out early */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sreg = nftnl_expr_get_u32(e, NFTNL_EXPR_CMP_SREG);
|
||||||
|
|
||||||
if (sreg != NFT_REG_1) {
|
if (sreg != NFT_REG_1) {
|
||||||
syslog(LOG_ERR, "parse_rule_cmp: Unsupport reg:%d", sreg);
|
syslog(LOG_ERR, "parse_rule_cmp: Unsupport reg:%d", sreg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data_val = (void *)nftnl_expr_get(e, NFTNL_EXPR_CMP_DATA, &data_len);
|
||||||
|
|
||||||
switch (r->reg1_type) {
|
switch (r->reg1_type) {
|
||||||
case RULE_REG_IIF:
|
case RULE_REG_IIF:
|
||||||
if (data_len == sizeof(uint32_t) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(uint32_t)) {
|
||||||
r->ingress_ifidx = *(uint32_t *)data_val;
|
r->ingress_ifidx = *(uint32_t *)data_val;
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP_SRC_ADDR:
|
case RULE_REG_IP_SRC_ADDR:
|
||||||
if (data_len == sizeof(in_addr_t) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(in_addr_t)) {
|
||||||
r->rhost = *(in_addr_t *)data_val;
|
r->rhost = *(in_addr_t *)data_val;
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP6_SRC_ADDR:
|
case RULE_REG_IP6_SRC_ADDR:
|
||||||
if (data_len == sizeof(struct in6_addr) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(struct in6_addr)) {
|
||||||
r->rhost6 = *(struct in6_addr *)data_val;
|
r->rhost6 = *(struct in6_addr *)data_val;
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP_DEST_ADDR:
|
case RULE_REG_IP_DEST_ADDR:
|
||||||
if (data_len == sizeof(in_addr_t) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(in_addr_t)) {
|
||||||
if (r->type == RULE_FILTER) {
|
if (r->type == RULE_FILTER) {
|
||||||
r->iaddr = *(in_addr_t *)data_val;
|
r->iaddr = *(in_addr_t *)data_val;
|
||||||
} else {
|
} else {
|
||||||
r->rhost = *(in_addr_t *)data_val;
|
r->rhost = *(in_addr_t *)data_val;
|
||||||
}
|
}
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP6_DEST_ADDR:
|
case RULE_REG_IP6_DEST_ADDR:
|
||||||
if (data_len == sizeof(struct in6_addr) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(struct in6_addr)) {
|
||||||
if (r->type == RULE_FILTER) {
|
if (r->type == RULE_FILTER) {
|
||||||
r->iaddr6 = *(struct in6_addr *)data_val;
|
r->iaddr6 = *(struct in6_addr *)data_val;
|
||||||
} else {
|
} else {
|
||||||
r->rhost6 = *(struct in6_addr *)data_val;
|
r->rhost6 = *(struct in6_addr *)data_val;
|
||||||
}
|
}
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP_SD_ADDR:
|
case RULE_REG_IP_SD_ADDR:
|
||||||
if (data_len == sizeof(in_addr_t) * 2 && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(in_addr_t) * 2) {
|
||||||
addrp = (in_addr_t *)data_val;
|
addrp = (in_addr_t *)data_val;
|
||||||
r->iaddr = addrp[0];
|
r->iaddr = addrp[0];
|
||||||
r->rhost = addrp[1];
|
r->rhost = addrp[1];
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP6_SD_ADDR:
|
case RULE_REG_IP6_SD_ADDR:
|
||||||
if (data_len == sizeof(struct in6_addr) * 2 && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(struct in6_addr) * 2) {
|
||||||
addrp6 = (struct in6_addr *)data_val;
|
addrp6 = (struct in6_addr *)data_val;
|
||||||
r->iaddr6 = addrp6[0];
|
r->iaddr6 = addrp6[0];
|
||||||
r->rhost6 = addrp6[1];
|
r->rhost6 = addrp6[1];
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_IP_PROTO:
|
case RULE_REG_IP_PROTO:
|
||||||
case RULE_REG_IP6_PROTO:
|
case RULE_REG_IP6_PROTO:
|
||||||
if (data_len == sizeof(uint8_t) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(uint8_t)) {
|
||||||
r->proto = *(uint8_t *)data_val;
|
r->proto = *(uint8_t *)data_val;
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_TCP_DPORT:
|
case RULE_REG_TCP_DPORT:
|
||||||
if (data_len == sizeof(uint16_t) && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(uint16_t)) {
|
||||||
r->eport = ntohs(*(uint16_t *)data_val);
|
r->eport = ntohs(*(uint16_t *)data_val);
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RULE_REG_TCP_SD_PORT:
|
case RULE_REG_TCP_SD_PORT:
|
||||||
if (data_len == sizeof(uint16_t) * 2 && op == NFT_CMP_EQ) {
|
if (data_len == sizeof(uint16_t) * 2) {
|
||||||
ports = (uint16_t *)data_val;
|
ports = (uint16_t *)data_val;
|
||||||
r->eport = ntohs(ports[0]);
|
r->eport = ntohs(ports[0]);
|
||||||
r->rport = ntohs(ports[1]);
|
r->rport = ntohs(ports[1]);
|
||||||
r->reg1_type = RULE_REG_NONE;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
syslog(LOG_DEBUG, "Unknown cmp (r1type:%d, data_len:%d, op:%d)",
|
syslog(LOG_DEBUG, "Unknown cmp (r1type:%d, data_len:%d, op:%d)",
|
||||||
r->reg1_type, data_len, op);
|
r->reg1_type, data_len, op);
|
||||||
|
/* return early - don't modify r->reg1_type */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
r->reg1_type = RULE_REG_NONE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue