OSDN Git Service

mac80211: add mesh interface type
authorJohannes Berg <johannes@sipsolutions.net>
Sat, 23 Feb 2008 14:17:07 +0000 (15:17 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 6 Mar 2008 20:30:41 +0000 (15:30 -0500)
This adds the mesh interface type.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/ieee80211.c
net/mac80211/ieee80211_iface.c
net/mac80211/rx.c
net/mac80211/util.c

index 7a80c39..934cc25 100644 (file)
@@ -443,6 +443,7 @@ enum ieee80211_if_types {
        IEEE80211_IF_TYPE_AP,
        IEEE80211_IF_TYPE_STA,
        IEEE80211_IF_TYPE_IBSS,
+       IEEE80211_IF_TYPE_MESH_POINT,
        IEEE80211_IF_TYPE_MNTR,
        IEEE80211_IF_TYPE_WDS,
        IEEE80211_IF_TYPE_VLAN,
index 2133c9f..1ddb8e1 100644 (file)
@@ -258,6 +258,7 @@ static int ieee80211_open(struct net_device *dev)
        case IEEE80211_IF_TYPE_STA:
        case IEEE80211_IF_TYPE_MNTR:
        case IEEE80211_IF_TYPE_IBSS:
+       case IEEE80211_IF_TYPE_MESH_POINT:
                /* no special treatment */
                break;
        case IEEE80211_IF_TYPE_INVALID:
index 6777050..9523aeb 100644 (file)
@@ -235,6 +235,7 @@ void ieee80211_if_reinit(struct net_device *dev)
 #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
                }
                break;
+       case IEEE80211_IF_TYPE_MESH_POINT:
        case IEEE80211_IF_TYPE_STA:
        case IEEE80211_IF_TYPE_IBSS:
                kfree(sdata->u.sta.extra_ie);
index 48574f6..b7eeae0 100644 (file)
@@ -1713,6 +1713,16 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
                        rx->sta = ieee80211_ibss_add_sta(sdata->dev, rx->skb,
                                                         bssid, hdr->addr2);
                break;
+       case IEEE80211_IF_TYPE_MESH_POINT:
+               if (!multicast &&
+                   compare_ether_addr(sdata->dev->dev_addr,
+                                      hdr->addr1) != 0) {
+                       if (!(sdata->dev->flags & IFF_PROMISC))
+                               return 0;
+
+                       rx->flags &= ~IEEE80211_TXRXD_RXRA_MATCH;
+               }
+               break;
        case IEEE80211_IF_TYPE_VLAN:
        case IEEE80211_IF_TYPE_AP:
                if (!bssid) {
index f64804f..790c32f 100644 (file)
@@ -382,6 +382,7 @@ void ieee80211_iterate_active_interfaces(
                case IEEE80211_IF_TYPE_STA:
                case IEEE80211_IF_TYPE_IBSS:
                case IEEE80211_IF_TYPE_WDS:
+               case IEEE80211_IF_TYPE_MESH_POINT:
                        break;
                }
                if (sdata->dev == local->mdev)