Commit d9268fb9 authored by David Woodhouse's avatar David Woodhouse Committed by David S. Miller

libertas: stop using ieee80211 for radiotap device

There seems to be no point in doing it as an ieee80211 device instead of
a normal netdev, and when we override its ->priv and then call
free_ieee80211() it has a distressing tendency to crash horribly.
Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 198cefb9
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/wireless.h> #include <linux/wireless.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <net/ieee80211.h>
#include "defs.h" #include "defs.h"
#include "scan.h" #include "scan.h"
...@@ -114,7 +113,6 @@ struct lbs_private { ...@@ -114,7 +113,6 @@ struct lbs_private {
struct net_device_stats stats; struct net_device_stats stats;
struct net_device *mesh_dev; /* Virtual device */ struct net_device *mesh_dev; /* Virtual device */
struct net_device *rtap_net_dev; struct net_device *rtap_net_dev;
struct ieee80211_device *ieee;
struct iw_statistics wstats; struct iw_statistics wstats;
struct lbs_mesh_stats mstats; struct lbs_mesh_stats mstats;
......
...@@ -1448,7 +1448,7 @@ static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1448,7 +1448,7 @@ static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev) static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
{ {
struct lbs_private *priv = dev->priv; struct lbs_private *priv = dev->priv;
return &priv->ieee->stats; return &priv->stats;
} }
...@@ -1457,42 +1457,36 @@ void lbs_remove_rtap(struct lbs_private *priv) ...@@ -1457,42 +1457,36 @@ void lbs_remove_rtap(struct lbs_private *priv)
if (priv->rtap_net_dev == NULL) if (priv->rtap_net_dev == NULL)
return; return;
unregister_netdev(priv->rtap_net_dev); unregister_netdev(priv->rtap_net_dev);
free_ieee80211(priv->rtap_net_dev); free_netdev(priv->rtap_net_dev);
priv->rtap_net_dev = NULL; priv->rtap_net_dev = NULL;
} }
int lbs_add_rtap(struct lbs_private *priv) int lbs_add_rtap(struct lbs_private *priv)
{ {
int rc = 0; int rc = 0;
struct net_device *rtap_dev;
if (priv->rtap_net_dev) if (priv->rtap_net_dev)
return -EPERM; return -EPERM;
priv->rtap_net_dev = alloc_ieee80211(0); rtap_dev = alloc_netdev(0, "rtap%d", ether_setup);
if (priv->rtap_net_dev == NULL) if (rtap_dev == NULL)
return -ENOMEM; return -ENOMEM;
rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP;
rtap_dev->open = lbs_rtap_open;
rtap_dev->stop = lbs_rtap_stop;
rtap_dev->get_stats = lbs_rtap_get_stats;
rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
rtap_dev->set_multicast_list = lbs_set_multicast_list;
rtap_dev->priv = priv;
priv->ieee = netdev_priv(priv->rtap_net_dev); rc = register_netdev(rtap_dev);
strcpy(priv->rtap_net_dev->name, "rtap%d");
priv->rtap_net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
priv->rtap_net_dev->open = lbs_rtap_open;
priv->rtap_net_dev->stop = lbs_rtap_stop;
priv->rtap_net_dev->get_stats = lbs_rtap_get_stats;
priv->rtap_net_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
priv->rtap_net_dev->set_multicast_list = lbs_set_multicast_list;
priv->rtap_net_dev->priv = priv;
priv->ieee->iw_mode = IW_MODE_MONITOR;
rc = register_netdev(priv->rtap_net_dev);
if (rc) { if (rc) {
free_ieee80211(priv->rtap_net_dev); free_netdev(rtap_dev);
priv->rtap_net_dev = NULL;
return rc; return rc;
} }
priv->rtap_net_dev = rtap_dev;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment