summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2012-07-06 23:17:30 +0000
committeremaste <emaste@FreeBSD.org>2012-07-06 23:17:30 +0000
commite91d8ed66961ddedc1faefbdbd5e9aaf203640bc (patch)
tree9e52712e5b9a28355b1f582250491cb9c3d8f706
parent3fd98197832d76ffc7a77c635b9cd424b6aa4341 (diff)
downloadFreeBSD-src-e91d8ed66961ddedc1faefbdbd5e9aaf203640bc.zip
FreeBSD-src-e91d8ed66961ddedc1faefbdbd5e9aaf203640bc.tar.gz
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
-rw-r--r--sys/net/if_tap.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c
index f80ce7c..201f976 100644
--- a/sys/net/if_tap.c
+++ b/sys/net/if_tap.c
@@ -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, caddr_t data)
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, caddr_t data)
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, caddr_t data)
break;
default:
- return (ether_ioctl(ifp, cmd, data));
- /* NOT REACHED */
+ error = ether_ioctl(ifp, cmd, data);
+ break;
}
- return (0);
+ return (error);
} /* tapifioctl */
OpenPOWER on IntegriCloud