Blame src/osf.c

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
}