diff options
author | Fernando Fernandez Mancera <ffmancera@riseup.net> | 2019-03-27 11:37:56 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2019-04-08 23:46:50 +0200 |
commit | fdda1fad8853b92bac726cbe162b58a5b73c8b4d (patch) | |
tree | 5f3c3318af92f81c08fecd57baf6e725aa733777 /src/osf.c | |
parent | 067ac215e93f6cb912c3f99ca9e6689397bfba2f (diff) |
osf: add version fingerprint support
Add support for version fingerprint in "osf" expression. Example:
table ip foo {
chain bar {
type filter hook input priority filter; policy accept;
osf ttl skip name "Linux"
osf ttl skip version "Linux:4.20"
}
}
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/osf.c')
-rw-r--r-- | src/osf.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -19,17 +19,22 @@ static void osf_expr_print(const struct expr *expr, struct output_ctx *octx) { const char *ttl_str = osf_ttl_int_to_str(expr->osf.ttl); - nft_print(octx, "osf %sname", ttl_str); + if (expr->osf.flags & NFT_OSF_F_VERSION) + nft_print(octx, "osf %sversion", ttl_str); + else + nft_print(octx, "osf %sname", ttl_str); } static void osf_expr_clone(struct expr *new, const struct expr *expr) { new->osf.ttl = expr->osf.ttl; + new->osf.flags = expr->osf.flags; } static bool osf_expr_cmp(const struct expr *e1, const struct expr *e2) { - return e1->osf.ttl == e2->osf.ttl; + return (e1->osf.ttl == e2->osf.ttl) && + (e1->osf.flags == e2->osf.flags); } const struct expr_ops osf_expr_ops = { @@ -41,7 +46,8 @@ const struct expr_ops osf_expr_ops = { .json = osf_expr_json, }; -struct expr *osf_expr_alloc(const struct location *loc, const uint8_t ttl) +struct expr *osf_expr_alloc(const struct location *loc, const uint8_t ttl, + const uint32_t flags) { unsigned int len = NFT_OSF_MAXGENRELEN * BITS_PER_BYTE; const struct datatype *type = &string_type; @@ -50,6 +56,7 @@ struct expr *osf_expr_alloc(const struct location *loc, const uint8_t ttl) expr = expr_alloc(loc, EXPR_OSF, type, BYTEORDER_HOST_ENDIAN, len); expr->osf.ttl = ttl; + expr->osf.flags = flags; return expr; } |