|
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 */
|