📄 driver_test.c
字号:
break; cli = cli->next; } if (!cli) return -1; return sendto(drv->test_socket, "DISASSOC", 8, 0, (struct sockaddr *) &cli->un, cli->unlen);}static struct hostapd_hw_modes *test_driver_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags){ struct hostapd_hw_modes *modes; *num_modes = 3; *flags = 0; modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes)); if (modes == NULL) return NULL; modes[0].mode = HOSTAPD_MODE_IEEE80211G; modes[0].num_channels = 1; modes[0].num_rates = 1; modes[0].channels = os_zalloc(sizeof(struct hostapd_channel_data)); modes[0].rates = os_zalloc(sizeof(struct hostapd_rate_data)); if (modes[0].channels == NULL || modes[0].rates == NULL) { hostapd_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 = 0; modes[0].rates[0].rate = 10; modes[0].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED | HOSTAPD_RATE_CCK | HOSTAPD_RATE_MANDATORY; modes[1].mode = HOSTAPD_MODE_IEEE80211B; modes[1].num_channels = 1; modes[1].num_rates = 1; modes[1].channels = os_zalloc(sizeof(struct hostapd_channel_data)); modes[1].rates = os_zalloc(sizeof(struct hostapd_rate_data)); if (modes[1].channels == NULL || modes[1].rates == NULL) { hostapd_free_hw_features(modes, *num_modes); return NULL; } modes[1].channels[0].chan = 1; modes[1].channels[0].freq = 2412; modes[1].channels[0].flag = 0; modes[1].rates[0].rate = 10; modes[1].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED | HOSTAPD_RATE_CCK | HOSTAPD_RATE_MANDATORY; modes[2].mode = HOSTAPD_MODE_IEEE80211A; modes[2].num_channels = 1; modes[2].num_rates = 1; modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data)); modes[2].rates = os_zalloc(sizeof(struct hostapd_rate_data)); if (modes[2].channels == NULL || modes[2].rates == NULL) { hostapd_free_hw_features(modes, *num_modes); return NULL; } modes[2].channels[0].chan = 60; modes[2].channels[0].freq = 5300; modes[2].channels[0].flag = 0; modes[2].rates[0].rate = 60; modes[2].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED | HOSTAPD_RATE_MANDATORY; return modes;}static int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid){ struct test_driver_data *drv = priv; struct test_driver_bss *bss; wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")", __func__, ifname, MAC2STR(bssid)); bss = os_zalloc(sizeof(*bss)); if (bss == NULL) return -1; os_strlcpy(bss->ifname, ifname, IFNAMSIZ); memcpy(bss->bssid, bssid, ETH_ALEN); bss->next = drv->bss; drv->bss = bss; return 0;}static int test_driver_bss_remove(void *priv, const char *ifname){ struct test_driver_data *drv = priv; struct test_driver_bss *bss, *prev; struct test_client_socket *cli, *prev_c; wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname); for (prev = NULL, bss = drv->bss; bss; prev = bss, bss = bss->next) { if (strcmp(bss->ifname, ifname) != 0) continue; if (prev) prev->next = bss->next; else drv->bss = bss->next; for (prev_c = NULL, cli = drv->cli; cli; prev_c = cli, cli = cli->next) { if (cli->bss != bss) continue; if (prev_c) prev_c->next = cli->next; else drv->cli = cli->next; free(cli); break; } test_driver_free_bss(bss); return 0; } return -1;}static int test_driver_if_add(const char *iface, void *priv, enum hostapd_driver_if_type type, char *ifname, const u8 *addr){ wpa_printf(MSG_DEBUG, "%s(iface=%s type=%d ifname=%s)", __func__, iface, type, ifname); return 0;}static int test_driver_if_update(void *priv, enum hostapd_driver_if_type type, char *ifname, const u8 *addr){ wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname); return 0;}static int test_driver_if_remove(void *priv, enum hostapd_driver_if_type type, const char *ifname, const u8 *addr){ wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname); return 0;}static int test_driver_valid_bss_mask(void *priv, const u8 *addr, const u8 *mask){ return 0;}static int test_driver_set_ssid(const char *ifname, void *priv, const u8 *buf, int len){ struct test_driver_data *drv = priv; struct test_driver_bss *bss; wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname); wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len); for (bss = drv->bss; bss; bss = bss->next) { if (strcmp(bss->ifname, ifname) != 0) continue; if (len < 0 || (size_t) len > sizeof(bss->ssid)) return -1; memcpy(bss->ssid, buf, len); bss->ssid_len = len; return 0; } return -1;}static int test_driver_set_privacy(const char *ifname, void *priv, int enabled){ struct test_driver_data *drv = priv; struct test_driver_bss *bss; wpa_printf(MSG_DEBUG, "%s(ifname=%s enabled=%d)", __func__, ifname, enabled); for (bss = drv->bss; bss; bss = bss->next) { if (strcmp(bss->ifname, ifname) != 0) continue; bss->privacy = enabled; return 0; } return -1;}static int test_driver_set_encryption(const char *iface, void *priv, const char *alg, const u8 *addr, int idx, const u8 *key, size_t key_len, int txkey){ wpa_printf(MSG_DEBUG, "%s(iface=%s alg=%s idx=%d txkey=%d)", __func__, iface, alg, idx, txkey); if (addr) wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr)); if (key) wpa_hexdump_key(MSG_DEBUG, " key", key, key_len); return 0;}static int test_driver_set_sta_vlan(void *priv, const u8 *addr, const char *ifname, int vlan_id){ wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)", __func__, MAC2STR(addr), ifname, vlan_id); return 0;}static int test_driver_sta_add(const char *ifname, void *priv, const u8 *addr, u16 aid, u16 capability, u8 *supp_rates, size_t supp_rates_len, int flags, u16 listen_interval){ struct test_driver_data *drv = priv; struct test_client_socket *cli; struct test_driver_bss *bss; wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d " "capability=0x%x flags=0x%x listen_interval=%d)", __func__, ifname, MAC2STR(addr), aid, capability, flags, listen_interval); wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates", supp_rates, supp_rates_len); cli = drv->cli; while (cli) { if (memcmp(cli->addr, addr, ETH_ALEN) == 0) break; cli = cli->next; } if (!cli) { wpa_printf(MSG_DEBUG, "%s: no matching client entry", __func__); return -1; } for (bss = drv->bss; bss; bss = bss->next) { if (strcmp(ifname, bss->ifname) == 0) break; } if (bss == NULL) { wpa_printf(MSG_DEBUG, "%s: No matching interface found from " "configured BSSes", __func__); return -1; } cli->bss = bss; return 0;}static void * test_driver_init(struct hostapd_data *hapd){ struct test_driver_data *drv; struct sockaddr_un addr_un; struct sockaddr_in addr_in; struct sockaddr *addr; socklen_t alen; drv = os_zalloc(sizeof(struct test_driver_data)); if (drv == NULL) { printf("Could not allocate memory for test driver data\n"); return NULL; } drv->bss = os_zalloc(sizeof(*drv->bss)); if (drv->bss == NULL) { printf("Could not allocate memory for test driver BSS data\n"); free(drv); return NULL; } drv->hapd = hapd; /* Generate a MAC address to help testing with multiple APs */ hapd->own_addr[0] = 0x02; /* locally administered */ sha1_prf((const u8 *) hapd->conf->iface, strlen(hapd->conf->iface), "hostapd test bssid generation", (const u8 *) hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len, hapd->own_addr + 1, ETH_ALEN - 1); os_strlcpy(drv->bss->ifname, hapd->conf->iface, IFNAMSIZ); memcpy(drv->bss->bssid, hapd->own_addr, ETH_ALEN); if (hapd->conf->test_socket) { if (strlen(hapd->conf->test_socket) >= sizeof(addr_un.sun_path)) { printf("Too long test_socket path\n"); test_driver_free_priv(drv); return NULL; } if (strncmp(hapd->conf->test_socket, "DIR:", 4) == 0) { size_t len = strlen(hapd->conf->test_socket) + 30; drv->socket_dir = strdup(hapd->conf->test_socket + 4); drv->own_socket_path = malloc(len); if (drv->own_socket_path) { snprintf(drv->own_socket_path, len, "%s/AP-" MACSTR, hapd->conf->test_socket + 4, MAC2STR(hapd->own_addr)); } } else if (strncmp(hapd->conf->test_socket, "UDP:", 4) == 0) { drv->udp_port = atoi(hapd->conf->test_socket + 4); } else { drv->own_socket_path = strdup(hapd->conf->test_socket); } if (drv->own_socket_path == NULL && drv->udp_port == 0) { test_driver_free_priv(drv); return NULL; } drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX, SOCK_DGRAM, 0); if (drv->test_socket < 0) { perror("socket"); test_driver_free_priv(drv); return NULL; } if (drv->udp_port) { os_memset(&addr_in, 0, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(drv->udp_port); addr = (struct sockaddr *) &addr_in; alen = sizeof(addr_in); } else { os_memset(&addr_un, 0, sizeof(addr_un)); addr_un.sun_family = AF_UNIX; os_strlcpy(addr_un.sun_path, drv->own_socket_path, sizeof(addr_un.sun_path)); addr = (struct sockaddr *) &addr_un; alen = sizeof(addr_un); } if (bind(drv->test_socket, addr, alen) < 0) { perror("bind(PF_UNIX)"); close(drv->test_socket); if (drv->own_socket_path) unlink(drv->own_socket_path); test_driver_free_priv(drv); return NULL; } eloop_register_read_sock(drv->test_socket, test_driver_receive_unix, drv, NULL); } else drv->test_socket = -1; return drv;}static void test_driver_deinit(void *priv){ struct test_driver_data *drv = priv; struct test_client_socket *cli, *prev; cli = drv->cli; while (cli) { prev = cli; cli = cli->next; free(prev); } if (drv->test_socket >= 0) { eloop_unregister_read_sock(drv->test_socket); close(drv->test_socket); if (drv->own_socket_path) unlink(drv->own_socket_path); } /* There should be only one BSS remaining at this point. */ if (drv->bss == NULL) wpa_printf(MSG_ERROR, "%s: drv->bss == NULL", __func__); else if (drv->bss->next) wpa_printf(MSG_ERROR, "%s: drv->bss->next != NULL", __func__); test_driver_free_priv(drv);}const struct wpa_driver_ops wpa_driver_test_ops = { .name = "test", .init = test_driver_init, .deinit = test_driver_deinit, .send_eapol = test_driver_send_eapol, .send_mgmt_frame = test_driver_send_mgmt_frame, .set_generic_elem = test_driver_set_generic_elem, .sta_deauth = test_driver_sta_deauth, .sta_disassoc = test_driver_sta_disassoc, .get_hw_feature_data = test_driver_get_hw_feature_data, .bss_add = test_driver_bss_add, .bss_remove = test_driver_bss_remove, .if_add = test_driver_if_add, .if_update = test_driver_if_update, .if_remove = test_driver_if_remove, .valid_bss_mask = test_driver_valid_bss_mask, .set_ssid = test_driver_set_ssid, .set_privacy = test_driver_set_privacy, .set_encryption = test_driver_set_encryption, .set_sta_vlan = test_driver_set_sta_vlan, .sta_add = test_driver_sta_add, .send_ether = test_driver_send_ether, .set_wps_beacon_ie = test_driver_set_wps_beacon_ie, .set_wps_probe_resp_ie = test_driver_set_wps_probe_resp_ie,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -