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

📄 driver_privsep.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * WPA Supplicant - privilege separated driver interface * Copyright (c) 2007-2009, 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 "includes.h"#include <sys/un.h>#include "common.h"#include "driver.h"#include "eloop.h"#include "privsep_commands.h"struct wpa_driver_privsep_data {	void *ctx;	u8 own_addr[ETH_ALEN];	int priv_socket;	char *own_socket_path;	int cmd_socket;	char *own_cmd_path;	struct sockaddr_un priv_addr;	char ifname[16];};static int wpa_priv_reg_cmd(struct wpa_driver_privsep_data *drv, int cmd){	int res;	res = sendto(drv->priv_socket, &cmd, sizeof(cmd), 0,		     (struct sockaddr *) &drv->priv_addr,		     sizeof(drv->priv_addr));	if (res < 0)		perror("sendto");	return res < 0 ? -1 : 0;}static int wpa_priv_cmd(struct wpa_driver_privsep_data *drv, int cmd,			const void *data, size_t data_len,			void *reply, size_t *reply_len){	struct msghdr msg;	struct iovec io[2];	io[0].iov_base = &cmd;	io[0].iov_len = sizeof(cmd);	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 = data ? 2 : 1;	msg.msg_name = &drv->priv_addr;	msg.msg_namelen = sizeof(drv->priv_addr);	if (sendmsg(drv->cmd_socket, &msg, 0) < 0) {		perror("sendmsg(cmd_socket)");		return -1;	}	if (reply) {		fd_set rfds;		struct timeval tv;		int res;		FD_ZERO(&rfds);		FD_SET(drv->cmd_socket, &rfds);		tv.tv_sec = 5;		tv.tv_usec = 0;		res = select(drv->cmd_socket + 1, &rfds, NULL, NULL, &tv);		if (res < 0 && errno != EINTR) {			perror("select");			return -1;		}		if (FD_ISSET(drv->cmd_socket, &rfds)) {			res = recv(drv->cmd_socket, reply, *reply_len, 0);			if (res < 0) {				perror("recv");				return -1;			}			*reply_len = res;		} else {			wpa_printf(MSG_DEBUG, "PRIVSEP: Timeout while waiting "				   "for reply (cmd=%d)", cmd);			return -1;		}	}	return 0;}			     static int wpa_driver_privsep_set_wpa(void *priv, int enabled){	struct wpa_driver_privsep_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);	return wpa_priv_cmd(drv, PRIVSEP_CMD_SET_WPA, &enabled,			    sizeof(enabled), NULL, NULL);}static int wpa_driver_privsep_scan(void *priv, const u8 *ssid, size_t ssid_len){	struct wpa_driver_privsep_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);	return wpa_priv_cmd(drv, PRIVSEP_CMD_SCAN, ssid, ssid_len,			    NULL, NULL);}static struct wpa_scan_results *wpa_driver_privsep_get_scan_results2(void *priv){	struct wpa_driver_privsep_data *drv = priv;	int res, num;	u8 *buf, *pos, *end;	size_t reply_len = 60000;	struct wpa_scan_results *results;	struct wpa_scan_res *r;	buf = os_malloc(reply_len);	if (buf == NULL)		return NULL;	res = wpa_priv_cmd(drv, PRIVSEP_CMD_GET_SCAN_RESULTS,			   NULL, 0, buf, &reply_len);	if (res < 0) {		os_free(buf);		return NULL;	}	wpa_printf(MSG_DEBUG, "privsep: Received %lu bytes of scan results",		   (unsigned long) reply_len);	if (reply_len < sizeof(int)) {		wpa_printf(MSG_DEBUG, "privsep: Invalid scan result len %lu",			   (unsigned long) reply_len);		os_free(buf);		return NULL;	}	pos = buf;	end = buf + reply_len;	os_memcpy(&num, pos, sizeof(int));	if (num < 0 || num > 1000) {		os_free(buf);		return NULL;	}	pos += sizeof(int);	results = os_zalloc(sizeof(*results));	if (results == NULL) {		os_free(buf);		return NULL;	}	results->res = os_zalloc(num * sizeof(struct wpa_scan_res *));	if (results->res == NULL) {		os_free(results);		os_free(buf);		return NULL;	}	while (results->num < (size_t) num && pos + sizeof(int) < end) {		int len;		os_memcpy(&len, pos, sizeof(int));		pos += sizeof(int);		if (len < 0 || len > 10000 || pos + len > end)			break;		r = os_malloc(len);		if (r == NULL)			break;		os_memcpy(r, pos, len);		pos += len;		if (sizeof(*r) + r->ie_len > (size_t) len) {			os_free(r);			break;		}		results->res[results->num++] = r;	}	os_free(buf);	return results;}static int wpa_driver_privsep_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){	struct wpa_driver_privsep_data *drv = priv;	struct privsep_cmd_set_key cmd;	wpa_printf(MSG_DEBUG, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",		   __func__, priv, alg, key_idx, set_tx);	os_memset(&cmd, 0, sizeof(cmd));	cmd.alg = alg;	if (addr)		os_memcpy(cmd.addr, addr, ETH_ALEN);	else		os_memset(cmd.addr, 0xff, ETH_ALEN);	cmd.key_idx = key_idx;	cmd.set_tx = set_tx;	if (seq && seq_len > 0 && seq_len < sizeof(cmd.seq)) {		os_memcpy(cmd.seq, seq, seq_len);		cmd.seq_len = seq_len;	}	if (key && key_len > 0 && key_len < sizeof(cmd.key)) {		os_memcpy(cmd.key, key, key_len);		cmd.key_len = key_len;	}	return wpa_priv_cmd(drv, PRIVSEP_CMD_SET_KEY, &cmd, sizeof(cmd),			    NULL, NULL);}static int wpa_driver_privsep_associate(	void *priv, struct wpa_driver_associate_params *params){	struct wpa_driver_privsep_data *drv = priv;	struct privsep_cmd_associate *data;	int res;	size_t buflen;	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);	buflen = sizeof(*data) + params->wpa_ie_len;	data = os_zalloc(buflen);	if (data == NULL)		return -1;	if (params->bssid)		os_memcpy(data->bssid, params->bssid, ETH_ALEN);	os_memcpy(data->ssid, params->ssid, params->ssid_len);	data->ssid_len = params->ssid_len;	data->freq = params->freq;	data->pairwise_suite = params->pairwise_suite;	data->group_suite = params->group_suite;	data->key_mgmt_suite = params->key_mgmt_suite;	data->auth_alg = params->auth_alg;	data->mode = params->mode;	data->wpa_ie_len = params->wpa_ie_len;	if (params->wpa_ie)		os_memcpy(data + 1, params->wpa_ie, params->wpa_ie_len);	/* TODO: add support for other assoc parameters */	res = wpa_priv_cmd(drv, PRIVSEP_CMD_ASSOCIATE, data, buflen,			   NULL, NULL);	os_free(data);	return res;}static int wpa_driver_privsep_get_bssid(void *priv, u8 *bssid){	struct wpa_driver_privsep_data *drv = priv;	int res;	size_t len = ETH_ALEN;	res = wpa_priv_cmd(drv, PRIVSEP_CMD_GET_BSSID, NULL, 0, bssid, &len);	if (res < 0 || len != ETH_ALEN)		return -1;	return 0;}static int wpa_driver_privsep_get_ssid(void *priv, u8 *ssid){	struct wpa_driver_privsep_data *drv = priv;	int res, ssid_len;	u8 reply[sizeof(int) + 32];	size_t len = sizeof(reply);	res = wpa_priv_cmd(drv, PRIVSEP_CMD_GET_SSID, NULL, 0, reply, &len);	if (res < 0 || len < sizeof(int))		return -1;	os_memcpy(&ssid_len, reply, sizeof(int));	if (ssid_len < 0 || ssid_len > 32 || sizeof(int) + ssid_len > len) {		wpa_printf(MSG_DEBUG, "privsep: Invalid get SSID reply");		return -1;	}	os_memcpy(ssid, &reply[sizeof(int)], ssid_len);	return ssid_len;}static int wpa_driver_privsep_deauthenticate(void *priv, const u8 *addr,					  int reason_code){	//struct wpa_driver_privsep_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",		   __func__, MAC2STR(addr), reason_code);	wpa_printf(MSG_DEBUG, "%s - TODO", __func__);	return 0;}static int wpa_driver_privsep_disassociate(void *priv, const u8 *addr,					int reason_code){	//struct wpa_driver_privsep_data *drv = priv;	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",		   __func__, MAC2STR(addr), reason_code);	wpa_printf(MSG_DEBUG, "%s - TODO", __func__);	return 0;}static void wpa_driver_privsep_event_assoc(void *ctx, wpa_event_type event,					   u8 *buf, size_t len){	union wpa_event_data data;	int inc_data = 0;	u8 *pos, *end;	int ie_len;	os_memset(&data, 0, sizeof(data));	pos = buf;	end = buf + len;	if (end - pos < (int) sizeof(int))		return;	os_memcpy(&ie_len, pos, sizeof(int));	pos += sizeof(int);	if (ie_len < 0 || ie_len > end - pos)		return;	if (ie_len) {		data.assoc_info.req_ies = pos;		data.assoc_info.req_ies_len = ie_len;		pos += ie_len;		inc_data = 1;	}	wpa_supplicant_event(ctx, event, inc_data ? &data : NULL);}static void wpa_driver_privsep_event_interface_status(void *ctx, u8 *buf,						      size_t len){	union wpa_event_data data;	int ievent;	if (len < sizeof(int) ||	    len - sizeof(int) > sizeof(data.interface_status.ifname))		return;	os_memcpy(&ievent, buf, sizeof(int));	os_memset(&data, 0, sizeof(data));	data.interface_status.ievent = ievent;	os_memcpy(data.interface_status.ifname, buf + sizeof(int),		  len - sizeof(int));	wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &data);}static void wpa_driver_privsep_event_michael_mic_failure(	void *ctx, u8 *buf, size_t len){	union wpa_event_data data;	if (len != sizeof(int))		return;	os_memset(&data, 0, sizeof(data));	os_memcpy(&data.michael_mic_failure.unicast, buf, sizeof(int));	wpa_supplicant_event(ctx, EVENT_MICHAEL_MIC_FAILURE, &data);}static void wpa_driver_privsep_event_pmkid_candidate(void *ctx, u8 *buf,						     size_t len){	union wpa_event_data data;	if (len != sizeof(struct pmkid_candidate))		return;	os_memset(&data, 0, sizeof(data));	os_memcpy(&data.pmkid_candidate, buf, len);	wpa_supplicant_event(ctx, EVENT_PMKID_CANDIDATE, &data);}static void wpa_driver_privsep_event_stkstart(void *ctx, u8 *buf, size_t len){	union wpa_event_data data;	if (len != ETH_ALEN)

⌨️ 快捷键说明

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