mirror of
https://git.netfilter.org/nftables
synced 2026-01-26 10:34:27 +00:00
parser_bison: Introduce tokens for monitor events
There already is a start condition for "monitor" keyword and also a DESTROY token. So just add the missing one and get rid of the intermediate string buffer. Keep checking the struct monitor::event value in eval phase just to be on the safe side. Signed-off-by: Phil Sutter <phil@nwl.cc> Reviewed-by: Florian Westphal <fw@strlen.de>
This commit is contained in:
parent
d6d9930fc2
commit
9e80bfd034
@ -739,15 +739,23 @@ enum {
|
||||
CMD_MONITOR_OBJ_MAX
|
||||
};
|
||||
|
||||
enum cmd_monitor_event {
|
||||
CMD_MONITOR_EVENT_ANY,
|
||||
CMD_MONITOR_EVENT_NEW,
|
||||
CMD_MONITOR_EVENT_DEL
|
||||
};
|
||||
#define CMD_MONITOR_EVENT_MAX (CMD_MONITOR_EVENT_DEL + 1)
|
||||
|
||||
struct monitor {
|
||||
struct location location;
|
||||
uint32_t format;
|
||||
uint32_t flags;
|
||||
uint32_t type;
|
||||
const char *event;
|
||||
struct location location;
|
||||
uint32_t format;
|
||||
uint32_t flags;
|
||||
uint32_t type;
|
||||
enum cmd_monitor_event event;
|
||||
};
|
||||
|
||||
struct monitor *monitor_alloc(uint32_t format, uint32_t type, const char *event);
|
||||
struct monitor *monitor_alloc(uint32_t format, uint32_t type,
|
||||
enum cmd_monitor_event event);
|
||||
void monitor_free(struct monitor *m);
|
||||
|
||||
#define NFT_NLATTR_LOC_MAX 32
|
||||
|
||||
@ -6452,13 +6452,6 @@ static int cmd_evaluate_rename(struct eval_ctx *ctx, struct cmd *cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum {
|
||||
CMD_MONITOR_EVENT_ANY,
|
||||
CMD_MONITOR_EVENT_NEW,
|
||||
CMD_MONITOR_EVENT_DEL,
|
||||
CMD_MONITOR_EVENT_MAX
|
||||
};
|
||||
|
||||
static uint32_t monitor_flags[CMD_MONITOR_EVENT_MAX][CMD_MONITOR_OBJ_MAX] = {
|
||||
[CMD_MONITOR_EVENT_ANY] = {
|
||||
[CMD_MONITOR_OBJ_ANY] = 0xffffffff,
|
||||
@ -6528,20 +6521,9 @@ static uint32_t monitor_flags[CMD_MONITOR_EVENT_MAX][CMD_MONITOR_OBJ_MAX] = {
|
||||
|
||||
static int cmd_evaluate_monitor(struct eval_ctx *ctx, struct cmd *cmd)
|
||||
{
|
||||
uint32_t event;
|
||||
uint32_t *monitor_event_flags = monitor_flags[cmd->monitor->event];
|
||||
|
||||
if (cmd->monitor->event == NULL)
|
||||
event = CMD_MONITOR_EVENT_ANY;
|
||||
else if (strcmp(cmd->monitor->event, "new") == 0)
|
||||
event = CMD_MONITOR_EVENT_NEW;
|
||||
else if (strcmp(cmd->monitor->event, "destroy") == 0)
|
||||
event = CMD_MONITOR_EVENT_DEL;
|
||||
else {
|
||||
return monitor_error(ctx, cmd->monitor, "invalid event %s",
|
||||
cmd->monitor->event);
|
||||
}
|
||||
|
||||
cmd->monitor->flags = monitor_flags[event][cmd->monitor->type];
|
||||
cmd->monitor->flags = monitor_event_flags[cmd->monitor->type];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -353,6 +353,7 @@ int nft_lex(void *, void *, void *);
|
||||
%token DESCRIBE "describe"
|
||||
%token IMPORT "import"
|
||||
%token EXPORT "export"
|
||||
%token NEW "new"
|
||||
%token DESTROY "destroy"
|
||||
|
||||
%token MONITOR "monitor"
|
||||
@ -985,9 +986,7 @@ int nft_lex(void *, void *, void *);
|
||||
%destructor { expr_free($$); } osf_expr
|
||||
|
||||
%type <val> markup_format
|
||||
%type <string> monitor_event
|
||||
%destructor { free_const($$); } monitor_event
|
||||
%type <val> monitor_object monitor_format
|
||||
%type <val> monitor_event monitor_object monitor_format
|
||||
|
||||
%type <val> synproxy_ts synproxy_sack
|
||||
|
||||
@ -1892,8 +1891,9 @@ monitor_cmd : monitor_event monitor_object monitor_format
|
||||
}
|
||||
;
|
||||
|
||||
monitor_event : /* empty */ { $$ = NULL; }
|
||||
| STRING { $$ = $1; }
|
||||
monitor_event : /* empty */ { $$ = CMD_MONITOR_EVENT_ANY; }
|
||||
| NEW { $$ = CMD_MONITOR_EVENT_NEW; }
|
||||
| DESTROY { $$ = CMD_MONITOR_EVENT_DEL; }
|
||||
;
|
||||
|
||||
monitor_object : /* empty */ { $$ = CMD_MONITOR_OBJ_ANY; }
|
||||
|
||||
@ -1389,7 +1389,8 @@ void markup_free(struct markup *m)
|
||||
free(m);
|
||||
}
|
||||
|
||||
struct monitor *monitor_alloc(uint32_t format, uint32_t type, const char *event)
|
||||
struct monitor *monitor_alloc(uint32_t format, uint32_t type,
|
||||
enum cmd_monitor_event event)
|
||||
{
|
||||
struct monitor *mon;
|
||||
|
||||
@ -1404,7 +1405,6 @@ struct monitor *monitor_alloc(uint32_t format, uint32_t type, const char *event)
|
||||
|
||||
void monitor_free(struct monitor *m)
|
||||
{
|
||||
free_const(m->event);
|
||||
free(m);
|
||||
}
|
||||
|
||||
|
||||
@ -322,6 +322,8 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
|
||||
<SCANSTATE_CMD_MONITOR>{
|
||||
"rules" { return RULES; }
|
||||
"trace" { return TRACE; }
|
||||
"new" { return NEW; }
|
||||
"destroy" { return DESTROY; }
|
||||
}
|
||||
"hook" { return HOOK; }
|
||||
"device" { return DEVICE; }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user