2009-09-08 11:56:07 +02:00
|
|
|
/*
|
|
|
|
* Control interface for shared AP commands
|
|
|
|
* Copyright (c) 2004-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"
|
|
|
|
|
2009-11-29 17:46:42 +01:00
|
|
|
#include "common.h"
|
2009-12-25 00:12:50 +01:00
|
|
|
#include "ap/hostapd.h"
|
|
|
|
#include "ap/ieee802_1x.h"
|
|
|
|
#include "ap/wpa.h"
|
|
|
|
#include "ap/ieee802_11.h"
|
|
|
|
#include "ap/sta_info.h"
|
2009-12-25 00:26:37 +01:00
|
|
|
#include "ap/wps_hostapd.h"
|
2009-09-08 11:56:07 +02:00
|
|
|
#include "ctrl_iface_ap.h"
|
|
|
|
|
|
|
|
|
|
|
|
static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd,
|
|
|
|
struct sta_info *sta,
|
|
|
|
char *buf, size_t buflen)
|
|
|
|
{
|
|
|
|
int len, res, ret;
|
|
|
|
|
|
|
|
if (sta == NULL) {
|
|
|
|
ret = os_snprintf(buf, buflen, "FAIL\n");
|
|
|
|
if (ret < 0 || (size_t) ret >= buflen)
|
|
|
|
return 0;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
len = 0;
|
|
|
|
ret = os_snprintf(buf + len, buflen - len, MACSTR "\n",
|
|
|
|
MAC2STR(sta->addr));
|
|
|
|
if (ret < 0 || (size_t) ret >= buflen - len)
|
|
|
|
return len;
|
|
|
|
len += ret;
|
|
|
|
|
|
|
|
res = ieee802_11_get_mib_sta(hapd, sta, buf + len, buflen - len);
|
|
|
|
if (res >= 0)
|
|
|
|
len += res;
|
|
|
|
res = wpa_get_mib_sta(sta->wpa_sm, buf + len, buflen - len);
|
|
|
|
if (res >= 0)
|
|
|
|
len += res;
|
|
|
|
res = ieee802_1x_get_mib_sta(hapd, sta, buf + len, buflen - len);
|
|
|
|
if (res >= 0)
|
|
|
|
len += res;
|
|
|
|
res = hostapd_wps_get_mib_sta(hapd, sta->addr, buf + len,
|
|
|
|
buflen - len);
|
|
|
|
if (res >= 0)
|
|
|
|
len += res;
|
|
|
|
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int hostapd_ctrl_iface_sta_first(struct hostapd_data *hapd,
|
|
|
|
char *buf, size_t buflen)
|
|
|
|
{
|
|
|
|
return hostapd_ctrl_iface_sta_mib(hapd, hapd->sta_list, buf, buflen);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr,
|
|
|
|
char *buf, size_t buflen)
|
|
|
|
{
|
|
|
|
u8 addr[ETH_ALEN];
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (hwaddr_aton(txtaddr, addr)) {
|
|
|
|
ret = os_snprintf(buf, buflen, "FAIL\n");
|
|
|
|
if (ret < 0 || (size_t) ret >= buflen)
|
|
|
|
return 0;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
return hostapd_ctrl_iface_sta_mib(hapd, ap_get_sta(hapd, addr),
|
|
|
|
buf, buflen);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int hostapd_ctrl_iface_sta_next(struct hostapd_data *hapd, const char *txtaddr,
|
|
|
|
char *buf, size_t buflen)
|
|
|
|
{
|
|
|
|
u8 addr[ETH_ALEN];
|
|
|
|
struct sta_info *sta;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (hwaddr_aton(txtaddr, addr) ||
|
|
|
|
(sta = ap_get_sta(hapd, addr)) == NULL) {
|
|
|
|
ret = os_snprintf(buf, buflen, "FAIL\n");
|
|
|
|
if (ret < 0 || (size_t) ret >= buflen)
|
|
|
|
return 0;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen);
|
|
|
|
}
|