2003-03-25 Paul Jakma <paul@dishone.st>

	* sync to latest zebra CVS
	* spec file: updated and added define for ospf-api/client

NB: OSPF-API has been broken by the zebra.org changes, which
has added struct ospf * as a new arg to many functions
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index d845684..08217af 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -482,22 +482,21 @@
 int
 ospf_write (struct thread *thread)
 {
+  struct ospf *ospf = THREAD_ARG (thread);
   struct ospf_interface *oi;
   struct ospf_packet *op;
   struct sockaddr_in sa_dst;
-  u_char type;
-  int ret;
-  int flags = 0;
   struct ip iph;
   struct msghdr msg;
   struct iovec iov[2];
-  struct ospf *top;
+  u_char type;
+  int ret;
+  int flags = 0;
   listnode node;
   
-  top = THREAD_ARG (thread);
-  top->t_write = NULL;
+  ospf->t_write = NULL;
 
-  node = listhead (top->oi_write_q);
+  node = listhead (ospf->oi_write_q);
   assert (node);
   oi = getdata (node);
   assert (oi);
@@ -507,9 +506,9 @@
   assert (op);
   assert (op->length >= OSPF_HEADER_SIZE);
 
-  if (op->dst.s_addr == htonl (OSPF_ALLSPFROUTERS) ||
-      op->dst.s_addr == htonl (OSPF_ALLDROUTERS))
-    ospf_if_ipmulticast (top, oi->address, oi->ifp->ifindex);
+  if (op->dst.s_addr == htonl (OSPF_ALLSPFROUTERS)
+      || op->dst.s_addr == htonl (OSPF_ALLDROUTERS))
+    ospf_if_ipmulticast (ospf, oi->address, oi->ifp->ifindex);
 
   /* Rewrite the md5 signature & update the seq */
   ospf_make_md5_digest (oi, op);
@@ -529,7 +528,7 @@
 
   iph.ip_hl = sizeof (struct ip) >> 2;
   iph.ip_v = IPVERSION;
-  iph.ip_tos = 0;
+  iph.ip_tos = IPTOS_PREC_INTERNETCONTROL;
 #if defined(__NetBSD__) || defined(__FreeBSD__)
   iph.ip_len = iph.ip_hl*4 + op->length;
 #else
@@ -556,7 +555,7 @@
   iov[1].iov_base = STREAM_DATA (op->s);
   iov[1].iov_len = op->length;
 
-  ret = sendmsg (top->fd, &msg, flags);
+  ret = sendmsg (ospf->fd, &msg, flags);
   
   if (ret < 0)
     zlog_warn ("*** sendmsg in ospf_write failed with %s", strerror (errno));
@@ -589,13 +588,13 @@
   if (ospf_fifo_head (oi->obuf) == NULL)
     {
       oi->on_write_q = 0;
-      list_delete_node (top->oi_write_q, node);
+      list_delete_node (ospf->oi_write_q, node);
     }
   
   /* If packets still remain in queue, call write thread. */
-  if (!list_isempty (top->oi_write_q))
-    ospf_top->t_write =                                              
-      thread_add_write (master, ospf_write, top, top->fd);
+  if (!list_isempty (ospf->oi_write_q))
+    ospf->t_write =                                              
+      thread_add_write (master, ospf_write, ospf, ospf->fd);
 
   return 0;
 }
@@ -617,10 +616,8 @@
   hello = (struct ospf_hello *) STREAM_PNT (s);
 
   /* If Hello is myself, silently discard. */
