RADIUS DAS: Allow PMKSA cache entry to be removed without association
This extends Disconnect-Request processing to check against PMKSA cache entries if no active session (STA association) match the request. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
e94a3f626d
commit
cbc210de09
5 changed files with 99 additions and 0 deletions
|
@ -12,6 +12,7 @@
|
|||
#include "utils/eloop.h"
|
||||
#include "eapol_auth/eapol_auth_sm.h"
|
||||
#include "eapol_auth/eapol_auth_sm_i.h"
|
||||
#include "radius/radius_das.h"
|
||||
#include "sta_info.h"
|
||||
#include "ap_config.h"
|
||||
#include "pmksa_cache_auth.h"
|
||||
|
@ -452,3 +453,74 @@ pmksa_cache_auth_init(void (*free_cb)(struct rsn_pmksa_cache_entry *entry,
|
|||
|
||||
return pmksa;
|
||||
}
|
||||
|
||||
|
||||
static int das_attr_match(struct rsn_pmksa_cache_entry *entry,
|
||||
struct radius_das_attrs *attr)
|
||||
{
|
||||
int match = 0;
|
||||
|
||||
if (attr->sta_addr) {
|
||||
if (os_memcmp(attr->sta_addr, entry->spa, ETH_ALEN) != 0)
|
||||
return 0;
|
||||
match++;
|
||||
}
|
||||
|
||||
if (attr->acct_multi_session_id) {
|
||||
char buf[20];
|
||||
|
||||
if (attr->acct_multi_session_id_len != 17)
|
||||
return 0;
|
||||
os_snprintf(buf, sizeof(buf), "%08X+%08X",
|
||||
entry->acct_multi_session_id_hi,
|
||||
entry->acct_multi_session_id_lo);
|
||||
if (os_memcmp(attr->acct_multi_session_id, buf, 17) != 0)
|
||||
return 0;
|
||||
match++;
|
||||
}
|
||||
|
||||
if (attr->cui) {
|
||||
if (!entry->cui ||
|
||||
attr->cui_len != wpabuf_len(entry->cui) ||
|
||||
os_memcmp(attr->cui, wpabuf_head(entry->cui),
|
||||
attr->cui_len) != 0)
|
||||
return 0;
|
||||
match++;
|
||||
}
|
||||
|
||||
if (attr->user_name) {
|
||||
if (!entry->identity ||
|
||||
attr->user_name_len != entry->identity_len ||
|
||||
os_memcmp(attr->user_name, entry->identity,
|
||||
attr->user_name_len) != 0)
|
||||
return 0;
|
||||
match++;
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
|
||||
int pmksa_cache_auth_radius_das_disconnect(struct rsn_pmksa_cache *pmksa,
|
||||
struct radius_das_attrs *attr)
|
||||
{
|
||||
int found = 0;
|
||||
struct rsn_pmksa_cache_entry *entry, *prev;
|
||||
|
||||
if (attr->acct_session_id)
|
||||
return -1;
|
||||
|
||||
entry = pmksa->pmksa;
|
||||
while (entry) {
|
||||
if (das_attr_match(entry, attr)) {
|
||||
found++;
|
||||
prev = entry;
|
||||
entry = entry->next;
|
||||
pmksa_cache_free_entry(pmksa, prev);
|
||||
continue;
|
||||
}
|
||||
entry = entry->next;
|
||||
}
|
||||
|
||||
return found ? 0 : -1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue