Terminology cleanup: The import_control hook is now called preexport.
Once upon a time, far far away, there were the old Bird developers discussing what direction of route flow shall be called import and export. They decided to say "import to protocol" and "export to table" when speaking about a protocol. When speaking about a table, they spoke about "importing to table" and "exporting to protocol". The latter terminology was adopted in configuration, then also the bird CLI in commitea2ae6dd0
started to use it (in year 2009). Now it's 2018 and the terminology is the latter. Import is from protocol to table, export is from table to protocol. Anyway, there was still an import_control hook which executed right before route export. One thing is funny. There are two commits in April 1999 with just two minutes between them. The older announces the final settlement on config terminology, the newer uses the other definition. Let's see their commit messages as the git-log tool shows them (the newer first): commit9e0e485e50
Author: Martin Mares <mj@ucw.cz> Date: Mon Apr 5 20:17:59 1999 +0000 Added some new protocol hooks (look at the comments for better explanation): make_tmp_attrs Convert inline attributes to ea_list store_tmp_attrs Convert ea_list to inline attributes import_control Pre-import decisions commit5056c559c4
Author: Martin Mares <mj@ucw.cz> Date: Mon Apr 5 20:15:31 1999 +0000 Changed syntax of attaching filters to protocols to hopefully the final version: EXPORT <filter-spec> for outbound routes (i.e., those announced by BIRD to the rest of the world). IMPORT <filter-spec> for inbound routes (i.e., those imported by BIRD from the rest of the world). where <filter-spec> is one of: ALL pass all routes NONE drop all routes FILTER <name> use named filter FILTER { <filter> } use explicitly defined filter For all protocols, the default is IMPORT ALL, EXPORT NONE. This includes the kernel protocol, so that you need to add EXPORT ALL to get the previous configuration of kernel syncer (as usually, see doc/bird.conf.example for a bird.conf example :)). Let's say RIP to this almost 19-years-old inconsistency. For now, if you import a route, it is always from protocol to table. If you export a route, it is always from table to protocol. And they lived happily ever after.
This commit is contained in:
parent
e2ae08694e
commit
14375237f6
13 changed files with 33 additions and 33 deletions
|
@ -258,16 +258,16 @@ void store_tmp_attrs(rte *e, ea_list *attrs)
|
||||||
{ DUMMY; }
|
{ DUMMY; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* import_control - pre-filtering decisions on route import
|
* preexport - pre-filtering decisions before route export
|
||||||
* @p: protocol instance the route is going to be imported to
|
* @p: protocol instance the route is going to be exported to
|
||||||
* @e: the route in question
|
* @e: the route in question
|
||||||
* @attrs: extended attributes of the route
|
* @attrs: extended attributes of the route
|
||||||
* @pool: linear pool for allocation of all temporary data
|
* @pool: linear pool for allocation of all temporary data
|
||||||
*
|
*
|
||||||
* The import_control() hook is called as the first step of a exporting
|
* The preexport() hook is called as the first step of a exporting
|
||||||
* a route from a routing table to the protocol instance. It can modify
|
* a route from a routing table to the protocol instance. It can modify
|
||||||
* route attributes and force acceptance or rejection of the route regardless
|
* route attributes and force acceptance or rejection of the route before
|
||||||
* of user-specified filters. See rte_announce() for a complete description
|
* the user-specified filters are run. See rte_announce() for a complete description
|
||||||
* of the route distribution process.
|
* of the route distribution process.
|
||||||
*
|
*
|
||||||
* The standard use of this hook is to reject routes having originated
|
* The standard use of this hook is to reject routes having originated
|
||||||
|
@ -276,7 +276,7 @@ void store_tmp_attrs(rte *e, ea_list *attrs)
|
||||||
* Result: 1 if the route has to be accepted, -1 if rejected and 0 if it
|
* Result: 1 if the route has to be accepted, -1 if rejected and 0 if it
|
||||||
* should be passed to the filters.
|
* should be passed to the filters.
|
||||||
*/
|
*/
|
||||||
int import_control(struct proto *p, rte **e, ea_list **attrs, struct linpool *pool)
|
int preexport(struct proto *p, rte **e, ea_list **attrs, struct linpool *pool)
|
||||||
{ DUMMY; }
|
{ DUMMY; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -191,12 +191,12 @@ struct proto {
|
||||||
* ifa_notify Notify protocol about interface address changes.
|
* ifa_notify Notify protocol about interface address changes.
|
||||||
* rt_notify Notify protocol about routing table updates.
|
* rt_notify Notify protocol about routing table updates.
|
||||||
* neigh_notify Notify protocol about neighbor cache events.
|
* neigh_notify Notify protocol about neighbor cache events.
|
||||||
* make_tmp_attrs Construct ea_list from private attrs stored in rte.
|
* make_tmp_attrs Construct ea_list from private attrs stored in rta.
|
||||||
* store_tmp_attrs Store private attrs back to rta. The route MUST NOT be cached.
|
* store_tmp_attrs Store private attrs back to rta. The route MUST NOT be cached.
|
||||||
* import_control Called as the first step of the route importing process.
|
* preexport Called as the first step of the route exporting process.
|
||||||
* It can construct a new rte, add private attributes and
|
* It can construct a new rte, add private attributes and
|
||||||
* decide whether the route shall be imported: 1=yes, -1=no,
|
* decide whether the route shall be exported: 1=yes, -1=no,
|
||||||
* 0=process it through the import filter set by the user.
|
* 0=process it through the export filter set by the user.
|
||||||
* reload_routes Request channel to reload all its routes to the core
|
* reload_routes Request channel to reload all its routes to the core
|
||||||
* (using rte_update()). Returns: 0=reload cannot be done,
|
* (using rte_update()). Returns: 0=reload cannot be done,
|
||||||
* 1= reload is scheduled and will happen (asynchronously).
|
* 1= reload is scheduled and will happen (asynchronously).
|
||||||
|
@ -210,7 +210,7 @@ struct proto {
|
||||||
void (*neigh_notify)(struct neighbor *neigh);
|
void (*neigh_notify)(struct neighbor *neigh);
|
||||||
struct ea_list *(*make_tmp_attrs)(struct rte *rt, struct linpool *pool);
|
struct ea_list *(*make_tmp_attrs)(struct rte *rt, struct linpool *pool);
|
||||||
void (*store_tmp_attrs)(struct rte *rt);
|
void (*store_tmp_attrs)(struct rte *rt);
|
||||||
int (*import_control)(struct proto *, struct rte **rt, struct linpool *pool);
|
int (*preexport)(struct proto *, struct rte **rt, struct linpool *pool);
|
||||||
void (*reload_routes)(struct channel *);
|
void (*reload_routes)(struct channel *);
|
||||||
void (*feed_begin)(struct channel *, int initial);
|
void (*feed_begin)(struct channel *, int initial);
|
||||||
void (*feed_end)(struct channel *);
|
void (*feed_end)(struct channel *);
|
||||||
|
|
|
@ -271,7 +271,7 @@ static inline int rte_is_filtered(rte *r) { return !!(r->flags & REF_FILTERED);
|
||||||
#define RA_ANY 3 /* Announcement of any route change */
|
#define RA_ANY 3 /* Announcement of any route change */
|
||||||
#define RA_MERGED 4 /* Announcement of optimal route merged with next ones */
|
#define RA_MERGED 4 /* Announcement of optimal route merged with next ones */
|
||||||
|
|
||||||
/* Return value of import_control() callback */
|
/* Return value of preexport() callback */
|
||||||
#define RIC_ACCEPT 1 /* Accepted by protocol */
|
#define RIC_ACCEPT 1 /* Accepted by protocol */
|
||||||
#define RIC_PROCESS 0 /* Process it through import filter */
|
#define RIC_PROCESS 0 /* Process it through import filter */
|
||||||
#define RIC_REJECT -1 /* Rejected by protocol */
|
#define RIC_REJECT -1 /* Rejected by protocol */
|
||||||
|
|
|
@ -133,7 +133,7 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
|
||||||
else if (d->export_mode)
|
else if (d->export_mode)
|
||||||
{
|
{
|
||||||
struct proto *ep = ec->proto;
|
struct proto *ep = ec->proto;
|
||||||
int ic = ep->import_control ? ep->import_control(ep, &e, c->show_pool) : 0;
|
int ic = ep->preexport ? ep->preexport(ep, &e, c->show_pool) : 0;
|
||||||
|
|
||||||
if (ec->ra_mode == RA_OPTIMAL || ec->ra_mode == RA_MERGED)
|
if (ec->ra_mode == RA_OPTIMAL || ec->ra_mode == RA_MERGED)
|
||||||
pass = 1;
|
pass = 1;
|
||||||
|
|
|
@ -407,7 +407,7 @@ export_filter_(struct channel *c, rte *rt0, rte **rt_free, linpool *pool, int si
|
||||||
|
|
||||||
rte_make_tmp_attrs(&rt, pool);
|
rte_make_tmp_attrs(&rt, pool);
|
||||||
|
|
||||||
v = p->import_control ? p->import_control(p, &rt, pool) : 0;
|
v = p->preexport ? p->preexport(p, &rt, pool) : 0;
|
||||||
if (v < 0)
|
if (v < 0)
|
||||||
{
|
{
|
||||||
if (silent)
|
if (silent)
|
||||||
|
@ -873,7 +873,7 @@ rt_notify_merged(struct channel *c, net *net, rte *new_changed, rte *old_changed
|
||||||
* routing table @tab) changes In that case @old stores the old route
|
* routing table @tab) changes In that case @old stores the old route
|
||||||
* from the same protocol.
|
* from the same protocol.
|
||||||
*
|
*
|
||||||
* For each appropriate protocol, we first call its import_control()
|
* For each appropriate protocol, we first call its preexport()
|
||||||
* hook which performs basic checks on the route (each protocol has a
|
* hook which performs basic checks on the route (each protocol has a
|
||||||
* right to veto or force accept of the route before any filter is
|
* right to veto or force accept of the route before any filter is
|
||||||
* asked) and adds default values of attributes specific to the new
|
* asked) and adds default values of attributes specific to the new
|
||||||
|
@ -1473,7 +1473,7 @@ rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter)
|
||||||
|
|
||||||
/* Rest is stripped down export_filter() */
|
/* Rest is stripped down export_filter() */
|
||||||
rte_make_tmp_attrs(&rt, rte_update_pool);
|
rte_make_tmp_attrs(&rt, rte_update_pool);
|
||||||
int v = p->import_control ? p->import_control(p, &rt, rte_update_pool) : 0;
|
int v = p->preexport ? p->preexport(p, &rt, rte_update_pool) : 0;
|
||||||
if (v == RIC_PROCESS)
|
if (v == RIC_PROCESS)
|
||||||
v = (f_run(filter, &rt, rte_update_pool, FF_SILENT) <= F_ACCEPT);
|
v = (f_run(filter, &rt, rte_update_pool, FF_SILENT) <= F_ACCEPT);
|
||||||
|
|
||||||
|
|
|
@ -2104,7 +2104,7 @@ babel_prepare_attrs(struct linpool *pool, ea_list *next, uint metric, u64 router
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
babel_import_control(struct proto *P, struct rte **new, struct linpool *pool UNUSED)
|
babel_preexport(struct proto *P, struct rte **new, struct linpool *pool UNUSED)
|
||||||
{
|
{
|
||||||
struct rta *a = (*new)->attrs;
|
struct rta *a = (*new)->attrs;
|
||||||
|
|
||||||
|
@ -2228,7 +2228,7 @@ babel_init(struct proto_config *CF)
|
||||||
|
|
||||||
P->if_notify = babel_if_notify;
|
P->if_notify = babel_if_notify;
|
||||||
P->rt_notify = babel_rt_notify;
|
P->rt_notify = babel_rt_notify;
|
||||||
P->import_control = babel_import_control;
|
P->preexport = babel_preexport;
|
||||||
P->make_tmp_attrs = babel_make_tmp_attrs;
|
P->make_tmp_attrs = babel_make_tmp_attrs;
|
||||||
P->store_tmp_attrs = babel_store_tmp_attrs;
|
P->store_tmp_attrs = babel_store_tmp_attrs;
|
||||||
P->rte_better = babel_rte_better;
|
P->rte_better = babel_rte_better;
|
||||||
|
|
|
@ -1371,7 +1371,7 @@ bgp_free_prefix(struct bgp_channel *c, struct bgp_prefix *px)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
bgp_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
bgp_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
||||||
{
|
{
|
||||||
rte *e = *new;
|
rte *e = *new;
|
||||||
struct proto *SRC = e->attrs->src->proto;
|
struct proto *SRC = e->attrs->src->proto;
|
||||||
|
|
|
@ -1533,7 +1533,7 @@ bgp_init(struct proto_config *CF)
|
||||||
struct bgp_config *cf = (struct bgp_config *) CF;
|
struct bgp_config *cf = (struct bgp_config *) CF;
|
||||||
|
|
||||||
P->rt_notify = bgp_rt_notify;
|
P->rt_notify = bgp_rt_notify;
|
||||||
P->import_control = bgp_import_control;
|
P->preexport = bgp_preexport;
|
||||||
P->neigh_notify = bgp_neigh_notify;
|
P->neigh_notify = bgp_neigh_notify;
|
||||||
P->reload_routes = bgp_reload_routes;
|
P->reload_routes = bgp_reload_routes;
|
||||||
P->feed_begin = bgp_feed_begin;
|
P->feed_begin = bgp_feed_begin;
|
||||||
|
|
|
@ -533,7 +533,7 @@ int bgp_rte_mergable(rte *pri, rte *sec);
|
||||||
int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best);
|
int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best);
|
||||||
struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool);
|
struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool);
|
||||||
void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
|
void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
|
||||||
int bgp_import_control(struct proto *, struct rte **, struct linpool *);
|
int bgp_preexport(struct proto *, struct rte **, struct linpool *);
|
||||||
int bgp_get_attr(struct eattr *e, byte *buf, int buflen);
|
int bgp_get_attr(struct eattr *e, byte *buf, int buflen);
|
||||||
void bgp_get_route_info(struct rte *, byte *buf);
|
void bgp_get_route_info(struct rte *, byte *buf);
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "ospf.h"
|
#include "ospf.h"
|
||||||
|
|
||||||
static int ospf_import_control(struct proto *P, rte **new, struct linpool *pool);
|
static int ospf_preexport(struct proto *P, rte **new, struct linpool *pool);
|
||||||
static struct ea_list *ospf_make_tmp_attrs(struct rte *rt, 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);
|
static void ospf_store_tmp_attrs(struct rte *rt);
|
||||||
static void ospf_reload_routes(struct channel *C);
|
static void ospf_reload_routes(struct channel *C);
|
||||||
|
@ -315,7 +315,7 @@ ospf_init(struct proto_config *CF)
|
||||||
P->rt_notify = ospf_rt_notify;
|
P->rt_notify = ospf_rt_notify;
|
||||||
P->if_notify = ospf_if_notify;
|
P->if_notify = ospf_if_notify;
|
||||||
P->ifa_notify = cf->ospf2 ? ospf_ifa_notify2 : ospf_ifa_notify3;
|
P->ifa_notify = cf->ospf2 ? ospf_ifa_notify2 : ospf_ifa_notify3;
|
||||||
P->import_control = ospf_import_control;
|
P->preexport = ospf_preexport;
|
||||||
P->reload_routes = ospf_reload_routes;
|
P->reload_routes = ospf_reload_routes;
|
||||||
P->make_tmp_attrs = ospf_make_tmp_attrs;
|
P->make_tmp_attrs = ospf_make_tmp_attrs;
|
||||||
P->store_tmp_attrs = ospf_store_tmp_attrs;
|
P->store_tmp_attrs = ospf_store_tmp_attrs;
|
||||||
|
@ -434,7 +434,7 @@ ospf_disp(timer * timer)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ospf_import_control - accept or reject new route from nest's routing table
|
* ospf_preexport - accept or reject new route from nest's routing table
|
||||||
* @P: OSPF protocol instance
|
* @P: OSPF protocol instance
|
||||||
* @new: the new route
|
* @new: the new route
|
||||||
* @attrs: list of attributes
|
* @attrs: list of attributes
|
||||||
|
@ -444,7 +444,7 @@ ospf_disp(timer * timer)
|
||||||
* import to the filters.
|
* import to the filters.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
ospf_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
ospf_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
||||||
{
|
{
|
||||||
struct ospf_proto *p = (struct ospf_proto *) P;
|
struct ospf_proto *p = (struct ospf_proto *) P;
|
||||||
struct ospf_area *oa = ospf_main_area(p);
|
struct ospf_area *oa = ospf_main_area(p);
|
||||||
|
|
|
@ -98,7 +98,7 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
pipe_import_control(struct proto *P, rte **ee, struct linpool *p UNUSED)
|
pipe_preexport(struct proto *P, rte **ee, struct linpool *p UNUSED)
|
||||||
{
|
{
|
||||||
struct proto *pp = (*ee)->sender->proto;
|
struct proto *pp = (*ee)->sender->proto;
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ pipe_init(struct proto_config *CF)
|
||||||
struct pipe_config *cf = (void *) CF;
|
struct pipe_config *cf = (void *) CF;
|
||||||
|
|
||||||
P->rt_notify = pipe_rt_notify;
|
P->rt_notify = pipe_rt_notify;
|
||||||
P->import_control = pipe_import_control;
|
P->preexport = pipe_preexport;
|
||||||
P->reload_routes = pipe_reload_routes;
|
P->reload_routes = pipe_reload_routes;
|
||||||
|
|
||||||
pipe_configure_channels(p, cf);
|
pipe_configure_channels(p, cf);
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
* processes asynchronous events (specified by RA_EV_* codes), and radv_timer(),
|
* processes asynchronous events (specified by RA_EV_* codes), and radv_timer(),
|
||||||
* which triggers sending RAs and computes the next timeout.
|
* which triggers sending RAs and computes the next timeout.
|
||||||
*
|
*
|
||||||
* The RAdv protocol could receive routes (through radv_import_control() and
|
* The RAdv protocol could receive routes (through radv_preexport() and
|
||||||
* radv_rt_notify()), but only the configured trigger route is tracked (in
|
* radv_rt_notify()), but only the configured trigger route is tracked (in
|
||||||
* &active var). When a radv protocol is reconfigured, the connected routing
|
* &active var). When a radv protocol is reconfigured, the connected routing
|
||||||
* table is examined (in radv_check_active()) to have proper &active value in
|
* table is examined (in radv_check_active()) to have proper &active value in
|
||||||
|
@ -396,7 +396,7 @@ radv_net_match_trigger(struct radv_config *cf, net *n)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
radv_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
radv_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
||||||
{
|
{
|
||||||
// struct radv_proto *p = (struct radv_proto *) P;
|
// struct radv_proto *p = (struct radv_proto *) P;
|
||||||
struct radv_config *cf = (struct radv_config *) (P->cf);
|
struct radv_config *cf = (struct radv_config *) (P->cf);
|
||||||
|
@ -580,7 +580,7 @@ radv_init(struct proto_config *CF)
|
||||||
|
|
||||||
P->main_channel = proto_add_channel(P, proto_cf_main_channel(CF));
|
P->main_channel = proto_add_channel(P, proto_cf_main_channel(CF));
|
||||||
|
|
||||||
P->import_control = radv_import_control;
|
P->preexport = radv_preexport;
|
||||||
P->rt_notify = radv_rt_notify;
|
P->rt_notify = radv_rt_notify;
|
||||||
P->if_notify = radv_if_notify;
|
P->if_notify = radv_if_notify;
|
||||||
P->ifa_notify = radv_ifa_notify;
|
P->ifa_notify = radv_ifa_notify;
|
||||||
|
|
|
@ -579,7 +579,7 @@ krt_export_net(struct krt_proto *p, net *net, rte **rt_free)
|
||||||
|
|
||||||
rte_make_tmp_attrs(&rt, krt_filter_lp);
|
rte_make_tmp_attrs(&rt, krt_filter_lp);
|
||||||
|
|
||||||
/* We could run krt_import_control() here, but it is already handled by KRF_INSTALLED */
|
/* We could run krt_preexport() here, but it is already handled by KRF_INSTALLED */
|
||||||
|
|
||||||
if (filter == FILTER_ACCEPT)
|
if (filter == FILTER_ACCEPT)
|
||||||
goto accept;
|
goto accept;
|
||||||
|
@ -940,7 +940,7 @@ krt_store_tmp_attrs(rte *rt)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
krt_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
krt_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
||||||
{
|
{
|
||||||
// struct krt_proto *p = (struct krt_proto *) P;
|
// struct krt_proto *p = (struct krt_proto *) P;
|
||||||
rte *e = *new;
|
rte *e = *new;
|
||||||
|
@ -1085,7 +1085,7 @@ krt_init(struct proto_config *CF)
|
||||||
|
|
||||||
p->p.main_channel = proto_add_channel(&p->p, proto_cf_main_channel(CF));
|
p->p.main_channel = proto_add_channel(&p->p, proto_cf_main_channel(CF));
|
||||||
|
|
||||||
p->p.import_control = krt_import_control;
|
p->p.preexport = krt_preexport;
|
||||||
p->p.rt_notify = krt_rt_notify;
|
p->p.rt_notify = krt_rt_notify;
|
||||||
p->p.if_notify = krt_if_notify;
|
p->p.if_notify = krt_if_notify;
|
||||||
p->p.reload_routes = krt_reload_routes;
|
p->p.reload_routes = krt_reload_routes;
|
||||||
|
|
Loading…
Reference in a new issue