1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
|
#ifndef NFTABLES_STATEMENT_H
#define NFTABLES_STATEMENT_H
#include <list.h>
#include <expression.h>
#include <json.h>
extern struct stmt *expr_stmt_alloc(const struct location *loc,
struct expr *expr);
extern struct stmt *verdict_stmt_alloc(const struct location *loc,
struct expr *expr);
struct chain_stmt {
struct chain *chain;
struct expr *expr;
};
struct stmt *chain_stmt_alloc(const struct location *loc, struct chain *chain,
enum nft_verdicts verdict);
struct flow_stmt {
const char *table_name;
};
struct stmt *flow_stmt_alloc(const struct location *loc, const char *name);
struct objref_stmt {
uint32_t type;
struct expr *expr;
};
const char *objref_type_name(uint32_t type);
struct stmt *objref_stmt_alloc(const struct location *loc);
struct connlimit_stmt {
uint32_t count;
uint32_t flags;
};
extern struct stmt *connlimit_stmt_alloc(const struct location *loc);
struct counter_stmt {
uint64_t packets;
uint64_t bytes;
};
extern struct stmt *counter_stmt_alloc(const struct location *loc);
struct last_stmt {
uint64_t used;
uint32_t set;
};
extern struct stmt *last_stmt_alloc(const struct location *loc);
struct exthdr_stmt {
struct expr *expr;
struct expr *val;
};
extern struct stmt *exthdr_stmt_alloc(const struct location *loc,
struct expr *payload, struct expr *expr);
struct payload_stmt {
struct expr *expr;
struct expr *val;
};
extern struct stmt *payload_stmt_alloc(const struct location *loc,
struct expr *payload, struct expr *expr);
#include <meta.h>
struct meta_stmt {
enum nft_meta_keys key;
const struct meta_template *tmpl;
struct expr *expr;
};
extern struct stmt *meta_stmt_alloc(const struct location *loc,
enum nft_meta_keys key,
struct expr *expr);
enum {
STMT_LOG_PREFIX = (1 << 0),
STMT_LOG_SNAPLEN = (1 << 1),
STMT_LOG_GROUP = (1 << 2),
STMT_LOG_QTHRESHOLD = (1 << 3),
STMT_LOG_LEVEL = (1 << 4),
};
struct log_stmt {
const char *prefix;
unsigned int snaplen;
uint16_t group;
uint16_t qthreshold;
uint32_t level;
uint32_t logflags;
uint32_t flags;
};
extern const char *log_level(uint32_t level);
extern int log_level_parse(const char *level);
extern struct stmt *log_stmt_alloc(const struct location *loc);
struct limit_stmt {
uint64_t rate;
uint64_t unit;
enum nft_limit_type type;
uint32_t burst;
uint32_t flags;
};
extern struct stmt *limit_stmt_alloc(const struct location *loc);
extern void __limit_stmt_print(const struct limit_stmt *limit);
struct reject_stmt {
struct expr *expr;
enum nft_reject_types type:8;
int8_t icmp_code;
uint8_t verbose_print:1;
unsigned int family;
};
extern struct stmt *reject_stmt_alloc(const struct location *loc);
enum nft_nat_etypes {
__NFT_NAT_SNAT = NFT_NAT_SNAT,
__NFT_NAT_DNAT = NFT_NAT_DNAT,
NFT_NAT_MASQ,
NFT_NAT_REDIR,
};
extern const char *nat_etype2str(enum nft_nat_etypes type);
enum {
STMT_NAT_F_INTERVAL = (1 << 0),
STMT_NAT_F_PREFIX = (1 << 1),
STMT_NAT_F_CONCAT = (1 << 2),
};
struct nat_stmt {
enum nft_nat_etypes type;
struct expr *addr;
struct expr *proto;
uint32_t flags;
uint8_t family;
uint32_t type_flags;
};
extern struct stmt *nat_stmt_alloc(const struct location *loc,
enum nft_nat_etypes type);
struct optstrip_stmt {
struct expr *expr;
};
extern struct stmt *optstrip_stmt_alloc(const struct location *loc, struct expr *e);
struct tproxy_stmt {
struct expr *addr;
struct expr *port;
uint8_t family;
uint8_t table_family; /* only used for printing the rule */
};
extern struct stmt *tproxy_stmt_alloc(const struct location *loc);
struct queue_stmt {
struct expr *queue;
uint16_t flags;
};
extern struct stmt *queue_stmt_alloc(const struct location *loc,
struct expr *e, uint16_t flags);
struct quota_stmt {
uint64_t bytes;
uint64_t used;
uint32_t flags;
};
struct stmt *quota_stmt_alloc(const struct location *loc);
#include <ct.h>
struct ct_stmt {
enum nft_ct_keys key;
const struct ct_template *tmpl;
struct expr *expr;
int8_t direction;
};
extern struct stmt *ct_stmt_alloc(const struct location *loc,
enum nft_ct_keys key,
int8_t direction,
struct expr *expr);
struct dup_stmt {
struct expr *to;
struct expr *dev;
};
struct stmt *dup_stmt_alloc(const struct location *loc);
uint32_t dup_stmt_type(const char *type);
struct fwd_stmt {
uint8_t family;
struct expr *addr;
struct expr *dev;
};
struct stmt *fwd_stmt_alloc(const struct location *loc);
uint32_t fwd_stmt_type(const char *type);
struct set_stmt {
struct expr *set;
struct expr *key;
struct list_head stmt_list;
enum nft_dynset_ops op;
};
extern const char * const set_stmt_op_names[];
extern struct stmt *set_stmt_alloc(const struct location *loc);
struct map_stmt {
struct expr *set;
struct expr *key;
struct expr *data;
struct list_head stmt_list;
enum nft_dynset_ops op;
};
extern struct stmt *map_stmt_alloc(const struct location *loc);
struct synproxy_stmt {
uint16_t mss;
uint8_t wscale;
uint32_t flags;
};
extern struct stmt *synproxy_stmt_alloc(const struct location *loc);
struct meter_stmt {
struct expr *set;
struct expr *key;
struct stmt *stmt;
const char *name;
uint32_t size;
};
extern struct stmt *meter_stmt_alloc(const struct location *loc);
/**
* enum nft_xt_type - xtables statement types
*
* @NFT_XT_MATCH: match
* @NFT_XT_TARGET: target
* @NFT_XT_WATCHER: watcher (only for the bridge family)
*/
enum nft_xt_type {
NFT_XT_MATCH = 0,
NFT_XT_TARGET,
NFT_XT_WATCHER,
};
#define NFT_XT_MAX (NFT_XT_WATCHER + 1)
struct xtables_match;
struct xtables_target;
struct xt_stmt {
const char *name;
enum nft_xt_type type;
uint32_t rev;
uint32_t family;
size_t infolen;
void *info;
uint32_t proto;
};
extern struct stmt *xt_stmt_alloc(const struct location *loc);
/**
* enum stmt_types - statement types
*
* @STMT_INVALID: uninitialised
* @STMT_EXPRESSION: expression statement (relational)
* @STMT_VERDICT: verdict statement
* @STMT_METER: meter statement
* @STMT_COUNTER: counters
* @STMT_PAYLOAD: payload statement
* @STMT_META: meta statement
* @STMT_LIMIT: limit statement
* @STMT_LOG: log statement
* @STMT_REJECT: REJECT statement
* @STMT_NAT: NAT statement
* @STMT_QUEUE: QUEUE statement
* @STMT_CT: conntrack statement
* @STMT_SET: set statement
* @STMT_DUP: dup statement
* @STMT_FWD: forward statement
* @STMT_XT: XT statement
* @STMT_QUOTA: quota statement
* @STMT_NOTRACK: notrack statement
* @STMT_OBJREF: stateful object reference statement
* @STMT_EXTHDR: extension header statement
* @STMT_FLOW_OFFLOAD: flow offload statement
* @STMT_CONNLIMIT: connection limit statement
* @STMT_MAP: map statement
* @STMT_SYNPROXY: synproxy statement
* @STMT_CHAIN: chain statement
* @STMT_OPTSTRIP: optstrip statement
* @STMT_LAST: last statement
*/
enum stmt_types {
STMT_INVALID,
STMT_EXPRESSION,
STMT_VERDICT,
STMT_METER,
STMT_COUNTER,
STMT_PAYLOAD,
STMT_META,
STMT_LIMIT,
STMT_LOG,
STMT_REJECT,
STMT_NAT,
STMT_TPROXY,
STMT_QUEUE,
STMT_CT,
STMT_SET,
STMT_DUP,
STMT_FWD,
STMT_XT,
STMT_QUOTA,
STMT_NOTRACK,
STMT_OBJREF,
STMT_EXTHDR,
STMT_FLOW_OFFLOAD,
STMT_CONNLIMIT,
STMT_MAP,
STMT_SYNPROXY,
STMT_CHAIN,
STMT_OPTSTRIP,
STMT_LAST,
};
/**
* struct stmt_ops
*
* @type: statement type
* @name: name
* @destroy: destructor
* @print: function to print statement
*/
struct stmt;
struct stmt_ops {
enum stmt_types type;
const char *name;
void (*destroy)(struct stmt *stmt);
void (*print)(const struct stmt *stmt,
struct output_ctx *octx);
json_t *(*json)(const struct stmt *stmt,
struct output_ctx *octx);
};
enum stmt_flags {
STMT_F_TERMINAL = 0x1,
STMT_F_STATEFUL = 0x2,
};
/**
* struct stmt
*
* @list: rule list node
* @location: location where the statement was defined
* @flags: statement flags
* @type: statement type
* @union: type specific data
*/
struct stmt {
struct list_head list;
struct location location;
enum stmt_flags flags;
enum stmt_types type:8;
union {
struct expr *expr;
struct exthdr_stmt exthdr;
struct meter_stmt meter;
struct connlimit_stmt connlimit;
struct counter_stmt counter;
struct payload_stmt payload;
struct meta_stmt meta;
struct last_stmt last;
struct log_stmt log;
struct limit_stmt limit;
struct reject_stmt reject;
struct nat_stmt nat;
struct tproxy_stmt tproxy;
struct optstrip_stmt optstrip;
struct queue_stmt queue;
struct quota_stmt quota;
struct ct_stmt ct;
struct set_stmt set;
struct dup_stmt dup;
struct fwd_stmt fwd;
struct xt_stmt xt;
struct objref_stmt objref;
struct flow_stmt flow;
struct map_stmt map;
struct synproxy_stmt synproxy;
struct chain_stmt chain;
};
};
extern struct stmt *stmt_alloc(const struct location *loc,
const struct stmt_ops *ops);
int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt);
int stmt_dependency_evaluate(struct eval_ctx *ctx, struct stmt *stmt);
extern void stmt_free(struct stmt *stmt);
extern void stmt_list_free(struct list_head *list);
extern void stmt_print(const struct stmt *stmt, struct output_ctx *octx);
const char *stmt_name(const struct stmt *stmt);
const struct stmt_ops *stmt_ops(const struct stmt *stmt);
const char *get_rate(uint64_t byte_rate, uint64_t *rate);
const char *get_unit(uint64_t u);
#endif /* NFTABLES_STATEMENT_H */
|