|
Packit |
c5a612 |
#include <nftables.h>
|
|
Packit |
c5a612 |
#include <expression.h>
|
|
Packit |
c5a612 |
#include <utils.h>
|
|
Packit |
c5a612 |
#include <string.h>
|
|
Packit |
c5a612 |
#include <osf.h>
|
|
Packit |
c5a612 |
#include <json.h>
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
static const char *osf_ttl_int_to_str(const uint8_t ttl)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
if (ttl == 1)
|
|
Packit |
c5a612 |
return "ttl loose ";
|
|
Packit |
c5a612 |
else if (ttl == 2)
|
|
Packit |
c5a612 |
return "ttl skip ";
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
return "";
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
static void osf_expr_print(const struct expr *expr, struct output_ctx *octx)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
const char *ttl_str = osf_ttl_int_to_str(expr->osf.ttl);
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
if (expr->osf.flags & NFT_OSF_F_VERSION)
|
|
Packit |
c5a612 |
nft_print(octx, "osf %sversion", ttl_str);
|
|
Packit |
c5a612 |
else
|
|
Packit |
c5a612 |
nft_print(octx, "osf %sname", ttl_str);
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
static void osf_expr_clone(struct expr *new, const struct expr *expr)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
new->osf.ttl = expr->osf.ttl;
|
|
Packit |
c5a612 |
new->osf.flags = expr->osf.flags;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
static bool osf_expr_cmp(const struct expr *e1, const struct expr *e2)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
return (e1->osf.ttl == e2->osf.ttl) &&
|
|
Packit |
c5a612 |
(e1->osf.flags == e2->osf.flags);
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
const struct expr_ops osf_expr_ops = {
|
|
Packit |
c5a612 |
.type = EXPR_OSF,
|
|
Packit |
c5a612 |
.name = "osf",
|
|
Packit |
c5a612 |
.print = osf_expr_print,
|
|
Packit |
c5a612 |
.clone = osf_expr_clone,
|
|
Packit |
c5a612 |
.cmp = osf_expr_cmp,
|
|
Packit |
c5a612 |
.json = osf_expr_json,
|
|
Packit |
c5a612 |
};
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
struct expr *osf_expr_alloc(const struct location *loc, const uint8_t ttl,
|
|
Packit |
c5a612 |
const uint32_t flags)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
unsigned int len = NFT_OSF_MAXGENRELEN * BITS_PER_BYTE;
|
|
Packit |
c5a612 |
const struct datatype *type = &string_type;
|
|
Packit |
c5a612 |
struct expr *expr;
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
expr = expr_alloc(loc, EXPR_OSF, type,
|
|
Packit |
c5a612 |
BYTEORDER_HOST_ENDIAN, len);
|
|
Packit |
c5a612 |
expr->osf.ttl = ttl;
|
|
Packit |
c5a612 |
expr->osf.flags = flags;
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
return expr;
|
|
Packit |
c5a612 |
}
|