|
|
|
@ -364,25 +364,38 @@ static const char *udp_filter(nfapi_buf *b, int family) { |
|
|
|
|
|
|
|
nfapi_nested_begin(b, NFTA_LIST_ELEM); |
|
|
|
|
|
|
|
nfapi_add_str_attr(b, NFTA_EXPR_NAME, "payload"); |
|
|
|
if (family == NFPROTO_INET) { |
|
|
|
|
|
|
|
nfapi_nested_begin(b, NFTA_EXPR_DATA); |
|
|
|
nfapi_add_str_attr(b, NFTA_EXPR_NAME, "meta"); |
|
|
|
|
|
|
|
nfapi_nested_begin(b, NFTA_EXPR_DATA); |
|
|
|
|
|
|
|
nfapi_add_u32_attr(b, NFTA_META_KEY, htonl(NFT_META_L4PROTO)); |
|
|
|
nfapi_add_u32_attr(b, NFTA_META_DREG, htonl(NFT_REG_1)); |
|
|
|
|
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_DREG, htonl(NFT_REG_1)); |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_BASE, htonl(NFT_PAYLOAD_NETWORK_HEADER)); |
|
|
|
nfapi_nested_end(b); |
|
|
|
} |
|
|
|
else { |
|
|
|
nfapi_add_str_attr(b, NFTA_EXPR_NAME, "payload"); |
|
|
|
|
|
|
|
if (family == NFPROTO_IPV4) |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_OFFSET, |
|
|
|
htonl(offsetof(struct iphdr, protocol))); |
|
|
|
else if (family == NFPROTO_IPV6) |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_OFFSET, |
|
|
|
htonl(offsetof(struct ip6_hdr, ip6_nxt))); |
|
|
|
else |
|
|
|
return "unsupported address family for UDP filter"; |
|
|
|
nfapi_nested_begin(b, NFTA_EXPR_DATA); |
|
|
|
|
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_LEN, htonl(sizeof(proto))); |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_DREG, htonl(NFT_REG_1)); |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_BASE, htonl(NFT_PAYLOAD_NETWORK_HEADER)); |
|
|
|
|
|
|
|
nfapi_nested_end(b); |
|
|
|
if (family == NFPROTO_IPV4) |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_OFFSET, |
|
|
|
htonl(offsetof(struct iphdr, protocol))); |
|
|
|
else if (family == NFPROTO_IPV6) |
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_OFFSET, |
|
|
|
htonl(offsetof(struct ip6_hdr, ip6_nxt))); |
|
|
|
else |
|
|
|
return "unsupported address family for UDP filter"; |
|
|
|
|
|
|
|
nfapi_add_u32_attr(b, NFTA_PAYLOAD_LEN, htonl(sizeof(proto))); |
|
|
|
|
|
|
|
nfapi_nested_end(b); |
|
|
|
} |
|
|
|
|
|
|
|
nfapi_nested_end(b); |
|
|
|
|
|
|
|
@ -783,6 +796,11 @@ static const char *nftables_do(const char *chain, const char *base_chain, |
|
|
|
if (err) |
|
|
|
return err; |
|
|
|
|
|
|
|
if (args->family == NFPROTO_INET) |
|
|
|
err = do_func(nl, NFPROTO_INET, chain, base_chain, args); |
|
|
|
if (err) |
|
|
|
return err; |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
|