diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index 316376f539..4fa05f5a4e 100644 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -840,6 +840,12 @@ typedef enum { WMITLV_TAG_STRUC_wmi_vdev_limit_offchan_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_roam_rssi_rejection_oce_config_param, WMITLV_TAG_STRUC_wmi_unit_test_event_fixed_param, + WMITLV_TAG_STRUC_wmi_roam_fils_offload_tlv_param, + WMITLV_TAG_STRUC_wmi_pdev_update_pmk_cache_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_pmk_cache, + WMITLV_TAG_STRUC_wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_roam_fils_synch_tlv_param, + WMITLV_TAG_STRUC_wmi_gtk_offload_extended_tlv_param, } WMITLV_TAG_ID; /* @@ -1176,6 +1182,8 @@ typedef enum { OP(WMI_OEM_DMA_RING_CFG_REQ_CMDID) \ OP(WMI_PDEV_BSS_CHAN_INFO_REQUEST_CMDID) \ OP(WMI_VDEV_LIMIT_OFFCHAN_CMDID) \ + OP(WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID) \ + OP(WMI_PDEV_UPDATE_PMK_CACHE_CMDID) \ /* add new CMD_LIST elements above this line */ @@ -1489,8 +1497,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_RMV_BCN_FILTER_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_11r_offload_tlv_param, offload_11r_param, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_ese_offload_tlv_param, offload_ese_param, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_tlv_buf_len_param, assoc_ie_len_param, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, assoc_ie_buf, WMITLV_SIZE_VAR) - + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, assoc_ie_buf, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_fils_offload_tlv_param, offload_fils_info_param, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_SCAN_MODE); /* Roam scan Rssi Threshold Cmd */ @@ -1675,6 +1683,15 @@ WMITLV_CREATE_PARAM_STRUC(WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_channel, wmi_channel, chan, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_SET_CHANNEL_CMDID); +#define WMITLV_TABLE_WMI_PDEV_UPDATE_PMK_CACHE_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_update_pmk_cache_cmd_fixed_param, wmi_pdev_update_pmk_cache_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_pmk_cache, pmk_cache, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_UPDATE_PMK_CACHE_CMDID); + +#define WMITLV_TABLE_WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param, wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, fils_hlp_pkt, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID); /* Echo Cmd */ #define WMITLV_TABLE_WMI_ECHO_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_echo_cmd_fixed_param, wmi_echo_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) @@ -1715,7 +1732,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_P2P_GO_SET_BEACON_IE); /* GTK offload Cmd */ #define WMITLV_TABLE_WMI_GTK_OFFLOAD_CMDID(id,op,buf,len) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_WMI_GTK_OFFLOAD_CMD_fixed_param, WMI_GTK_OFFLOAD_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_WMI_GTK_OFFLOAD_CMD_fixed_param, WMI_GTK_OFFLOAD_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_gtk_offload_fils_tlv_param, wmi_fils_gtk_info, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_GTK_OFFLOAD_CMDID); @@ -3618,7 +3636,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, status, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, reassoc_req_frame, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_hw_mode_transition_event_fixed_param, hw_mode_transition_fixed_param, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_set_hw_mode_response_vdev_mac_entry, wmi_pdev_set_hw_mode_response_vdev_mac_mapping, WMITLV_SIZE_VAR) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_set_hw_mode_response_vdev_mac_entry, wmi_pdev_set_hw_mode_response_vdev_mac_mapping, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_fils_synch_tlv_param, roam_fils_synch_info, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_SYNCH_EVENTID); /* WOW Wakeup Host Event */ diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 05d971f9c3..e7e25152d6 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -370,6 +370,10 @@ typedef enum { WMI_PDEV_DIV_GET_RSSI_ANTID_CMDID, /* get bss chan info */ WMI_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, + /* update pmk cache info */ + WMI_PDEV_UPDATE_PMK_CACHE_CMDID, + /* update fils HLP */ + WMI_PDEV_UPDATE_FILS_HLP_PKT_CMDID, /* VDEV (virtual device) specific commands */ /** vdev create */ @@ -3096,6 +3100,100 @@ typedef struct { /* followed by WMITLV_TAG_ARRAY_BYTE */ } wmi_diag_event_fixed_param; + +#define WMI_MAX_PMKID_LEN 16 +#define WMI_MAX_PMK_LEN 64 + +#define WMI_PMK_CACHE_CAT_FLAG_BSSID 0x1 +#define WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID 0x2 + +#define WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY 0x1 +#define WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY 0x2 + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 pmk_len; + A_UINT8 pmk[WMI_MAX_PMK_LEN];/* for big-endian hosts, manual endian conversion will be needed to keep the array values in their original order, + in spite of the automatic byte-swap applied to WMI messages during download*/ + A_UINT32 pmkid_len; + A_UINT8 pmkid[WMI_MAX_PMKID_LEN]; + wmi_mac_addr bssid; + wmi_ssid ssid; + A_UINT32 cache_id; + A_UINT32 cat_flag; // whether (bssid) or (ssid,cache_id) is valid + A_UINT32 action_flag; // add/delete the entry +} wmi_pmk_cache; + +#define WMI_PMK_CACHE_OP_FLAG_FLUSH_ALL 0x1 + +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_pdev_update_pmk_cache_cmd_fixed_param */ + A_UINT32 op_flag; //option to flush all the cache at once + A_UINT32 vdev_id; + A_UINT32 num_cache; + /** + * TLV (tag length value) parameters follow the update_pmk_cache cmd + * structure. The TLV's are: + * wmi_pmk_cache cache_list[]; + */ +} wmi_pdev_update_pmk_cache_cmd_fixed_param; + +#define WMI_FILS_MAX_USERNAME_LEN 16 +#define WMI_FILS_MAX_REALM_LEN 256 +#define WMI_FILS_MAX_RRK_LEN 64 +#define WMI_FILS_MAX_RIK_LEN 64 + +/* for big-endian hosts, manual endian conversion will be needed to keep the array values in their original order, +in spite of the automatic byte-swap applied to WMI messages during download*/ + +typedef struct { + A_UINT8 username[WMI_FILS_MAX_USERNAME_LEN]; + A_UINT32 username_length; + A_UINT32 next_erp_seq_num; + A_UINT8 rRk[WMI_FILS_MAX_RRK_LEN]; + A_UINT32 rRk_length; + A_UINT8 rIk[WMI_FILS_MAX_RIK_LEN]; + A_UINT32 rIk_length; + A_UINT8 realm[WMI_FILS_MAX_REALM_LEN]; + A_UINT32 realm_len; +} wmi_erp_info; + +enum wmi_fils_hlp_pkt_type { + WMI_FILS_HLP_PKT_TYPE_DHCP_DISCOVER = 1, +}; + +typedef struct { + A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_roam_fils_offload_tlv_param */ + A_UINT32 flags; + wmi_erp_info vdev_erp_info; +} wmi_roam_fils_offload_tlv_param; + +typedef struct { + A_UINT32 tlv_header; /** tag WMITLV_TAG_STRUC_wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param**/ + A_UINT32 flags; + A_UINT32 vdev_id; + A_UINT32 size; + A_UINT32 pkt_type; // filled using enum wmi_fils_hlp_pkt_type + // A_UINT8 fils_hlp_pkt[]; +} wmi_pdev_update_fils_hlp_pkt_cmd_fixed_param; + +#define WMI_MAX_KEK_LEN 64 +#define GTK_OFFLOAD_KEK_EXTENDED_BYTES WMI_MAX_KEK_LEN /*KEK len has been increased to 64 to support FILS security. + To not break backward compatibility, new GTK_OFFLOAD_KEK_EXTENDED_BYTES has been defined without modifying old GTK_OFFLOAD_KEK_BYTES */ + +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_roam_fils_synch_tlv_param */ + A_UINT32 update_erp_next_seq_num;// Boolean denoting whether next erp_seq_num changed or not. + A_UINT32 next_erp_seq_num; + A_UINT32 kek_len; + A_UINT8 kek[WMI_MAX_KEK_LEN]; + A_UINT32 pmk_len; + A_UINT8 pmk[WMI_MAX_PMK_LEN]; + A_UINT8 pmkid[WMI_MAX_PMKID_LEN]; + A_UINT8 realm[WMI_FILS_MAX_REALM_LEN]; + A_UINT32 realm_len; +} wmi_roam_fils_synch_tlv_param; + /* * If FW has multiple active channels due to MCC(multi channel concurrency), * then these stats are combined stats for all the active channels. @@ -9450,6 +9548,8 @@ enum { WMI_AUTH_RSNA_8021X_SHA256, WMI_AUTH_CCKM_WPA, WMI_AUTH_CCKM_RSNA, + WMI_AUTH_RSNA_FILS_SHA256, + WMI_AUTH_RSNA_FILS_SHA384, }; typedef struct { @@ -11621,6 +11721,16 @@ typedef struct { A_UINT8 replay_counter[GTK_REPLAY_COUNTER_BYTES]; /* replay counter for re-key */ } WMI_GTK_OFFLOAD_CMD_fixed_param; +typedef struct { + A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_gtk_offload_extended_tlv_param */ + A_UINT32 vdev_id; /** unique id identifying the VDEV */ + A_UINT32 flags; /* control flags, GTK offload command use high byte */ + A_UINT32 kek_len; + A_UINT8 KEK[GTK_OFFLOAD_KEK_EXTENDED_BYTES]; /* key encryption key */ + A_UINT8 KCK[GTK_OFFLOAD_KCK_BYTES]; /* key confirmation key */ + A_UINT8 replay_counter[GTK_REPLAY_COUNTER_BYTES]; /* replay counter for re-key */ +} wmi_gtk_offload_fils_tlv_param; + typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_WMI_PMF_OFFLOAD_SET_SA_QUERY_CMD_fixed_param */ A_UINT32 vdev_id; diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 89fe16baf0..3974af3cb6 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 419 +#define __WMI_REVISION_ 420 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work