summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorfenner <fenner@FreeBSD.org>1996-03-15 17:08:07 +0000
committerfenner <fenner@FreeBSD.org>1996-03-15 17:08:07 +0000
commit7eae8f5c38e62f3e7ad9cbae40e24d35b91382ef (patch)
treef7e74e8db51ee3c8a8e6539a1f4a285d25149870 /sys
parent4bc23fada7ceabb4bc4e4a493c6bb8bd570304b3 (diff)
downloadFreeBSD-src-7eae8f5c38e62f3e7ad9cbae40e24d35b91382ef.zip
FreeBSD-src-7eae8f5c38e62f3e7ad9cbae40e24d35b91382ef.tar.gz
Allow SIOCGIFBRDADDR and SIOCGIFNETMASK to return information about
aliases, if the alias address was passed in the struct ifreq. Default to first address on the list, for backwards compatibility.
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet/in.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index fb49a5c..7455b6a 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in.c 8.4 (Berkeley) 1/9/95
- * $Id: in.c,v 1.21 1996/01/08 20:59:06 guido Exp $
+ * $Id: in.c,v 1.22 1996/03/11 15:13:12 davidg Exp $
*/
#include <sys/param.h>
@@ -155,7 +155,7 @@ in_control(so, cmd, data, ifp)
register struct ifnet *ifp;
{
register struct ifreq *ifr = (struct ifreq *)data;
- register struct in_ifaddr *ia = 0;
+ register struct in_ifaddr *ia = 0, *iap;
register struct ifaddr *ifa;
struct in_ifaddr *oia;
struct in_aliasreq *ifra = (struct in_aliasreq *)data;
@@ -166,11 +166,23 @@ in_control(so, cmd, data, ifp)
/*
* Find address for this interface, if it exists.
+ *
+ * If an alias address was specified, find that one instead of
+ * the first one on the interface.
*/
if (ifp)
- for (ia = in_ifaddr; ia; ia = ia->ia_next)
- if (ia->ia_ifp == ifp)
- break;
+ for (iap = in_ifaddr; iap; iap = iap->ia_next)
+ if (iap->ia_ifp == ifp) {
+ if (((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr ==
+ iap->ia_addr.sin_addr.s_addr) {
+ ia = iap;
+ break;
+ } else if (ia == NULL) {
+ ia = iap;
+ if (ifr->ifr_addr.sa_family != AF_INET)
+ break;
+ }
+ }
switch (cmd) {
OpenPOWER on IntegriCloud