From b57e086cc18e01336413bfb448ec1ce5d05280fb Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 13 Dec 2009 23:25:30 +0200 Subject: [PATCH] Mark management frame processing functions to use const buffer --- hostapd/ap_list.c | 6 ++--- hostapd/ap_list.h | 4 ++-- hostapd/beacon.c | 7 +++--- hostapd/beacon.h | 4 ++-- hostapd/drv_callbacks.c | 6 ++--- hostapd/ieee802_11.c | 49 +++++++++++++++++++++++++---------------- hostapd/ieee802_11.h | 5 +++-- hostapd/wme.c | 12 +++++----- hostapd/wme.h | 4 ++-- src/drivers/driver.h | 2 +- wpa_supplicant/ap.c | 2 +- wpa_supplicant/ap.h | 2 +- 12 files changed, 58 insertions(+), 45 deletions(-) diff --git a/hostapd/ap_list.c b/hostapd/ap_list.c index 1cdf0a24d..ec6c2c06c 100644 --- a/hostapd/ap_list.c +++ b/hostapd/ap_list.c @@ -55,7 +55,7 @@ static int ap_list_beacon_olbc(struct hostapd_iface *iface, struct ap_info *ap) } -struct ap_info * ap_get_ap(struct hostapd_iface *iface, u8 *ap) +struct ap_info * ap_get_ap(struct hostapd_iface *iface, const u8 *ap) { struct ap_info *s; @@ -195,7 +195,7 @@ int ap_ap_for_each(struct hostapd_iface *iface, } -static struct ap_info * ap_ap_add(struct hostapd_iface *iface, u8 *addr) +static struct ap_info * ap_ap_add(struct hostapd_iface *iface, const u8 *addr) { struct ap_info *ap; @@ -221,7 +221,7 @@ static struct ap_info * ap_ap_add(struct hostapd_iface *iface, u8 *addr) void ap_list_process_beacon(struct hostapd_iface *iface, - struct ieee80211_mgmt *mgmt, + const struct ieee80211_mgmt *mgmt, struct ieee802_11_elems *elems, struct hostapd_frame_info *fi) { diff --git a/hostapd/ap_list.h b/hostapd/ap_list.h index 22181c71b..f49f58b54 100644 --- a/hostapd/ap_list.h +++ b/hostapd/ap_list.h @@ -54,11 +54,11 @@ struct ap_info { struct ieee802_11_elems; struct hostapd_frame_info; -struct ap_info * ap_get_ap(struct hostapd_iface *iface, u8 *sta); +struct ap_info * ap_get_ap(struct hostapd_iface *iface, const u8 *sta); int ap_ap_for_each(struct hostapd_iface *iface, int (*func)(struct ap_info *s, void *data), void *data); void ap_list_process_beacon(struct hostapd_iface *iface, - struct ieee80211_mgmt *mgmt, + const struct ieee80211_mgmt *mgmt, struct ieee802_11_elems *elems, struct hostapd_frame_info *fi); #ifdef NEED_AP_MLME diff --git a/hostapd/beacon.c b/hostapd/beacon.c index 420433e08..1f653238c 100644 --- a/hostapd/beacon.c +++ b/hostapd/beacon.c @@ -191,13 +191,14 @@ static u8 * hostapd_eid_wpa(struct hostapd_data *hapd, u8 *eid, size_t len, } -void handle_probe_req(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, - size_t len) +void handle_probe_req(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len) { struct ieee80211_mgmt *resp; struct ieee802_11_elems elems; char *ssid; - u8 *pos, *epos, *ie; + u8 *pos, *epos; + const u8 *ie; size_t ssid_len, ie_len; struct sta_info *sta = NULL; diff --git a/hostapd/beacon.h b/hostapd/beacon.h index ca80ac0f0..c1510e194 100644 --- a/hostapd/beacon.h +++ b/hostapd/beacon.h @@ -18,8 +18,8 @@ struct ieee80211_mgmt; -void handle_probe_req(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, - size_t len); +void handle_probe_req(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len); #ifdef NEED_AP_MLME void ieee802_11_set_beacon(struct hostapd_data *hapd); void ieee802_11_set_beacons(struct hostapd_iface *iface); diff --git a/hostapd/drv_callbacks.c b/hostapd/drv_callbacks.c index 55c753990..29c86c85c 100644 --- a/hostapd/drv_callbacks.c +++ b/hostapd/drv_callbacks.c @@ -351,14 +351,14 @@ static void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, } -static void hostapd_mgmt_rx(struct hostapd_data *hapd, u8 *buf, +static void hostapd_mgmt_rx(struct hostapd_data *hapd, const u8 *buf, size_t len, struct hostapd_frame_info *fi) { struct hostapd_iface *iface = hapd->iface; - struct ieee80211_hdr *hdr; + const struct ieee80211_hdr *hdr; const u8 *bssid; - hdr = (struct ieee80211_hdr *) buf; + hdr = (const struct ieee80211_hdr *) buf; bssid = get_hdr_bssid(hdr, len); if (bssid == NULL) return; diff --git a/hostapd/ieee802_11.c b/hostapd/ieee802_11.c index bf50abbce..8d4fe3923 100644 --- a/hostapd/ieee802_11.c +++ b/hostapd/ieee802_11.c @@ -196,7 +196,8 @@ void ieee802_11_print_ssid(char *buf, const u8 *ssid, u8 len) * @addr: Address of the destination STA * @reason: Reason code for Deauthentication */ -void ieee802_11_send_deauth(struct hostapd_data *hapd, u8 *addr, u16 reason) +void ieee802_11_send_deauth(struct hostapd_data *hapd, const u8 *addr, + u16 reason) { struct ieee80211_mgmt mgmt; @@ -217,7 +218,8 @@ void ieee802_11_send_deauth(struct hostapd_data *hapd, u8 *addr, u16 reason) static u16 auth_shared_key(struct hostapd_data *hapd, struct sta_info *sta, - u16 auth_transaction, u8 *challenge, int iswep) + u16 auth_transaction, const u8 *challenge, + int iswep) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, @@ -339,15 +341,15 @@ static void handle_auth_ft_finish(void *ctx, const u8 *dst, const u8 *bssid, #endif /* CONFIG_IEEE80211R */ -static void handle_auth(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, - size_t len) +static void handle_auth(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len) { u16 auth_alg, auth_transaction, status_code; u16 resp = WLAN_STATUS_SUCCESS; struct sta_info *sta = NULL; int res; u16 fc; - u8 *challenge = NULL; + const u8 *challenge = NULL; u32 session_timeout, acct_interim_interval; int vlan_id = 0; u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN]; @@ -635,7 +637,7 @@ static u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta, static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, - u8 *ies, size_t ies_len, int reassoc) + const u8 *ies, size_t ies_len, int reassoc) { struct ieee802_11_elems elems; u16 resp; @@ -821,7 +823,7 @@ static void send_deauth(struct hostapd_data *hapd, const u8 *addr, static void send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, - u16 status_code, int reassoc, u8 *ies, + u16 status_code, int reassoc, const u8 *ies, size_t ies_len) { int send_len; @@ -882,11 +884,12 @@ static void send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, static void handle_assoc(struct hostapd_data *hapd, - struct ieee80211_mgmt *mgmt, size_t len, int reassoc) + const struct ieee80211_mgmt *mgmt, size_t len, + int reassoc) { u16 capab_info, listen_interval; u16 resp = WLAN_STATUS_SUCCESS; - u8 *pos; + const u8 *pos; int left, i; struct sta_info *sta; @@ -1139,7 +1142,7 @@ static void handle_deauth(struct hostapd_data *hapd, static void handle_beacon(struct hostapd_data *hapd, - struct ieee80211_mgmt *mgmt, size_t len, + const struct ieee80211_mgmt *mgmt, size_t len, struct hostapd_frame_info *fi) { struct ieee802_11_elems elems; @@ -1190,10 +1193,11 @@ void ieee802_11_send_sa_query_req(struct hostapd_data *hapd, static void hostapd_sa_query_action(struct hostapd_data *hapd, - struct ieee80211_mgmt *mgmt, size_t len) + const struct ieee80211_mgmt *mgmt, + size_t len) { struct sta_info *sta; - u8 *end; + const u8 *end; int i; end = mgmt->u.action.u.sa_query_resp.trans_id + @@ -1255,7 +1259,7 @@ static int robust_action_frame(u8 category) static void handle_action(struct hostapd_data *hapd, - struct ieee80211_mgmt *mgmt, size_t len) + const struct ieee80211_mgmt *mgmt, size_t len) { struct sta_info *sta; @@ -1315,6 +1319,8 @@ static void handle_action(struct hostapd_data *hapd, mgmt->u.action.category); if (!(mgmt->da[0] & 0x01) && !(mgmt->u.action.category & 0x80) && !(mgmt->sa[0] & 0x01)) { + struct ieee80211_mgmt *resp; + /* * IEEE 802.11-REVma/D9.0 - 7.3.1.11 * Return the Action frame to the source without change @@ -1322,12 +1328,17 @@ static void handle_action(struct hostapd_data *hapd, */ wpa_printf(MSG_DEBUG, "IEEE 802.11: Return unknown Action " "frame back to sender"); - os_memcpy(mgmt->da, mgmt->sa, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); - mgmt->u.action.category |= 0x80; + resp = os_malloc(len); + if (resp == NULL) + return; + os_memcpy(resp, mgmt, len); + os_memcpy(resp->da, resp->sa, ETH_ALEN); + os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN); + os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN); + resp->u.action.category |= 0x80; - hostapd_send_mgmt_frame(hapd, mgmt, len); + hostapd_send_mgmt_frame(hapd, resp, len); + os_free(resp); } } @@ -1345,7 +1356,7 @@ static void handle_action(struct hostapd_data *hapd, * addition, it can be called to re-inserted pending frames (e.g., when using * external RADIUS server as an MAC ACL). */ -void ieee802_11_mgmt(struct hostapd_data *hapd, u8 *buf, size_t len, +void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, struct hostapd_frame_info *fi) { struct ieee80211_mgmt *mgmt; diff --git a/hostapd/ieee802_11.h b/hostapd/ieee802_11.h index 93a2a50a4..95c99b2d3 100644 --- a/hostapd/ieee802_11.h +++ b/hostapd/ieee802_11.h @@ -23,8 +23,9 @@ struct hostapd_data; struct sta_info; struct hostapd_frame_info; -void ieee802_11_send_deauth(struct hostapd_data *hapd, u8 *addr, u16 reason); -void ieee802_11_mgmt(struct hostapd_data *hapd, u8 *buf, size_t len, +void ieee802_11_send_deauth(struct hostapd_data *hapd, const u8 *addr, + u16 reason); +void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, struct hostapd_frame_info *fi); void ieee802_11_mgmt_cb(struct hostapd_data *hapd, const u8 *buf, size_t len, u16 stype, int ok); diff --git a/hostapd/wme.c b/hostapd/wme.c index 8e17a4170..f539e9896 100644 --- a/hostapd/wme.c +++ b/hostapd/wme.c @@ -223,13 +223,13 @@ int wmm_process_tspec(struct wmm_tspec_element *tspec) static void wmm_addts_req(struct hostapd_data *hapd, - struct ieee80211_mgmt *mgmt, + const struct ieee80211_mgmt *mgmt, struct wmm_tspec_element *tspec, size_t len) { - u8 *end = ((u8 *) mgmt) + len; + const u8 *end = ((const u8 *) mgmt) + len; int res; - if ((u8 *) (tspec + 1) > end) { + if ((const u8 *) (tspec + 1) > end) { wpa_printf(MSG_DEBUG, "WMM: TSPEC overflow in ADDTS Request"); return; } @@ -247,12 +247,12 @@ static void wmm_addts_req(struct hostapd_data *hapd, } -void hostapd_wmm_action(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, - size_t len) +void hostapd_wmm_action(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len) { int action_code; int left = len - IEEE80211_HDRLEN - 4; - u8 *pos = ((u8 *) mgmt) + IEEE80211_HDRLEN + 4; + const u8 *pos = ((const u8 *) mgmt) + IEEE80211_HDRLEN + 4; struct ieee802_11_elems elems; struct sta_info *sta = ap_get_sta(hapd, mgmt->sa); diff --git a/hostapd/wme.h b/hostapd/wme.h index 8fd2b7c00..fbaf8adc5 100644 --- a/hostapd/wme.h +++ b/hostapd/wme.h @@ -21,8 +21,8 @@ struct ieee80211_mgmt; u8 * hostapd_eid_wmm(struct hostapd_data *hapd, u8 *eid); int hostapd_eid_wmm_valid(struct hostapd_data *hapd, const u8 *eid, size_t len); -void hostapd_wmm_action(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, - size_t len); +void hostapd_wmm_action(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len); int wmm_process_tspec(struct wmm_tspec_element *tspec); #endif /* WME_H */ diff --git a/src/drivers/driver.h b/src/drivers/driver.h index c6dbcb286..7fa4ed2a0 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1942,7 +1942,7 @@ union wpa_event_data { * struct rx_mgmt - Data for EVENT_RX_MGMT events */ struct rx_mgmt { - u8 *frame; + const u8 *frame; size_t frame_len; struct hostapd_frame_info *fi; } rx_mgmt; diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 2e0882a57..9dbe719a3 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -501,7 +501,7 @@ void ap_rx_from_unknown_sta(void *ctx, const struct ieee80211_hdr *hdr, } -void ap_mgmt_rx(void *ctx, u8 *buf, size_t len, +void ap_mgmt_rx(void *ctx, const u8 *buf, size_t len, struct hostapd_frame_info *fi) { #ifdef NEED_AP_MLME diff --git a/wpa_supplicant/ap.h b/wpa_supplicant/ap.h index 487de45af..a1975d789 100644 --- a/wpa_supplicant/ap.h +++ b/wpa_supplicant/ap.h @@ -36,7 +36,7 @@ void ap_tx_status(void *ctx, const u8 *addr, const u8 *buf, size_t len, int ack); void ap_rx_from_unknown_sta(void *ctx, const struct ieee80211_hdr *hdr, size_t len); -void ap_mgmt_rx(void *ctx, u8 *buf, size_t len, +void ap_mgmt_rx(void *ctx, const u8 *buf, size_t len, struct hostapd_frame_info *fi); void ap_mgmt_tx_cb(void *ctx, const u8 *buf, size_t len, u16 stype, int ok);