-  if (IPV4_ADDR_SAME (&ospfh->router_id, &ospf_top->router_id)) {
-    zlog_info ("Packet %s [Hello:RECV]: router_id matches our router id");
+  if (IPV4_ADDR_SAME (&ospfh->router_id, &oi->ospf->router_id))
     return;
-  }
 
   /* If incoming interface is passive one, ignore Hello. */
   if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_PASSIVE) {
@@ -681,7 +678,7 @@
 #endif /* REJECT_IF_TBIT_ON */
 
 #ifdef HAVE_OPAQUE_LSA
-  if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE)
+  if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)
       && CHECK_FLAG (hello->options, OSPF_OPTION_O))
     {
       /*
@@ -823,7 +820,7 @@
       return;
     }
 
-  if (ospf_nbr_bidirectional (&ospf_top->router_id, hello->neighbors,
+  if (ospf_nbr_bidirectional (&oi->ospf->router_id, hello->neighbors,
 			      size - OSPF_HELLO_MIN_SIZE))
     {
       OSPF_NSM_EVENT_EXECUTE (nbr, NSM_TwoWayReceived);
@@ -1050,7 +1047,7 @@
 
 #ifdef HAVE_OPAQUE_LSA
   if (CHECK_FLAG (dd->options, OSPF_OPTION_O)
-      && !CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+      && !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
     {
       /*
        * This node is not configured to handle O-bit, for now.
@@ -1081,7 +1078,7 @@
       if ((IS_SET_DD_ALL (dd->flags) == OSPF_DD_FLAG_ALL) &&
 	  (size == OSPF_DB_DESC_MIN_SIZE))
 	{
-	  if (IPV4_ADDR_CMP (&nbr->router_id, &ospf_top->router_id) > 0)
+	  if (IPV4_ADDR_CMP (&nbr->router_id, &oi->ospf->router_id) > 0)
 	    {
 	      /* We're Slave---obey */
 	      zlog_warn ("Packet[DD]: Negotiation done (Slave).");
@@ -1098,7 +1095,7 @@
       /* Ack from the Slave */
       else if (!IS_SET_DD_MS (dd->flags) && !IS_SET_DD_I (dd->flags) &&
 	       ntohl (dd->dd_seqnum) == nbr->dd_seqnum &&
-	       IPV4_ADDR_CMP (&nbr->router_id, &ospf_top->router_id) < 0)
+	       IPV4_ADDR_CMP (&nbr->router_id, &oi->ospf->router_id) < 0)
 	{
 	  zlog_warn ("Packet[DD]: Negotiation done (Master).");
 	  nbr->dd_flags &= ~OSPF_DD_FLAG_I;
@@ -1113,7 +1110,7 @@
       nbr->options = dd->options;
 
 #ifdef HAVE_OPAQUE_LSA
-      if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+      if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
         {
           if (IS_DEBUG_OSPF_EVENT)
             zlog_info ("Neighbor[%s] is %sOpaque-capable.",
@@ -1610,8 +1607,8 @@
 	 then take the following actions. */
 
       if (IS_LSA_MAXAGE (lsa) && !current &&
-	  (ospf_nbr_count (oi->nbrs, NSM_Exchange) +
-	   ospf_nbr_count (oi->nbrs, NSM_Loading)) == 0)
+	  (ospf_nbr_count (oi, NSM_Exchange) +
+	   ospf_nbr_count (oi, NSM_Loading)) == 0)
 	{
 	  /* Response Link State Acknowledgment. */
 	  ospf_ls_ack_send (nbr, lsa);
@@ -1623,7 +1620,7 @@
 
 #ifdef HAVE_OPAQUE_LSA
       if (IS_OPAQUE_LSA (lsa->data->type)
-      &&  IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf_top->router_id))
+      &&  IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id))
         {
           /*
            * Even if initial flushing seems to be completed, there might
@@ -1676,7 +1673,7 @@
 	  (ret = ospf_lsa_more_recent (current, lsa)) < 0)
 	{
 	  /* Actual flooding procedure. */
-	  if (ospf_flood (nbr, current, lsa) < 0)  /* Trap NSSA later. */
+	  if (ospf_flood (oi->ospf, nbr, current, lsa) < 0)  /* Trap NSSA later. */
 	    DISCARD_LSA (lsa, 4);
 	  continue;
 	}
