summaryrefslogtreecommitdiffstats
path: root/proto/ospf
diff options
context:
space:
mode:
Diffstat (limited to 'proto/ospf')
-rw-r--r--proto/ospf/ospf.c127
-rw-r--r--proto/ospf/ospf.h48
2 files changed, 172 insertions, 3 deletions
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 25a0bea..d10df85 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -15,16 +15,138 @@
#include "nest/protocol.h"
#include "nest/route.h"
#include "conf/conf.h"
+#include "lib/ip.h"
+#include "lib/socket.h"
+#include "lib/lists.h"
#include "ospf.h"
+int
+ospf_rx_hook(sock *sk, int size)
+{
+ DBG(" RX_Hook_Called.\n");
+ return(1);
+}
+
+void
+ospf_tx_hook(sock *sk)
+{
+ DBG(" TX_Hook_Called.\n");
+}
+
+void
+ospf_err_hook(sock *sk, int err)
+{
+ DBG(" Err_Hook_Called.\n");
+}
+
+/* This will change ! */
+sock *
+ospf_open_socket(struct proto *p, struct ospf_iface *ifa)
+{
+ sock *mcsk;
+
+ /* No NBMA networks now */
+
+ if(ifa->iface->flags & IF_MULTICAST)
+ {
+ mcsk=sk_new(p->pool);
+ mcsk->type=SK_IP_MC;
+ mcsk->dport=OSPF_PROTO;
+ mcsk->saddr=AllSPFRouters;
+ mcsk->daddr=AllSPFRouters;
+ mcsk->ttl=1;
+ mcsk->rx_hook=ospf_rx_hook;
+ mcsk->tx_hook=ospf_tx_hook;
+ mcsk->err_hook=ospf_err_hook;
+ mcsk->iface=ifa->iface;
+ mcsk->rbsize=ifa->iface->mtu;
+ if(sk_open(mcsk)!=0)
+ {
+ DBG(" OSPF: SK_OPEN: failed\n");
+ return(NULL);
+ }
+ return(mcsk);
+ }
+ else return(NULL);
+}
+
+/*
+ * This will later decide, wheter use iface for OSPF or not
+ * depending on config
+ */
+int
+is_good_iface(struct proto *p, struct iface *iface)
+{
+ return(iface->flags & IF_UP);
+}
+
+/* Of course, it's NOT true now */
+byte
+ospf_iface_clasify(struct iface *ifa)
+{
+ if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))==
+ IF_MULTIACCESS|IF_MULTICAST) return OSPF_IM_MULTICAST;
+ if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))==
+ IF_MULTIACCESS) return OSPF_IM_NBMA;
+ return OSPF_IM_PTP;
+}
+
+void
+ospf_iface_default(struct ospf_iface *ifa)
+{
+ int i;
+
+ ifa->area=0;
+ ifa->cost=COST_D;
+ ifa->rxmtint=RXMTINT_D;
+ ifa->iftransdelay=IFTRANSDELAY_D;
+ ifa->priority=PRIORITY_D;
+ ifa->helloint=HELLOINT_D;
+ ifa->deadint=DEADINT_D;
+ ifa->autype=0;
+ for(i=0;i<8;i++) ifa->aukey[i]=0;
+ ifa->options=0;
+ ifa->dr=ipa_from_u32(0x00000000);
+ ifa->bdr=ipa_from_u32(0x00000000);
+ ifa->mode=ospf_iface_clasify(ifa->iface);
+}
+
+void
+ospf_if_notify(struct proto *p, unsigned flags, struct iface *new, struct iface *old)
+{
+ struct ospf_iface *ospf_iface;
+
+ struct ospf_config *c;
+ c=(struct ospf_config *)(p->cf);
+
+
+
+ DBG(" OSPF: If notify called\n");
+
+ if(((flags & IF_CHANGE_UP)==IF_CHANGE_UP) && is_good_iface(p, new))
+ {
+ /* Latter I'll use config - this is incorrect */
+ ospf_iface=mb_alloc(p->pool, sizeof(struct ospf_iface));
+ ospf_iface->iface=new;
+ add_tail(&(c->iface_list), NODE ospf_iface);
+ ospf_iface_default(ospf_iface);
+ init_list(&(ospf_iface->sk_list));
+ if(ospf_open_socket(p, ospf_iface)!=NULL)
+ {
+ add_tail(&(ospf_iface->sk_list),NODE ospf_iface);
+ }
+ }
+}
+
static int
ospf_start(struct proto *p)
{
- struct ospf_config *c = (void *) p->cf;
-
DBG(" OSPF: Start\n");
+
+ p->if_notify=ospf_if_notify;
+
return PS_UP;
}
@@ -53,6 +175,7 @@ static void
ospf_preconfig(struct protocol *x, struct config *c)
{
DBG( " OSPF: preconfig\n" );
+ init_list(&(((struct ospf_config *)c)->iface_list));
}
static void
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 4e165f8..44a8e79 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -9,9 +9,55 @@
#ifndef _BIRD_OSPF_H_
#define _BIRD_OSPF_H_
+#define OSPF_PROTO 89
+#define AllSPFRouters ipa_from_u32(0xe0000005) /* 224.0.0.5 */
+#define AllDRouters ipa_from_u32(0xe0000006) /* 224.0.0.6 */
+
struct ospf_config {
struct proto_config c;
- ip_addr area; /* Area ID */
+ ip_addr area; /* Area ID !!! This is wrong !!! */
+ list iface_list;
};
+struct ospf_iface {
+ node n;
+ list sk_list; /* List of active sockets */
+ struct iface *iface; /* Nest's iface */
+ u32 area; /* OSPF Area */
+ u16 cost; /* Cost of iface */
+ int rxmtint; /* number of seconds between LSA retransmissions */
+ int iftransdelay; /* The estimated number of seconds it takes to
+ transmit a Link State Update Packet over this
+ interface. LSAs contained in the update */
+ u8 priority; /* A router priority for DR election */
+ u16 helloint; /* number of seconds between hello sending */
+ u32 deadint; /* after "deadint" missing hellos is router dead */
+ u16 autype;
+ u8 aukey[8];
+ u8 options;
+ ip_addr dr; /* Designated router */
+ ip_addr bdr; /* Backup DR */
+ byte mode;
+#define OSPF_IM_MULTICAST 0
+#define OSPF_IM_PTP 1
+#define OSPF_IM_NBMA 2
+
+/* Default values for interface parameters */
+#define COST_D 10
+#define RXMTINT_D 5
+#define IFTRANSDELAY_D 1
+#define PRIORITY_D 0
+#define HELLOINT_D 10
+#define DEADINT_D 4
+};
+
+
+struct ospf_patt {
+ struct iface_patt i;
+
+ u16 cost;
+ byte mode;
+};
+
+
#endif /* _BIRD_OSPF_H_ */