]> git.hungrycats.org Git - linux/commitdiff
[VLAN]: Propagate ethtool/mii ioctls to the real device.
authorStephen Hemminger <shemminger@osdl.org>
Mon, 9 Aug 2004 09:33:10 +0000 (02:33 -0700)
committerStephen Hemminger <shemminger@osdl.org>
Mon, 9 Aug 2004 09:33:10 +0000 (02:33 -0700)
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@redhat.com>
net/8021q/vlan.c
net/8021q/vlan.h
net/8021q/vlan_dev.c

index a44c900ac08bad6c26fe4a9612298cbed4bf72f4..96e2391f3d6c991712986d4757d810fcd5564fc3 100644 (file)
@@ -358,6 +358,7 @@ static void vlan_setup(struct net_device *new_dev)
        new_dev->set_mac_address = vlan_dev_set_mac_address;
        new_dev->set_multicast_list = vlan_dev_set_multicast_list;
        new_dev->destructor = free_netdev;
+       new_dev->do_ioctl = vlan_dev_ioctl;
 }
 
 /*  Attach a VLAN device to a mac address (ie Ethernet Card).
index 3a5ae4334389916d26e1b9d1ef3714af1d8a21f8..5d9b7a1d2a8b1c08e7bc1c72e78ab12173f1237c 100644 (file)
@@ -65,6 +65,7 @@ int vlan_dev_change_mtu(struct net_device *dev, int new_mtu);
 int vlan_dev_set_mac_address(struct net_device *dev, void* addr);
 int vlan_dev_open(struct net_device* dev);
 int vlan_dev_stop(struct net_device* dev);
+int vlan_dev_ioctl(struct net_device* dev, struct ifreq *ifr, int cmd);
 int vlan_dev_set_ingress_priority(char* dev_name, __u32 skb_prio, short vlan_prio);
 int vlan_dev_set_egress_priority(char* dev_name, __u32 skb_prio, short vlan_prio);
 int vlan_dev_set_vlan_flag(char* dev_name, __u32 flag, short flag_val);
index bea6963654d14c606e95e0c8ac61c5fe17a8b971..9dfce1bc7d0a12ef53e7635b3e3592ca630a933e 100644 (file)
@@ -757,6 +757,34 @@ int vlan_dev_stop(struct net_device *dev)
        vlan_flush_mc_list(dev);
        return 0;
 }
+
+int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev;
+       struct ifreq ifrr;
+       int err = -EOPNOTSUPP;
+
+       strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
+       ifrr.ifr_ifru = ifr->ifr_ifru;
+
+       switch(cmd) {
+       case SIOCGMIIPHY:
+       case SIOCGMIIREG:
+       case SIOCSMIIREG:
+               if (real_dev->do_ioctl && netif_device_present(real_dev)) 
+                       err = real_dev->do_ioctl(dev, &ifrr, cmd);
+               break;
+
+       case SIOCETHTOOL:
+               err = dev_ethtool(&ifrr);
+       }
+
+       if (!err) 
+               ifr->ifr_ifru = ifrr.ifr_ifru;
+
+       return err;
+}
+
 /** Taken from Gleb + Lennert's VLAN code, and modified... */
 void vlan_dev_set_multicast_list(struct net_device *vlan_dev)
 {