Skip to content

Commit

Permalink
wcn36xx: Add GTK offload to WoWLAN path
Browse files Browse the repository at this point in the history
Using previously set GTK KCK and KEK material this commit adds GTK rekeying
to the WoWLAN suspend/resume path. A small error in the packing of the
up to now unused command structure is fixed as we go.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Tested-by: Benjamin Li <benl@squareup.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210605011140.2004643-9-bryan.odonoghue@linaro.org
  • Loading branch information
Bryan O'Donoghue authored and Kalle Valo committed Jun 14, 2021
1 parent 8974e59 commit 6693f76
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 1 deletion.
2 changes: 1 addition & 1 deletion drivers/net/wireless/ath/wcn36xx/hal.h
Original file line number Diff line number Diff line change
Expand Up @@ -4905,7 +4905,7 @@ struct wcn36xx_hal_gtk_offload_req_msg {
u64 key_replay_counter;

u8 bss_index;
};
} __packed;

struct wcn36xx_hal_gtk_offload_rsp_msg {
struct wcn36xx_hal_msg_header header;
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/wireless/ath/wcn36xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1119,6 +1119,9 @@ static int wcn36xx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wow)
if (ret)
goto out;
ret = wcn36xx_smd_ipv6_ns_offload(wcn, vif, true);
if (ret)
goto out;
ret = wcn36xx_smd_gtk_offload(wcn, vif, true);
if (ret)
goto out;
ret = wcn36xx_smd_set_power_params(wcn, true);
Expand All @@ -1139,6 +1142,7 @@ static int wcn36xx_resume(struct ieee80211_hw *hw)
vif = wcn36xx_get_first_assoc_vif(wcn);
if (vif) {
wcn36xx_smd_set_power_params(wcn, false);
wcn36xx_smd_gtk_offload(wcn, vif, false);
wcn36xx_smd_ipv6_ns_offload(wcn, vif, false);
wcn36xx_smd_arp_offload(wcn, vif, false);
}
Expand Down
39 changes: 39 additions & 0 deletions drivers/net/wireless/ath/wcn36xx/smd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2856,6 +2856,44 @@ int wcn36xx_smd_ipv6_ns_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
}
#endif

int wcn36xx_smd_gtk_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
bool enable)
{
struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
struct wcn36xx_hal_gtk_offload_req_msg msg_body;
int ret;

mutex_lock(&wcn->hal_mutex);

INIT_HAL_MSG(msg_body, WCN36XX_HAL_GTK_OFFLOAD_REQ);

if (enable) {
memcpy(&msg_body.kek, vif_priv->rekey_data.kek, NL80211_KEK_LEN);
memcpy(&msg_body.kck, vif_priv->rekey_data.kck, NL80211_KCK_LEN);
msg_body.key_replay_counter =
le64_to_cpu(vif_priv->rekey_data.replay_ctr);
msg_body.bss_index = vif_priv->bss_index;
} else {
msg_body.flags = WCN36XX_HAL_GTK_OFFLOAD_FLAGS_DISABLE;
}

PREPARE_HAL_BUF(wcn->hal_buf, msg_body);

ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
if (ret) {
wcn36xx_err("Sending host_offload_arp failed\n");
goto out;
}
ret = wcn36xx_smd_rsp_status_check(wcn->hal_buf, wcn->hal_rsp_len);
if (ret) {
wcn36xx_err("host_offload_arp failed err=%d\n", ret);
goto out;
}
out:
mutex_unlock(&wcn->hal_mutex);
return ret;
}

int wcn36xx_smd_rsp_process(struct rpmsg_device *rpdev,
void *buf, int len, void *priv, u32 addr)
{
Expand Down Expand Up @@ -2905,6 +2943,7 @@ int wcn36xx_smd_rsp_process(struct rpmsg_device *rpdev,
case WCN36XX_HAL_START_SCAN_OFFLOAD_RSP:
case WCN36XX_HAL_STOP_SCAN_OFFLOAD_RSP:
case WCN36XX_HAL_HOST_OFFLOAD_RSP:
case WCN36XX_HAL_GTK_OFFLOAD_RSP:
memcpy(wcn->hal_buf, buf, len);
wcn->hal_rsp_len = len;
complete(&wcn->hal_rsp_compl);
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/ath/wcn36xx/smd.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,7 @@ int wcn36xx_smd_arp_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
int wcn36xx_smd_ipv6_ns_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
bool enable);

int wcn36xx_smd_gtk_offload(struct wcn36xx *wcn, struct ieee80211_vif *vif,
bool enable);

#endif /* _SMD_H_ */

0 comments on commit 6693f76

Please sign in to comment.