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 */
 
 
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to