Blame include/datatype.h

Packit c5a612
#ifndef NFTABLES_DATATYPE_H
Packit c5a612
#define NFTABLES_DATATYPE_H
Packit c5a612
Packit c5a612
#include <json.h>
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * enum datatypes
Packit c5a612
 *
Packit c5a612
 * @TYPE_INVALID:	uninitialized
Packit c5a612
 * @TYPE_VERDICT:	nftables verdict
Packit c5a612
 * @TYPE_NFPROTO:	netfilter protocol (integer subtype)
Packit c5a612
 * @TYPE_BITMASK:	bitmask
Packit c5a612
 * @TYPE_INTEGER:	integer
Packit c5a612
 * @TYPE_STRING:	string
Packit c5a612
 * @TYPE_LLADDR:	link layer address (integer subtype)
Packit c5a612
 * @TYPE_IPADDR:	IPv4 address (integer subtype)
Packit c5a612
 * @TYPE_IP6ADDR:	IPv6 address (integer subtype)
Packit c5a612
 * @TYPE_ETHERADDR:	Ethernet address (lladdr subtype)
Packit c5a612
 * @TYPE_ETHERTYPE:	EtherType (integer subtype)
Packit c5a612
 * @TYPE_ARPOP:		ARP operation (integer subtype)
Packit c5a612
 * @TYPE_INET_PROTOCOL:	internet protocol (integer subtype)
Packit c5a612
 * @TYPE_INET_SERVICE:	internet service (integer subtype)
Packit c5a612
 * @TYPE_ICMP_TYPE:	ICMP type codes (integer subtype)
Packit c5a612
 * @TYPE_TCP_FLAG:	TCP flag (bitmask subtype)
Packit c5a612
 * @TCPE_DCCP_PKTTYPE:	DCCP packet type (integer subtype)
Packit c5a612
 * @TYPE_MH_TYPE:	Mobility Header type (integer subtype)
Packit c5a612
 * @TYPE_TIME:		relative time
Packit c5a612
 * @TYPE_MARK:		packet mark (integer subtype)
Packit c5a612
 * @TYPE_IFINDEX:	interface index (integer subtype)
Packit c5a612
 * @TYPE_ARPHRD:	interface type (integer subtype)
Packit c5a612
 * @TYPE_REALM:		routing realm (integer subtype)
Packit c5a612
 * @TYPE_CLASSID:	TC classid (integer subtype)
Packit c5a612
 * @TYPE_UID:		user ID (integer subtype)
Packit c5a612
 * @TYPE_GID:		group ID (integer subtype)
Packit c5a612
 * @TYPE_CT_STATE:	conntrack state (bitmask subtype)
Packit c5a612
 * @TYPE_CT_DIR:	conntrack direction
Packit c5a612
 * @TYPE_CT_STATUS:	conntrack status (bitmask subtype)
Packit c5a612
 * @TYPE_ICMP6_TYPE:	ICMPv6 type codes (integer subtype)
Packit c5a612
 * @TYPE_CT_LABEL:	Conntrack Label (bitmask subtype)
Packit c5a612
 * @TYPE_PKTTYPE:	packet type (integer subtype)
Packit c5a612
 * @TYPE_ICMP_CODE:	icmp code (integer subtype)
Packit c5a612
 * @TYPE_ICMPV6_CODE:	icmpv6 code (integer subtype)
Packit c5a612
 * @TYPE_ICMPX_CODE:	icmpx code (integer subtype)
Packit c5a612
 * @TYPE_DEVGROUP:	devgroup code (integer subtype)
Packit c5a612
 * @TYPE_DSCP:		Differentiated Services Code Point (integer subtype)
Packit c5a612
 * @TYPE_IFNAME:	interface name (string subtype)
Packit c5a612
 * @TYPE_IGMP:		IGMP type (integer subtype)
Packit c5a612
 * @TYPE_TIME_DATA	Date type (integer subtype)
Packit c5a612
 * @TYPE_TIME_HOUR	Hour type (integer subtype)
Packit c5a612
 * @TYPE_TIME_DAY	Day type (integer subtype)
Packit c5a612
 */
Packit c5a612
enum datatypes {
Packit c5a612
	TYPE_INVALID,
Packit c5a612
	TYPE_VERDICT,
Packit c5a612
	TYPE_NFPROTO,
Packit c5a612
	TYPE_BITMASK,
Packit c5a612
	TYPE_INTEGER,
Packit c5a612
	TYPE_STRING,
Packit c5a612
	TYPE_LLADDR,
Packit c5a612
	TYPE_IPADDR,
Packit c5a612
	TYPE_IP6ADDR,
Packit c5a612
	TYPE_ETHERADDR,
Packit c5a612
	TYPE_ETHERTYPE,
Packit c5a612
	TYPE_ARPOP,
Packit c5a612
	TYPE_INET_PROTOCOL,
Packit c5a612
	TYPE_INET_SERVICE,
Packit c5a612
	TYPE_ICMP_TYPE,
Packit c5a612
	TYPE_TCP_FLAG,
Packit c5a612
	TYPE_DCCP_PKTTYPE,
Packit c5a612
	TYPE_MH_TYPE,
Packit c5a612
	TYPE_TIME,
Packit c5a612
	TYPE_MARK,
Packit c5a612
	TYPE_IFINDEX,
Packit c5a612
	TYPE_ARPHRD,
Packit c5a612
	TYPE_REALM,
Packit c5a612
	TYPE_CLASSID,
Packit c5a612
	TYPE_UID,
Packit c5a612
	TYPE_GID,
Packit c5a612
	TYPE_CT_STATE,
Packit c5a612
	TYPE_CT_DIR,
Packit c5a612
	TYPE_CT_STATUS,
Packit c5a612
	TYPE_ICMP6_TYPE,
Packit c5a612
	TYPE_CT_LABEL,
Packit c5a612
	TYPE_PKTTYPE,
Packit c5a612
	TYPE_ICMP_CODE,
Packit c5a612
	TYPE_ICMPV6_CODE,
Packit c5a612
	TYPE_ICMPX_CODE,
Packit c5a612
	TYPE_DEVGROUP,
Packit c5a612
	TYPE_DSCP,
Packit c5a612
	TYPE_ECN,
Packit c5a612
	TYPE_FIB_ADDR,
Packit c5a612
	TYPE_BOOLEAN,
Packit c5a612
	TYPE_CT_EVENTBIT,
Packit c5a612
	TYPE_IFNAME,
Packit c5a612
	TYPE_IGMP_TYPE,
Packit c5a612
	TYPE_TIME_DATE,
Packit c5a612
	TYPE_TIME_HOUR,
Packit c5a612
	TYPE_TIME_DAY,
Packit c5a612
	__TYPE_MAX
Packit c5a612
};
Packit c5a612
#define TYPE_MAX		(__TYPE_MAX - 1)
Packit c5a612
Packit c5a612
#define TYPE_BITS		6
Packit c5a612
#define TYPE_MASK		((1 << TYPE_BITS) - 1)
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * enum byteorder
Packit c5a612
 *
Packit c5a612
 * @BYTEORDER_INVALID:		uninitialized/unknown
Packit c5a612
 * @BYTEORDER_HOST_ENDIAN:	host endian
Packit c5a612
 * @BYTEORDER_BIG_ENDIAN:	big endian
Packit c5a612
 */
Packit c5a612
enum byteorder {
Packit c5a612
	BYTEORDER_INVALID,
Packit c5a612
	BYTEORDER_HOST_ENDIAN,
Packit c5a612
	BYTEORDER_BIG_ENDIAN,
Packit c5a612
};
Packit c5a612
Packit c5a612
struct expr;
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * enum datatype_flags
Packit c5a612
 *
Packit c5a612
 * @DTYPE_F_ALLOC:		datatype is dynamically allocated
Packit c5a612
 * @DTYPE_F_PREFIX:		preferred representation for ranges is a prefix
Packit c5a612
 */
Packit c5a612
enum datatype_flags {
Packit c5a612
	DTYPE_F_ALLOC		= (1 << 0),
Packit c5a612
	DTYPE_F_PREFIX		= (1 << 1),
Packit c5a612
};
Packit c5a612
Packit c5a612
struct parse_ctx;
Packit c5a612
/**
Packit c5a612
 * struct datatype
Packit c5a612
 *
Packit c5a612
 * @type:	numeric identifier
Packit c5a612
 * @byteorder:	byteorder of type (non-basetypes only)
Packit c5a612
 * @flags:	flags
Packit c5a612
 * @size:	type size (fixed sized non-basetypes only)
Packit c5a612
 * @subtypes:	number of subtypes (concat type)
Packit c5a612
 * @name:	type name
Packit c5a612
 * @desc:	type description
Packit c5a612
 * @basetype:	basetype for subtypes, determines type compatibility
Packit c5a612
 * @basefmt:	format string for basetype
Packit c5a612
 * @print:	function to print a constant of this type
Packit c5a612
 * @parse:	function to parse a symbol and return an expression
Packit c5a612
 * @sym_tbl:	symbol table for this type
Packit c5a612
 * @refcnt:	reference counter (only for DTYPE_F_ALLOC)
Packit c5a612
 */
Packit c5a612
struct datatype {
Packit c5a612
	uint32_t			type;
Packit c5a612
	enum byteorder			byteorder;
Packit c5a612
	unsigned int			flags;
Packit c5a612
	unsigned int			size;
Packit c5a612
	unsigned int			subtypes;
Packit c5a612
	const char			*name;
Packit c5a612
	const char			*desc;
Packit c5a612
	const struct datatype		*basetype;
Packit c5a612
	const char			*basefmt;
Packit c5a612
	void				(*print)(const struct expr *expr,
Packit c5a612
						 struct output_ctx *octx);
Packit c5a612
	json_t				*(*json)(const struct expr *expr,
Packit c5a612
						 struct output_ctx *octx);
Packit c5a612
	struct error_record		*(*parse)(struct parse_ctx *ctx,
Packit c5a612
						  const struct expr *sym,
Packit c5a612
						  struct expr **res);
Packit c5a612
	const struct symbol_table	*sym_tbl;
Packit c5a612
	unsigned int			refcnt;
Packit c5a612
};
Packit c5a612
Packit c5a612
extern const struct datatype *datatype_lookup(enum datatypes type);
Packit c5a612
extern const struct datatype *datatype_lookup_byname(const char *name);
Packit c5a612
extern struct datatype *datatype_get(const struct datatype *dtype);
Packit c5a612
extern void datatype_set(struct expr *expr, const struct datatype *dtype);
Packit c5a612
extern void datatype_free(const struct datatype *dtype);
Packit c5a612
Packit c5a612
struct parse_ctx {
Packit c5a612
	struct symbol_tables	*tbl;
Packit c5a612
};
Packit c5a612
Packit c5a612
extern struct error_record *symbol_parse(struct parse_ctx *ctx,
Packit c5a612
					 const struct expr *sym,
Packit c5a612
					 struct expr **res);
Packit c5a612
extern void datatype_print(const struct expr *expr, struct output_ctx *octx);
Packit c5a612
Packit c5a612
static inline bool datatype_equal(const struct datatype *d1,
Packit c5a612
				  const struct datatype *d2)
Packit c5a612
{
Packit c5a612
	return d1->type == d2->type;
Packit c5a612
}
Packit c5a612
Packit c5a612
static inline const struct datatype *
Packit c5a612
datatype_basetype(const struct datatype *dtype)
Packit c5a612
{
Packit c5a612
	return dtype->basetype ? dtype->basetype : dtype;
Packit c5a612
}
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * struct symbolic_constant - symbol <-> constant mapping
Packit c5a612
 *
Packit c5a612
 * @identifier:	symbol
Packit c5a612
 * @value:	symbolic value
Packit c5a612
 */
Packit c5a612
struct symbolic_constant {
Packit c5a612
	const char			*identifier;
Packit c5a612
	uint64_t			value;
Packit c5a612
};
Packit c5a612
Packit c5a612
#define SYMBOL(id, v)	{ .identifier = (id), .value = (v) }
Packit c5a612
#define SYMBOL_LIST_END	(struct symbolic_constant) { }
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * enum base - indicate how to display symbol table values
Packit c5a612
 *
Packit c5a612
 * @BASE_HEXADECIMAL:	hexadecimal
Packit c5a612
 * @BASE_DECIMAL:	decimal
Packit c5a612
 */
Packit c5a612
enum base {
Packit c5a612
	BASE_HEXADECIMAL,
Packit c5a612
	BASE_DECIMAL,
Packit c5a612
};
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * struct symbol_table - type construction from symbolic values
Packit c5a612
 *
Packit c5a612
 * @base:	base of symbols representation
Packit c5a612
 * @symbols:	the symbols
Packit c5a612
 */
