📄 driver_test.c
字号:
return 0;}static const u8 * wpa_driver_test_get_mac_addr(void *priv){ struct wpa_driver_test_data *drv = priv; wpa_printf(MSG_DEBUG, "%s", __func__); return drv->own_addr;}static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto, const u8 *data, size_t data_len){ struct wpa_driver_test_data *drv = priv; char *msg; size_t msg_len; struct l2_ethhdr eth; struct sockaddr *addr; socklen_t alen;#ifdef DRIVER_TEST_UNIX struct sockaddr_un addr_un;#endif /* DRIVER_TEST_UNIX */ wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len); os_memset(ð, 0, sizeof(eth)); os_memcpy(eth.h_dest, dest, ETH_ALEN); os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN); eth.h_proto = host_to_be16(proto); msg_len = 6 + sizeof(eth) + data_len; msg = os_malloc(msg_len); if (msg == NULL) return -1; os_memcpy(msg, "EAPOL ", 6); os_memcpy(msg + 6, ð, sizeof(eth)); os_memcpy(msg + 6 + sizeof(eth), data, data_len); if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 || drv->test_dir == NULL) { if (drv->hostapd_addr_udp_set) { addr = (struct sockaddr *) &drv->hostapd_addr_udp; alen = sizeof(drv->hostapd_addr_udp); } else {#ifdef DRIVER_TEST_UNIX addr = (struct sockaddr *) &drv->hostapd_addr; alen = sizeof(drv->hostapd_addr);#else /* DRIVER_TEST_UNIX */ os_free(msg); return -1;#endif /* DRIVER_TEST_UNIX */ } } else {#ifdef DRIVER_TEST_UNIX struct stat st; os_memset(&addr_un, 0, sizeof(addr_un)); addr_un.sun_family = AF_UNIX; os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path), "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest)); if (stat(addr_un.sun_path, &st) < 0) { os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path), "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest)); } addr = (struct sockaddr *) &addr_un; alen = sizeof(addr_un);#else /* DRIVER_TEST_UNIX */ os_free(msg); return -1;#endif /* DRIVER_TEST_UNIX */ } if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) { perror("sendmsg(test_socket)"); os_free(msg); return -1; } os_free(msg); return 0;}static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa){ struct wpa_driver_test_data *drv = priv; os_memset(capa, 0, sizeof(*capa)); capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA | WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK | WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE | WPA_DRIVER_CAPA_KEY_MGMT_FT | WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK; capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 | WPA_DRIVER_CAPA_ENC_WEP104 | WPA_DRIVER_CAPA_ENC_TKIP | WPA_DRIVER_CAPA_ENC_CCMP; capa->auth = WPA_DRIVER_AUTH_OPEN | WPA_DRIVER_AUTH_SHARED | WPA_DRIVER_AUTH_LEAP; if (drv->use_mlme) capa->flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME; return 0;}static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr, int protect_type, int key_type){ wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d", __func__, protect_type, key_type); if (addr) { wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr)); } return 0;}#ifdef CONFIG_CLIENT_MLMEstatic struct wpa_hw_modes *wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags){ struct wpa_hw_modes *modes; *num_modes = 1; *flags = 0; modes = os_zalloc(*num_modes * sizeof(struct wpa_hw_modes)); if (modes == NULL) return NULL; modes[0].mode = WPA_MODE_IEEE80211G; modes[0].num_channels = 1; modes[0].num_rates = 1; modes[0].channels = os_zalloc(sizeof(struct wpa_channel_data)); modes[0].rates = os_zalloc(sizeof(struct wpa_rate_data)); if (modes[0].channels == NULL || modes[0].rates == NULL) { wpa_supplicant_sta_free_hw_features(modes, *num_modes); return NULL; } modes[0].channels[0].chan = 1; modes[0].channels[0].freq = 2412; modes[0].channels[0].flag = WPA_CHAN_W_SCAN | WPA_CHAN_W_ACTIVE_SCAN; modes[0].rates[0].rate = 10; modes[0].rates[0].flags = WPA_RATE_BASIC | WPA_RATE_SUPPORTED | WPA_RATE_CCK | WPA_RATE_MANDATORY; return modes;}static int wpa_driver_test_set_channel(void *priv, wpa_hw_mode phymode, int chan, int freq){ wpa_printf(MSG_DEBUG, "%s: phymode=%d chan=%d freq=%d", __func__, phymode, chan, freq); return 0;}static int wpa_driver_test_send_mlme(void *priv, const u8 *data, size_t data_len){ struct wpa_driver_test_data *drv = priv; struct msghdr msg; struct iovec io[2]; struct sockaddr_un addr; const u8 *dest; struct dirent *dent; DIR *dir; wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len); if (data_len < 10) return -1; dest = data + 4; io[0].iov_base = "MLME "; io[0].iov_len = 5; io[1].iov_base = (u8 *) data; io[1].iov_len = data_len; os_memset(&msg, 0, sizeof(msg)); msg.msg_iov = io; msg.msg_iovlen = 2; if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 || drv->test_dir == NULL) { if (drv->hostapd_addr_udp_set) { msg.msg_name = &drv->hostapd_addr_udp; msg.msg_namelen = sizeof(drv->hostapd_addr_udp); } else {#ifdef DRIVER_TEST_UNIX msg.msg_name = &drv->hostapd_addr; msg.msg_namelen = sizeof(drv->hostapd_addr);#endif /* DRIVER_TEST_UNIX */ } } else if (os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0) { dir = opendir(drv->test_dir); if (dir == NULL) return -1; while ((dent = readdir(dir))) {#ifdef _DIRENT_HAVE_D_TYPE /* Skip the file if it is not a socket. * Also accept DT_UNKNOWN (0) in case * the C library or underlying file * system does not support d_type. */ if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN) continue;#endif /* _DIRENT_HAVE_D_TYPE */ if (os_strcmp(dent->d_name, ".") == 0 || os_strcmp(dent->d_name, "..") == 0) continue; wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s", __func__, dent->d_name); os_memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", drv->test_dir, dent->d_name); msg.msg_name = &addr; msg.msg_namelen = sizeof(addr); if (sendmsg(drv->test_socket, &msg, 0) < 0) perror("sendmsg(test_socket)"); } closedir(dir); return 0; } else { struct stat st; os_memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest)); if (stat(addr.sun_path, &st) < 0) { os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest)); } msg.msg_name = &addr; msg.msg_namelen = sizeof(addr); } if (sendmsg(drv->test_socket, &msg, 0) < 0) { perror("sendmsg(test_socket)"); return -1; } return 0;}static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr, const u8 *supp_rates, size_t supp_rates_len){ wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr)); return 0;}static int wpa_driver_test_mlme_remove_sta(void *priv, const u8 *addr){ wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr)); return 0;}static int wpa_driver_test_set_ssid(void *priv, const u8 *ssid, size_t ssid_len){ wpa_printf(MSG_DEBUG, "%s", __func__); return 0;}static int wpa_driver_test_set_bssid(void *priv, const u8 *bssid){ wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid)); return 0;}#endif /* CONFIG_CLIENT_MLME */static int wpa_driver_test_set_probe_req_ie(void *priv, const u8 *ies, size_t ies_len){ struct wpa_driver_test_data *drv = priv; os_free(drv->probe_req_ie); if (ies) { drv->probe_req_ie = os_malloc(ies_len); if (drv->probe_req_ie == NULL) { drv->probe_req_ie_len = 0; return -1; } os_memcpy(drv->probe_req_ie, ies, ies_len); drv->probe_req_ie_len = ies_len; } else { drv->probe_req_ie = NULL; drv->probe_req_ie_len = 0; } return 0;}static void * wpa_driver_test_global_init(void){ struct wpa_driver_test_global *global; global = os_zalloc(sizeof(*global)); return global;}static void wpa_driver_test_global_deinit(void *priv){ struct wpa_driver_test_global *global = priv; os_free(global);}static struct wpa_interface_info *wpa_driver_test_get_interfaces(void *global_priv){ /* struct wpa_driver_test_global *global = priv; */ struct wpa_interface_info *iface; iface = os_zalloc(sizeof(*iface)); if (iface == NULL) return iface; iface->ifname = os_strdup("sta0"); iface->desc = os_strdup("test interface 0"); iface->drv_name = "test"; iface->next = os_zalloc(sizeof(*iface)); if (iface->next) { iface->next->ifname = os_strdup("sta1"); iface->next->desc = os_strdup("test interface 1"); iface->next->drv_name = "test"; } return iface;}const struct wpa_driver_ops wpa_driver_test_ops = { "test", "wpa_supplicant test driver", wpa_driver_test_get_bssid, wpa_driver_test_get_ssid, wpa_driver_test_set_wpa, wpa_driver_test_set_key, NULL /* init */, wpa_driver_test_deinit, wpa_driver_test_set_param, NULL /* set_countermeasures */, NULL /* set_drop_unencrypted */, wpa_driver_test_scan, NULL /* get_scan_results */, wpa_driver_test_deauthenticate, wpa_driver_test_disassociate, wpa_driver_test_associate, NULL /* set_auth_alg */, NULL /* add_pmkid */, NULL /* remove_pmkid */, NULL /* flush_pmkid */, wpa_driver_test_get_capa, NULL /* poll */, NULL /* get_ifname */, wpa_driver_test_get_mac_addr, wpa_driver_test_send_eapol, NULL /* set_operstate */, wpa_driver_test_mlme_setprotection,#ifdef CONFIG_CLIENT_MLME wpa_driver_test_get_hw_feature_data, wpa_driver_test_set_channel, wpa_driver_test_set_ssid, wpa_driver_test_set_bssid, wpa_driver_test_send_mlme, wpa_driver_test_mlme_add_sta, wpa_driver_test_mlme_remove_sta,#else /* CONFIG_CLIENT_MLME */ NULL /* get_hw_feature_data */, NULL /* set_channel */, NULL /* set_ssid */, NULL /* set_bssid */, NULL /* send_mlme */, NULL /* mlme_add_sta */, NULL /* mlme_remove_sta */,#endif /* CONFIG_CLIENT_MLME */ NULL /* update_ft_ies */, NULL /* send_ft_action */, wpa_driver_test_get_scan_results2, wpa_driver_test_set_probe_req_ie, NULL /* set_mode */, NULL /* set_country */, wpa_driver_test_global_init, wpa_driver_test_global_deinit, wpa_driver_test_init2, wpa_driver_test_get_interfaces};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -