Commit 14375237 authored by Jan Maria Matejka's avatar Jan Maria Matejka
Browse files

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 commit ea2ae6dd 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):

    commit 9e0e485e
    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

    commit 5056c559
    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.
parent e2ae0869
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -258,16 +258,16 @@ void store_tmp_attrs(rte *e, ea_list *attrs)
{ DUMMY; }

/**
 * import_control - pre-filtering decisions on route import
 * @p: protocol instance the route is going to be imported to
 * preexport - pre-filtering decisions before route export
 * @p: protocol instance the route is going to be exported to
 * @e: the route in question
 * @attrs: extended attributes of the route
 * @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
 * route attributes and force acceptance or rejection of the route regardless
 * of user-specified filters. See rte_announce() for a complete description
 * route attributes and force acceptance or rejection of the route before
 * the user-specified filters are run. See rte_announce() for a complete description
 * of the route distribution process.
 *
 * 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
 * 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; }

/**
+5 −5
Original line number Diff line number Diff line
@@ -191,12 +191,12 @@ struct proto {
   *	   ifa_notify	Notify protocol about interface address changes.
   *	   rt_notify	Notify protocol about routing table updates.
   *	   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.
   *	   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
   *			decide whether the route shall be imported: 1=yes, -1=no,
   *			0=process it through the import filter set by the user.
   *			decide whether the route shall be exported: 1=yes, -1=no,
   *			0=process it through the export filter set by the user.
   *	   reload_routes   Request channel to reload all its routes to the core
   *			(using rte_update()). Returns: 0=reload cannot be done,
   *			1= reload is scheduled and will happen (asynchronously).
@@ -210,7 +210,7 @@ struct proto {
  void (*neigh_notify)(struct neighbor *neigh);
  struct ea_list *(*make_tmp_attrs)(struct rte *rt, struct linpool *pool);
  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 (*feed_begin)(struct channel *, int initial);
  void (*feed_end)(struct channel *);
+1 −1
Original line number Diff line number Diff line
@@ -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_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_PROCESS	0		/* Process it through import filter */
#define RIC_REJECT	-1		/* Rejected by protocol */
+1 −1
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
      else if (d->export_mode)
	{
	  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)
	    pass = 1;
+3 −3
Original line number Diff line number Diff line
@@ -407,7 +407,7 @@ export_filter_(struct channel *c, rte *rt0, rte **rt_free, linpool *pool, int si

  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 (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
 * 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
 * right to veto or force accept of the route before any filter is
 * 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() */
  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)
    v = (f_run(filter, &rt, rte_update_pool, FF_SILENT) <= F_ACCEPT);

Loading