]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Not all I mean serious. Almost everything will change.
authorOndrej Filip <feela@network.cz>
Mon, 12 Apr 1999 23:54:21 +0000 (23:54 +0000)
committerOndrej Filip <feela@network.cz>
Mon, 12 Apr 1999 23:54:21 +0000 (23:54 +0000)
Changes: struct ospf_iface draft, various constants added...

proto/ospf/ospf.c
proto/ospf/ospf.h

index 25a0bea9cae022c8f0bcabd74f3f3ed6a31dbe95..d10df851ec64ccd1f618d3239918408570547d51 100644 (file)
 #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
index 4e165f829d1880248367b6e317a2bf341a203077..44a8e79f1bb09819de2d84957d1d9224a7de526a 100644 (file)
@@ -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_ */