Use shared function for adding common RADIUS attributes
Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
e100828b76
commit
8bea63e095
4 changed files with 137 additions and 227 deletions
|
@ -42,7 +42,6 @@ static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
|
||||||
size_t len;
|
size_t len;
|
||||||
int i;
|
int i;
|
||||||
struct wpabuf *b;
|
struct wpabuf *b;
|
||||||
struct hostapd_radius_attr *attr;
|
|
||||||
|
|
||||||
msg = radius_msg_new(RADIUS_CODE_ACCOUNTING_REQUEST,
|
msg = radius_msg_new(RADIUS_CODE_ACCOUNTING_REQUEST,
|
||||||
radius_client_get_id(hapd->radius));
|
radius_client_get_id(hapd->radius));
|
||||||
|
@ -97,88 +96,11 @@ static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_acct_req_attr,
|
if (add_common_radius_attr(hapd, hapd->conf->radius_acct_req_attr, sta,
|
||||||
RADIUS_ATTR_NAS_IP_ADDRESS) &&
|
msg) < 0)
|
||||||
hapd->conf->own_ip_addr.af == AF_INET &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
|
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
|
|
||||||
printf("Could not add NAS-IP-Address\n");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_IPV6_ADDRESS) &&
|
|
||||||
hapd->conf->own_ip_addr.af == AF_INET6 &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
|
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
|
|
||||||
printf("Could not add NAS-IPv6-Address\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_IPV6 */
|
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_IDENTIFIER) &&
|
|
||||||
hapd->conf->nas_identifier &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
|
|
||||||
(u8 *) hapd->conf->nas_identifier,
|
|
||||||
os_strlen(hapd->conf->nas_identifier))) {
|
|
||||||
printf("Could not add NAS-Identifier\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_PORT) &&
|
|
||||||
sta &&
|
|
||||||
!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
|
|
||||||
printf("Could not add NAS-Port\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
|
|
||||||
MAC2STR(hapd->own_addr),
|
|
||||||
wpa_ssid_txt(hapd->conf->ssid.ssid,
|
|
||||||
hapd->conf->ssid.ssid_len));
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_CALLED_STATION_ID) &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Called-Station-Id\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sta) {
|
if (sta) {
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
|
|
||||||
MAC2STR(sta->addr));
|
|
||||||
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Calling-Station-Id\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(
|
|
||||||
hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_PORT_TYPE) &&
|
|
||||||
!radius_msg_add_attr_int32(
|
|
||||||
msg, RADIUS_ATTR_NAS_PORT_TYPE,
|
|
||||||
RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
|
|
||||||
printf("Could not add NAS-Port-Type\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
|
|
||||||
radius_sta_rate(hapd, sta) / 2,
|
|
||||||
(radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
|
|
||||||
radius_mode_txt(hapd));
|
|
||||||
if (!hostapd_config_get_radius_attr(
|
|
||||||
hapd->conf->radius_acct_req_attr,
|
|
||||||
RADIUS_ATTR_CONNECT_INFO) &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Connect-Info\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; ; i++) {
|
for (i = 0; ; i++) {
|
||||||
val = ieee802_1x_get_radius_class(sta->eapol_sm, &len,
|
val = ieee802_1x_get_radius_class(sta->eapol_sm, &len,
|
||||||
i);
|
i);
|
||||||
|
@ -202,17 +124,6 @@ static struct radius_msg * accounting_msg(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (attr = hapd->conf->radius_acct_req_attr; attr; attr = attr->next)
|
|
||||||
{
|
|
||||||
if (!radius_msg_add_attr(msg, attr->type,
|
|
||||||
wpabuf_head(attr->val),
|
|
||||||
wpabuf_len(attr->val))) {
|
|
||||||
wpa_printf(MSG_ERROR, "Could not add RADIUS "
|
|
||||||
"attribute");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return msg;
|
return msg;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* hostapd / IEEE 802.11 authentication (ACL)
|
* hostapd / IEEE 802.11 authentication (ACL)
|
||||||
* Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
#include "ap_config.h"
|
#include "ap_config.h"
|
||||||
#include "ap_drv_ops.h"
|
#include "ap_drv_ops.h"
|
||||||
#include "ieee802_11.h"
|
#include "ieee802_11.h"
|
||||||
|
#include "ieee802_1x.h"
|
||||||
#include "ieee802_11_auth.h"
|
#include "ieee802_11_auth.h"
|
||||||
|
|
||||||
#define RADIUS_ACL_TIMEOUT 30
|
#define RADIUS_ACL_TIMEOUT 30
|
||||||
|
@ -140,39 +141,9 @@ static int hostapd_radius_acl_query(struct hostapd_data *hapd, const u8 *addr,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hapd->conf->own_ip_addr.af == AF_INET &&
|
if (add_common_radius_attr(hapd, hapd->conf->radius_auth_req_attr,
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
|
NULL, msg) < 0)
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Could not add NAS-IP-Address");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6
|
|
||||||
if (hapd->conf->own_ip_addr.af == AF_INET6 &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
|
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Could not add NAS-IPv6-Address");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_IPV6 */
|
|
||||||
|
|
||||||
if (hapd->conf->nas_identifier &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
|
|
||||||
(u8 *) hapd->conf->nas_identifier,
|
|
||||||
os_strlen(hapd->conf->nas_identifier))) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Could not add NAS-Identifier");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
|
|
||||||
MAC2STR(hapd->own_addr),
|
|
||||||
wpa_ssid_txt(hapd->conf->ssid.ssid,
|
|
||||||
hapd->conf->ssid.ssid_len));
|
|
||||||
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Could not add Called-Station-Id");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
|
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
|
||||||
MAC2STR(addr));
|
MAC2STR(addr));
|
||||||
|
@ -182,12 +153,6 @@ static int hostapd_radius_acl_query(struct hostapd_data *hapd, const u8 *addr,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
|
|
||||||
RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
|
|
||||||
wpa_printf(MSG_DEBUG, "Could not add NAS-Port-Type");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), "CONNECT 11Mbps 802.11b");
|
os_snprintf(buf, sizeof(buf), "CONNECT 11Mbps 802.11b");
|
||||||
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
|
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
(u8 *) buf, os_strlen(buf))) {
|
||||||
|
|
|
@ -409,14 +409,133 @@ static void ieee802_1x_learn_identity(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int add_common_radius_sta_attr(struct hostapd_data *hapd,
|
||||||
|
struct hostapd_radius_attr *req_attr,
|
||||||
|
struct sta_info *sta,
|
||||||
|
struct radius_msg *msg)
|
||||||
|
{
|
||||||
|
char buf[128];
|
||||||
|
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_NAS_PORT) &&
|
||||||
|
!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add NAS-Port");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
|
||||||
|
MAC2STR(sta->addr));
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
|
||||||
|
(u8 *) buf, os_strlen(buf))) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add Calling-Station-Id");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sta->flags & WLAN_STA_PREAUTH) {
|
||||||
|
os_strlcpy(buf, "IEEE 802.11i Pre-Authentication",
|
||||||
|
sizeof(buf));
|
||||||
|
} else {
|
||||||
|
os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
|
||||||
|
radius_sta_rate(hapd, sta) / 2,
|
||||||
|
(radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
|
||||||
|
radius_mode_txt(hapd));
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
}
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_CONNECT_INFO) &&
|
||||||
|
!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
|
||||||
|
(u8 *) buf, os_strlen(buf))) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add Connect-Info");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int add_common_radius_attr(struct hostapd_data *hapd,
|
||||||
|
struct hostapd_radius_attr *req_attr,
|
||||||
|
struct sta_info *sta,
|
||||||
|
struct radius_msg *msg)
|
||||||
|
{
|
||||||
|
char buf[128];
|
||||||
|
struct hostapd_radius_attr *attr;
|
||||||
|
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_NAS_IP_ADDRESS) &&
|
||||||
|
hapd->conf->own_ip_addr.af == AF_INET &&
|
||||||
|
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
|
||||||
|
(u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add NAS-IP-Address");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IPV6
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_NAS_IPV6_ADDRESS) &&
|
||||||
|
hapd->conf->own_ip_addr.af == AF_INET6 &&
|
||||||
|
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
|
||||||
|
(u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add NAS-IPv6-Address");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_IPV6 */
|
||||||
|
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_NAS_IDENTIFIER) &&
|
||||||
|
hapd->conf->nas_identifier &&
|
||||||
|
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
|
||||||
|
(u8 *) hapd->conf->nas_identifier,
|
||||||
|
os_strlen(hapd->conf->nas_identifier))) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add NAS-Identifier");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
|
||||||
|
MAC2STR(hapd->own_addr),
|
||||||
|
wpa_ssid_txt(hapd->conf->ssid.ssid,
|
||||||
|
hapd->conf->ssid.ssid_len));
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_CALLED_STATION_ID) &&
|
||||||
|
!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
|
||||||
|
(u8 *) buf, os_strlen(buf))) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add Called-Station-Id");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hostapd_config_get_radius_attr(req_attr,
|
||||||
|
RADIUS_ATTR_NAS_PORT_TYPE) &&
|
||||||
|
!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
|
||||||
|
RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add NAS-Port-Type");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sta && add_common_radius_sta_attr(hapd, req_attr, sta, msg) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (attr = req_attr; attr; attr = attr->next) {
|
||||||
|
if (!radius_msg_add_attr(msg, attr->type,
|
||||||
|
wpabuf_head(attr->val),
|
||||||
|
wpabuf_len(attr->val))) {
|
||||||
|
wpa_printf(MSG_ERROR, "Could not add RADIUS "
|
||||||
|
"attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
|
static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
|
||||||
struct sta_info *sta,
|
struct sta_info *sta,
|
||||||
const u8 *eap, size_t len)
|
const u8 *eap, size_t len)
|
||||||
{
|
{
|
||||||
struct radius_msg *msg;
|
struct radius_msg *msg;
|
||||||
char buf[128];
|
|
||||||
struct eapol_state_machine *sm = sta->eapol_sm;
|
struct eapol_state_machine *sm = sta->eapol_sm;
|
||||||
struct hostapd_radius_attr *attr;
|
|
||||||
|
|
||||||
if (sm == NULL)
|
if (sm == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -443,64 +562,9 @@ static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
if (add_common_radius_attr(hapd, hapd->conf->radius_auth_req_attr, sta,
|
||||||
RADIUS_ATTR_NAS_IP_ADDRESS) &&
|
msg) < 0)
|
||||||
hapd->conf->own_ip_addr.af == AF_INET &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IP_ADDRESS,
|
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v4, 4)) {
|
|
||||||
printf("Could not add NAS-IP-Address\n");
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_IPV6_ADDRESS) &&
|
|
||||||
hapd->conf->own_ip_addr.af == AF_INET6 &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IPV6_ADDRESS,
|
|
||||||
(u8 *) &hapd->conf->own_ip_addr.u.v6, 16)) {
|
|
||||||
printf("Could not add NAS-IPv6-Address\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_IPV6 */
|
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_IDENTIFIER) &&
|
|
||||||
hapd->conf->nas_identifier &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_NAS_IDENTIFIER,
|
|
||||||
(u8 *) hapd->conf->nas_identifier,
|
|
||||||
os_strlen(hapd->conf->nas_identifier))) {
|
|
||||||
printf("Could not add NAS-Identifier\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_PORT) &&
|
|
||||||
!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT, sta->aid)) {
|
|
||||||
printf("Could not add NAS-Port\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT ":%s",
|
|
||||||
MAC2STR(hapd->own_addr),
|
|
||||||
wpa_ssid_txt(hapd->conf->ssid.ssid,
|
|
||||||
hapd->conf->ssid.ssid_len));
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_CALLED_STATION_ID) &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_CALLED_STATION_ID,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Called-Station-Id\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
os_snprintf(buf, sizeof(buf), RADIUS_802_1X_ADDR_FORMAT,
|
|
||||||
MAC2STR(sta->addr));
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
if (!radius_msg_add_attr(msg, RADIUS_ATTR_CALLING_STATION_ID,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Calling-Station-Id\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: should probably check MTU from driver config; 2304 is max for
|
/* TODO: should probably check MTU from driver config; 2304 is max for
|
||||||
* IEEE 802.11, but use 1400 to avoid problems with too large packets
|
* IEEE 802.11, but use 1400 to avoid problems with too large packets
|
||||||
|
@ -512,32 +576,6 @@ static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_NAS_PORT_TYPE) &&
|
|
||||||
!radius_msg_add_attr_int32(msg, RADIUS_ATTR_NAS_PORT_TYPE,
|
|
||||||
RADIUS_NAS_PORT_TYPE_IEEE_802_11)) {
|
|
||||||
printf("Could not add NAS-Port-Type\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sta->flags & WLAN_STA_PREAUTH) {
|
|
||||||
os_strlcpy(buf, "IEEE 802.11i Pre-Authentication",
|
|
||||||
sizeof(buf));
|
|
||||||
} else {
|
|
||||||
os_snprintf(buf, sizeof(buf), "CONNECT %d%sMbps %s",
|
|
||||||
radius_sta_rate(hapd, sta) / 2,
|
|
||||||
(radius_sta_rate(hapd, sta) & 1) ? ".5" : "",
|
|
||||||
radius_mode_txt(hapd));
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
}
|
|
||||||
if (!hostapd_config_get_radius_attr(hapd->conf->radius_auth_req_attr,
|
|
||||||
RADIUS_ATTR_CONNECT_INFO) &&
|
|
||||||
!radius_msg_add_attr(msg, RADIUS_ATTR_CONNECT_INFO,
|
|
||||||
(u8 *) buf, os_strlen(buf))) {
|
|
||||||
printf("Could not add Connect-Info\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eap && !radius_msg_add_eap(msg, eap, len)) {
|
if (eap && !radius_msg_add_eap(msg, eap, len)) {
|
||||||
printf("Could not add EAP-Message\n");
|
printf("Could not add EAP-Message\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -579,17 +617,6 @@ static void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (attr = hapd->conf->radius_auth_req_attr; attr; attr = attr->next)
|
|
||||||
{
|
|
||||||
if (!radius_msg_add_attr(msg, attr->type,
|
|
||||||
wpabuf_head(attr->val),
|
|
||||||
wpabuf_len(attr->val))) {
|
|
||||||
wpa_printf(MSG_ERROR, "Could not add RADIUS "
|
|
||||||
"attribute");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, sta->addr) < 0)
|
if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, sta->addr) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* hostapd / IEEE 802.1X-2004 Authenticator
|
* hostapd / IEEE 802.1X-2004 Authenticator
|
||||||
* Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -14,6 +14,8 @@ struct sta_info;
|
||||||
struct eapol_state_machine;
|
struct eapol_state_machine;
|
||||||
struct hostapd_config;
|
struct hostapd_config;
|
||||||
struct hostapd_bss_config;
|
struct hostapd_bss_config;
|
||||||
|
struct hostapd_radius_attr;
|
||||||
|
struct radius_msg;
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
@ -83,4 +85,9 @@ char *eap_type_text(u8 type);
|
||||||
const char *radius_mode_txt(struct hostapd_data *hapd);
|
const char *radius_mode_txt(struct hostapd_data *hapd);
|
||||||
int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta);
|
int radius_sta_rate(struct hostapd_data *hapd, struct sta_info *sta);
|
||||||
|
|
||||||
|
int add_common_radius_attr(struct hostapd_data *hapd,
|
||||||
|
struct hostapd_radius_attr *req_attr,
|
||||||
|
struct sta_info *sta,
|
||||||
|
struct radius_msg *msg);
|
||||||
|
|
||||||
#endif /* IEEE802_1X_H */
|
#endif /* IEEE802_1X_H */
|
||||||
|
|
Loading…
Reference in a new issue