diff options
author | Jan Maria Matejka <mq@ucw.cz> | 2018-05-29 12:08:12 +0200 |
---|---|---|
committer | Jan Maria Matejka <mq@ucw.cz> | 2018-05-30 17:08:49 +0200 |
commit | 13c0be19d3d2acc9c1636bbab9222aabdf27d7ac (patch) | |
tree | 8df5514a7d995becaa85ab8a9de700cfa93cb302 /proto/ospf | |
parent | ee7e2ffd265fd76dbc8c94d9c2d48da54c27ff76 (diff) |
Nest: Removing separate tmpa from route propagation
This is a fundamental change of an original (1999) concept of route
processing inside BIRD. During import/export, there was a temporary
ea_list created which was to be used instead of the another one inside
the route itself.
This led to some confusion, quirks, and strange filter code that handled
extended route attributes. Dropping it now.
The protocol interface has changed in an uniform way -- the
`struct ea_list *attrs` argument has been removed from store_tmp_attrs(),
import_control(), rt_notify() and get_route_info().
Diffstat (limited to 'proto/ospf')
-rw-r--r-- | proto/ospf/config.Y | 8 | ||||
-rw-r--r-- | proto/ospf/ospf.c | 18 | ||||
-rw-r--r-- | proto/ospf/topology.c | 3 | ||||
-rw-r--r-- | proto/ospf/topology.h | 2 |
4 files changed, 16 insertions, 15 deletions
diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index 0b09966d..c439a614 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -497,10 +497,10 @@ ospf_iface: ospf_iface_start ospf_iface_patt_list ospf_iface_opt_list { ospf_iface_finish(); } ; -CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC1); }) -CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); }) -CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_TAG); }) -CF_ADDTO(dynamic_attr, OSPF_ROUTER_ID { $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID | EAF_TEMP, T_QUAD, EA_OSPF_ROUTER_ID); }) +CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_OSPF_METRIC1); }) +CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_OSPF_METRIC2); }) +CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_OSPF_TAG); }) +CF_ADDTO(dynamic_attr, OSPF_ROUTER_ID { $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID, T_QUAD, EA_OSPF_ROUTER_ID); }) CF_CLI_HELP(SHOW OSPF, ..., [[Show information about OSPF protocol]]); CF_CLI(SHOW OSPF, optsym, [<name>], [[Show information about OSPF protocol]]) diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index d9edc3e7..fa122f01 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -101,9 +101,9 @@ #include <stdlib.h> #include "ospf.h" -static int ospf_import_control(struct proto *P, rte **new, ea_list **attrs, struct linpool *pool); +static int ospf_import_control(struct proto *P, rte **new, struct linpool *pool); static struct ea_list *ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool); -static void ospf_store_tmp_attrs(struct rte *rt, struct ea_list *attrs); +static void ospf_store_tmp_attrs(struct rte *rt); static void ospf_reload_routes(struct channel *C); static int ospf_rte_better(struct rte *new, struct rte *old); static int ospf_rte_same(struct rte *new, struct rte *old); @@ -446,7 +446,7 @@ ospf_disp(timer * timer) * import to the filters. */ static int -ospf_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct linpool *pool UNUSED) +ospf_import_control(struct proto *P, rte **new, struct linpool *pool) { struct ospf_proto *p = (struct ospf_proto *) P; struct ospf_area *oa = ospf_main_area(p); @@ -471,12 +471,12 @@ ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool) } static void -ospf_store_tmp_attrs(struct rte *rt, struct ea_list *attrs) +ospf_store_tmp_attrs(struct rte *rt) { - rt->u.ospf.metric1 = ea_get_int(attrs, EA_OSPF_METRIC1, LSINFINITY); - rt->u.ospf.metric2 = ea_get_int(attrs, EA_OSPF_METRIC2, 10000); - rt->u.ospf.tag = ea_get_int(attrs, EA_OSPF_TAG, 0); - rt->u.ospf.router_id = ea_get_int(attrs, EA_OSPF_ROUTER_ID, 0); + rt->u.ospf.metric1 = ea_get_int(rt->attrs->eattrs, EA_OSPF_METRIC1, LSINFINITY); + rt->u.ospf.metric2 = ea_get_int(rt->attrs->eattrs, EA_OSPF_METRIC2, 10000); + rt->u.ospf.tag = ea_get_int(rt->attrs->eattrs, EA_OSPF_TAG, 0); + rt->u.ospf.router_id = ea_get_int(rt->attrs->eattrs, EA_OSPF_ROUTER_ID, 0); } /** @@ -535,7 +535,7 @@ ospf_get_status(struct proto *P, byte * buf) } static void -ospf_get_route_info(rte * rte, byte * buf, ea_list * attrs UNUSED) +ospf_get_route_info(rte * rte, byte * buf) { char *type = "<bug>"; diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index e909bbe9..54b255c9 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -1243,11 +1243,12 @@ find_surrogate_fwaddr(struct ospf_proto *p, struct ospf_area *oa) } void -ospf_rt_notify(struct proto *P, struct channel *ch UNUSED, net *n, rte *new, rte *old UNUSED, ea_list *ea) +ospf_rt_notify(struct proto *P, struct channel *ch UNUSED, net *n, rte *new, rte *old UNUSED) { struct ospf_proto *p = (struct ospf_proto *) P; struct ospf_area *oa = NULL; /* non-NULL for NSSA-LSA */ ort *nf; + struct ea_list *ea = new->attrs->eattrs; /* * There are several posibilities: diff --git a/proto/ospf/topology.h b/proto/ospf/topology.h index ac87334b..54ec9ccf 100644 --- a/proto/ospf/topology.h +++ b/proto/ospf/topology.h @@ -188,7 +188,7 @@ void ospf_originate_sum_net_lsa(struct ospf_proto *p, struct ospf_area *oa, ort void ospf_originate_sum_rt_lsa(struct ospf_proto *p, struct ospf_area *oa, u32 drid, int metric, u32 options); void ospf_originate_ext_lsa(struct ospf_proto *p, struct ospf_area *oa, ort *nf, u8 mode, u32 metric, u32 ebit, ip_addr fwaddr, u32 tag, int pbit); -void ospf_rt_notify(struct proto *P, struct channel *ch, net *n, rte *new, rte *old, ea_list *attrs); +void ospf_rt_notify(struct proto *P, struct channel *ch, net *n, rte *new, rte *old); void ospf_update_topology(struct ospf_proto *p); struct top_hash_entry *ospf_hash_find(struct top_graph *, u32 domain, u32 lsa, u32 rtr, u32 type); |