[PATCH 3/9] Static protocol supports SADR.
Dean Luga
dluga93 at gmail.com
Tue Mar 7 00:56:27 CET 2017
From: dean <dluga93 at gmail.com>
Two grammar rules were added that allow addition of source dependent
routes in the configuration of the static protocol.
route <dst_prefix> from <src_prefix> via <ip>
route <dst_prefix> from <src_prefix> via "<interface>"
Added a function that returns an addr_data object initialized from
a static_route object.
static_install and static_remove functions use net_*2 functions
to install/remove SADR routes if SADR is enabled.
---
proto/static/config.Y | 26 ++++++++++++++++++++++++++
proto/static/static.c | 21 +++++++++++++++++++--
proto/static/static.h | 6 ++++++
3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/proto/static/config.Y b/proto/static/config.Y
index 182721b..1ab35a4 100644
--- a/proto/static/config.Y
+++ b/proto/static/config.Y
@@ -91,12 +91,38 @@ stat_route:
this_srt->via = $3;
this_srt->via_if = $4;
}
+ | stat_route0 FROM prefix VIA ipa ipa_scope {
+ this_srt->dest = RTD_ROUTER;
+ this_srt->via = $5;
+ this_srt->via_if = $6;
+
+ #ifdef SADR_OSPF
+ this_srt->from = $3.addr;
+ this_srt->slen = $3.len;
+ #else
+ cf_error("\"from\" keyword only works when SADR is enabled.");
+ #endif
+ }
| stat_route0 VIA TEXT {
this_srt->dest = RTD_DEVICE;
this_srt->if_name = $3;
rem_node(&this_srt->n);
add_tail(&STATIC_CFG->iface_routes, &this_srt->n);
}
+ | stat_route0 FROM prefix VIA TEXT {
+ this_srt->dest = RTD_DEVICE;
+
+ #ifdef SADR_OSPF
+ this_srt->from = $3.addr;
+ this_srt->slen = $3.len;
+ #else
+ cf_error("\"from\" keyword only works when SADR is enabled.");
+ #endif
+
+ this_srt->if_name = $5;
+ rem_node(&this_srt->n);
+ add_tail(&STATIC_CFG->iface_routes, &this_srt->n);
+ }
| stat_route0 MULTIPATH stat_multipath {
this_srt->dest = RTD_MULTIPATH;
}
diff --git a/proto/static/static.c b/proto/static/static.c
index d54302a..acf6c30 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -57,6 +57,21 @@ p_igp_table(struct proto *p)
return cf->igp_table ? cf->igp_table->table : p->table;
}
+static addr_data
+addr_data_static_init(struct static_route *r) {
+ addr_data addr = {
+ .prefix = &r->net,
+ .pxlen = r->masklen
+ };
+
+ #ifdef SADR_OSPF
+ addr.src_prefix = &r->from;
+ addr.src_pxlen = r->slen;
+ #endif
+
+ return addr;
+}
+
static void
static_install(struct proto *p, struct static_route *r, struct iface *ifa)
{
@@ -109,7 +124,8 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
/* We skip rta_lookup() here */
- n = net_get(p->table, r->net, r->masklen);
+ addr_data addr = addr_data_static_init(r);
+ n = net_get2(p->table, addr);
e = rte_get_temp(&a);
e->net = n;
e->pflags = 0;
@@ -133,7 +149,8 @@ static_remove(struct proto *p, struct static_route *r)
return;
DBG("Removing static route %I/%d via %I\n", r->net, r->masklen, r->via);
- n = net_find(p->table, r->net, r->masklen);
+ addr_data addr = addr_data_static_init(r);
+ n = net_find2(p->table, addr);
rte_update(p, n, NULL);
r->installed = 0;
}
diff --git a/proto/static/static.h b/proto/static/static.h
index 6b04723..9bf481b 100644
--- a/proto/static/static.h
+++ b/proto/static/static.h
@@ -30,6 +30,12 @@ struct static_route {
int masklen; /* Mask length */
int dest; /* Destination type (RTD_*) */
ip_addr via; /* Destination router */
+
+ #ifdef SADR_OSPF
+ ip_addr from; /* Source address */
+ int slen; /* Source address mask length */
+ #endif
+
struct iface *via_if; /* Destination iface, for link-local vias */
struct neighbor *neigh;
byte *if_name; /* Name for RTD_DEVICE routes */
--
2.7.4
More information about the Bird-users
mailing list