2003-10-15 sowmini.varadhan@sun.com

        * ripd/ripd.c: (rip_send_packet) use rip->sock for mcast sends,
          instead of creating one socket per send. send source addr to
          rip_update_interface.
          (rip_update_process) should send an update on every connected
          network for each interface.
          (rip_request_send) should send a request on every connected
          network for each interface.
        * ripd/ripd.h: update prototype for rip_interface_multicast_set
        * ripd/rip_interface.c: (rip_interface_multicast_set) reorganized
          so that it can be called repeatedly for aliased interfaces (on
          multiple networks).
diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c
index 2668e7d..e3aea18 100644
--- a/ripd/rip_interface.c
+++ b/ripd/rip_interface.c
@@ -137,28 +137,25 @@
 }
 
 void
-rip_interface_multicast_set (int sock, struct interface *ifp)
+rip_interface_multicast_set (int sock, struct connected *connected, 
+                             int if_pointopoint)
 {
   int ret;
-  listnode node;
   struct servent *sp;
   struct sockaddr_in from;
-
-  for (node = listhead (ifp->connected); node; nextnode (node))
-    {
-      struct prefix_ipv4 *p;
-      struct connected *connected;
       struct in_addr addr;
+  struct prefix_ipv4 *p;
 
-      connected = getdata (node);
+  if (if_pointopoint)
+    p = (struct prefix_ipv4 *) connected->destination;
+  else
       p = (struct prefix_ipv4 *) connected->address;
 
-      if (p->family == AF_INET)
-	{
 	  addr = p->prefix;
 
+
 	  if (setsockopt_multicast_ipv4 (sock, IP_MULTICAST_IF,
-					 addr, 0, ifp->ifindex) < 0) 
+				 addr, 0, 0) < 0) 
 	    {
 	      zlog_warn ("Can't setsockopt IP_MULTICAST_IF to fd %d", sock);
 	      return;
@@ -176,6 +173,7 @@
 
 	  /* Address shoud be any address. */
 	  from.sin_family = AF_INET;
+  addr = ((struct prefix_ipv4 *) connected->address)->prefix;
 	  from.sin_addr = addr;
 #ifdef HAVE_SIN_LEN
 	  from.sin_len = sizeof (struct sockaddr_in);
@@ -184,12 +182,11 @@
     if (ripd_privs.change (ZPRIVS_RAISE))
       zlog_err ("rip_interface_multicast_set: could not raise privs");
       
-	  ret = bind (sock, (struct sockaddr *) & from, 
-		      sizeof (struct sockaddr_in));
+  bind (sock, NULL, 0); /* unbind any previous association */
+  ret = bind (sock, (struct sockaddr *) & from, sizeof (struct sockaddr_in));
 	  if (ret < 0)
 	    {
 	      zlog_warn ("Can't bind socket: %s", strerror (errno));
-	      return;
 	    }
 
     if (ripd_privs.change (ZPRIVS_LOWER))
@@ -198,8 +195,6 @@
 	  return;
 
 	}
-    }
-}
 
 /* Send RIP request packet to specified interface. */
 void