Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133118046
D8365.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D8365.id.diff
View Options
Index: head/sys/net80211/ieee80211_adhoc.c
===================================================================
--- head/sys/net80211/ieee80211_adhoc.c
+++ head/sys/net80211/ieee80211_adhoc.c
@@ -427,8 +427,12 @@
goto err;
}
/*
- * Fake up a node for this newly
- * discovered member of the IBSS.
+ * Fake up a node for this newly discovered member
+ * of the IBSS.
+ *
+ * Note: This doesn't "upgrade" the node to 11n;
+ * that will happen after a probe request/response
+ * exchange.
*/
ni = ieee80211_fakeup_adhoc_node(vap, wh->i_addr2);
if (ni == NULL) {
@@ -773,12 +777,35 @@
ni = ieee80211_add_neighbor(vap, wh, &scan);
else
ni = NULL;
+
+ /*
+ * Send a probe request so we announce 11n
+ * capabilities.
+ */
+ ieee80211_send_probereq(ni, /* node */
+ vap->iv_myaddr, /* SA */
+ ni->ni_macaddr, /* DA */
+ vap->iv_bss->ni_bssid, /* BSSID */
+ vap->iv_bss->ni_essid,
+ vap->iv_bss->ni_esslen); /* SSID */
+
} else if (ni->ni_capinfo == 0) {
/*
* Update faked node created on transmit.
* Note this also updates the tsf.
*/
ieee80211_init_neighbor(ni, wh, &scan);
+
+ /*
+ * Send a probe request so we announce 11n
+ * capabilities.
+ */
+ ieee80211_send_probereq(ni, /* node */
+ vap->iv_myaddr, /* SA */
+ ni->ni_macaddr, /* DA */
+ vap->iv_bss->ni_bssid, /* BSSID */
+ vap->iv_bss->ni_essid,
+ vap->iv_bss->ni_esslen); /* SSID */
} else {
/*
* Record tsf for potential resync.
@@ -889,6 +916,12 @@
*/
ieee80211_send_proberesp(vap, wh->i_addr2,
is11bclient(rates, xrates) ? IEEE80211_SEND_LEGACY_11B : 0);
+
+ /*
+ * Note: we don't benefit from stashing the probe request
+ * IEs away to use for IBSS negotiation, because we
+ * typically don't get all of the IEs.
+ */
break;
case IEEE80211_FC0_SUBTYPE_ACTION:
Index: head/sys/net80211/ieee80211_node.c
===================================================================
--- head/sys/net80211/ieee80211_node.c
+++ head/sys/net80211/ieee80211_node.c
@@ -324,10 +324,11 @@
struct ieee80211_node *ni;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
- "%s: creating %s on channel %u%c\n", __func__,
+ "%s: creating %s on channel %u%c flags 0x%08x\n", __func__,
ieee80211_opmode_name[vap->iv_opmode],
ieee80211_chan2ieee(ic, chan),
- ieee80211_channel_type_char(chan));
+ ieee80211_channel_type_char(chan),
+ chan->ic_flags);
ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->iv_myaddr);
if (ni == NULL) {
@@ -408,6 +409,14 @@
}
}
+ /* XXX TODO: other bits and pieces - eg fast-frames? */
+
+ /* If we're an 11n channel then initialise the 11n bits */
+ if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {
+ /* XXX what else? */
+ ieee80211_ht_node_init(ni);
+ }
+
(void) ieee80211_sta_join1(ieee80211_ref_node(ni));
}
@@ -1549,6 +1558,9 @@
* so we can do interesting things (e.g. use
* WME to disable ACK's).
*/
+ /*
+ * XXX TODO: 11n?
+ */
if (vap->iv_flags & IEEE80211_F_WME)
ni->ni_flags |= IEEE80211_NODE_QOS;
#ifdef IEEE80211_SUPPORT_SUPERG
@@ -1558,8 +1570,44 @@
}
ieee80211_node_setuptxparms(ni);
ieee80211_ratectl_node_init(ni);
+
+ /*
+ * XXX TODO: 11n? At least 20MHz, at least A-MPDU RX,
+ * not A-MPDU TX; not 11n rates, etc. We'll cycle
+ * that after we hear that we can indeed do 11n
+ * (either by a beacon frame or by a probe response.)
+ */
+
+ /*
+ * This is the first time we see the node.
+ */
if (ic->ic_newassoc != NULL)
ic->ic_newassoc(ni, 1);
+
+ /*
+ * Kick off a probe request to the given node;
+ * we will then use the probe response to update
+ * 11n/etc configuration state.
+ *
+ * XXX TODO: this isn't guaranteed, and until we get
+ * a probe response, we won't be able to actually
+ * do anything 802.11n related to the node.
+ * So if this does indeed work, maybe we should hold
+ * off on sending responses until we get the probe
+ * response, or just default to some sensible subset
+ * of 802.11n behaviour (eg always allow aggregation
+ * negotiation TO us, but not FROM us, etc) so we
+ * aren't entirely busted.
+ */
+ if (vap->iv_opmode == IEEE80211_M_IBSS) {
+ ieee80211_send_probereq(ni, /* node */
+ vap->iv_myaddr, /* SA */
+ ni->ni_macaddr, /* DA */
+ vap->iv_bss->ni_bssid, /* BSSID */
+ vap->iv_bss->ni_essid,
+ vap->iv_bss->ni_esslen); /* SSID */
+ }
+
/* XXX not right for 802.1x/WPA */
ieee80211_node_authorize(ni);
}
@@ -1632,6 +1680,21 @@
ni->ni_ies.htinfo_ie);
ieee80211_node_setuptxparms(ni);
ieee80211_ratectl_node_init(ni);
+
+ /* Reassociate; we're now 11n */
+ /*
+ * XXX TODO: this is the wrong thing to do -
+ * we're calling it with isnew=1 so the ath(4)
+ * driver reinitialises the rate tables.
+ * This "mostly" works for ath(4), but it won't
+ * be right for firmware devices which allocate
+ * node states.
+ *
+ * So, do we just create a new node and delete
+ * the old one? Or?
+ */
+ if (ni->ni_ic->ic_newassoc)
+ ni->ni_ic->ic_newassoc(ni, 1);
}
}
@@ -1809,6 +1872,10 @@
* caller to be consistent with
* ieee80211_find_node_locked.
*/
+ /*
+ * XXX TODO: this doesn't fake up 11n state; we need
+ * to find another way to get it upgraded.
+ */
ni = ieee80211_fakeup_adhoc_node(vap, macaddr);
if (ni != NULL)
(void) ieee80211_ref_node(ni);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 24, 3:12 AM (6 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24115890
Default Alt Text
D8365.id.diff (5 KB)
Attached To
Mode
D8365: [net80211] add initial support for HT upgrade of IBSS nodes. * add ability for IBSS nodes to be upgraded when it sees HT IEs * add HT IEs to probe requests/responses and beacons * send a probe request after bringing up a node so we can...
Attached
Detach File
Event Timeline
Log In to Comment