Commit f13027af authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville

p54: add beacon filtering support

This patch adds beacon filtering support to p54.
Signed-off-by: default avatarChristian Lamparter <chunkeey@web.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent dce07258
...@@ -134,6 +134,7 @@ struct p54_led_dev { ...@@ -134,6 +134,7 @@ struct p54_led_dev {
struct p54_common { struct p54_common {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct ieee80211_vif *vif;
void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb); void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb);
int (*open)(struct ieee80211_hw *dev); int (*open)(struct ieee80211_hw *dev);
void (*stop)(struct ieee80211_hw *dev); void (*stop)(struct ieee80211_hw *dev);
......
...@@ -1044,6 +1044,7 @@ static void p54_rx_stats(struct ieee80211_hw *dev, struct sk_buff *skb) ...@@ -1044,6 +1044,7 @@ static void p54_rx_stats(struct ieee80211_hw *dev, struct sk_buff *skb)
static void p54_rx_trap(struct ieee80211_hw *dev, struct sk_buff *skb) static void p54_rx_trap(struct ieee80211_hw *dev, struct sk_buff *skb)
{ {
struct p54_common *priv = dev->priv;
struct p54_hdr *hdr = (struct p54_hdr *) skb->data; struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
struct p54_trap *trap = (struct p54_trap *) hdr->data; struct p54_trap *trap = (struct p54_trap *) hdr->data;
u16 event = le16_to_cpu(trap->event); u16 event = le16_to_cpu(trap->event);
...@@ -1057,6 +1058,8 @@ static void p54_rx_trap(struct ieee80211_hw *dev, struct sk_buff *skb) ...@@ -1057,6 +1058,8 @@ static void p54_rx_trap(struct ieee80211_hw *dev, struct sk_buff *skb)
wiphy_name(dev->wiphy), freq); wiphy_name(dev->wiphy), freq);
break; break;
case P54_TRAP_NO_BEACON: case P54_TRAP_NO_BEACON:
if (priv->vif)
ieee80211_beacon_loss(priv->vif);
break; break;
case P54_TRAP_SCAN: case P54_TRAP_SCAN:
break; break;
...@@ -1939,7 +1942,8 @@ static int p54_set_ps(struct ieee80211_hw *dev) ...@@ -1939,7 +1942,8 @@ static int p54_set_ps(struct ieee80211_hw *dev)
int i; int i;
if (dev->conf.flags & IEEE80211_CONF_PS) if (dev->conf.flags & IEEE80211_CONF_PS)
mode = P54_PSM | P54_PSM_DTIM | P54_PSM_MCBC; mode = P54_PSM | P54_PSM_BEACON_TIMEOUT | P54_PSM_DTIM |
P54_PSM_CHECKSUM | P54_PSM_MCBC;
else else
mode = P54_PSM_CAM; mode = P54_PSM_CAM;
...@@ -1957,9 +1961,10 @@ static int p54_set_ps(struct ieee80211_hw *dev) ...@@ -1957,9 +1961,10 @@ static int p54_set_ps(struct ieee80211_hw *dev)
psm->intervals[i].periods = cpu_to_le16(1); psm->intervals[i].periods = cpu_to_le16(1);
} }
psm->beacon_rssi_skip_max = 60; psm->beacon_rssi_skip_max = 200;
psm->rssi_delta_threshold = 0; psm->rssi_delta_threshold = 0;
psm->nr = 0; psm->nr = 10;
psm->exclude[0] = 0;
priv->tx(dev, skb); priv->tx(dev, skb);
...@@ -2114,6 +2119,8 @@ static int p54_add_interface(struct ieee80211_hw *dev, ...@@ -2114,6 +2119,8 @@ static int p54_add_interface(struct ieee80211_hw *dev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
priv->vif = conf->vif;
switch (conf->type) { switch (conf->type) {
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_ADHOC:
...@@ -2138,6 +2145,7 @@ static void p54_remove_interface(struct ieee80211_hw *dev, ...@@ -2138,6 +2145,7 @@ static void p54_remove_interface(struct ieee80211_hw *dev,
struct p54_common *priv = dev->priv; struct p54_common *priv = dev->priv;
mutex_lock(&priv->conf_mutex); mutex_lock(&priv->conf_mutex);
priv->vif = NULL;
if (priv->cached_beacon) if (priv->cached_beacon)
p54_tx_cancel(dev, priv->cached_beacon); p54_tx_cancel(dev, priv->cached_beacon);
priv->mode = NL80211_IFTYPE_MONITOR; priv->mode = NL80211_IFTYPE_MONITOR;
...@@ -2590,7 +2598,8 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) ...@@ -2590,7 +2598,8 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
skb_queue_head_init(&priv->tx_queue); skb_queue_head_init(&priv->tx_queue);
dev->flags = IEEE80211_HW_RX_INCLUDES_FCS | dev->flags = IEEE80211_HW_RX_INCLUDES_FCS |
IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_NOISE_DBM; IEEE80211_HW_NOISE_DBM |
IEEE80211_HW_BEACON_FILTER;
dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_ADHOC) |
......
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