@@ -1973,9 +1970,9 @@
 			  struct ip *iph, struct ospf_header *ospfh)
 {
   struct ospf_interface *rcv_oi;
-  listnode node;
   struct ospf_vl_data *vl_data;
   struct ospf_area *vl_area;
+  listnode node;
 
   if (IN_MULTICAST (ntohl (iph->ip_dst.s_addr)) ||
       !OSPF_IS_AREA_BACKBONE (ospfh))
@@ -1983,16 +1980,17 @@
 
   if ((rcv_oi = oi) == NULL)
     {
-     if ((rcv_oi = ospf_if_lookup_by_local_addr (ifp, iph->ip_dst)) == NULL)
+     if ((rcv_oi = ospf_if_lookup_by_local_addr (oi->ospf, ifp,
+						 iph->ip_dst)) == NULL)
        return NULL;
     }
 
-  for (node = listhead (ospf_top->vlinks); node; nextnode (node))
+  for (node = listhead (oi->ospf->vlinks); node; nextnode (node))
     {
       if ((vl_data = getdata (node)) == NULL)
 	continue;
       
-      vl_area = ospf_area_lookup_by_area_id (vl_data->vl_area_id);
+      vl_area = ospf_area_lookup_by_area_id (oi->ospf, vl_data->vl_area_id);
       if (!vl_area)
 	continue;
       
@@ -2195,7 +2193,7 @@
 {
   int ret;
   struct stream *ibuf;
-  struct ospf *top;
+  struct ospf *ospf;
   struct ospf_interface *oi;
   struct ip *iph;
   struct ospf_header *ospfh;
@@ -2203,25 +2201,25 @@
   struct interface *ifp;
 
   /* first of all get interface pointer. */
-  top = THREAD_ARG (thread);
-  top->t_read = NULL;
+  ospf = THREAD_ARG (thread);
+  ospf->t_read = NULL;
 
   /* read OSPF packet. */
-  ibuf = ospf_recv_packet (top->fd, &ifp);
+  ibuf = ospf_recv_packet (ospf->fd, &ifp);
   if (ibuf == NULL)
     return -1;
   
   iph = (struct ip *) STREAM_DATA (ibuf);
 
   /* prepare for next packet. */
-  top->t_read = thread_add_read (master, ospf_read, top, top->fd);
+  ospf->t_read = thread_add_read (master, ospf_read, ospf, ospf->fd);
 
   /* IP Header dump. */
     if (IS_DEBUG_OSPF_PACKET(0, RECV))
 	    ospf_ip_header_dump (ibuf);
 
   /* Self-originated packet should be discarded silently. */
-  if (ospf_if_lookup_by_local_addr (NULL, iph->ip_src))
+  if (ospf_if_lookup_by_local_addr (ospf, NULL, iph->ip_src))
     {
       stream_free (ibuf);
       return 0;
@@ -2234,7 +2232,7 @@
   ospfh = (struct ospf_header *) STREAM_PNT (ibuf);
 
   /* associate packet with ospf interface */
-  oi = ospf_if_lookup_recv_interface (iph->ip_src);
+  oi = ospf_if_lookup_recv_if (ospf, iph->ip_src);
   if (ifp && oi && oi->ifp != ifp)
     {
       zlog_warn ("Packet from [%s] received on wrong link %s",
@@ -2336,7 +2334,7 @@
   ospfh->version = (u_char) OSPF_VERSION;
   ospfh->type = (u_char) type;
 
-  ospfh->router_id = ospf_top->router_id;
+  ospfh->router_id = oi->ospf->router_id;
 
   ospfh->checksum = 0;
   ospfh->area_id = oi->area->area_id;
@@ -2453,25 +2451,21 @@
 
   /* Add neighbor seen. */
   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
-    if ((nbr = rn->info) != NULL) {
-      /* ignore 0.0.0.0 node. */
-      if (nbr->router_id.s_addr != 0)
-	if (nbr->state != NSM_Attempt)
-	/* ignore Down neighbor. */
-	if (nbr->state != NSM_Down)
-	  /* this is myself for DR election. */
-	  if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf_top->router_id))
+    if ((nbr = rn->info))
+      if (nbr->router_id.s_addr != 0)	/* Ignore 0.0.0.0 node. */
+	if (nbr->state != NSM_Attempt)  /* Ignore Down neighbor. */
+	if (nbr->state != NSM_Down)     /* This is myself for DR election. */
+	  if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
 	    {
 	      /* Check neighbor is sane? */
-	      if (nbr->d_router.s_addr != 0 &&
-		  IPV4_ADDR_SAME (&nbr->d_router, &oi->address->u.prefix4) &&
-		  IPV4_ADDR_SAME (&nbr->bd_router, &oi->address->u.prefix4))
-		flag = 0;
+	      if (nbr->d_router.s_addr != 0
+		  && IPV4_ADDR_SAME (&nbr->d_router, &oi->address->u.prefix4)
+		  && IPV4_ADDR_SAME (&nbr->bd_router, &oi->address->u.prefix4))
+		flag = 1;
 
 	      stream_put_ipv4 (s, nbr->router_id.s_addr);
 	      length += 4;
 	    }
-    }
 
   /* Let neighbor generate BackupSeen. */
   if (flag == 1)
@@ -2503,7 +2497,7 @@
   /* Set Options. */
   options = OPTIONS (oi);
 #ifdef HAVE_OPAQUE_LSA
-  if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+  if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
     {
       if (IS_SET_DD_I (nbr->dd_flags)
       ||  CHECK_FLAG (nbr->options, OSPF_OPTION_O))