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:
Phil Sutter 2025-11-21 14:02:36 +01:00
parent d6d9930fc2
commit 9e80bfd034
5 changed files with 25 additions and 33 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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; }

View File

@ -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);
}

View File

@ -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; }