Commit 50d8424a authored by Martin Mareš's avatar Martin Mareš

Added configuration of the device internal protocol. This is primarily

intended to serve as an example of interface pattern list use. As a side
effect, you can disable generating of device routes by disabling
this protocol.
parent 66efdf96
......@@ -2,7 +2,6 @@ Core
~~~~
* right usage of DBG vs. debug
* cleanup debugging calls!
- global "interface weed out list"
- TOS not supported by kernel -> automatically drop routes with TOS<>0
......
......@@ -8,7 +8,12 @@ router id 62.168.0.1
define xyzzy = 120+10
protocol rip MyRIP_test {
preference xyzzy
debug all
#protocol rip MyRIP_test {
# preference xyzzy
# debug all
#}
protocol device {
# disabled
# interface "-eth*", "*"
}
......@@ -14,6 +14,7 @@ CF_HDR
#include "lib/socket.h"
#include "lib/timer.h"
#include "nest/protocol.h"
#include "nest/iface.h"
CF_DECLS
......
......@@ -10,9 +10,14 @@ CF_HDR
static struct proto *this_proto;
#include "nest/rt-dev.h"
void rt_dev_add_iface(char *);
CF_DECLS
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF)
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DEVICE)
CF_KEYWORDS(INTERFACE)
%type <i> idval
......@@ -64,6 +69,40 @@ proto_item:
| DEBUG OFF { this_proto->debug = 0; }
;
/* Device protocol */
CF_ADDTO(proto, dev_proto '}')
dev_proto_start: proto_start DEVICE {
if (!(this_proto = cf_dev_proto)) cf_error("Device protocol already defined");
cf_dev_proto = NULL;
}
;
dev_proto:
dev_proto_start '{'
| dev_proto proto_item ';'
| dev_proto dev_iface_list ';'
;
dev_iface_list:
INTERFACE TEXT {
init_list(&((struct rt_dev_proto *) this_proto)->iface_list);
rt_dev_add_iface($2);
}
| dev_iface_list ',' TEXT { rt_dev_add_iface($3); }
;
CF_CODE
void
rt_dev_add_iface(char *n)
{
struct rt_dev_proto *p = (void *) this_proto;
struct iface_patt *k = cfg_alloc(sizeof(struct iface_patt));
k->pattern = cfg_strcpy(n);
add_tail(&p->iface_list, &k->n);
}
CF_END
......@@ -75,7 +75,6 @@ struct proto {
void (*rte_remove)(struct network *, struct rte *);
/* Reconfigure function? */
/* Interface patterns */
/* Input/output filters */
/* Connection to routing tables? */
......@@ -90,4 +89,10 @@ void *proto_new(struct protocol *, unsigned size);
extern list proto_list, inactive_proto_list;
/*
* Known unique protocol instances as referenced by config routines
*/
extern struct proto *cf_dev_proto;
#endif
......@@ -14,11 +14,20 @@
#include "nest/iface.h"
#include "nest/protocol.h"
#include "nest/route.h"
#include "nest/rt-dev.h"
#include "conf/conf.h"
#include "lib/resource.h"
struct proto *cf_dev_proto;
static void
dev_if_notify(struct proto *p, unsigned c, struct iface *old, struct iface *new)
{
struct rt_dev_proto *P = (void *) p;
if (old && !iface_patt_match(&P->iface_list, old) ||
new && !iface_patt_match(&P->iface_list, new))
return;
if (c & IF_CHANGE_DOWN)
{
net *n;
......@@ -72,11 +81,17 @@ dev_init(struct protocol *p)
static void
dev_preconfig(struct protocol *x)
{
struct proto *p = proto_new(&proto_device, sizeof(struct proto));
struct rt_dev_proto *P = proto_new(&proto_device, sizeof(struct rt_dev_proto));
struct proto *p = &P->p;
struct iface_patt *k = cfg_alloc(sizeof(struct iface_patt));
cf_dev_proto = p;
p->preference = DEF_PREF_DIRECT;
p->start = dev_start;
p->if_notify = dev_if_notify;
init_list(&P->iface_list);
k->pattern = "*";
add_tail(&P->iface_list, &k->n);
}
static void
......
/*
* BIRD -- Direct Device Routes
*
* (c) 1998 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#ifndef _BIRD_RT_DEV_H_
#define _BIRD_RT_DEV_H_
struct rt_dev_proto {
struct proto p;
list iface_list;
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment