]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Sending and receving of hello pkts works. No I will start building neighbor
authorOndrej Filip <feela@network.cz>
Mon, 31 May 1999 18:24:54 +0000 (18:24 +0000)
committerOndrej Filip <feela@network.cz>
Mon, 31 May 1999 18:24:54 +0000 (18:24 +0000)
database.

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

index 914adce90eda61fe46ec09929838adc0c6cdae81..5fdbc226ddc88de617e080cff4232f515d527d3d 100644 (file)
@@ -196,7 +196,7 @@ ospf_open_socket(struct proto *p, struct ospf_iface *ifa)
 {
   sock *mcsk;
 
-  /* No NBMA networks now */
+  /* FIXME: No NBMA networks now */
 
   if(ifa->iface->flags & IF_MULTICAST)
   {
@@ -261,16 +261,83 @@ ospf_iface_clasify(struct iface *ifa)
   return OSPF_IT_PTP;
 }
 
+void
+fill_ospf_pkt_hdr(struct ospf_iface *ifa, void *buf, u8 h_type)
+{
+  struct ospf_packet *pkt;
+  struct proto *p;
+  
+  p=(struct proto *)(ifa->proto);
+
+  pkt=(struct ospf_packet *)buf;
+
+  pkt->version=OSPF_VERSION;
+
+  pkt->type=h_type;
+
+  pkt->routerid=htonl(p->cf->global->router_id);
+  pkt->areaid=htonl(ifa->area);
+  pkt->autype=htons(ifa->autype);
+}
+
 void
 hello_timer_hook(timer *timer)
 {
   struct ospf_iface *ifa;
+  struct ospf_hello_packet *pkt;
+  struct ospf_packet *op;
   struct proto *p;
+  struct ospf_neighbor *neigh;
+  u16 length;
+  u32 *pp;
+  int i;
 
   ifa=(struct ospf_iface *)timer->data;
   p=(struct proto *)(ifa->proto);
   debug("%s: Hello timer fired on interface %s.\n",
     p->name, ifa->iface->name);
+  /* Now we should send a hello packet */
+  /* First a common packet header */
+  //if(ifa->type!=OSPF_IT_NBMA)
+  if(ifa->hello_sk!=NULL)
+  {
+    /* Now fill ospf_hello header */
+    pkt=(struct ospf_hello_packet *)(ifa->hello_sk->tbuf);
+    op=(struct ospf_packet *)pkt;
+
+    fill_ospf_pkt_hdr(ifa, pkt, HELLO);
+
+    pkt->netmask=ipa_mkmask(ifa->iface->addr->pxlen);
+    ipa_hton(pkt->netmask);
+    pkt->hello_int=ntohs(ifa->helloint);
+    pkt->options=ifa->options;
+    pkt->priority=ifa->priority;
+    pkt->deadint=htonl(ifa->deadint*ifa->helloint);
+    pkt->dr=ifa->drid;
+    pkt->bdr=ifa->bdrid;
+
+    /* Fill all neighbors */
+    i=0;
+    pp=(u32 *)(((byte *)pkt)+sizeof(struct ospf_hello_packet));
+    WALK_LIST (neigh, ifa->neigh_list)
+    {
+      *(pp+i)=neigh->rid;
+      i++;
+    }
+
+    length=sizeof(struct ospf_hello_packet)+i*sizeof(u32);
+
+    op->length=ntohs(length);
+
+    /* Do authentification */
+
+    op->checksum=ipsum_calculate(op,sizeof(struct ospf_packet)-8,
+      &(pkt->netmask),length-sizeof(struct ospf_packet),NULL);
+
+    sk_send(ifa->hello_sk,length);
+
+    /* XXXX */
+  }
 }
 
 void
@@ -325,7 +392,7 @@ ospf_add_timers(struct ospf_iface *ifa, pool *pool, int wait)
   ifa->hello_timer->hook=hello_timer_hook;
   ifa->hello_timer->recurrent=ifa->helloint;
   ifa->hello_timer->expires=0;
-  tm_start(ifa->hello_timer,0);
+  tm_start(ifa->hello_timer,ifa->helloint);
   DBG("%s: Installing hello timer.\n", p->name);
   if((ifa->type!=OSPF_IT_PTP))
   {
@@ -359,7 +426,7 @@ ospf_iface_default(struct ospf_iface *ifa)
   ifa->deadint=DEADINT_D;
   ifa->autype=0;
   for(i=0;i<8;i++) ifa->aukey[i]=0;
-  ifa->options=0;
+  ifa->options=2;
   ifa->drip=ipa_from_u32(0x00000000);
   ifa->drid=0;
   ifa->bdrip=ipa_from_u32(0x00000000);
@@ -382,8 +449,7 @@ void
 ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
 {
   struct ospf_iface *ifa;
-  sock *mcsk, *newsk;
-  struct ospf_sock *osk;
+  sock *mcsk;
 
   struct ospf_config *c;
   c=(struct ospf_config *)(p->cf);
@@ -403,13 +469,17 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
     ospf_iface_default(ifa);
     /* FIXME: This should read config */
     ospf_add_timers(ifa,p->pool,0);
-    init_list(&(ifa->sk_list));
-    if((mcsk=ospf_open_socket(p, ifa))!=NULL)
+    if(ifa->type!=OSPF_IT_NBMA)
     {
-      osk=(struct ospf_sock *)mb_alloc(p->pool, sizeof(struct ospf_sock));
-      osk->sk=mcsk;
-      add_tail(&(ifa->sk_list),NODE osk);
+      if((mcsk=ospf_open_socket(p, ifa))!=NULL)
+      {
+       ifa->hello_sk=mcsk;
+      }
+      else log("Huh? could not open socket?");
+      /* FIXME: In fail case??? */
+      init_list(&(ifa->neigh_list));
     }
+    /* FIXME: NBMA? */
   }
 
   if(flags & IF_CHANGE_DOWN)
index b827294dc26edd7fe255c5239521d2d9a5396c52..a0fdf816a9a13ac163eb2e31937f2001cdfdeaff 100644 (file)
@@ -33,7 +33,8 @@ struct ospf_iface {
   node n;
   struct proto_ospf *proto;
   struct iface *iface; /* Nest's iface */
-  list sk_list;                /* List of active sockets */
+  sock *hello_sk;      /* List of active sockets */
+  list neigh_list;     /* List of neigbours */
   u32 area;            /* OSPF Area */
   u16 cost;            /* Cost of iface */
   int rxmtint;         /* number of seconds between LSA retransmissions */
@@ -73,11 +74,6 @@ struct ospf_iface {
 #define WAIT_DMH 2     /* Value of Wait timer - not found it in RFC - using 2*HELLO */
 };
 
-struct ospf_sock {
-  node n;
-  sock *sk;
-};
-
 struct ospf_patt {
   struct iface_patt i;