Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2012 13:59:23 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r239422 - stable/9/sys/net
Message-ID:  <201208201359.q7KDxNoo043453@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Mon Aug 20 13:59:22 2012
New Revision: 239422
URL: http://svn.freebsd.org/changeset/base/239422

Log:
  MFC r238183:
  
    Implement SIOCGIFMEDIA for if_tap(4)
  
    Appease certain if_tap(4) consumers by providing simulated Ethernet
    media status.
  
    DragonFly commit 70d9a675bf5441cc854a843ead702d08928c37f3
  
  Obtained from:  DragonFly BSD
  Sponsored by:   ADARA Networks

Modified:
  stable/9/sys/net/if_tap.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/net/if_tap.c
==============================================================================
--- stable/9/sys/net/if_tap.c	Mon Aug 20 13:08:37 2012	(r239421)
+++ stable/9/sys/net/if_tap.c	Mon Aug 20 13:59:22 2012	(r239422)
@@ -65,6 +65,7 @@
 #include <net/if.h>
 #include <net/if_clone.h>
 #include <net/if_dl.h>
+#include <net/if_media.h>
 #include <net/if_types.h>
 #include <net/route.h>
 #include <net/vnet.h>
@@ -602,7 +603,8 @@ tapifioctl(struct ifnet *ifp, u_long cmd
 	struct tap_softc	*tp = ifp->if_softc;
 	struct ifreq		*ifr = (struct ifreq *)data;
 	struct ifstat		*ifs = NULL;
-	int			 dummy;
+	struct ifmediareq	*ifmr = NULL;
+	int			 dummy, error = 0;
 
 	switch (cmd) {
 		case SIOCSIFFLAGS: /* XXX -- just like vmnet does */
@@ -610,6 +612,22 @@ tapifioctl(struct ifnet *ifp, u_long cmd
 		case SIOCDELMULTI:
 			break;
 
+		case SIOCGIFMEDIA:
+			ifmr = (struct ifmediareq *)data;
+			dummy = ifmr->ifm_count;
+			ifmr->ifm_count = 1;
+			ifmr->ifm_status = IFM_AVALID;
+			ifmr->ifm_active = IFM_ETHER;
+			if (tp->tap_flags & TAP_OPEN)
+				ifmr->ifm_status |= IFM_ACTIVE;
+			ifmr->ifm_current = ifmr->ifm_active;
+			if (dummy >= 1) {
+				int media = IFM_ETHER;
+				error = copyout(&media, ifmr->ifm_ulist,
+				    sizeof(int));
+			}
+			break;
+
 		case SIOCSIFMTU:
 			ifp->if_mtu = ifr->ifr_mtu;
 			break;
@@ -626,11 +644,11 @@ tapifioctl(struct ifnet *ifp, u_long cmd
 			break;
 
 		default:
-			return (ether_ioctl(ifp, cmd, data));
-			/* NOT REACHED */
+			error = ether_ioctl(ifp, cmd, data);
+			break;
 	}
 
-	return (0);
+	return (error);
 } /* tapifioctl */
 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208201359.q7KDxNoo043453>