⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver_test.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -