AP: Allow identifying which passphrase station used with wpa_psk_file
It is now possible to optionally specify keyid for each wpa_psk_file entry: keyid=something 00:00:00:00:00:00 secretpassphrase When station connects and the passphrase it used has an associated keyid it will be appended to the AP-STA-CONNECTED event string: wlan0: AP-STA-CONNECTED 00:36:76:21:dc:7b keyid=something It's also possible to retrieve it through the control interface: $ hostapd_cli all_sta Selected interface 'ap0' 00:36:76:21:dc:7b ... keyid=something New hostapd is able to read old wpa_psk_file. However, old hostapd will not be able to read the new wpa_psk_file if it includes keyids. Signed-off-by: Michal Kazior <michal@plume.com>
This commit is contained in:
parent
b08c9ad0c7
commit
ec5c39a557
6 changed files with 103 additions and 9 deletions
|
@ -259,6 +259,12 @@ static int hostapd_config_read_wpa_psk(const char *fname,
|
|||
{
|
||||
FILE *f;
|
||||
char buf[128], *pos;
|
||||
const char *keyid;
|
||||
char *context;
|
||||
char *context2;
|
||||
char *token;
|
||||
char *name;
|
||||
char *value;
|
||||
int line = 0, ret = 0, len, ok;
|
||||
u8 addr[ETH_ALEN];
|
||||
struct hostapd_wpa_psk *psk;
|
||||
|
@ -288,9 +294,35 @@ static int hostapd_config_read_wpa_psk(const char *fname,
|
|||
if (buf[0] == '\0')
|
||||
continue;
|
||||
|
||||
if (hwaddr_aton(buf, addr)) {
|
||||
context = NULL;
|
||||
keyid = NULL;
|
||||
while ((token = str_token(buf, " ", &context))) {
|
||||
if (!os_strchr(token, '='))
|
||||
break;
|
||||
context2 = NULL;
|
||||
name = str_token(token, "=", &context2);
|
||||
value = str_token(token, "", &context2);
|
||||
if (!value)
|
||||
value = "";
|
||||
if (!os_strcmp(name, "keyid")) {
|
||||
keyid = value;
|
||||
} else {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"Unrecognized '%s=%s' on line %d in '%s'",
|
||||
name, value, line, fname);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == -1)
|
||||
break;
|
||||
|
||||
if (!token)
|
||||
token = "";
|
||||
if (hwaddr_aton(token, addr)) {
|
||||
wpa_printf(MSG_ERROR, "Invalid MAC address '%s' on "
|
||||
"line %d in '%s'", buf, line, fname);
|
||||
"line %d in '%s'", token, line, fname);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
@ -306,15 +338,14 @@ static int hostapd_config_read_wpa_psk(const char *fname,
|
|||
else
|
||||
os_memcpy(psk->addr, addr, ETH_ALEN);
|
||||
|
||||
pos = buf + 17;
|
||||
if (*pos == '\0') {
|
||||
pos = str_token(buf, "", &context);
|
||||
if (!pos) {
|
||||
wpa_printf(MSG_ERROR, "No PSK on line %d in '%s'",
|
||||
line, fname);
|
||||
os_free(psk);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
|
||||
ok = 0;
|
||||
len = os_strlen(pos);
|
||||
|
@ -333,6 +364,18 @@ static int hostapd_config_read_wpa_psk(const char *fname,
|
|||
break;
|
||||
}
|
||||
|
||||
if (keyid) {
|
||||
len = os_strlcpy(psk->keyid, keyid, sizeof(psk->keyid));
|
||||
if ((size_t) len >= sizeof(psk->keyid)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"PSK keyid too long on line %d in '%s'",
|
||||
line, fname);
|
||||
os_free(psk);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
psk->next = ssid->wpa_psk;
|
||||
ssid->wpa_psk = psk;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue