summaryrefslogtreecommitdiff
path: root/proto/ospf/ospf.c
diff options
context:
space:
mode:
Diffstat (limited to 'proto/ospf/ospf.c')
-rw-r--r--proto/ospf/ospf.c127
1 files changed, 125 insertions, 2 deletions
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 25a0bea9..d10df851 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