add ieee80211_send_error to encapsulate an idiom
This commit is contained in:
parent
07fc2e05e9
commit
87f793a9fe
@ -110,6 +110,8 @@ static void ieee80211_discard_mac(struct ieee80211com *,
|
||||
static struct mbuf *ieee80211_defrag(struct ieee80211com *,
|
||||
struct ieee80211_node *, struct mbuf *);
|
||||
static struct mbuf *ieee80211_decap(struct ieee80211com *, struct mbuf *);
|
||||
static void ieee80211_send_error(struct ieee80211com *, struct ieee80211_node *,
|
||||
const u_int8_t *mac, int subtype, int arg);
|
||||
static void ieee80211_node_pwrsave(struct ieee80211_node *, int enable);
|
||||
static void ieee80211_recv_pspoll(struct ieee80211com *,
|
||||
struct ieee80211_node *, struct mbuf *);
|
||||
@ -349,14 +351,9 @@ ieee80211_input(struct ieee80211com *ic, struct mbuf *m,
|
||||
if (ni == ic->ic_bss) {
|
||||
IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT,
|
||||
wh, "data", "%s", "unknown src");
|
||||
/* NB: caller deals with reference */
|
||||
ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2);
|
||||
if (ni != NULL) {
|
||||
IEEE80211_SEND_MGMT(ic, ni,
|
||||
IEEE80211_FC0_SUBTYPE_DEAUTH,
|
||||
IEEE80211_REASON_NOT_AUTHED);
|
||||
ieee80211_free_node(ni);
|
||||
}
|
||||
ieee80211_send_error(ic, ni, wh->i_addr2,
|
||||
IEEE80211_FC0_SUBTYPE_DEAUTH,
|
||||
IEEE80211_REASON_NOT_AUTHED);
|
||||
ic->ic_stats.is_rx_notassoc++;
|
||||
goto err;
|
||||
}
|
||||
@ -913,6 +910,33 @@ ieee80211_auth_open(struct ieee80211com *ic, struct ieee80211_frame *wh,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a management frame error response to the specified
|
||||
* station. If ni is associated with the station then use
|
||||
* it; otherwise allocate a temporary node suitable for
|
||||
* transmitting the frame and then free the reference so
|
||||
* it will go away as soon as the frame has been transmitted.
|
||||
*/
|
||||
static void
|
||||
ieee80211_send_error(struct ieee80211com *ic, struct ieee80211_node *ni,
|
||||
const u_int8_t *mac, int subtype, int arg)
|
||||
{
|
||||
int istmp;
|
||||
|
||||
if (ni == ic->ic_bss) {
|
||||
ni = ieee80211_dup_bss(&ic->ic_sta, mac);
|
||||
if (ni == NULL) {
|
||||
/* XXX msg */
|
||||
return;
|
||||
}
|
||||
istmp = 1;
|
||||
} else
|
||||
istmp = 0;
|
||||
IEEE80211_SEND_MGMT(ic, ni, subtype, arg);
|
||||
if (istmp)
|
||||
ieee80211_free_node(ni);
|
||||
}
|
||||
|
||||
static int
|
||||
alloc_challenge(struct ieee80211com *ic, struct ieee80211_node *ni)
|
||||
{
|
||||
@ -1136,9 +1160,9 @@ ieee80211_auth_shared(struct ieee80211com *ic, struct ieee80211_frame *wh,
|
||||
*/
|
||||
if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
|
||||
/* XXX hack to workaround calling convention */
|
||||
IEEE80211_SEND_MGMT(ic, ni,
|
||||
IEEE80211_FC0_SUBTYPE_AUTH,
|
||||
(seq + 1) | (estatus<<16));
|
||||
ieee80211_send_error(ic, ni, wh->i_addr2,
|
||||
IEEE80211_FC0_SUBTYPE_AUTH,
|
||||
(seq + 1) | (estatus<<16));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2192,13 +2216,9 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0,
|
||||
"[%s] deny %s request, sta not authenticated\n",
|
||||
ether_sprintf(wh->i_addr2),
|
||||
reassoc ? "reassoc" : "assoc");
|
||||
ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2);
|
||||
if (ni != NULL) {
|
||||
IEEE80211_SEND_MGMT(ic, ni,
|
||||
IEEE80211_FC0_SUBTYPE_DEAUTH,
|
||||
IEEE80211_REASON_ASSOC_NOT_AUTHED);
|
||||
ieee80211_free_node(ni);
|
||||
}
|
||||
ieee80211_send_error(ic, ni, wh->i_addr2,
|
||||
IEEE80211_FC0_SUBTYPE_DEAUTH,
|
||||
IEEE80211_REASON_ASSOC_NOT_AUTHED);
|
||||
ic->ic_stats.is_rx_assoc_notauth++;
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user