fix-rx-mtu-params-20030131
authorJim Rees <rees@umich.edu>
Fri, 31 Jan 2003 21:20:45 +0000 (21:20 +0000)
committerJim Rees <rees@umich.edu>
Fri, 31 Jan 2003 21:20:45 +0000 (21:20 +0000)
Return subnet mask from rxi_FindIfnet for AFSOP_GETMASK.
Put rxi_FindIfnet() in rx/rx_prototypes.h to avoid similar screwups in the future.

src/afs/afs_call.c
src/rx/IRIX/rx_knet.c
src/rx/rx_kcommon.c
src/rx/rx_prototypes.h

index 3214444..a8f6d51 100644 (file)
@@ -759,10 +759,8 @@ long parm, parm2, parm3, parm4, parm5, parm6;
       mtu = ((i == -1) ? htonl(1500) : afs_cb_interface.mtu[i]);
 #else /* AFS_USERSPACE_IP_ADDR */
       struct ifnet *tifnp;
-      struct in_ifaddr *tifadp = (struct in_ifaddr *) 0;
-      extern struct ifnet *rxi_FindIfnet();
-      tifnp = rxi_FindIfnet(parm2, &tifadp);  /*  make iterative */
+
+      tifnp = rxi_FindIfnet(parm2, NULL);  /*  make iterative */
       mtu = (tifnp ? tifnp->if_mtu : htonl(1500));
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #endif /* !AFS_SUN5_ENV */
@@ -798,22 +796,10 @@ long parm, parm2, parm3, parm4, parm5, parm6;
       }
 #else /* AFS_USERSPACE_IP_ADDR */
       struct ifnet *tifnp;
-#ifdef AFS_DARWIN60_ENV
-      struct ifaddr *tifadp = (struct ifaddr *) 0;
-#else
-      struct in_ifaddr *tifadp = (struct in_ifaddr *) 0;
-#endif
-      extern struct ifnet *rxi_FindIfnet();
-      tifnp = rxi_FindIfnet(parm2, &tifadp);  /* make iterative */
-      if (tifnp && tifadp) {
-#ifdef AFS_DARWIN60_ENV
-        mask = ((struct sockaddr_in *)tifadp->ifa_netmask)->sin_addr.s_addr;
-#else
-        mask = tifadp->ia_subnetmask;
-#endif
-      } else {
+
+      tifnp = rxi_FindIfnet(parm2, &mask);  /* make iterative */
+      if (!tifnp)
         code = -1;
-      }
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #endif /* !AFS_SUN5_ENV */
       if (!code) 
index 09e385a..621a350 100644 (file)
@@ -319,26 +319,28 @@ static int rxi_MatchIfnet(struct hashbucket *h, caddr_t key, caddr_t arg1,
 }
 
     
-struct ifnet * rxi_FindIfnet(addr, pifad) 
-     afs_uint32 addr;
-     struct in_ifaddr **pifad;
+struct ifnet *
+rxi_FindIfnet(afs_uint32 addr, afs_uint32 *maskp)
 {
-  afs_uint32 ppaddr;
-  int match_value = 0;
-
-  if (numMyNetAddrs == 0)
-    (void) rxi_GetIFInfo();
-
-  ppaddr = ntohl(addr);
-  *pifad = (struct in_ifaddr*)&hashinfo_inaddr;
-
-  (void) hash_enum(&hashinfo_inaddr, rxi_MatchIfnet, HTF_INET,
-                  (caddr_t)&ppaddr, (caddr_t)&match_value, (caddr_t)pifad);
-   
-  if (match_value)
-      return (*pifad)->ia_ifp;
-  else
-      return NULL;
+    afs_uint32 ppaddr;
+    int match_value = 0;
+    struct in_ifaddr *ifad;
+
+    if (numMyNetAddrs == 0)
+       (void) rxi_GetIFInfo();
+
+    ppaddr = ntohl(addr);
+    ifad = (struct in_ifaddr*)&hashinfo_inaddr;
+
+    (void) hash_enum(&hashinfo_inaddr, rxi_MatchIfnet, HTF_INET,
+                    (caddr_t)&ppaddr, (caddr_t)&match_value, (caddr_t)&ifad);
+
+    if (match_value) {
+       if (maskp)
+           *maskp = ifad->ia_subnetmask;
+       return ifad->ia_ifp;
+    } else
+       return NULL;
 }
 
 static int rxi_EnumGetIfInfo(struct hashbucket *h, caddr_t key, caddr_t arg1,
index d5e73c9..d159865 100644 (file)
@@ -24,8 +24,6 @@ RCSID("$Header$");
 #endif
 #include "afsint.h"
 
-struct ifnet *rxi_FindIfnet(afs_uint32 addr);
-
 #ifndef RXK_LISTENER_ENV
 int (*rxk_PacketArrivalProc)(register struct rx_packet *ahandle,
         register struct sockaddr_in *afrom, char *arock,
@@ -379,7 +377,7 @@ void rxi_InitPeerParams(register struct rx_peer *pp)
        (void) rxi_GetIFInfo();
 #endif
 
-    ifn = rxi_FindIfnet(pp->host);
+    ifn = rxi_FindIfnet(pp->host, NULL);
     if (ifn) {
        pp->timeout.sec = 2;
        /* pp->timeout.usec = 0; */
@@ -647,7 +645,7 @@ int rxi_GetIFInfo(void)
 #if defined(AFS_DARWIN60_ENV) || defined(AFS_XBSD_ENV)
 /* Returns ifnet which best matches address */
 struct ifnet *
-rxi_FindIfnet(afs_uint32 addr) 
+rxi_FindIfnet(afs_uint32 addr, afs_uint32 *maskp)
 {
     struct sockaddr_in s;
     struct ifaddr *ifad;
@@ -656,6 +654,8 @@ rxi_FindIfnet(afs_uint32 addr)
     s.sin_addr.s_addr = addr;
     ifad = ifa_ifwithnet((struct sockaddr *) &s);
 
+    if (ifad && maskp)
+       *maskp = ((struct sockaddr_in *)ifad->ifa_netmask)->sin_addr.s_addr;
     return (ifad ? ifad->ifa_ifp : NULL);
 }
 
@@ -663,7 +663,7 @@ rxi_FindIfnet(afs_uint32 addr)
 
 /* Returns ifnet which best matches address */
 struct ifnet *
-rxi_FindIfnet(afs_uint32 addr)
+rxi_FindIfnet(afs_uint32 addr, afs_uint32 *maskp)
 {
     int match_value = 0;
     extern struct in_ifaddr *in_ifaddr;
@@ -697,6 +697,8 @@ rxi_FindIfnet(afs_uint32 addr)
     } /* for all in_ifaddrs */
 
  done:
+    if (ifad && maskp)
+       *maskp = ifad->ia_subnetmask;
     return (ifad ? ifad->ia_ifp : NULL);
 }
 #endif /* else DARWIN60 || XBSD */
index 579d355..7c16469 100644 (file)
@@ -269,6 +269,7 @@ extern void rxk_ListenerProc(void);
 extern void rxk_Listener(void);
 #ifndef UKERNEL
 extern void afs_rxevent_daemon(void);
+extern struct ifnet *rxi_FindIfnet(afs_uint32 addr, afs_uint32 *maskp);
 #endif
 extern void osi_StopListener(void);