Add vlan_id to driver set_key() operation

This is in preparation for adding support to use a single WLAN netdev
with VLAN operations offloaded to the driver. No functional changes are
included in this commit.

Signed-off-by: Gurumoorthi Gnanasambandhan <gguru@codeaurora.org>
This commit is contained in:
Gurumoorthi Gnanasambandhan 2019-12-05 12:38:47 +02:00 committed by Jouni Malinen
parent f822546451
commit 4d3ae54fbd
8 changed files with 36 additions and 30 deletions

View file

@ -2154,7 +2154,7 @@ static int hostapd_ctrl_reset_pn(struct hostapd_data *hapd, const char *cmd)
if (hostapd_drv_set_key(hapd->conf->iface, hapd, if (hostapd_drv_set_key(hapd->conf->iface, hapd,
hapd->last_igtk_alg, hapd->last_igtk_alg,
broadcast_ether_addr, broadcast_ether_addr,
hapd->last_igtk_key_idx, 1, NULL, 0, hapd->last_igtk_key_idx, 0, 1, NULL, 0,
zero, hapd->last_igtk_len) < 0) zero, hapd->last_igtk_len) < 0)
return -1; return -1;
@ -2162,8 +2162,8 @@ static int hostapd_ctrl_reset_pn(struct hostapd_data *hapd, const char *cmd)
return hostapd_drv_set_key(hapd->conf->iface, hapd, return hostapd_drv_set_key(hapd->conf->iface, hapd,
hapd->last_igtk_alg, hapd->last_igtk_alg,
broadcast_ether_addr, broadcast_ether_addr,
hapd->last_igtk_key_idx, 1, NULL, 0, hapd->last_igtk_key_idx, 0, 1, NULL,
hapd->last_igtk, 0, hapd->last_igtk,
hapd->last_igtk_len); hapd->last_igtk_len);
} }
@ -2178,7 +2178,7 @@ static int hostapd_ctrl_reset_pn(struct hostapd_data *hapd, const char *cmd)
if (hostapd_drv_set_key(hapd->conf->iface, hapd, if (hostapd_drv_set_key(hapd->conf->iface, hapd,
hapd->last_gtk_alg, hapd->last_gtk_alg,
broadcast_ether_addr, broadcast_ether_addr,
hapd->last_gtk_key_idx, 1, NULL, 0, hapd->last_gtk_key_idx, 0, 1, NULL, 0,
zero, hapd->last_gtk_len) < 0) zero, hapd->last_gtk_len) < 0)
return -1; return -1;
@ -2186,8 +2186,9 @@ static int hostapd_ctrl_reset_pn(struct hostapd_data *hapd, const char *cmd)
return hostapd_drv_set_key(hapd->conf->iface, hapd, return hostapd_drv_set_key(hapd->conf->iface, hapd,
hapd->last_gtk_alg, hapd->last_gtk_alg,
broadcast_ether_addr, broadcast_ether_addr,
hapd->last_gtk_key_idx, 1, NULL, 0, hapd->last_gtk_key_idx, 0, 1, NULL,
hapd->last_gtk, hapd->last_gtk_len); 0, hapd->last_gtk,
hapd->last_gtk_len);
} }
sta = ap_get_sta(hapd, addr); sta = ap_get_sta(hapd, addr);
@ -2203,14 +2204,14 @@ static int hostapd_ctrl_reset_pn(struct hostapd_data *hapd, const char *cmd)
/* First, use a zero key to avoid any possible duplicate key avoidance /* First, use a zero key to avoid any possible duplicate key avoidance
* in the driver. */ * in the driver. */
if (hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg, if (hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg,
sta->addr, sta->last_tk_key_idx, 1, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 1, NULL, 0,
zero, sta->last_tk_len) < 0) zero, sta->last_tk_len) < 0)
return -1; return -1;
/* Set the previously configured key to reset its TSC/RSC */ /* Set the previously configured key to reset its TSC/RSC */
return hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg, return hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg,
sta->addr, sta->last_tk_key_idx, 1, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 1, NULL,
sta->last_tk, sta->last_tk_len); 0, sta->last_tk, sta->last_tk_len);
} }
@ -2257,7 +2258,7 @@ static int hostapd_ctrl_set_key(struct hostapd_data *hapd, const char *cmd)
return -1; return -1;
wpa_printf(MSG_INFO, "TESTING: Set key"); wpa_printf(MSG_INFO, "TESTING: Set key");
return hostapd_drv_set_key(hapd->conf->iface, hapd, alg, addr, idx, return hostapd_drv_set_key(hapd->conf->iface, hapd, alg, addr, idx, 0,
set_tx, seq, 6, key, key_len); set_tx, seq, 6, key, key_len);
} }
@ -2273,7 +2274,7 @@ static void restore_tk(void *ctx1, void *ctx2)
* in replay protection issues for now since there is no clean way of * in replay protection issues for now since there is no clean way of
* preventing encryption of a single EAPOL frame. */ * preventing encryption of a single EAPOL frame. */
hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg, hostapd_drv_set_key(hapd->conf->iface, hapd, sta->last_tk_alg,
sta->addr, sta->last_tk_key_idx, 1, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 1, NULL, 0,
sta->last_tk, sta->last_tk_len); sta->last_tk, sta->last_tk_len);
} }
@ -2297,8 +2298,8 @@ static int hostapd_ctrl_resend_m1(struct hostapd_data *hapd, const char *cmd)
wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR, wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR,
MAC2STR(sta->addr)); MAC2STR(sta->addr));
hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE, hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE,
sta->addr, sta->last_tk_key_idx, 0, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 0, NULL,
NULL, 0); 0, NULL, 0);
} }
wpa_printf(MSG_INFO, "TESTING: Send M1 to " MACSTR, MAC2STR(sta->addr)); wpa_printf(MSG_INFO, "TESTING: Send M1 to " MACSTR, MAC2STR(sta->addr));
@ -2327,8 +2328,8 @@ static int hostapd_ctrl_resend_m3(struct hostapd_data *hapd, const char *cmd)
wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR, wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR,
MAC2STR(sta->addr)); MAC2STR(sta->addr));
hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE, hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE,
sta->addr, sta->last_tk_key_idx, 0, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 0, NULL,
NULL, 0); 0, NULL, 0);
} }
wpa_printf(MSG_INFO, "TESTING: Send M3 to " MACSTR, MAC2STR(sta->addr)); wpa_printf(MSG_INFO, "TESTING: Send M3 to " MACSTR, MAC2STR(sta->addr));
@ -2357,8 +2358,8 @@ static int hostapd_ctrl_resend_group_m1(struct hostapd_data *hapd,
wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR, wpa_printf(MSG_INFO, "TESTING: Clear TK for " MACSTR,
MAC2STR(sta->addr)); MAC2STR(sta->addr));
hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE, hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE,
sta->addr, sta->last_tk_key_idx, 0, NULL, 0, sta->addr, sta->last_tk_key_idx, 0, 0, NULL,
NULL, 0); 0, NULL, 0);
} }
wpa_printf(MSG_INFO, wpa_printf(MSG_INFO,

View file

@ -680,7 +680,7 @@ int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start,
int hostapd_drv_set_key(const char *ifname, struct hostapd_data *hapd, int hostapd_drv_set_key(const char *ifname, struct hostapd_data *hapd,
enum wpa_alg alg, const u8 *addr, enum wpa_alg alg, const u8 *addr,
int key_idx, int set_tx, int key_idx, int vlan_id, int set_tx,
const u8 *seq, size_t seq_len, const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len) const u8 *key, size_t key_len)
{ {
@ -699,6 +699,7 @@ int hostapd_drv_set_key(const char *ifname, struct hostapd_data *hapd,
params.seq_len = seq_len; params.seq_len = seq_len;
params.key = key; params.key = key;
params.key_len = key_len; params.key_len = key_len;
params.vlan_id = vlan_id;
return hapd->driver->set_key(hapd->drv_priv, &params); return hapd->driver->set_key(hapd->drv_priv, &params);
} }

View file

@ -89,7 +89,7 @@ int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start,
int hostapd_drv_set_key(const char *ifname, int hostapd_drv_set_key(const char *ifname,
struct hostapd_data *hapd, struct hostapd_data *hapd,
enum wpa_alg alg, const u8 *addr, enum wpa_alg alg, const u8 *addr,
int key_idx, int set_tx, int key_idx, int vlan_id, int set_tx,
const u8 *seq, size_t seq_len, const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len); const u8 *key, size_t key_len);
int hostapd_drv_send_mlme(struct hostapd_data *hapd, int hostapd_drv_send_mlme(struct hostapd_data *hapd,

View file

@ -292,7 +292,7 @@ static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
if (!ifname || !hapd->drv_priv) if (!ifname || !hapd->drv_priv)
return; return;
for (i = 0; i < NUM_WEP_KEYS; i++) { for (i = 0; i < NUM_WEP_KEYS; i++) {
if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, NULL, i, if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, NULL, i, 0,
0, NULL, 0, NULL, 0)) { 0, NULL, 0, NULL, 0)) {
wpa_printf(MSG_DEBUG, "Failed to clear default " wpa_printf(MSG_DEBUG, "Failed to clear default "
"encryption keys (ifname=%s keyidx=%d)", "encryption keys (ifname=%s keyidx=%d)",
@ -302,7 +302,7 @@ static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
if (hapd->conf->ieee80211w) { if (hapd->conf->ieee80211w) {
for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) { for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) {
if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE,
NULL, i, 0, NULL, NULL, i, 0, 0, NULL,
0, NULL, 0)) { 0, NULL, 0)) {
wpa_printf(MSG_DEBUG, "Failed to clear " wpa_printf(MSG_DEBUG, "Failed to clear "
"default mgmt encryption keys " "default mgmt encryption keys "
@ -328,7 +328,7 @@ static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
idx = ssid->wep.idx; idx = ssid->wep.idx;
if (ssid->wep.default_len && if (ssid->wep.default_len &&
hostapd_drv_set_key(hapd->conf->iface, hostapd_drv_set_key(hapd->conf->iface,
hapd, WPA_ALG_WEP, broadcast_ether_addr, idx, hapd, WPA_ALG_WEP, broadcast_ether_addr, idx, 0,
1, NULL, 0, ssid->wep.key[idx], 1, NULL, 0, ssid->wep.key[idx],
ssid->wep.len[idx])) { ssid->wep.len[idx])) {
wpa_printf(MSG_WARNING, "Could not set WEP encryption."); wpa_printf(MSG_WARNING, "Could not set WEP encryption.");
@ -553,7 +553,7 @@ static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd)
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (hapd->conf->ssid.wep.key[i] && if (hapd->conf->ssid.wep.key[i] &&
hostapd_drv_set_key(iface, hapd, WPA_ALG_WEP, NULL, i, hostapd_drv_set_key(iface, hapd, WPA_ALG_WEP, NULL, i, 0,
i == hapd->conf->ssid.wep.idx, NULL, 0, i == hapd->conf->ssid.wep.idx, NULL, 0,
hapd->conf->ssid.wep.key[i], hapd->conf->ssid.wep.key[i],
hapd->conf->ssid.wep.len[i])) { hapd->conf->ssid.wep.len[i])) {

View file

@ -4911,7 +4911,7 @@ static void hostapd_set_wds_encryption(struct hostapd_data *hapd,
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (ssid->wep.key[i] && if (ssid->wep.key[i] &&
hostapd_drv_set_key(ifname_wds, hapd, WPA_ALG_WEP, NULL, i, hostapd_drv_set_key(ifname_wds, hapd, WPA_ALG_WEP, NULL, i,
i == ssid->wep.idx, NULL, 0, 0, i == ssid->wep.idx, NULL, 0,
ssid->wep.key[i], ssid->wep.len[i])) { ssid->wep.key[i], ssid->wep.len[i])) {
wpa_printf(MSG_WARNING, wpa_printf(MSG_WARNING,
"Could not set WEP keys for WDS interface; %s", "Could not set WEP keys for WDS interface; %s",

View file

@ -284,7 +284,7 @@ static void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
/* TODO: set encryption in TX callback, i.e., only after STA /* TODO: set encryption in TX callback, i.e., only after STA
* has ACKed EAPOL-Key frame */ * has ACKed EAPOL-Key frame */
if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP, if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
sta->addr, 0, 1, NULL, 0, ikey, sta->addr, 0, 0, 1, NULL, 0, ikey,
hapd->conf->individual_wep_key_len)) { hapd->conf->individual_wep_key_len)) {
wpa_printf(MSG_ERROR, wpa_printf(MSG_ERROR,
"Could not set individual WEP encryption"); "Could not set individual WEP encryption");
@ -2177,7 +2177,7 @@ static void ieee802_1x_rekey(void *eloop_ctx, void *timeout_ctx)
* after new broadcast key has been sent to all stations. */ * after new broadcast key has been sent to all stations. */
if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP, if (hostapd_drv_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
broadcast_ether_addr, broadcast_ether_addr,
eapol->default_wep_key_idx, 1, NULL, 0, eapol->default_wep_key_idx, 0, 1, NULL, 0,
eapol->default_wep_key, eapol->default_wep_key,
hapd->conf->default_wep_key_len)) { hapd->conf->default_wep_key_len)) {
hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X, hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
@ -2470,8 +2470,8 @@ int ieee802_1x_init(struct hostapd_data *hapd)
if (hapd->conf->default_wep_key_len) { if (hapd->conf->default_wep_key_len) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
hostapd_drv_set_key(hapd->conf->iface, hapd, hostapd_drv_set_key(hapd->conf->iface, hapd,
WPA_ALG_NONE, NULL, i, 0, NULL, 0, WPA_ALG_NONE, NULL, i, 0, 0, NULL,
NULL, 0); 0, NULL, 0);
ieee802_1x_rekey(hapd, NULL); ieee802_1x_rekey(hapd, NULL);

View file

@ -418,8 +418,8 @@ static int hostapd_wpa_auth_set_key(void *ctx, int vlan_id, enum wpa_alg alg,
hapd->last_gtk_len = key_len; hapd->last_gtk_len = key_len;
} }
#endif /* CONFIG_TESTING_OPTIONS */ #endif /* CONFIG_TESTING_OPTIONS */
return hostapd_drv_set_key(ifname, hapd, alg, addr, idx, 1, NULL, 0, return hostapd_drv_set_key(ifname, hapd, alg, addr, idx, vlan_id, 1,
key, key_len); NULL, 0, key, key_len);
} }

View file

@ -1588,6 +1588,10 @@ struct wpa_driver_set_key_params {
* *
* WEP: 5 or 13, TKIP: 32, CCMP/GCMP: 16, IGTK: 16 */ * WEP: 5 or 13, TKIP: 32, CCMP/GCMP: 16, IGTK: 16 */
size_t key_len; size_t key_len;
/**
* vlan_id - VLAN index (0..4095) for VLAN offload cases */
int vlan_id;
}; };
/** /**