diff options
author | Maria Matejka <mq@ucw.cz> | 2023-10-15 23:52:46 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2024-03-25 14:15:30 +0100 |
commit | bc10975adbb0aef772496f334dd0bbd23251c1d8 (patch) | |
tree | 3a5fa98e3b2dbccaa0b359440bee902295222bc0 /filter | |
parent | 08571b20598c58877e1565403d970efc2b90dba6 (diff) | |
download | bird-bc10975adbb0aef772496f334dd0bbd23251c1d8.tar.gz |
ASPA: checks done in filters; no autoreload yet
Diffstat (limited to 'filter')
-rw-r--r-- | filter/config.Y | 3 | ||||
-rw-r--r-- | filter/data.c | 1 | ||||
-rw-r--r-- | filter/data.h | 1 | ||||
-rw-r--r-- | filter/f-inst.c | 15 |
4 files changed, 19 insertions, 1 deletions
diff --git a/filter/config.Y b/filter/config.Y index 09d4fd89..5c3a1c16 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -364,7 +364,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, TRUE, FALSE, RT, RO, UNKNOWN, GENERIC, FROM, GW, NET, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX, WEIGHT, GW_MPLS, GW_MPLS_STACK, ONLINK, PREFERENCE, - ROA_CHECK, + ROA_CHECK, ASPA_CHECK, DEFINED, ADD, DELETE, RESET, PREPEND, @@ -946,6 +946,7 @@ term: | ROA_CHECK '(' rtable ')' { $$ = f_new_inst(FI_ROA_CHECK_IMPLICIT, $3); } | ROA_CHECK '(' rtable ',' term ',' term ')' { $$ = f_new_inst(FI_ROA_CHECK_EXPLICIT, $5, $7, $3); } + | ASPA_CHECK '(' rtable ',' term ')' { $$ = f_new_inst(FI_ASPA_CHECK_EXPLICIT, $5, $3); } | FORMAT '(' term ')' { $$ = f_new_inst(FI_FORMAT, $3); } diff --git a/filter/data.c b/filter/data.c index e268a8ec..282206eb 100644 --- a/filter/data.c +++ b/filter/data.c @@ -40,6 +40,7 @@ static const char * const f_type_str[] = { [T_ENUM_RTC] = "enum rtc", [T_ENUM_RTD] = "enum rtd", [T_ENUM_ROA] = "enum roa", + [T_ENUM_ASPA] = "enum aspa", [T_ENUM_NETTYPE] = "enum nettype", [T_ENUM_RA_PREFERENCE] = "enum ra_preference", [T_ENUM_AF] = "enum af", diff --git a/filter/data.h b/filter/data.h index df8d6a8f..bd1fa9a0 100644 --- a/filter/data.h +++ b/filter/data.h @@ -43,6 +43,7 @@ enum f_type { T_ENUM_RA_PREFERENCE = 0x37, T_ENUM_AF = 0x38, T_ENUM_MPLS_POLICY = 0x39, + T_ENUM_ASPA = 0x3a, /* new enums go here */ T_ENUM_EMPTY = 0x3f, /* Special hack for atomic_aggr */ diff --git a/filter/f-inst.c b/filter/f-inst.c index 6593a381..bebd13c5 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -1606,6 +1606,21 @@ } + INST(FI_ASPA_CHECK_EXPLICIT, 1, 1) { /* ASPA Check */ + NEVER_CONSTANT; + ARG(1, T_PATH); + RTC(2); + struct rtable *table = rtc->table; + + if (!table) + runtime("Missing ASPA table"); + + if (table->addr_type != NET_ASPA) + runtime("Table type must be ASPA"); + + RESULT(T_ENUM_ASPA, i, [[ aspa_check(table, v1.val.ad) ]]); + } + INST(FI_FROM_HEX, 1, 1) { /* Convert hex text to bytestring */ ARG(1, T_STRING); |