summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nest/proto.c3
-rw-r--r--nest/protocol.h8
-rw-r--r--proto/bgp/Makefile5
-rw-r--r--proto/bgp/bgp.c68
-rw-r--r--proto/bgp/bgp.h31
-rw-r--r--proto/bgp/config.Y45
6 files changed, 155 insertions, 5 deletions
diff --git a/nest/proto.c b/nest/proto.c
index 937cda2..95988ce 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -367,6 +367,9 @@ protos_build(void)
#ifdef CONFIG_PIPE
add_tail(&protocol_list, &proto_pipe.n);
#endif
+#ifdef CONFIG_BGP
+ add_tail(&protocol_list, &proto_bgp.n);
+#endif
proto_pool = rp_new(&root_pool, "Protocols");
proto_flush_event = ev_new(proto_pool);
proto_flush_event->hook = proto_flush_all;
diff --git a/nest/protocol.h b/nest/protocol.h
index 9dd32fc..b02ea02 100644
--- a/nest/protocol.h
+++ b/nest/protocol.h
@@ -61,11 +61,9 @@ extern list protocol_list;
* Known protocols
*/
-extern struct protocol proto_device;
-extern struct protocol proto_rip;
-extern struct protocol proto_static;
-extern struct protocol proto_ospf;
-extern struct protocol proto_pipe;
+extern struct protocol
+ proto_device, proto_rip, proto_static,
+ proto_ospf, proto_pipe, proto_bgp;
/*
* Routing Protocol Instance
diff --git a/proto/bgp/Makefile b/proto/bgp/Makefile
new file mode 100644
index 0000000..8358bc8
--- /dev/null
+++ b/proto/bgp/Makefile
@@ -0,0 +1,5 @@
+source=bgp.c
+root-rel=../../
+dir-name=proto/bgp
+
+include ../../Rules
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
new file mode 100644
index 0000000..26e3906
--- /dev/null
+++ b/proto/bgp/bgp.c
@@ -0,0 +1,68 @@
+/*
+ * BIRD -- The Border Gateway Protocol
+ *
+ * (c) 2000 Martin Mares <mj@ucw.cz>
+ *
+ * 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 "bgp.h"
+
+static void
+bgp_rt_notify(struct proto *P, net *n, rte *new, rte *old, ea_list *tmpa)
+{
+}
+
+static struct proto *
+bgp_init(struct proto_config *C)
+{
+ struct bgp_config *c = (struct bgp_config *) C;
+ struct proto *P = proto_new(C, sizeof(struct bgp_proto));
+ struct bgp_proto *p = (struct bgp_proto *) P;
+
+ P->rt_notify = bgp_rt_notify;
+ return P;
+}
+
+static int
+bgp_start(struct proto *P)
+{
+ return PS_UP;
+}
+
+static int
+bgp_shutdown(struct proto *P)
+{
+ return PS_DOWN;
+}
+
+void
+bgp_check(struct bgp_config *c)
+{
+ if (!c->local_as)
+ cf_error("Local AS number must be set");
+ if (!c->remote_as)
+ cf_error("Neighbor must be configured");
+}
+
+struct protocol proto_bgp = {
+ name: "BGP",
+ template: "bgp%d",
+ init: bgp_init,
+ start: bgp_start,
+ shutdown: bgp_shutdown,
+#if 0
+ dump: bgp_dump,
+ get_status: bgp_get_status,
+ get_route_info: bgp_get_route_info,
+ show_route_data: bgp_show_route_data
+#endif
+};
diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h
new file mode 100644
index 0000000..2e352be
--- /dev/null
+++ b/proto/bgp/bgp.h
@@ -0,0 +1,31 @@
+/*
+ * BIRD -- The Border Gateway Protocol
+ *
+ * (c) 2000 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_BGP_H_
+#define _BIRD_BGP_H_
+
+struct bgp_config {
+ struct proto_config c;
+ unsigned int local_as, remote_as;
+ ip_addr remote_ip;
+ int multihop; /* Number of hops if multihop */
+};
+
+struct bgp_proto {
+ struct proto p;
+};
+
+struct bgp_route {
+};
+
+struct bgp_attrs {
+};
+
+void bgp_check(struct bgp_config *c);
+
+#endif
diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y
new file mode 100644
index 0000000..f66f358
--- /dev/null
+++ b/proto/bgp/config.Y
@@ -0,0 +1,45 @@
+/*
+ * BIRD -- Border Gateway Protocol Configuration
+ *
+ * (c) 2000 Martin Mares <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+CF_HDR
+
+#include "proto/bgp/bgp.h"
+
+#define BGP_CFG ((struct bgp_config *) this_proto)
+
+CF_DECLS
+
+CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS)
+
+CF_GRAMMAR
+
+CF_ADDTO(proto, bgp_proto '}' { bgp_check(BGP_CFG); } )
+
+bgp_proto_start: proto_start BGP {
+ this_proto = proto_config_new(&proto_bgp, sizeof(struct bgp_config));
+ this_proto->preference = DEF_PREF_BGP;
+ }
+ ;
+
+bgp_proto:
+ bgp_proto_start proto_name '{'
+ | bgp_proto proto_item ';'
+ | bgp_proto LOCAL AS NUM ';' {
+ if ($4 < 0 || $4 > 65535) cf_error("AS number out of range");
+ BGP_CFG->local_as = $4;
+ }
+ | bgp_proto NEIGHBOR IPA AS NUM ';' {
+ if ($5 < 0 || $5 > 65535) cf_error("AS number out of range");
+ BGP_CFG->remote_ip = $3;
+ BGP_CFG->remote_as = $5;
+ }
+ ;
+
+CF_CODE
+
+CF_END