|
@@ -123,6 +123,7 @@
|
|
|
#include "wlan_reg_ucfg_api.h"
|
|
|
#include "wlan_hdd_rx_monitor.h"
|
|
|
#include "sme_power_save_api.h"
|
|
|
+#include "enet.h"
|
|
|
|
|
|
#ifdef CNSS_GENL
|
|
|
#include <net/cnss_nl.h>
|
|
@@ -4848,6 +4849,64 @@ static inline void hdd_populate_fils_params(struct cfg80211_connect_resp_params
|
|
|
{ }
|
|
|
#endif
|
|
|
|
|
|
+/**
|
|
|
+ * hdd_update_hlp_info() - Update HLP packet received in FILS assoc rsp
|
|
|
+ * @dev: net device
|
|
|
+ * @roam_fils_params: Fils join rsp params
|
|
|
+ *
|
|
|
+ * This API is used to send the received HLP packet in Assoc rsp(FILS AKM)
|
|
|
+ * to the network layer.
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+static void hdd_update_hlp_info(struct net_device *dev,
|
|
|
+ struct fils_join_rsp_params *roam_fils_params)
|
|
|
+{
|
|
|
+ struct sk_buff *skb;
|
|
|
+ uint16_t skb_len;
|
|
|
+ struct llc_snap_hdr_t *llc_hdr;
|
|
|
+ QDF_STATUS status;
|
|
|
+ uint8_t *hlp_data = roam_fils_params->hlp_data;
|
|
|
+ uint16_t hlp_data_len = roam_fils_params->hlp_data_len;
|
|
|
+ struct hdd_adapter *padapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
|
|
+
|
|
|
+ /* Calculate skb length */
|
|
|
+ skb_len = (2 * ETH_ALEN) + hlp_data_len;
|
|
|
+ skb = qdf_nbuf_alloc(NULL, skb_len, 0, 4, false);
|
|
|
+ if (skb == NULL) {
|
|
|
+ hdd_err("HLP packet nbuf alloc fails");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ qdf_mem_copy(skb_put(skb, ETH_ALEN), roam_fils_params->dst_mac.bytes,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+ qdf_mem_copy(skb_put(skb, ETH_ALEN), roam_fils_params->src_mac.bytes,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+
|
|
|
+ llc_hdr = (struct llc_snap_hdr_t *) hlp_data;
|
|
|
+ if (IS_SNAP(llc_hdr)) {
|
|
|
+ hlp_data += LLC_SNAP_HDR_OFFSET_ETHERTYPE;
|
|
|
+ hlp_data_len += LLC_SNAP_HDR_OFFSET_ETHERTYPE;
|
|
|
+ }
|
|
|
+
|
|
|
+ qdf_mem_copy(skb_put(skb, hlp_data_len), hlp_data, hlp_data_len);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This HLP packet is formed from HLP info encapsulated
|
|
|
+ * in assoc response frame which is AEAD encrypted.
|
|
|
+ * Hence, this checksum validation can be set unnecessary.
|
|
|
+ * i.e. network layer need not worry about checksum.
|
|
|
+ */
|
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
+
|
|
|
+ status = hdd_rx_packet_cbk(padapter, skb);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ hdd_err("Sending HLP packet fails");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ hdd_debug("send HLP packet to netif successfully");
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* hdd_connect_done() - Wrapper API to call cfg80211_connect_done
|
|
|
* @dev: network device
|
|
@@ -4904,6 +4963,9 @@ static void hdd_connect_done(struct net_device *dev, const u8 *bssid,
|
|
|
|
|
|
cfg80211_connect_done(dev, &fils_params, gfp);
|
|
|
|
|
|
+ if (roam_fils_params && roam_fils_params->hlp_data_len)
|
|
|
+ hdd_update_hlp_info(dev, roam_fils_params);
|
|
|
+
|
|
|
/* Clear all the FILS key info */
|
|
|
if (roam_fils_params && roam_fils_params->fils_pmk)
|
|
|
qdf_mem_free(roam_fils_params->fils_pmk);
|
|
@@ -4921,6 +4983,11 @@ static inline void hdd_connect_done(struct net_device *dev, const u8 *bssid,
|
|
|
timeout_reason, struct fils_join_rsp_params
|
|
|
*roam_fils_params)
|
|
|
{ }
|
|
|
+
|
|
|
+static inline void hdd_update_hlp_info(struct net_device *dev,
|
|
|
+ struct fils_join_rsp_params *roam_fils_params)
|
|
|
+
|
|
|
+{ }
|
|
|
#endif
|
|
|
#endif
|
|
|
|