diff --git a/bird-gdb.py b/bird-gdb.py index a85ef8c6..3cf65a9c 100644 --- a/bird-gdb.py +++ b/bird-gdb.py @@ -30,6 +30,7 @@ class BIRDFValPrinter(BIRDPrinter): "T_ENUM_ROA": "i", "T_ENUM_NETTYPE": "i", "T_ENUM_RA_PREFERENCE": "i", + "T_ENUM_AF": "i", "T_IP": "ip", "T_NET": "net", "T_STRING": "s", diff --git a/conf/gen_keywords.m4 b/conf/gen_keywords.m4 index cf3fb58e..0c1dc545 100644 --- a/conf/gen_keywords.m4 +++ b/conf/gen_keywords.m4 @@ -34,9 +34,11 @@ m4_define(CF_CLI, `CF_KEYWORDS(m4_translit($1, [[ ]], [[,]])) ') # Enums are translated to C initializers: use CF_ENUM(typename, prefix, values) -m4_define(CF_enum, `m4_divert(1){ "CF_enum_prefix[[]]$1", -((CF_enum_type<<16) | CF_enum_prefix[[]]$1), NULL }, +# For different prefix: CF_ENUM_PX(typename, external prefix, C prefix, values) +m4_define(CF_enum, `m4_divert(1){ "CF_enum_prefix_ext[[]]$1", -((CF_enum_type<<16) | CF_enum_prefix_int[[]]$1), NULL }, m4_divert(-1)') -m4_define(CF_ENUM, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix]],$2)CF_iterate([[CF_enum]], [[m4_shift(m4_shift($@))]])DNL') +m4_define(CF_ENUM, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix_ext]],$2)m4_define([[CF_enum_prefix_int]],$2)CF_iterate([[CF_enum]], [[m4_shift(m4_shift($@))]])DNL') +m4_define(CF_ENUM_PX, `m4_define([[CF_enum_type]],$1)m4_define([[CF_enum_prefix_ext]],$2)m4_define([[CF_enum_prefix_int]],$3)CF_iterate([[CF_enum]], [[m4_shift(m4_shift(m4_shift($@)))]])DNL') # After all configuration templates end, we generate the m4_m4wrap(` diff --git a/conf/gen_parser.m4 b/conf/gen_parser.m4 index af43d96f..5b378a93 100644 --- a/conf/gen_parser.m4 +++ b/conf/gen_parser.m4 @@ -44,6 +44,7 @@ m4_define(CF_CLI_HELP, `') # ENUM declarations are ignored m4_define(CF_ENUM, `') +m4_define(CF_ENUM_PX, `') # After all configuration templates end, we finally generate the grammar file. m4_m4wrap(` diff --git a/filter/data.h b/filter/data.h index 083595f4..db6b6e12 100644 --- a/filter/data.h +++ b/filter/data.h @@ -38,6 +38,7 @@ enum f_type { T_ENUM_ROA = 0x35, T_ENUM_NETTYPE = 0x36, T_ENUM_RA_PREFERENCE = 0x37, + T_ENUM_AF = 0x38, /* new enums go here */ T_ENUM_EMPTY = 0x3f, /* Special hack for atomic_aggr */ diff --git a/lib/ip.h b/lib/ip.h index 945f2893..f3b1cc31 100644 --- a/lib/ip.h +++ b/lib/ip.h @@ -48,6 +48,13 @@ #define UDP_HEADER_LENGTH 8 +/* IANA Address Family Numbers */ +/* https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml */ +/* Would use AF_ prefix, but that collides with POSIX address family numbers */ +#define AFI_IPV4 1 +#define AFI_IPV6 2 + + #ifdef DEBUGGING typedef struct ip4_addr { diff --git a/nest/config.Y b/nest/config.Y index 1bc203dd..8fe060c5 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -85,6 +85,7 @@ CF_ENUM(T_ENUM_RTS, RTS_, DUMMY, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIREC CF_ENUM(T_ENUM_SCOPE, SCOPE_, HOST, LINK, SITE, ORGANIZATION, UNIVERSE, UNDEFINED) CF_ENUM(T_ENUM_RTD, RTD_, UNICAST, BLACKHOLE, UNREACHABLE, PROHIBIT) CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID) +CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6) %type idval %type imexport