Packit c5a612
struct symbol_table {
Packit c5a612
	enum base 			base;
Packit c5a612
	struct symbolic_constant	symbols[];
Packit c5a612
};
Packit c5a612
Packit c5a612
extern struct error_record *symbolic_constant_parse(struct parse_ctx *ctx,
Packit c5a612
						    const struct expr *sym,
Packit c5a612
						    const struct symbol_table *tbl,
Packit c5a612
						    struct expr **res);
Packit c5a612
extern void symbolic_constant_print(const struct symbol_table *tbl,
Packit c5a612
				    const struct expr *expr, bool quotes,
Packit c5a612
				    struct output_ctx *octx);
Packit c5a612
extern void symbol_table_print(const struct symbol_table *tbl,
Packit c5a612
			       const struct datatype *dtype,
Packit c5a612
			       enum byteorder byteorder,
Packit c5a612
			       struct output_ctx *octx);
Packit c5a612
Packit c5a612
extern struct symbol_table *rt_symbol_table_init(const char *filename);
Packit c5a612
extern void rt_symbol_table_free(const struct symbol_table *tbl);
Packit c5a612
Packit c5a612
extern const struct datatype invalid_type;
Packit c5a612
extern const struct datatype verdict_type;
Packit c5a612
extern const struct datatype nfproto_type;
Packit c5a612
extern const struct datatype bitmask_type;
Packit c5a612
extern const struct datatype integer_type;
Packit c5a612
extern const struct datatype string_type;
Packit c5a612
extern const struct datatype lladdr_type;
Packit c5a612
extern const struct datatype ipaddr_type;
Packit c5a612
extern const struct datatype ip6addr_type;
Packit c5a612
extern const struct datatype etheraddr_type;
Packit c5a612
extern const struct datatype ethertype_type;
Packit c5a612
extern const struct datatype arphrd_type;
Packit c5a612
extern const struct datatype inet_protocol_type;
Packit c5a612
extern const struct datatype inet_service_type;
Packit c5a612
extern const struct datatype mark_type;
Packit c5a612
extern const struct datatype icmp_type_type;
Packit c5a612
extern const struct datatype icmp_code_type;
Packit c5a612
extern const struct datatype icmpv6_code_type;
Packit c5a612
extern const struct datatype icmpx_code_type;
Packit c5a612
extern const struct datatype igmp_type_type;
Packit c5a612
extern const struct datatype time_type;
Packit c5a612
extern const struct datatype boolean_type;
Packit c5a612
extern const struct datatype priority_type;
Packit c5a612
extern const struct datatype policy_type;
Packit c5a612
Packit c5a612
void inet_service_type_print(const struct expr *expr, struct output_ctx *octx);
Packit c5a612
Packit c5a612
extern const struct datatype *concat_type_alloc(uint32_t type);
Packit c5a612
Packit c5a612
static inline uint32_t concat_subtype_add(uint32_t type, uint32_t subtype)
Packit c5a612
{
Packit c5a612
	return type << TYPE_BITS | subtype;
Packit c5a612
}
Packit c5a612
Packit c5a612
static inline uint32_t concat_subtype_id(uint32_t type, unsigned int n)
Packit c5a612
{
Packit c5a612
	return (type >> TYPE_BITS * n) & TYPE_MASK;
Packit c5a612
}
Packit c5a612
Packit c5a612
static inline const struct datatype *
Packit c5a612
concat_subtype_lookup(uint32_t type, unsigned int n)
Packit c5a612
{
Packit c5a612
	return datatype_lookup(concat_subtype_id(type, n));
Packit c5a612
}
Packit c5a612
Packit c5a612
extern const struct datatype *
Packit c5a612
set_datatype_alloc(const struct datatype *orig_dtype, unsigned int byteorder);
Packit c5a612
extern void set_datatype_destroy(const struct datatype *dtype);
Packit c5a612
Packit c5a612
extern void time_print(uint64_t msec, struct output_ctx *octx);
Packit c5a612
extern struct error_record *time_parse(const struct location *loc,
Packit c5a612
				       const char *c, uint64_t *res);
Packit c5a612
Packit c5a612
extern struct error_record *rate_parse(const struct location *loc,
Packit c5a612
				       const char *str, uint64_t *rate,
Packit c5a612
				       uint64_t *unit);
Packit c5a612
Packit c5a612
extern struct error_record *data_unit_parse(const struct location *loc,
Packit c5a612
					    const char *str, uint64_t *rate);
Packit c5a612
Packit c5a612
#endif /* NFTABLES_DATATYPE_H */