pentoo-overlay/net-wireless/hostapd/files/cui-20120417.patch
2012-04-17 23:09:02 +00:00

451 lines
13 KiB
Diff

diff -rupN hostapd-0.7.3/src/ap/accounting.c src/ap/accounting.c
--- hostapd-0.7.3/src/ap/accounting.c 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/accounting.c 2011-09-06 21:01:36.000000000 -0700
@@ -24,6 +24,7 @@
#include "ap_config.h"
#include "sta_info.h"
#include "accounting.h"
+/*#include "eapol_auth/eapol_auth_sm_i.h"*/
/* Default interval in seconds for polling TX/RX octets from the driver if
@@ -43,7 +44,10 @@ static struct radius_msg * accounting_ms
char buf[128];
u8 *val;
size_t len;
+ u8 *cui; /*Define CUI Attribute*/
+ size_t cui_len; /*Define CUI Attribute length*/
int i;
+ struct eapol_state_machine *sm = sta->eapol_sm;
msg = radius_msg_new(RADIUS_CODE_ACCOUNTING_REQUEST,
radius_client_get_id(hapd->radius));
@@ -82,7 +86,9 @@ static struct radius_msg * accounting_ms
if (sta) {
val = ieee802_1x_get_identity(sta->eapol_sm, &len);
+ printf("GOT ID\n");
if (!val) {
+
os_snprintf(buf, sizeof(buf), RADIUS_ADDR_FORMAT,
MAC2STR(sta->addr));
val = (u8 *) buf;
@@ -94,6 +100,30 @@ static struct radius_msg * accounting_ms
printf("Could not add User-Name\n");
goto fail;
}
+
+
+ /*Check if the CUI attribute is set, if so returns the TRUE or FALSE accordingly**************/
+ if (getSetCui(sta->eapol_sm)){
+ cui=get_CUI (sta->eapol_sm, &cui_len);
+ printf("GOT CUI\n");
+
+ if (!cui) {
+
+ os_snprintf(buf, sizeof(buf), RADIUS_ADDR_FORMAT,
+ MAC2STR(sta->addr));
+ cui = (u8 *) buf;
+ cui_len = os_strlen(buf);
+ }
+ if (!radius_msg_add_attr(msg, RADIUS_ATTR_CHARGEABLE_USER_IDENTITY, cui,
+ cui_len)) { /*Add CUI attribute to the Accounting Request Message*/
+ printf("Could not add CUI\n");
+ goto fail;
+ }
+ /********************/
+ }
+ /*else { */
+ /* printf ("PROBLEM IN IF\n");*/
+ /*}*/
}
if (hapd->conf->own_ip_addr.af == AF_INET &&
diff -rupN hostapd-0.7.3/src/ap/accounting.h src/ap/accounting.h
--- hostapd-0.7.3/src/ap/accounting.h 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/accounting.h 2011-07-25 19:26:06.000000000 -0700
@@ -22,6 +22,7 @@ static inline void accounting_sta_start(
{
}
+
static inline void accounting_sta_stop(struct hostapd_data *hapd,
struct sta_info *sta)
{
diff -rupN hostapd-0.7.3/src/ap/ieee802_1x.c src/ap/ieee802_1x.c
--- hostapd-0.7.3/src/ap/ieee802_1x.c 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/ieee802_1x.c 2011-09-06 20:59:54.000000000 -0700
@@ -899,6 +899,7 @@ void ieee802_1x_new_station(struct hosta
* re-authentication without having to wait for the
* Supplicant to send EAPOL-Start.
*/
+ printf("REAUTHENTICATION-EAPOL");
sta->eapol_sm->reAuthenticate = TRUE;
}
eapol_auth_step(sta->eapol_sm);
@@ -1138,6 +1139,68 @@ static void ieee802_1x_update_sta_identi
sm->identity_len = len;
}
+/* This method is used to Set the CUI attribute Value**************************************/
+static void set_cui(struct hostapd_data *hapd,
+ struct sta_info *sta,
+ struct radius_msg *msg)
+
+{
+ u8 *buf,*cui_identity;
+ size_t len;
+ struct eapol_state_machine *sm = sta->eapol_sm;
+
+ if (sm == NULL)
+ return;
+
+ if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_CHARGEABLE_USER_IDENTITY, &buf, &len,
+ NULL) < 0)
+ return;
+ cui_identity = os_malloc(len + 1);
+ if (cui_identity == NULL)
+ return;
+ os_memcpy(cui_identity, buf, len);
+ cui_identity[len] = '\0';
+
+ sm->cui = cui_identity;
+ sm->cui_len = len;
+ printf(" SET CUI %s",(char *) cui_identity);
+
+
+}
+
+
+/* **************************************/
+
+/*check CUI attribute is available in Access Accept */
+static void check_cuiAttr (struct radius_msg *msg,struct sta_info *sta, struct hostapd_data *hapd)
+{
+
+ struct eapol_state_machine *sm = sta->eapol_sm; /*Define a pointer to eapol_state_machine*/
+
+
+ size_t i;
+
+ for (i = 0;i<msg->attr_used;i++)
+ { struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
+ if (attr->type == RADIUS_ATTR_CHARGEABLE_USER_IDENTITY) /*check CUI attribute is availabe in Access-Accept packet*/
+ {
+ printf("CUI Attribute is Available");
+ sm->cuiAvailable = TRUE;
+ set_cui(hapd, sta, msg);
+ break;
+
+ }
+ else {
+ sm->cuiAvailable = FALSE;
+ printf ("CUI is not available in this packet");
+
+ }
+
+
+ }
+
+}
+
struct sta_id_search {
u8 identifier;
@@ -1298,6 +1361,8 @@ ieee802_1x_receive_auth(struct radius_ms
shared_secret_len);
ieee802_1x_store_radius_class(hapd, sta, msg);
ieee802_1x_update_sta_identity(hapd, sta, msg);
+ /*set_cui(hapd, sta, msg);*/
+ check_cuiAttr (msg,sta,hapd);
if (sm->eap_if->eapKeyAvailable &&
wpa_auth_pmksa_add(sta->wpa_sm, sm->eapol_key_crypt,
session_timeout_set ?
@@ -1777,6 +1842,27 @@ u8 * ieee802_1x_get_identity(struct eapo
}
+
+u8 * get_CUI(struct eapol_state_machine *sm, size_t *len) /* return CUI Attribute Value ******************************/
+{
+ if (sm == NULL || sm->identity == NULL)
+ return NULL;
+
+ *len = sm->cui_len;
+ return sm->cui;
+}
+
+Boolean getSetCui (struct eapol_state_machine *sm) /*Check if the CUI value is set or not, and returns TRUE or FALSE accordingly*/
+
+{ if (sm->cuiAvailable)
+ return TRUE;
+else
+ return FALSE;
+ }
+
+/*****************************/
+
+
u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len,
int idx)
{
diff -rupN hostapd-0.7.3/src/ap/ieee802_1x.h src/ap/ieee802_1x.h
--- hostapd-0.7.3/src/ap/ieee802_1x.h 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/ieee802_1x.h 2011-07-25 19:43:10.000000000 -0700
@@ -69,6 +69,13 @@ void ieee802_1x_deinit(struct hostapd_da
int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
const u8 *buf, size_t len, int ack);
u8 * ieee802_1x_get_identity(struct eapol_state_machine *sm, size_t *len);
+
+/** definig CUI get function */
+u8 * get_CUI(struct eapol_state_machine *sm, size_t *len);
+Boolean getSetCui (struct eapol_state_machine *sm);
+
+/*********************/
+
u8 * ieee802_1x_get_radius_class(struct eapol_state_machine *sm, size_t *len,
int idx);
const u8 * ieee802_1x_get_key(struct eapol_state_machine *sm, size_t *len);
diff -rupN hostapd-0.7.3/src/ap/pmksa_cache_auth.c src/ap/pmksa_cache_auth.c
--- hostapd-0.7.3/src/ap/pmksa_cache_auth.c 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/pmksa_cache_auth.c 2011-09-06 22:42:00.000000000 -0700
@@ -142,6 +142,20 @@ static void pmksa_cache_from_eapol_data(
}
}
+/*set to cui in to cache*/
+
+ if (eapol ->cui) {
+
+ entry ->cui = os_malloc(eapol->cui_len); /*Allocate memory for CUI attribute*/
+ if (entry->cui) {
+ entry->cui_len = eapol->cui_len;
+ os_memcpy(entry->cui, eapol->cui,
+ eapol->cui_len);
+ }
+ }
+
+/*set to cui in to cache*/
+
#ifndef CONFIG_NO_RADIUS
radius_copy_class(&entry->radius_class, &eapol->radius_class);
#endif /* CONFIG_NO_RADIUS */
@@ -169,6 +183,25 @@ void pmksa_cache_to_eapol_data(struct rs
eapol->identity, eapol->identity_len);
}
+/*Added to get CUI from the cache*/
+
+
+ if (entry->cui) {
+ os_free(eapol->cui);
+
+ eapol->cui = os_malloc(entry->cui_len);
+ eapol->cuiAvailable=TRUE;
+ if (eapol->cui) {
+ eapol->cui_len = entry->cui_len;
+ os_memcpy(eapol->cui, entry->cui,
+ entry->cui_len); /*copy the CUI attribute value to EAPOL data structure*/
+ }
+ wpa_hexdump_ascii(MSG_DEBUG, "CUIfrom PMKSA",
+ eapol->cui, eapol->cui_len);
+ }
+
+ /*Added to get CUI from the cache*/
+
#ifndef CONFIG_NO_RADIUS
radius_free_class(&eapol->radius_class);
radius_copy_class(&eapol->radius_class, &entry->radius_class);
@@ -180,6 +213,7 @@ void pmksa_cache_to_eapol_data(struct rs
eapol->eap_type_authsrv = entry->eap_type_authsrv;
((struct sta_info *) eapol->sta)->vlan_id = entry->vlan_id;
+ printf ("GETTING CACHE ENTRY\n");
}
diff -rupN hostapd-0.7.3/src/ap/pmksa_cache_auth.h src/ap/pmksa_cache_auth.h
--- hostapd-0.7.3/src/ap/pmksa_cache_auth.h 2010-09-07 08:43:39.000000000 -0700
+++ src/ap/pmksa_cache_auth.h 2011-08-07 19:19:44.000000000 -0700
@@ -31,6 +31,8 @@ struct rsn_pmksa_cache_entry {
u8 *identity;
size_t identity_len;
+ u8 *cui; /* cui by me*/
+ size_t cui_len; /*Size of the cached cui by me*/
struct radius_class_data radius_class;
u8 eap_type_authsrv;
int vlan_id;
diff -rupN hostapd-0.7.3/src/common/ieee802_11_common.c src/common/ieee802_11_common.c
--- hostapd-0.7.3/src/common/ieee802_11_common.c 2010-09-07 08:43:39.000000000 -0700
+++ src/common/ieee802_11_common.c 2011-07-25 17:56:38.000000000 -0700
@@ -31,8 +31,8 @@ static int ieee802_11_parse_vendor_speci
if (elen < 4) {
if (show_errors) {
wpa_printf(MSG_MSGDUMP, "short vendor specific "
- "information element ignored (len=%lu)",
- (unsigned long) elen);
+ "information element ignored (len=%lu)",
+ (unsigned long) elen);
}
return -1;
}
diff -rupN hostapd-0.7.3/src/eapol_auth/eapol_auth_sm_i.h src/eapol_auth/eapol_auth_sm_i.h
--- hostapd-0.7.3/src/eapol_auth/eapol_auth_sm_i.h 2010-09-07 08:43:39.000000000 -0700
+++ src/eapol_auth/eapol_auth_sm_i.h 2011-09-06 20:43:46.000000000 -0700
@@ -75,6 +75,7 @@ struct eapol_state_machine {
/* variables */
Boolean eapolLogoff;
Boolean eapolStart;
+ Boolean cuiAvailable; /*to check CUI is available in AcessAccept*/
PortTypes portMode;
unsigned int reAuthCount;
/* constants */
@@ -159,6 +160,8 @@ struct eapol_state_machine {
u8 last_eap_id; /* last used EAP Identifier */
u8 *identity;
size_t identity_len;
+ u8 *cui; /*Define CUI Attribute*/
+ size_t cui_len; /*Define CUI attribute length*/
u8 eap_type_authsrv; /* EAP type of the last EAP packet from
* Authentication server */
u8 eap_type_supp; /* EAP type of the last EAP packet from Supplicant */
diff -rupN hostapd-0.7.3/src/radius/radius.c src/radius/radius.c
--- hostapd-0.7.3/src/radius/radius.c 2010-09-07 08:43:39.000000000 -0700
+++ src/radius/radius.c 2011-07-25 18:41:30.000000000 -0700
@@ -24,16 +24,16 @@
/**
* struct radius_msg - RADIUS message structure for new and parsed messages
*/
-struct radius_msg {
+//struct radius_msg {
/**
* buf - Allocated buffer for RADIUS message
*/
- struct wpabuf *buf;
+ //struct wpabuf *buf;
/**
* hdr - Pointer to the RADIUS header in buf
*/
- struct radius_hdr *hdr;
+ //struct radius_hdr *hdr;
/**
* attr_pos - Array of indexes to attributes
@@ -41,18 +41,18 @@ struct radius_msg {
* The values are number of bytes from buf to the beginning of
* struct radius_attr_hdr.
*/
- size_t *attr_pos;
+ //size_t *attr_pos;
/**
* attr_size - Total size of the attribute pointer array
*/
- size_t attr_size;
+ //size_t attr_size;
/**
* attr_used - Total number of attributes in the array
*/
- size_t attr_used;
-};
+ //size_t attr_used;
+//};
struct radius_hdr * radius_msg_get_hdr(struct radius_msg *msg)
@@ -66,7 +66,7 @@ struct wpabuf * radius_msg_get_buf(struc
return msg->buf;
}
-
+/*
static struct radius_attr_hdr *
radius_get_attr_hdr(struct radius_msg *msg, int idx)
{
@@ -74,7 +74,7 @@ radius_get_attr_hdr(struct radius_msg *m
(wpabuf_mhead_u8(msg->buf) + msg->attr_pos[idx]);
}
-
+*/
static void radius_msg_set_hdr(struct radius_msg *msg, u8 code, u8 identifier)
{
msg->hdr->code = code;
diff -rupN hostapd-0.7.3/src/radius/radius.h src/radius/radius.h
--- hostapd-0.7.3/src/radius/radius.h 2010-09-07 08:43:39.000000000 -0700
+++ src/radius/radius.h 2011-07-25 18:44:42.000000000 -0700
@@ -21,6 +21,45 @@
#pragma pack(push, 1)
#endif /* _MSC_VER */
+/************************/
+struct radius_msg {
+ /**
+ * buf - Allocated buffer for RADIUS message
+ */
+ struct wpabuf *buf;
+
+ /**
+ * hdr - Pointer to the RADIUS header in buf
+ */
+ struct radius_hdr *hdr;
+
+ /**
+ * attr_pos - Array of indexes to attributes
+ *
+ * The values are number of bytes from buf to the beginning of
+ * struct radius_attr_hdr.
+ */
+ size_t *attr_pos;
+
+ /**
+ * attr_size - Total size of the attribute pointer array
+ */
+ size_t attr_size;
+
+ /**
+ * attr_used - Total number of attributes in the array
+ */
+ size_t attr_used;
+};
+
+
+
+
+/***********************/
+
+
+
+
struct radius_hdr {
u8 code;
u8 identifier;
@@ -201,6 +240,10 @@ void radius_msg_finish_acct(struct radiu
size_t secret_len);
struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u8 type,
const u8 *data, size_t data_len);
+
+/****************************/
+
+/*****************************/
struct radius_msg * radius_msg_parse(const u8 *data, size_t len);
int radius_msg_add_eap(struct radius_msg *msg, const u8 *data,
size_t data_len);
@@ -238,7 +281,13 @@ static inline int radius_msg_add_attr_in
u32 val = htonl(value);
return radius_msg_add_attr(msg, type, (u8 *) &val, 4) != NULL;
}
-
+/**********************/
+static struct radius_attr_hdr * radius_get_attr_hdr(struct radius_msg *msg, int idx)
+{
+ return (struct radius_attr_hdr *)
+ (wpabuf_mhead_u8(msg->buf) + msg->attr_pos[idx]);
+}
+/**************************/
static inline int radius_msg_get_attr_int32(struct radius_msg *msg, u8 type,
u32 *value)
{