staging: rtlwifi: use siocdevprivate
rtl8188eu has an "android private" ioctl command multiplexer that is not currently safe for use in compat mode because of its triple-indirect pointer. rtl8723bs uses a different interface on the SIOCDEVPRIVATE command, based on the iwpriv data structure Both also have normal unreachable iwpriv commands, and all of the above should probably just get removed. For the moment, just switch over to the new interface. Cc: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
b9067f5dc4
Коммит
89939e8906
|
@ -22,6 +22,8 @@ void rtw_stop_drv_threads(struct adapter *padapter);
|
|||
void rtw_cancel_all_timer(struct adapter *padapter);
|
||||
|
||||
int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
||||
int rtw_android_priv_cmd(struct net_device *dev, struct ifreq *rq,
|
||||
void __user *data, int cmd);
|
||||
|
||||
struct net_device *rtw_init_netdev(void);
|
||||
u16 rtw_recv_select_queue(struct sk_buff *skb);
|
||||
|
|
|
@ -45,6 +45,7 @@ enum ANDROID_WIFI_CMD {
|
|||
ANDROID_WIFI_CMD_MAX
|
||||
};
|
||||
|
||||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
|
||||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
|
||||
void __user *data, int cmd);
|
||||
|
||||
#endif /* __RTW_ANDROID_H__ */
|
||||
|
|
|
@ -2769,9 +2769,6 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
|||
ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
|
||||
break;
|
||||
#endif /* CONFIG_88EU_AP_MODE */
|
||||
case (SIOCDEVPRIVATE + 1):
|
||||
ret = rtw_android_priv_cmd(dev, rq, cmd);
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
|
|
@ -288,6 +288,7 @@ static const struct net_device_ops rtw_netdev_ops = {
|
|||
.ndo_set_mac_address = rtw_net_set_mac_address,
|
||||
.ndo_get_stats = rtw_net_get_stats,
|
||||
.ndo_do_ioctl = rtw_ioctl,
|
||||
.ndo_siocdevprivate = rtw_android_priv_cmd,
|
||||
};
|
||||
|
||||
static const struct device_type wlan_type = {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
|
@ -116,7 +117,8 @@ static int android_get_p2p_addr(struct net_device *net, char *command,
|
|||
return ETH_ALEN;
|
||||
}
|
||||
|
||||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
|
||||
void __user *data, int cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
char *command;
|
||||
|
@ -124,9 +126,15 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
|||
int bytes_written = 0;
|
||||
struct android_wifi_priv_cmd priv_cmd;
|
||||
|
||||
if (!ifr->ifr_data)
|
||||
if (cmd != SIOCDEVPRIVATE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (in_compat_syscall()) /* to be implemented */
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(priv_cmd)))
|
||||
if (copy_from_user(&priv_cmd, data, sizeof(priv_cmd)))
|
||||
return -EFAULT;
|
||||
if (priv_cmd.total_len < 1)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -48,6 +48,8 @@ void rtw_stop_drv_threads(struct adapter *padapter);
|
|||
void rtw_cancel_all_timer(struct adapter *padapter);
|
||||
|
||||
int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
||||
int rtw_siocdevprivate(struct net_device *dev, struct ifreq *rq,
|
||||
void __user *data, int cmd);
|
||||
|
||||
int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname);
|
||||
struct net_device *rtw_init_netdev(struct adapter *padapter);
|
||||
|
|
|
@ -4485,6 +4485,21 @@ exit:
|
|||
return err;
|
||||
}
|
||||
|
||||
int rtw_siocdevprivate(struct net_device *dev, struct ifreq *rq,
|
||||
void __user *data, int cmd)
|
||||
{
|
||||
struct iwreq *wrq = (struct iwreq *)rq;
|
||||
|
||||
/* little hope of fixing this, better remove the whole function */
|
||||
if (in_compat_syscall())
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (cmd != SIOCDEVPRIVATE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return rtw_ioctl_wext_private(dev, &wrq->u);
|
||||
}
|
||||
|
||||
int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
{
|
||||
struct iwreq *wrq = (struct iwreq *)rq;
|
||||
|
@ -4497,9 +4512,6 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
|||
case RTL_IOCTL_HOSTAPD:
|
||||
ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
|
||||
break;
|
||||
case SIOCDEVPRIVATE:
|
||||
ret = rtw_ioctl_wext_private(dev, &wrq->u);
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
|
|
@ -459,6 +459,7 @@ static const struct net_device_ops rtw_netdev_ops = {
|
|||
.ndo_set_mac_address = rtw_net_set_mac_address,
|
||||
.ndo_get_stats = rtw_net_get_stats,
|
||||
.ndo_do_ioctl = rtw_ioctl,
|
||||
.ndo_siocdevprivate = rtw_siocdevprivate,
|
||||
};
|
||||
|
||||
int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)
|
||||
|
|
Загрузка…
Ссылка в новой задаче