diff options
Diffstat (limited to 'proto/static/config.Y')
-rw-r--r-- | proto/static/config.Y | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/proto/static/config.Y b/proto/static/config.Y index a9eaa872..ff506511 100644 --- a/proto/static/config.Y +++ b/proto/static/config.Y @@ -10,9 +10,11 @@ CF_HDR #include "proto/static/static.h" +static struct static_route *this_srt; + CF_DECLS -CF_KEYWORDS(STATIC) +CF_KEYWORDS(STATIC, ROUTE, VIA, DROP, REJECT, PROHIBIT, PREFERENCE) CF_GRAMMAR @@ -27,6 +29,32 @@ static_proto_start: proto_start STATIC { static_proto: static_proto_start proto_name '{' | static_proto proto_item ';' + | static_proto stat_route ';' + ; + +stat_route0: ROUTE IPA pxlen { + this_srt = cfg_allocz(sizeof(struct static_route)); + add_tail(&((struct static_proto *) this_proto)->other_routes, &this_srt->n); + if (!ip_is_prefix($2, $3)) cf_error("Invalid network prefix: %I/%d", $2, $3); + this_srt->net = $2; + this_srt->masklen = $3; + } + ; + +stat_route: + stat_route0 VIA IPA { + this_srt->dest = RTD_ROUTER; + this_srt->via = $3; + } + | stat_route0 VIA TEXT { + this_srt->dest = RTD_DEVICE; + this_srt->if_name = $3; + rem_node(&this_srt->n); + add_tail(&((struct static_proto *) this_proto)->iface_routes, &this_srt->n); + } + | stat_route0 DROP { this_srt->dest = RTD_BLACKHOLE; } + | stat_route0 REJECT { this_srt->dest = RTD_UNREACHABLE; } + | stat_route0 PROHIBIT { this_srt->dest = RTD_PROHIBIT; } ; CF_CODE |