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 ...@@ -2,7 +2,6 @@ Core
~~~~ ~~~~
* right usage of DBG vs. debug * right usage of DBG vs. debug
* cleanup debugging calls! * cleanup debugging calls!
- global "interface weed out list"
- TOS not supported by kernel -> automatically drop routes with TOS<>0 - TOS not supported by kernel -> automatically drop routes with TOS<>0
......
...@@ -8,7 +8,12 @@ router id 62.168.0.1 ...@@ -8,7 +8,12 @@ router id 62.168.0.1
define xyzzy = 120+10 define xyzzy = 120+10
protocol rip MyRIP_test { #protocol rip MyRIP_test {
preference xyzzy # preference xyzzy
debug all # debug all
#}
protocol device {
# disabled
# interface "-eth*", "*"
} }
...@@ -14,6 +14,7 @@ CF_HDR ...@@ -14,6 +14,7 @@ CF_HDR
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/timer.h" #include "lib/timer.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h"
CF_DECLS CF_DECLS
......
...@@ -10,9 +10,14 @@ CF_HDR ...@@ -10,9 +10,14 @@ CF_HDR
static struct proto *this_proto; static struct proto *this_proto;
#include "nest/rt-dev.h"
void rt_dev_add_iface(char *);
CF_DECLS 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 %type <i> idval
...@@ -64,6 +69,40 @@ proto_item: ...@@ -64,6 +69,40 @@ proto_item:
| DEBUG OFF { this_proto->debug = 0; } | 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 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 CF_END
...@@ -75,7 +75,6 @@ struct proto { ...@@ -75,7 +75,6 @@ struct proto {
void (*rte_remove)(struct network *, struct rte *); void (*rte_remove)(struct network *, struct rte *);
/* Reconfigure function? */ /* Reconfigure function? */
/* Interface patterns */
/* Input/output filters */ /* Input/output filters */
/* Connection to routing tables? */ /* Connection to routing tables? */
...@@ -90,4 +89,10 @@ void *proto_new(struct protocol *, unsigned size); ...@@ -90,4 +89,10 @@ void *proto_new(struct protocol *, unsigned size);
extern list proto_list, inactive_proto_list; extern list proto_list, inactive_proto_list;
/*
* Known unique protocol instances as referenced by config routines
*/
extern struct proto *cf_dev_proto;
#endif #endif
...@@ -14,11 +14,20 @@ ...@@ -14,11 +14,20 @@
#include "nest/iface.h" #include "nest/iface.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/route.h" #include "nest/route.h"
#include "nest/rt-dev.h"
#include "conf/conf.h"
#include "lib/resource.h" #include "lib/resource.h"
struct proto *cf_dev_proto;
static void static void
dev_if_notify(struct proto *p, unsigned c, struct iface *old, struct iface *new) 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) if (c & IF_CHANGE_DOWN)
{ {
net *n; net *n;
...@@ -72,11 +81,17 @@ dev_init(struct protocol *p) ...@@ -72,11 +81,17 @@ dev_init(struct protocol *p)
static void static void
dev_preconfig(struct protocol *x) 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->preference = DEF_PREF_DIRECT;
p->start = dev_start; p->start = dev_start;
p->if_notify = dev_if_notify; p->if_notify = dev_if_notify;
init_list(&P->iface_list);
k->pattern = "*";
add_tail(&P->iface_list, &k->n);
} }
static void 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