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;iattr_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) {