Return subnet mask from rxi_FindIfnet for AFSOP_GETMASK.
Put rxi_FindIfnet() in rx/rx_prototypes.h to avoid similar screwups in the future.
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 */
}
#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)
}
-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,
#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,
(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; */
#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;
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);
}
/* 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;
} /* for all in_ifaddrs */
done:
+ if (ifad && maskp)
+ *maskp = ifad->ia_subnetmask;
return (ifad ? ifad->ia_ifp : NULL);
}
#endif /* else DARWIN60 || XBSD */
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);