|
@@ -1101,6 +1101,35 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|
|
rtnl_unlock();
|
|
|
return ret;
|
|
|
|
|
|
+ case SIOCGIFHWADDR:
|
|
|
+ rtnl_lock();
|
|
|
+ vlan = macvtap_get_vlan(q);
|
|
|
+ if (!vlan) {
|
|
|
+ rtnl_unlock();
|
|
|
+ return -ENOLINK;
|
|
|
+ }
|
|
|
+ ret = 0;
|
|
|
+ u = vlan->dev->type;
|
|
|
+ if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) ||
|
|
|
+ copy_to_user(&ifr->ifr_hwaddr.sa_data, vlan->dev->dev_addr, ETH_ALEN) ||
|
|
|
+ put_user(u, &ifr->ifr_hwaddr.sa_family))
|
|
|
+ ret = -EFAULT;
|
|
|
+ macvtap_put_vlan(vlan);
|
|
|
+ rtnl_unlock();
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ case SIOCSIFHWADDR:
|
|
|
+ rtnl_lock();
|
|
|
+ vlan = macvtap_get_vlan(q);
|
|
|
+ if (!vlan) {
|
|
|
+ rtnl_unlock();
|
|
|
+ return -ENOLINK;
|
|
|
+ }
|
|
|
+ ret = dev_set_mac_address(vlan->dev, &ifr->ifr_hwaddr);
|
|
|
+ macvtap_put_vlan(vlan);
|
|
|
+ rtnl_unlock();
|
|
|
+ return ret;
|
|
|
+
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|