svn commit: r195307 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Fri Jul 3 14:37:11 UTC 2009
Author: rpaulo
Date: Fri Jul 3 14:37:10 2009
New Revision: 195307
URL: http://svn.freebsd.org/changeset/base/195307
Log:
Fix some problems with the recent action frame overhaul.
Sponsored by: The FreeBSD Foundation
Modified:
projects/mesh11s/sys/net80211/ieee80211_action.c
projects/mesh11s/sys/net80211/ieee80211_mesh.c
Modified: projects/mesh11s/sys/net80211/ieee80211_action.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_action.c Fri Jul 3 11:37:58 2009 (r195306)
+++ projects/mesh11s/sys/net80211/ieee80211_action.c Fri Jul 3 14:37:10 2009 (r195307)
@@ -62,6 +62,13 @@ static ieee80211_send_action_func *ht_se
send_inval, send_inval, send_inval, send_inval,
send_inval, send_inval, send_inval, send_inval,
};
+static ieee80211_send_action_func *meshpl_send_action[8] = {
+ send_inval, send_inval, send_inval, send_inval,
+ send_inval, send_inval, send_inval, send_inval,
+};
+static ieee80211_send_action_func *meshlm_send_action[4] = {
+ send_inval, send_inval, send_inval, send_inval,
+};
static ieee80211_send_action_func *vendor_send_action[8] = {
send_inval, send_inval, send_inval, send_inval,
send_inval, send_inval, send_inval, send_inval,
@@ -82,6 +89,16 @@ ieee80211_send_action_register(int cat,
break;
ht_send_action[act] = f;
return 0;
+ case IEEE80211_ACTION_CAT_MESHPEERING:
+ if (act >= N(meshpl_send_action))
+ break;
+ meshpl_send_action[act] = f;
+ return 0;
+ case IEEE80211_ACTION_CAT_MESHLMETRIC:
+ if (act >= N(meshlm_send_action))
+ break;
+ meshlm_send_action[act] = f;
+ return 0;
case IEEE80211_ACTION_CAT_VENDOR:
if (act >= N(vendor_send_action))
break;
@@ -113,6 +130,14 @@ ieee80211_send_action(struct ieee80211_n
if (act < N(ht_send_action))
f = ht_send_action[act];
break;
+ case IEEE80211_ACTION_CAT_MESHPEERING:
+ if (act < N(meshpl_send_action))
+ f = meshpl_send_action[act];
+ break;
+ case IEEE80211_ACTION_CAT_MESHLMETRIC:
+ if (act < N(meshlm_send_action))
+ f = meshlm_send_action[act];
+ break;
case IEEE80211_ACTION_CAT_VENDOR:
if (act < N(vendor_send_action))
f = vendor_send_action[act];
@@ -137,6 +162,13 @@ static ieee80211_recv_action_func *ht_re
recv_inval, recv_inval, recv_inval, recv_inval,
recv_inval, recv_inval, recv_inval, recv_inval,
};
+static ieee80211_recv_action_func *meshpl_recv_action[8] = {
+ recv_inval, recv_inval, recv_inval, recv_inval,
+ recv_inval, recv_inval, recv_inval, recv_inval,
+};
+static ieee80211_recv_action_func *meshlm_recv_action[4] = {
+ recv_inval, recv_inval, recv_inval, recv_inval,
+};
static ieee80211_recv_action_func *vendor_recv_action[8] = {
recv_inval, recv_inval, recv_inval, recv_inval,
recv_inval, recv_inval, recv_inval, recv_inval,
@@ -157,6 +189,16 @@ ieee80211_recv_action_register(int cat,
break;
ht_recv_action[act] = f;
return 0;
+ case IEEE80211_ACTION_CAT_MESHPEERING:
+ if (act >= N(meshpl_recv_action))
+ break;
+ meshpl_recv_action[act] = f;
+ return 0;
+ case IEEE80211_ACTION_CAT_MESHLMETRIC:
+ if (act >= N(meshlm_recv_action))
+ break;
+ meshlm_recv_action[act] = f;
+ return 0;
case IEEE80211_ACTION_CAT_VENDOR:
if (act >= N(vendor_recv_action))
break;
@@ -191,6 +233,14 @@ ieee80211_recv_action(struct ieee80211_n
if (ia->ia_action < N(ht_recv_action))
f = ht_recv_action[ia->ia_action];
break;
+ case IEEE80211_ACTION_CAT_MESHPEERING:
+ if (ia->ia_action < N(meshpl_recv_action))
+ f = meshpl_recv_action[ia->ia_action];
+ break;
+ case IEEE80211_ACTION_CAT_MESHLMETRIC:
+ if (ia->ia_action < N(meshlm_recv_action))
+ f = meshlm_recv_action[ia->ia_action];
+ break;
case IEEE80211_ACTION_CAT_VENDOR:
if (ia->ia_action < N(vendor_recv_action))
f = vendor_recv_action[ia->ia_action];
Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jul 3 11:37:58 2009 (r195306)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jul 3 14:37:10 2009 (r195307)
@@ -1104,7 +1104,8 @@ mesh_recv_action_meshpeering_open(struct
uint16_t args[3];
/* +2 for capabilites */
- meshpeer = mesh_parse_meshpeering_action(ni, wh, frm + 2, efrm, &ie);
+ meshpeer = mesh_parse_meshpeering_action(ni, wh,
+ frm + sizeof(struct ieee80211_action) + 2, efrm, &ie);
if (meshpeer == NULL) {
return 0;
}
@@ -1238,7 +1239,8 @@ mesh_recv_action_meshpeering_confirm(str
uint16_t args[3];
/* +2+2+2 for capabilites + status code + AID */
- meshpeer = mesh_parse_meshpeering_action(ni, wh, frm+2+2+2, efrm, &ie);
+ meshpeer = mesh_parse_meshpeering_action(ni, wh,
+ frm + sizeof(struct ieee80211_action) + 2 + 2 + 2, efrm, &ie);
if (meshpeer == NULL) {
return 0;
}
@@ -1383,6 +1385,7 @@ mesh_send_action_meshpeering_open(struct
{
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
uint16_t *args = args0;
const struct ieee80211_rateset *rs;
struct mbuf *m;
@@ -1399,8 +1402,13 @@ mesh_send_action_meshpeering_open(struct
m = ieee80211_getmgtframe(&frm,
ic->ic_headroom + sizeof(struct ieee80211_frame),
sizeof(uint16_t) /* action+category */
- /* XXX may action payload */
- + sizeof(struct ieee80211_action_ba_addbaresponse)
+ + sizeof(uint16_t) /* capabilites */
+ + sizeof(struct ieee80211_meshpeerver_ie)
+ + 2 + IEEE80211_RATE_SIZE
+ + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
+ + 2 + ms->ms_idlen /* Mesh ID */
+ + sizeof(struct ieee80211_meshconf_ie)
+ + sizeof(struct ieee80211_meshpeer_ie)
);
if (m != NULL) {
/*
@@ -1441,6 +1449,7 @@ mesh_send_action_meshpeering_confirm(str
{
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
uint16_t *args = args0;
const struct ieee80211_rateset *rs;
struct mbuf *m;
@@ -1458,8 +1467,15 @@ mesh_send_action_meshpeering_confirm(str
m = ieee80211_getmgtframe(&frm,
ic->ic_headroom + sizeof(struct ieee80211_frame),
sizeof(uint16_t) /* action+category */
- /* XXX may action payload */
- + sizeof(struct ieee80211_action_ba_addbaresponse)
+ + sizeof(uint16_t) /* capabilites */
+ + sizeof(uint16_t) /* status code */
+ + sizeof(uint16_t) /* AID */
+ + sizeof(struct ieee80211_meshpeerver_ie)
+ + 2 + IEEE80211_RATE_SIZE
+ + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
+ + 2 + ms->ms_idlen /* Mesh ID */
+ + sizeof(struct ieee80211_meshconf_ie)
+ + sizeof(struct ieee80211_meshpeer_ie)
);
if (m != NULL) {
/*
@@ -1505,6 +1521,7 @@ mesh_send_action_meshpeering_close(struc
{
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
+ struct ieee80211_mesh_state *ms = vap->iv_mesh;
uint16_t *args = args0;
struct mbuf *m;
uint8_t *frm;
@@ -1521,8 +1538,10 @@ mesh_send_action_meshpeering_close(struc
m = ieee80211_getmgtframe(&frm,
ic->ic_headroom + sizeof(struct ieee80211_frame),
sizeof(uint16_t) /* action+category */
- /* XXX may action payload */
- + sizeof(struct ieee80211_action_ba_addbaresponse)
+ + sizeof(uint16_t) /* reason code */
+ + sizeof(struct ieee80211_meshpeerver_ie)
+ + 2 + ms->ms_idlen /* Mesh ID */
+ + sizeof(struct ieee80211_meshpeer_ie)
);
if (m != NULL) {
/*
@@ -1610,6 +1629,7 @@ mesh_send_action_meshlink_reply(struct i
m = ieee80211_getmgtframe(&frm,
ic->ic_headroom + sizeof(struct ieee80211_frame),
sizeof(uint16_t) /* action+category */
+ + sizeof(struct ieee80211_meshlmetric_ie)
);
if (m != NULL) {
/*
More information about the svn-src-projects
mailing list