diff --git a/Makefile b/Makefile index c7dd7025..b0fee621 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ OPT=-O2 DEBUG=-g#gdb CFLAGS=$(OPT) $(DEBUG) -Wall -W -Wstrict-prototypes -Wno-unused -Wno-parentheses -PROTOCOLS=rip +PROTOCOLS=rip static LIBDIRS=sysdep/linux sysdep/unix lib BASEDIRS=nest $(addprefix proto/,$(PROTOCOLS)) STDDIRS=$(BASEDIRS) $(OBJDIR)/conf diff --git a/TODO b/TODO index 5dc5948b..10505823 100644 --- a/TODO +++ b/TODO @@ -16,6 +16,8 @@ Core - default preferences of protocols: prefer BGP over OSPF/RIP external routes? - secondary addresses -> subinterfaces - check if all protocols set proper packet priorities and TTL's. +- better default protocol names +- config: comments at end of line -> explicit ';' needed? - filter: logging of dropped routes (?) - limitation of memory consumption: per-process and total (?) diff --git a/bird.conf b/bird.conf index 80c4f512..30c0ea27 100644 --- a/bird.conf +++ b/bird.conf @@ -23,3 +23,7 @@ protocol kernel { learn; # Learn all routes from the kernel scan time 10; # Scan kernel tables every 10 seconds } + +protocol static { + disabled +} diff --git a/nest/protocol.h b/nest/protocol.h index 59db4287..f516f0f2 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -47,6 +47,7 @@ extern list protocol_list; extern struct protocol proto_device; extern struct protocol proto_rip; +extern struct protocol proto_static; /* * Routing Protocol Instance diff --git a/proto/static/Makefile b/proto/static/Makefile new file mode 100644 index 00000000..7771c2fd --- /dev/null +++ b/proto/static/Makefile @@ -0,0 +1,4 @@ +THISDIR=proto/static +OBJS=static.o + +include ../../Rules diff --git a/proto/static/config.Y b/proto/static/config.Y new file mode 100644 index 00000000..a9eaa872 --- /dev/null +++ b/proto/static/config.Y @@ -0,0 +1,34 @@ +/* + * BIRD -- Static Protocol Configuration + * + * (c) 1998 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +CF_HDR + +#include "proto/static/static.h" + +CF_DECLS + +CF_KEYWORDS(STATIC) + +CF_GRAMMAR + +CF_ADDTO(proto, static_proto '}') + +static_proto_start: proto_start STATIC { + this_proto = proto_new(&proto_static, sizeof(struct static_proto)); + static_init_instance((struct static_proto *) this_proto); + } + ; + +static_proto: + static_proto_start proto_name '{' + | static_proto proto_item ';' + ; + +CF_CODE + +CF_END diff --git a/proto/static/static.c b/proto/static/static.c new file mode 100644 index 00000000..679ee6ee --- /dev/null +++ b/proto/static/static.c @@ -0,0 +1,73 @@ +/* + * BIRD -- Static Route Generator + * + * (c) 1998 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#define LOCAL_DEBUG + +#include "nest/bird.h" +#include "nest/iface.h" +#include "nest/protocol.h" +#include "nest/route.h" +#include "conf/conf.h" + +#include "static.h" + +#define GET_DATA struct static_proto *p = (struct static_proto *) P + +static void +static_start(struct proto *P) +{ + DBG("Static: take off!\n"); +} + +static void +static_neigh_notify(struct neighbor *n) +{ + DBG("Static: neighbor notify got, don't know why.\n"); +} + +static void +static_dump(struct proto *P) +{ + DBG("Static: no dumps available in demo version.\n"); +} + +void +static_init_instance(struct static_proto *P) +{ + struct proto *p = &P->p; + + p->preference = DEF_PREF_STATIC; + p->start = static_start; + p->neigh_notify = static_neigh_notify; + p->dump = static_dump; + /* FIXME: Should shutdown remove all routes? */ +} + +static void +static_init(struct protocol *p) +{ +} + +static void +static_preconfig(struct protocol *x) +{ +} + +static void +static_postconfig(struct protocol *p) +{ +} + +struct protocol proto_static = { + { NULL, NULL }, + "Static", + 0, + static_init, + static_preconfig, + static_postconfig +}; diff --git a/proto/static/static.h b/proto/static/static.h new file mode 100644 index 00000000..df18c133 --- /dev/null +++ b/proto/static/static.h @@ -0,0 +1,30 @@ +/* + * BIRD -- Static Route Generator + * + * (c) 1998 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#ifndef _BIRD_STATIC_H_ +#define _BIRD_STATIC_H_ + +struct static_proto { + struct proto p; + list routes; +}; + +void static_init_instance(struct static_proto *); + +struct static_route { + node n; + u32 net; /* Network we route */ + int masklen; /* Mask length */ + int dest; /* Destination type (RTD_*) */ + u32 via; /* Destination router */ + struct neighbor *neigh; + /* FIXME: Device routes, maybe via device patterns? */ + /* FIXME: More route attributes, probably via filter syntax */ +}; + +#endif