X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/7f0233431a2bff01eaf82407134ea76a209cda9d..bb14a2f07c5b50fac48f91e68bb692ed7e0f1304:/package/hostapd/patches/350-hostap_multicall_fix.patch diff --git a/package/hostapd/patches/350-hostap_multicall_fix.patch b/package/hostapd/patches/350-hostap_multicall_fix.patch index 016ed0cca..20c50605d 100644 --- a/package/hostapd/patches/350-hostap_multicall_fix.patch +++ b/package/hostapd/patches/350-hostap_multicall_fix.patch @@ -40,7 +40,7 @@ static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param, int len); static int hostap_set_iface_flags(void *priv, int dev_up); -@@ -399,65 +404,6 @@ static int hostapd_ioctl(void *priv, str +@@ -400,65 +405,6 @@ static int hostapd_ioctl(void *priv, str } @@ -106,7 +106,7 @@ static int hostap_get_seqnum(const char *ifname, void *priv, const u8 *addr, int idx, u8 *seq) { -@@ -1125,21 +1071,14 @@ static struct hostapd_hw_modes * hostap_ +@@ -1126,21 +1072,9 @@ static struct hostapd_hw_modes * hostap_ return mode; } @@ -119,28 +119,32 @@ - int sock; - int current_mode; /* infra/adhoc */ -}; +- +- +-static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg); +- +#endif /* HOSTAPD */ -+#if !defined(NO_SUPPLICANT) - - static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg); - - -static int hostapd_ioctl(struct wpa_driver_hostap_data *drv, +static int wpa_hostapd_ioctl(struct hostap_driver_data *drv, struct prism2_hostapd_param *param, int len, int show_err) { -@@ -1161,7 +1100,7 @@ static int hostapd_ioctl(struct wpa_driv +@@ -1162,7 +1096,12 @@ static int hostapd_ioctl(struct wpa_driv } -static int wpa_driver_hostap_set_wpa_ie(struct wpa_driver_hostap_data *drv, ++#if !defined(NO_SUPPLICANT) ++ ++static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg); ++ ++ +static int wpa_driver_hostap_set_wpa_ie(struct hostap_driver_data *drv, const u8 *wpa_ie, size_t wpa_ie_len) { struct prism2_hostapd_param *param; -@@ -1177,7 +1116,7 @@ static int wpa_driver_hostap_set_wpa_ie( +@@ -1178,7 +1117,7 @@ static int wpa_driver_hostap_set_wpa_ie( param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT; param->u.generic_elem.len = wpa_ie_len; os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len); @@ -149,7 +153,7 @@ os_free(param); -@@ -1185,7 +1124,7 @@ static int wpa_driver_hostap_set_wpa_ie( +@@ -1186,7 +1125,7 @@ static int wpa_driver_hostap_set_wpa_ie( } @@ -158,7 +162,7 @@ int value) { struct iwreq iwr; -@@ -1207,7 +1146,7 @@ static int prism2param(struct wpa_driver +@@ -1208,7 +1147,7 @@ static int prism2param(struct wpa_driver static int wpa_driver_hostap_set_wpa(void *priv, int enabled) { @@ -167,41 +171,120 @@ int ret = 0; wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); -@@ -1260,7 +1199,7 @@ static int wpa_driver_hostap_set_key(con - const u8 *seq, size_t seq_len, - const u8 *key, size_t key_len) - { +@@ -1224,125 +1163,15 @@ static int wpa_driver_hostap_set_wpa(voi + } + + +-static void show_set_key_error(struct prism2_hostapd_param *param) +-{ +- switch (param->u.crypt.err) { +- case HOSTAP_CRYPT_ERR_UNKNOWN_ALG: +- wpa_printf(MSG_INFO, "Unknown algorithm '%s'.", +- param->u.crypt.alg); +- wpa_printf(MSG_INFO, "You may need to load kernel module to " +- "register that algorithm."); +- wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for " +- "WEP."); +- break; +- case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR: +- wpa_printf(MSG_INFO, "Unknown address " MACSTR ".", +- MAC2STR(param->sta_addr)); +- break; +- case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED: +- wpa_printf(MSG_INFO, "Crypt algorithm initialization failed."); +- break; +- case HOSTAP_CRYPT_ERR_KEY_SET_FAILED: +- wpa_printf(MSG_INFO, "Key setting failed."); +- break; +- case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED: +- wpa_printf(MSG_INFO, "TX key index setting failed."); +- break; +- case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED: +- wpa_printf(MSG_INFO, "Card configuration failed."); +- break; +- } +-} +- +- +-static int wpa_driver_hostap_set_key(const char *ifname, void *priv, +- enum wpa_alg alg, const u8 *addr, +- int key_idx, int set_tx, +- const u8 *seq, size_t seq_len, +- const u8 *key, size_t key_len) +-{ - struct wpa_driver_hostap_data *drv = priv; -+ struct hostap_driver_data *drv = priv; - struct prism2_hostapd_param *param; - u8 *buf; - size_t blen; -@@ -1305,14 +1244,10 @@ static int wpa_driver_hostap_set_key(con - * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported). - * This should be fine for more or less all cases, but for completeness - * sake, the driver could be enhanced to support the missing key. */ +- struct prism2_hostapd_param *param; +- u8 *buf; +- size_t blen; +- int ret = 0; +- char *alg_name; +- +- switch (alg) { +- case WPA_ALG_NONE: +- alg_name = "none"; +- break; +- case WPA_ALG_WEP: +- alg_name = "WEP"; +- break; +- case WPA_ALG_TKIP: +- alg_name = "TKIP"; +- break; +- case WPA_ALG_CCMP: +- alg_name = "CCMP"; +- break; +- default: +- return -1; +- } +- +- wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu " +- "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx, +- (unsigned long) seq_len, (unsigned long) key_len); +- +- if (seq_len > 8) +- return -2; +- +- blen = sizeof(*param) + key_len; +- buf = os_zalloc(blen); +- if (buf == NULL) +- return -1; +- +- param = (struct prism2_hostapd_param *) buf; +- param->cmd = PRISM2_SET_ENCRYPTION; +- /* TODO: In theory, STA in client mode can use five keys; four default +- * keys for receiving (with keyidx 0..3) and one individual key for +- * both transmitting and receiving (keyidx 0) _unicast_ packets. Now, +- * keyidx 0 is reserved for this unicast use and default keys can only +- * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported). +- * This should be fine for more or less all cases, but for completeness +- * sake, the driver could be enhanced to support the missing key. */ -#if 0 - if (addr == NULL) - os_memset(param->sta_addr, 0xff, ETH_ALEN); - else - os_memcpy(param->sta_addr, addr, ETH_ALEN); +- if (addr == NULL) +- os_memset(param->sta_addr, 0xff, ETH_ALEN); +- else +- os_memcpy(param->sta_addr, addr, ETH_ALEN); -#else - os_memset(param->sta_addr, 0xff, ETH_ALEN); -#endif - os_strlcpy((char *) param->u.crypt.alg, alg_name, - HOSTAP_CRYPT_ALG_NAME_LEN); - param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0; -@@ -1322,7 +1257,7 @@ static int wpa_driver_hostap_set_key(con - param->u.crypt.key_len = key_len; - os_memcpy((u8 *) (param + 1), key, key_len); - +- os_strlcpy((char *) param->u.crypt.alg, alg_name, +- HOSTAP_CRYPT_ALG_NAME_LEN); +- param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0; +- param->u.crypt.idx = key_idx; +- if (seq) +- os_memcpy(param->u.crypt.seq, seq, seq_len); +- param->u.crypt.key_len = key_len; +- os_memcpy((u8 *) (param + 1), key, key_len); +- - if (hostapd_ioctl(drv, param, blen, 1)) { -+ if (wpa_hostapd_ioctl(drv, param, blen, 1)) { - wpa_printf(MSG_WARNING, "Failed to set encryption."); - show_set_key_error(param); - ret = -1; -@@ -1335,13 +1270,13 @@ static int wpa_driver_hostap_set_key(con - +- wpa_printf(MSG_WARNING, "Failed to set encryption."); +- show_set_key_error(param); +- ret = -1; +- } +- os_free(buf); +- +- return ret; +-} +- +- static int wpa_driver_hostap_set_countermeasures(void *priv, int enabled) { - struct wpa_driver_hostap_data *drv = priv; @@ -216,7 +299,7 @@ int type) { struct iwreq iwr; -@@ -1362,7 +1297,7 @@ static int wpa_driver_hostap_reset(struc +@@ -1363,7 +1192,7 @@ static int wpa_driver_hostap_reset(struc } @@ -225,7 +308,7 @@ const u8 *addr, int cmd, int reason_code) { struct prism2_hostapd_param param; -@@ -1377,7 +1312,7 @@ static int wpa_driver_hostap_mlme(struct +@@ -1378,7 +1207,7 @@ static int wpa_driver_hostap_mlme(struct os_memcpy(param.sta_addr, addr, ETH_ALEN); param.u.mlme.cmd = cmd; param.u.mlme.reason_code = reason_code; @@ -234,7 +317,7 @@ if (ret == 0) { os_sleep(0, 100000); ret = wpa_driver_hostap_reset(drv, 2); -@@ -1389,7 +1324,7 @@ static int wpa_driver_hostap_mlme(struct +@@ -1390,7 +1219,7 @@ static int wpa_driver_hostap_mlme(struct static int wpa_driver_hostap_deauthenticate(void *priv, const u8 *addr, int reason_code) { @@ -243,7 +326,7 @@ wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DEAUTH, reason_code); -@@ -1399,7 +1334,7 @@ static int wpa_driver_hostap_deauthentic +@@ -1400,7 +1229,7 @@ static int wpa_driver_hostap_deauthentic static int wpa_driver_hostap_disassociate(void *priv, const u8 *addr, int reason_code) { @@ -252,7 +335,7 @@ wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DISASSOC, reason_code); -@@ -1410,7 +1345,7 @@ static int +@@ -1411,7 +1240,7 @@ static int wpa_driver_hostap_associate(void *priv, struct wpa_driver_associate_params *params) { @@ -261,7 +344,7 @@ int ret = 0; int allow_unencrypted_eapol; -@@ -1474,7 +1409,7 @@ wpa_driver_hostap_associate(void *priv, +@@ -1475,7 +1304,7 @@ wpa_driver_hostap_associate(void *priv, static int wpa_driver_hostap_scan(void *priv, struct wpa_driver_scan_params *params) { @@ -270,7 +353,7 @@ struct prism2_hostapd_param param; int ret; const u8 *ssid = params->ssids[0].ssid; -@@ -1495,7 +1430,7 @@ static int wpa_driver_hostap_scan(void * +@@ -1496,7 +1325,7 @@ static int wpa_driver_hostap_scan(void * param.cmd = PRISM2_HOSTAPD_SCAN_REQ; param.u.scan_req.ssid_len = ssid_len; os_memcpy(param.u.scan_req.ssid, ssid, ssid_len); @@ -279,7 +362,7 @@ /* Not all drivers generate "scan completed" wireless event, so try to * read results after a timeout. */ -@@ -1510,7 +1445,7 @@ static int wpa_driver_hostap_scan(void * +@@ -1511,7 +1340,7 @@ static int wpa_driver_hostap_scan(void * static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg) { @@ -288,7 +371,7 @@ int algs = 0; if (auth_alg & WPA_AUTH_ALG_OPEN) -@@ -1528,35 +1463,35 @@ static int wpa_driver_hostap_set_auth_al +@@ -1529,35 +1358,35 @@ static int wpa_driver_hostap_set_auth_al static int wpa_driver_hostap_get_bssid(void *priv, u8 *bssid) { @@ -329,7 +412,7 @@ drv = os_zalloc(sizeof(*drv)); if (drv == NULL) -@@ -1596,14 +1531,14 @@ static void * wpa_driver_hostap_init(voi +@@ -1597,14 +1426,120 @@ static void * wpa_driver_hostap_init(voi static void wpa_driver_hostap_deinit(void *priv) { @@ -343,10 +426,116 @@ -#endif /* HOSTAPD */ +#endif ++ ++ ++static void show_set_key_error(struct prism2_hostapd_param *param) ++{ ++ switch (param->u.crypt.err) { ++ case HOSTAP_CRYPT_ERR_UNKNOWN_ALG: ++ wpa_printf(MSG_INFO, "Unknown algorithm '%s'.", ++ param->u.crypt.alg); ++ wpa_printf(MSG_INFO, "You may need to load kernel module to " ++ "register that algorithm."); ++ wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for " ++ "WEP."); ++ break; ++ case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR: ++ wpa_printf(MSG_INFO, "Unknown address " MACSTR ".", ++ MAC2STR(param->sta_addr)); ++ break; ++ case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED: ++ wpa_printf(MSG_INFO, "Crypt algorithm initialization failed."); ++ break; ++ case HOSTAP_CRYPT_ERR_KEY_SET_FAILED: ++ wpa_printf(MSG_INFO, "Key setting failed."); ++ break; ++ case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED: ++ wpa_printf(MSG_INFO, "TX key index setting failed."); ++ break; ++ case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED: ++ wpa_printf(MSG_INFO, "Card configuration failed."); ++ break; ++ } ++} ++ ++ ++static int wpa_driver_hostap_set_key(const char *ifname, void *priv, ++ enum wpa_alg alg, const u8 *addr, ++ int key_idx, int set_tx, ++ const u8 *seq, size_t seq_len, ++ const u8 *key, size_t key_len) ++{ ++ struct hostap_driver_data *drv = priv; ++ struct prism2_hostapd_param *param; ++ u8 *buf; ++ size_t blen; ++ int ret = 0; ++ char *alg_name; ++ ++ switch (alg) { ++ case WPA_ALG_NONE: ++ alg_name = "none"; ++ break; ++ case WPA_ALG_WEP: ++ alg_name = "WEP"; ++ break; ++ case WPA_ALG_TKIP: ++ alg_name = "TKIP"; ++ break; ++ case WPA_ALG_CCMP: ++ alg_name = "CCMP"; ++ break; ++ default: ++ return -1; ++ } ++ ++ wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu " ++ "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx, ++ (unsigned long) seq_len, (unsigned long) key_len); ++ ++ if (seq_len > 8) ++ return -2; ++ ++ blen = sizeof(*param) + key_len; ++ buf = os_zalloc(blen); ++ if (buf == NULL) ++ return -1; ++ ++ param = (struct prism2_hostapd_param *) buf; ++ param->cmd = PRISM2_SET_ENCRYPTION; ++ /* TODO: In theory, STA in client mode can use five keys; four default ++ * keys for receiving (with keyidx 0..3) and one individual key for ++ * both transmitting and receiving (keyidx 0) _unicast_ packets. Now, ++ * keyidx 0 is reserved for this unicast use and default keys can only ++ * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported). ++ * This should be fine for more or less all cases, but for completeness ++ * sake, the driver could be enhanced to support the missing key. */ ++ if (addr == NULL) ++ os_memset(param->sta_addr, 0xff, ETH_ALEN); ++ else ++ os_memcpy(param->sta_addr, addr, ETH_ALEN); ++ os_strlcpy((char *) param->u.crypt.alg, alg_name, ++ HOSTAP_CRYPT_ALG_NAME_LEN); ++ param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0; ++ param->u.crypt.idx = key_idx; ++ if (seq) ++ os_memcpy(param->u.crypt.seq, seq, seq_len); ++ param->u.crypt.key_len = key_len; ++ os_memcpy((u8 *) (param + 1), key, key_len); ++ ++ if (wpa_hostapd_ioctl(drv, param, blen, 1)) { ++ wpa_printf(MSG_WARNING, "Failed to set encryption."); ++ show_set_key_error(param); ++ ret = -1; ++ } ++ os_free(buf); ++ ++ return ret; ++} const struct wpa_driver_ops wpa_driver_hostap_ops = { -@@ -1631,7 +1566,8 @@ const struct wpa_driver_ops wpa_driver_h +@@ -1632,7 +1567,8 @@ const struct wpa_driver_ops wpa_driver_h .sta_clear_stats = hostap_sta_clear_stats, .get_hw_feature_data = hostap_get_hw_feature_data, .set_ap_wps_ie = hostap_set_ap_wps_ie, @@ -356,7 +545,7 @@ .get_bssid = wpa_driver_hostap_get_bssid, .get_ssid = wpa_driver_hostap_get_ssid, .set_countermeasures = wpa_driver_hostap_set_countermeasures, -@@ -1643,5 +1579,5 @@ const struct wpa_driver_ops wpa_driver_h +@@ -1644,5 +1580,5 @@ const struct wpa_driver_ops wpa_driver_h .init = wpa_driver_hostap_init, .deinit = wpa_driver_hostap_deinit, .set_operstate = wpa_driver_hostap_set_operstate,