driver_test.c

来自「WPA在Linux下实现的原代码 WPA在Linux下实现的原代码」· C语言 代码 · 共 603 行 · 第 1/2 页

C
603
字号
/* * WPA Supplicant - testing driver interface * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include "common.h"#include "driver.h"#include "wpa_supplicant.h"#include "l2_packet.h"#include "eloop.h"#include "sha1.h"#include "wpa.h"struct wpa_driver_test_data {	void *ctx;	u8 own_addr[ETH_ALEN];	int test_socket;	struct sockaddr_un hostapd_addr;	char *own_socket_path;	u8 bssid[ETH_ALEN];	u8 ssid[32];	size_t ssid_len;	struct wpa_scan_result scanres;	size_t num_scanres;	int use_associnfo;	u8 assoc_wpa_ie[80];	size_t assoc_wpa_ie_len;};static int wpa_driver_test_set_wpa(void *priv, int enabled){	wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);	return 0;}static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx){	wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");	wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);}static int wpa_driver_test_scan(void *priv, const u8 *ssid, size_t ssid_len){	struct wpa_driver_test_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);	if (drv->test_socket >= 0) {		if (sendto(drv->test_socket, "SCAN", 4, 0,			   (struct sockaddr *) &drv->hostapd_addr,			   sizeof(drv->hostapd_addr)) < 0) {			perror("sendto(test_socket)");			return -1;		}	} else {		eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv,				     drv->ctx);		eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,				       drv->ctx);	}	return 0;}static int wpa_driver_test_get_scan_results(void *priv,					    struct wpa_scan_result *results,					    size_t max_size){	struct wpa_driver_test_data *drv = priv;	memcpy(results, &drv->scanres, sizeof(drv->scanres));	return drv->num_scanres;}static int wpa_driver_test_set_key(void *priv, 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){	wpa_printf(MSG_DEBUG, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",		   __func__, priv, alg, key_idx, set_tx);	if (addr) {		wpa_printf(MSG_DEBUG, "   addr=" MACSTR, MAC2STR(addr));	}	if (seq) {		wpa_hexdump(MSG_DEBUG, "   seq", seq, seq_len);	}	if (key) {		wpa_hexdump(MSG_DEBUG, "   key", key, key_len);	}	return 0;}static int wpa_driver_test_associate(	void *priv, struct wpa_driver_associate_params *params){	struct wpa_driver_test_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "		   "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",		   __func__, priv, params->freq, params->pairwise_suite,		   params->group_suite, params->key_mgmt_suite,		   params->auth_alg, params->mode);	if (params->bssid) {		wpa_printf(MSG_DEBUG, "   bssid=" MACSTR,			   MAC2STR(params->bssid));	}	if (params->ssid) {		wpa_hexdump_ascii(MSG_DEBUG, "   ssid",				  params->ssid, params->ssid_len);	}	if (params->wpa_ie) {		wpa_hexdump(MSG_DEBUG, "   wpa_ie",			    params->wpa_ie, params->wpa_ie_len);		drv->assoc_wpa_ie_len = params->wpa_ie_len;		if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))			drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);		memcpy(drv->assoc_wpa_ie, params->wpa_ie,		       drv->assoc_wpa_ie_len);	} else		drv->assoc_wpa_ie_len = 0;	if (drv->test_socket >= 0) {		char cmd[200], *pos, *end;		int i;		end = cmd + sizeof(cmd);		pos = cmd;		pos += snprintf(pos, end - pos, "ASSOC " MACSTR " ",				MAC2STR(drv->own_addr));		for (i = 0; i < params->ssid_len; i++) {			pos += snprintf(pos, end - pos, "%02x",					params->ssid[i]);		}		pos += snprintf(pos, end - pos, " ");		for (i = 0; i < params->wpa_ie_len; i++) {			pos += snprintf(pos, end - pos, "%02x",					params->wpa_ie[i]);		}		if (sendto(drv->test_socket, cmd, strlen(cmd), 0,			   (struct sockaddr *) &drv->hostapd_addr,			   sizeof(drv->hostapd_addr)) < 0) {			perror("sendto(test_socket)");			return -1;		}		memcpy(drv->ssid, params->ssid, params->ssid_len);		drv->ssid_len = params->ssid_len;	} else		wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);	return 0;}static int wpa_driver_test_get_bssid(void *priv, u8 *bssid){	struct wpa_driver_test_data *drv = priv;	memcpy(bssid, drv->bssid, ETH_ALEN);	return 0;}static int wpa_driver_test_get_ssid(void *priv, u8 *ssid){	struct wpa_driver_test_data *drv = priv;	memcpy(ssid, drv->ssid, 32);	return drv->ssid_len;}static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv){	if (drv->test_socket >= 0 &&	    sendto(drv->test_socket, "DISASSOC", 8, 0,		   (struct sockaddr *) &drv->hostapd_addr,		   sizeof(drv->hostapd_addr)) < 0) {		perror("sendto(test_socket)");		return -1;	}	return 0;}static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,					  int reason_code){	struct wpa_driver_test_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",		   __func__, MAC2STR(addr), reason_code);	memset(drv->bssid, 0, ETH_ALEN);	wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);	return wpa_driver_test_send_disassoc(drv);}static int wpa_driver_test_disassociate(void *priv, const u8 *addr,					int reason_code){	struct wpa_driver_test_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",		   __func__, MAC2STR(addr), reason_code);	memset(drv->bssid, 0, ETH_ALEN);	wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);	return wpa_driver_test_send_disassoc(drv);}static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,				     struct sockaddr_un *from,				     socklen_t fromlen,				     const char *data){	struct wpa_scan_result *res;	const char *pos, *pos2;	size_t len;	u8 ie[200], *ipos, *end;	wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);	/* SCANRESP BSSID SSID IEs */	res = &drv->scanres;	drv->num_scanres = 0;	memset(res, 0, sizeof(*res));	if (hwaddr_aton(data, res->bssid)) {		wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");		return;	}	pos = data + 17;	while (*pos == ' ')		pos++;	pos2 = strchr(pos, ' ');	if (pos2 == NULL) {		wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "			   "in scanres");		return;	}	len = (pos2 - pos) / 2;	if (len > sizeof(res->ssid))		len = sizeof(res->ssid);	if (hexstr2bin(pos, res->ssid, len) < 0) {		wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");		return;	}	res->ssid_len = len;	pos = pos2 + 1;	while (*pos == ' ')		pos++;	pos2 = strchr(pos, ' ');	if (pos2 == NULL)		len = strlen(pos) / 2;	else		len = (pos2 - pos) / 2;	if (len > sizeof(ie))		len = sizeof(ie);	if (hexstr2bin(pos, ie, len) < 0) {		wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");		return;	}	ipos = ie;	end = ipos + len;	while (ipos + 1 < end && ipos + 2 + ipos[1] <= end) {		len = 2 + ipos[1];		if (len > SSID_MAX_WPA_IE_LEN)			len = SSID_MAX_WPA_IE_LEN;		if (ipos[0] == RSN_INFO_ELEM) {			memcpy(res->rsn_ie, ipos, len);			res->rsn_ie_len = len;		} else if (ipos[0] == GENERIC_INFO_ELEM) {			memcpy(res->wpa_ie, ipos, len);			res->wpa_ie_len = len;		}		ipos += 2 + ipos[1];	}	drv->num_scanres = 1;	wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?