From 77e7f9c57c58c2ed64a1bd11def89969dfea692e Mon Sep 17 00:00:00 2001 From: Jim Rees Date: Fri, 31 Jan 2003 21:20:45 +0000 Subject: [PATCH] fix-rx-mtu-params-20030131 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 | 24 +++++------------------- src/rx/IRIX/rx_knet.c | 40 +++++++++++++++++++++------------------- src/rx/rx_kcommon.c | 12 +++++++----- src/rx/rx_prototypes.h | 1 + 4 files changed, 34 insertions(+), 43 deletions(-) diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 321444431..a8f6d5128 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -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) diff --git a/src/rx/IRIX/rx_knet.c b/src/rx/IRIX/rx_knet.c index 09e385a71..621a35008 100644 --- a/src/rx/IRIX/rx_knet.c +++ b/src/rx/IRIX/rx_knet.c @@ -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, diff --git a/src/rx/rx_kcommon.c b/src/rx/rx_kcommon.c index d5e73c975..d159865bb 100644 --- a/src/rx/rx_kcommon.c +++ b/src/rx/rx_kcommon.c @@ -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 */ diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 579d355f5..7c16469da 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -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); -- 2.39.5