Ver Fonte

qcacld-3.0: Add ECSA Target TSF attribute in QCN IE

Add ECSA Target TSF attribute in QCN IE. This attribute
will be included in regular ECSA public action frame and
will be use to send target_tsf and twt_switch_mode to
earbud during LL_LT_SAP CSA.

Change-Id: Ic86bf1b4e8e8516a5774371815d7566f00fee12a
CRs-Fixed: 3490521
Jyoti Kumari há 1 ano atrás
pai
commit
e6d59327e8

+ 9 - 0
core/mac/src/cfg/cfgUtil/dot11f.frms

@@ -2751,6 +2751,7 @@ const TLV_TRANSITION_REJECTIONP_ATTR_ID   = 7;
 const TLV_HE_DL_MUMIMO_SUPPP_ATTR_ID      = 8;
 const TLV_HE_MCS_11_12_ATTR_ID            = 9;
 const TLV_EDCA_PIFS_PARAM_ATTR_ID         = 13;
+const TLV_ECSA_TARGET_TSF_INFO_ATTR_ID    = 14;
 
 TLV qcn_version(TLV_VERSION_ATTR_ID) ( 1 : 1 ) LSB
 {
@@ -2806,6 +2807,12 @@ TLV edca_pifs_param_attr (TLV_EDCA_PIFS_PARAM_ATTR_ID) ( 1 : 1 ) LSB
    data[3..4];
 }
 
+TLV ecsa_target_tsf_info_attr (TLV_ECSA_TARGET_TSF_INFO_ATTR_ID) ( 1 : 1 ) LSB
+{
+    twt_ch_sw_mode, 1;
+    target_tsf, 8;
+}
+
 MULTIIE qcn_ie (EID_VENDOR_SPECIFIC) OUI ( 0x8C, 0xFD, 0xF0, 0x01 )
 {
    OPTIONALTLV qcn_version;
@@ -2818,6 +2825,7 @@ MULTIIE qcn_ie (EID_VENDOR_SPECIFIC) OUI ( 0x8C, 0xFD, 0xF0, 0x01 )
    OPTIONALTLV he_dl_mumimo_attr;
    OPTIONALTLV he_mcs13_attr;
    OPTIONALTLV edca_pifs_param_attr;
+   OPTIONALTLV ecsa_target_tsf_info_attr;
 }
 
 IE esp_information (EID_EXTN_ID_ELEMENT) OUI ( 0x0B )
@@ -4837,6 +4845,7 @@ FRAME ext_channel_switch_action_frame
     FF     Action;
     FF     ext_chan_switch_ann_action;
     OPTIE  WiderBWChanSwitchAnn;
+    OPTIE  qcn_ie;
 }
 
 FRAME p2p_oper_chan_change_confirm

+ 43 - 2
core/mac/src/include/dot11f.h

@@ -27,7 +27,7 @@
  *
  *
  * This file was automatically generated by 'framesc'
- * Wed May  3 14:05:58 2023 from the following file(s):
+ * Thu May 18 15:31:21 2023 from the following file(s):
  *
  * dot11f.frms
  *
@@ -2213,6 +2213,45 @@ uint32_t dot11f_get_packed_tlv_cellular_data_con_pref(
 }; /* End extern "C". */
 #endif /* C++ */
 
+/* ID 14 (0x000e) */
+typedef struct sDot11fTLVecsa_target_tsf_info_attr {
+	uint8_t             present;
+	uint8_t             twt_ch_sw_mode;
+	tDOT11F_U64         target_tsf;
+} tDot11fTLVecsa_target_tsf_info_attr;
+
+#define DOT11F_TLV_ECSA_TARGET_TSF_INFO_ATTR (14)
+
+/* N.B. These #defines do *not* include the ID & length */
+#define DOT11F_TLV_ECSA_TARGET_TSF_INFO_ATTR_MIN_LEN (9)
+
+#define DOT11F_TLV_ECSA_TARGET_TSF_INFO_ATTR_MAX_LEN (9)
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+uint32_t dot11f_unpack_tlv_ecsa_target_tsf_info_attr(
+	tpAniSirGlobal,
+	uint8_t *,
+	uint16_t,
+	tDot11fTLVecsa_target_tsf_info_attr*);
+
+uint32_t dot11f_pack_tlv_ecsa_target_tsf_info_attr(
+	tpAniSirGlobal,
+	tDot11fTLVecsa_target_tsf_info_attr *,
+	uint8_t *,
+	uint32_t,
+	uint32_t*);
+
+uint32_t dot11f_get_packed_tlv_ecsa_target_tsf_info_attr(
+	tpAniSirGlobal,
+	tDot11fTLVecsa_target_tsf_info_attr *,
+	uint32_t*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
+
 /* ID 13 (0x000d) */
 typedef struct sDot11fTLVedca_pifs_param_attr {
 	uint8_t             present;
@@ -10174,6 +10213,7 @@ typedef struct sDot11fIEqcn_ie {
 	tDot11fTLVhe_dl_mumimo_attr he_dl_mumimo_attr;
 	tDot11fTLVhe_mcs13_attr he_mcs13_attr;
 	tDot11fTLVedca_pifs_param_attr edca_pifs_param_attr;
+	tDot11fTLVecsa_target_tsf_info_attr ecsa_target_tsf_info_attr;
 } tDot11fIEqcn_ie;
 
 #define DOT11F_EID_QCN_IE (221)
@@ -10181,7 +10221,7 @@ typedef struct sDot11fIEqcn_ie {
 /* N.B. These #defines do *not* include the EID & length */
 #define DOT11F_IE_QCN_IE_MIN_LEN (4)
 
-#define DOT11F_IE_QCN_IE_MAX_LEN (42)
+#define DOT11F_IE_QCN_IE_MAX_LEN (53)
 
 #ifdef __cplusplus
 extern "C" {
@@ -12404,6 +12444,7 @@ typedef struct sDot11fext_channel_switch_action_frame{
 	tDot11fFfAction                            Action;
 	tDot11fFfext_chan_switch_ann_action        ext_chan_switch_ann_action;
 	tDot11fIEWiderBWChanSwitchAnn              WiderBWChanSwitchAnn;
+	tDot11fIEqcn_ie                            qcn_ie;
 } tDot11fext_channel_switch_action_frame;
 
 #define DOT11F_EXT_CHANNEL_SWITCH_ACTION_FRAME (49)

+ 115 - 27
core/mac/src/sys/legacy/src/utils/src/dot11f.c

@@ -25,7 +25,7 @@
  *
  *
  * This file was automatically generated by 'framesc'
- * Wed May  3 14:05:58 2023 from the following file(s):
+ * Thu May 18 15:31:21 2023 from the following file(s):
  *
  * dot11f.frms
  *
@@ -1551,6 +1551,36 @@ uint32_t dot11f_unpack_tlv_version(tpAniSirGlobal pCtx,
 #define SigTlvcellular_data_con_pref (0x0027)
 
 
+uint32_t dot11f_unpack_tlv_ecsa_target_tsf_info_attr(tpAniSirGlobal pCtx,
+						     uint8_t *pBuf,
+						     uint16_t tlvlen,
+						     tDot11fTLVecsa_target_tsf_info_attr *pDst)
+{
+	uint32_t status = DOT11F_PARSE_SUCCESS;
+	pDst->present = 1;
+	if (unlikely(tlvlen < 1)) {
+		pDst->present = 0;
+		return DOT11F_INCOMPLETE_IE;
+	}
+
+	pDst->twt_ch_sw_mode = *pBuf;
+	pBuf += 1;
+	tlvlen -= (uint8_t)1;
+	if (unlikely(tlvlen < 8)) {
+		pDst->present = 0;
+		return DOT11F_INCOMPLETE_IE;
+	}
+
+	framesntohq(pCtx, &pDst->target_tsf, pBuf, 0);
+	pBuf += 8;
+	tlvlen -= (uint8_t)8;
+	(void)pCtx;
+	return status;
+} /* End dot11f_unpack_tlv_ecsa_target_tsf_info_attr. */
+
+#define SigTlvecsa_target_tsf_info_attr (0x0028)
+
+
 uint32_t dot11f_unpack_tlv_edca_pifs_param_attr(tpAniSirGlobal pCtx,
 						 uint8_t *pBuf,
 						 uint16_t tlvlen,
@@ -1579,10 +1609,10 @@ uint32_t dot11f_unpack_tlv_edca_pifs_param_attr(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_edca_pifs_param_attr. */
 
-#define SigTlvedca_pifs_param_attr (0x0028)
+#define SigTlvedca_pifs_param_attr (0x0029)
 
 
-#define SigTlvhe_2xltf_160mhz_supp (0x0029)
+#define SigTlvhe_2xltf_160mhz_supp (0x002a)
 
 
 uint32_t dot11f_unpack_tlv_he_400ns_sgi_attr(tpAniSirGlobal pCtx,
@@ -1620,13 +1650,13 @@ uint32_t dot11f_unpack_tlv_he_400ns_sgi_attr(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_he_400ns_sgi_attr. */
 
-#define SigTlvhe_400ns_sgi_attr (0x002a)
+#define SigTlvhe_400ns_sgi_attr (0x002b)
 
 
-#define SigTlvhe_dl_mumimo_attr (0x002b)
+#define SigTlvhe_dl_mumimo_attr (0x002c)
 
 
-#define SigTlvhe_dl_ofdma_attr (0x002c)
+#define SigTlvhe_dl_ofdma_attr (0x002d)
 
 
 uint32_t dot11f_unpack_tlv_he_mcs13_attr(tpAniSirGlobal pCtx,
@@ -1656,10 +1686,10 @@ uint32_t dot11f_unpack_tlv_he_mcs13_attr(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_he_mcs13_attr. */
 
-#define SigTlvhe_mcs13_attr (0x002d)
+#define SigTlvhe_mcs13_attr (0x002e)
 
 
-#define SigTlvmbo_ap_cap (0x002e)
+#define SigTlvmbo_ap_cap (0x002f)
 
 
 uint32_t dot11f_unpack_tlv_non_prefferd_chan_rep(tpAniSirGlobal pCtx,
@@ -1690,7 +1720,7 @@ uint32_t dot11f_unpack_tlv_non_prefferd_chan_rep(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_non_prefferd_chan_rep. */
 
-#define SigTlvnon_prefferd_chan_rep (0x002f)
+#define SigTlvnon_prefferd_chan_rep (0x0030)
 
 
 uint32_t dot11f_unpack_tlv_oce_cap(tpAniSirGlobal pCtx,
@@ -1717,7 +1747,7 @@ uint32_t dot11f_unpack_tlv_oce_cap(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_oce_cap. */
 
-#define SigTlvoce_cap (0x0030)
+#define SigTlvoce_cap (0x0031)
 
 
 uint32_t dot11f_unpack_tlv_qcn_version(tpAniSirGlobal pCtx,
@@ -1747,7 +1777,7 @@ uint32_t dot11f_unpack_tlv_qcn_version(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_qcn_version. */
 
-#define SigTlvqcn_version (0x0031)
+#define SigTlvqcn_version (0x0032)
 
 
 uint32_t dot11f_unpack_tlv_reduced_wan_metrics(tpAniSirGlobal pCtx,
@@ -1772,7 +1802,7 @@ uint32_t dot11f_unpack_tlv_reduced_wan_metrics(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_reduced_wan_metrics. */
 
-#define SigTlvreduced_wan_metrics (0x0032)
+#define SigTlvreduced_wan_metrics (0x0033)
 
 
 uint32_t dot11f_unpack_tlv_rssi_assoc_rej(tpAniSirGlobal pCtx,
@@ -1802,22 +1832,22 @@ uint32_t dot11f_unpack_tlv_rssi_assoc_rej(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_rssi_assoc_rej. */
 
-#define SigTlvrssi_assoc_rej (0x0033)
+#define SigTlvrssi_assoc_rej (0x0034)
 
 
-#define SigTlvtrans_reasonp_attr (0x0034)
+#define SigTlvtrans_reasonp_attr (0x0035)
 
 
-#define SigTlvtrans_rejectp_attr (0x0035)
+#define SigTlvtrans_rejectp_attr (0x0036)
 
 
-#define SigTlvtransition_reason (0x0036)
+#define SigTlvtransition_reason (0x0037)
 
 
-#define SigTlvtransition_reject_reason (0x0037)
+#define SigTlvtransition_reject_reason (0x0038)
 
 
-#define SigTlvvht_mcs11_attr (0x0038)
+#define SigTlvvht_mcs11_attr (0x0039)
 
 
 uint32_t dot11f_unpack_tlv_p2_p_interface(tpAniSirGlobal pCtx,
@@ -1839,10 +1869,10 @@ uint32_t dot11f_unpack_tlv_p2_p_interface(tpAniSirGlobal pCtx,
 	return status;
 } /* End dot11f_unpack_tlv_p2_p_interface. */
 
-#define SigTlvP2PInterface (0x0039)
+#define SigTlvP2PInterface (0x003a)
 
 
-#define SigTlvP2PManageability (0x003a)
+#define SigTlvP2PManageability (0x003b)
 
 
 uint32_t dot11f_unpack_ie_gtk(tpAniSirGlobal pCtx,
@@ -10120,6 +10150,10 @@ static const tTLVDefn TLVS_qcn_ie[] = {
 	offsetof(tDot11fTLVedca_pifs_param_attr, present),
 	"edca_pifs_param_attr", SigTlvedca_pifs_param_attr,
 	DOT11F_TLV_EDCA_PIFS_PARAM_ATTR, 0, 6, 7, 0, 1, 1, 0, },
+	{ offsetof(tDot11fIEqcn_ie, ecsa_target_tsf_info_attr),
+	offsetof(tDot11fTLVecsa_target_tsf_info_attr, present),
+	"ecsa_target_tsf_info_attr", SigTlvecsa_target_tsf_info_attr,
+	DOT11F_TLV_ECSA_TARGET_TSF_INFO_ATTR, 0, 11, 11, 0, 1, 1, 0, },
 	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
 };
 
@@ -10976,7 +11010,7 @@ static const tIEDefn IES_AssocRequest[] = {
 	0, 7, 9, SigIehs20vendor_ie, {80, 111, 154, 16, 0},
 	4, DOT11F_EID_HS20VENDOR_IE, 0, 0, },
 	{ offsetof(tDot11fAssocRequest, qcn_ie), offsetof(tDot11fIEqcn_ie,
-	present), 0, "qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	present), 0, "qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fAssocRequest, osen_ie), offsetof(tDot11fIEosen_ie,
 	present), 0, "osen_ie", 0, 6, 261, SigIeosen_ie, {80, 111, 154, 18, 0},
@@ -11176,7 +11210,7 @@ static const tIEDefn IES_AssocResponse[] = {
 	0, 7, 28, SigIevendor_vht_ie, {0, 144, 76, 4, 0},
 	4, DOT11F_EID_VENDOR_VHT_IE, 0, 0, },
 	{ offsetof(tDot11fAssocResponse, qcn_ie), offsetof(tDot11fIEqcn_ie,
-	present), 0, "qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	present), 0, "qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fAssocResponse, MBO_IE), offsetof(tDot11fIEMBO_IE,
 	present), 0, "MBO_IE", 0, 6, 295, SigIeMBO_IE, {80, 111, 154, 22, 0},
@@ -11506,7 +11540,7 @@ static const tIEDefn IES_Beacon[] = {
 	"MBO_IE", 0, 6, 295, SigIeMBO_IE, {80, 111, 154, 22, 0},
 	4, DOT11F_EID_MBO_IE, 0, 0, },
 	{ offsetof(tDot11fBeacon, qcn_ie), offsetof(tDot11fIEqcn_ie, present), 0,
-	"qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	"qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fBeacon, reduced_neighbor_report),
 	offsetof(tDot11fIEreduced_neighbor_report, present), 0,
@@ -11763,7 +11797,7 @@ static const tIEDefn IES_Beacon2[] = {
 	present), 0, "ESEVersion", 0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
 	4, DOT11F_EID_ESEVERSION, 0, 0, },
 	{ offsetof(tDot11fBeacon2, qcn_ie), offsetof(tDot11fIEqcn_ie, present), 0,
-	"qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	"qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fBeacon2, reduced_neighbor_report),
 	offsetof(tDot11fIEreduced_neighbor_report, present), 0,
@@ -12020,7 +12054,7 @@ static const tIEDefn IES_BeaconIEs[] = {
 	0, "MBO_IE", 0, 6, 295, SigIeMBO_IE, {80, 111, 154, 22, 0},
 	4, DOT11F_EID_MBO_IE, 0, 0, },
 	{ offsetof(tDot11fBeaconIEs, qcn_ie), offsetof(tDot11fIEqcn_ie, present),
-	0, "qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	0, "qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fBeaconIEs, reduced_neighbor_report),
 	offsetof(tDot11fIEreduced_neighbor_report, present), 0,
@@ -12454,7 +12488,7 @@ static const tIEDefn IES_ProbeRequest[] = {
 	0, 6, 43, SigIeP2PProbeReq, {80, 111, 154, 9, 0},
 	4, DOT11F_EID_P2PPROBEREQ, 0, 0, },
 	{ offsetof(tDot11fProbeRequest, qcn_ie), offsetof(tDot11fIEqcn_ie,
-	present), 0, "qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	present), 0, "qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};
 
@@ -12705,7 +12739,7 @@ static const tIEDefn IES_ProbeResponse[] = {
 	present), 0, "MBO_IE", 0, 6, 295, SigIeMBO_IE, {80, 111, 154, 22, 0},
 	4, DOT11F_EID_MBO_IE, 0, 0, },
 	{ offsetof(tDot11fProbeResponse, qcn_ie), offsetof(tDot11fIEqcn_ie,
-	present), 0, "qcn_ie", 0, 6, 44, SigIeqcn_ie, {140, 253, 240, 1, 0},
+	present), 0, "qcn_ie", 0, 6, 55, SigIeqcn_ie, {140, 253, 240, 1, 0},
 	4, DOT11F_EID_QCN_IE, 0, 0, },
 	{ offsetof(tDot11fProbeResponse, reduced_neighbor_report),
 	offsetof(tDot11fIEreduced_neighbor_report, present), 0,
@@ -14117,6 +14151,9 @@ static const tIEDefn IES_ext_channel_switch_action_frame[] = {
 	WiderBWChanSwitchAnn), offsetof(tDot11fIEWiderBWChanSwitchAnn, present),
 	0, "WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
 	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, 0, },
+	{ offsetof(tDot11fext_channel_switch_action_frame, qcn_ie),
+	offsetof(tDot11fIEqcn_ie, present), 0, "qcn_ie", 0, 6, 55, SigIeqcn_ie,
+	{140, 253, 240, 1, 0}, 4, DOT11F_EID_QCN_IE, 0, 0, },
 	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};
 
 uint32_t dot11f_unpack_ext_channel_switch_action_frame(tpAniSirGlobal pCtx,
@@ -16850,6 +16887,13 @@ static uint32_t unpack_tlv_core(tpAniSirGlobal   pCtx,
 						  (uint8_t *)&(((tDot11fTLVcellular_data_con_pref *)
 						  (pFrm + pTlv->offset))->cellular_preference));
 					break;
+				case SigTlvecsa_target_tsf_info_attr:
+					status |=
+						dot11f_unpack_tlv_ecsa_target_tsf_info_attr(pCtx,
+						  pBufRemaining, len,
+						  (tDot11fTLVecsa_target_tsf_info_attr *)
+						  (pFrm + pTlv->offset));
+					break;
 				case SigTlvedca_pifs_param_attr:
 					status |=
 						dot11f_unpack_tlv_edca_pifs_param_attr(pCtx,
@@ -20079,6 +20123,11 @@ static uint32_t get_packed_size_tlv_core(tpAniSirGlobal pCtx,
 				pTlvPresent = ((tDot11fTLVcellular_data_con_pref *)
 					      (pFrm + pTlv->offset))->present;
 				break;
+			case SigTlvecsa_target_tsf_info_attr:
+				byteCount = 9;
+				pTlvPresent = ((tDot11fTLVecsa_target_tsf_info_attr *)
+					      (pFrm + pTlv->offset))->present;
+				break;
 			case SigTlvedca_pifs_param_attr:
 				byteCount = ((tDot11fTLVedca_pifs_param_attr *)(pFrm + pTlv->offset))->num_data+1;
 				pTlvPresent = ((tDot11fTLVedca_pifs_param_attr *)
@@ -21774,6 +21823,38 @@ uint32_t dot11f_pack_tlv_cellular_data_con_pref(tpAniSirGlobal pCtx,
 	return DOT11F_PARSE_SUCCESS;
 } /* End dot11f_pack_tlv_cellular_data_con_pref. */
 
+uint32_t dot11f_pack_tlv_ecsa_target_tsf_info_attr(tpAniSirGlobal pCtx,
+						   tDot11fTLVecsa_target_tsf_info_attr *pSrc,
+						   uint8_t *pBuf,
+						   uint32_t nBuf,
+						   uint32_t *pnConsumed)
+{
+	uint8_t *pTlvLen = 0;
+	uint32_t nConsumedOnEntry = *pnConsumed;
+	uint32_t nNeeded = 0U;
+	nNeeded += 11;
+	if (nNeeded > nBuf)
+		return DOT11F_BUFFER_OVERFLOW;
+	while (pSrc->present) {
+		*pBuf = 14;
+		pBuf += 1; *pnConsumed += 1;
+		pTlvLen = pBuf;
+		pBuf += 1; *pnConsumed += 1;
+		*pBuf = pSrc->twt_ch_sw_mode;
+		*pnConsumed += 1;
+		pBuf += 1;
+		frameshtonq(pCtx, pBuf, pSrc->target_tsf, 0);
+		*pnConsumed += 8;
+		pBuf += 8;
+		break;
+	}
+	(void)pCtx;
+	if (pTlvLen) {
+		*pTlvLen = *pnConsumed - nConsumedOnEntry - 2;
+	}
+	return DOT11F_PARSE_SUCCESS;
+} /* End dot11f_pack_tlv_ecsa_target_tsf_info_attr. */
+
 uint32_t dot11f_pack_tlv_edca_pifs_param_attr(tpAniSirGlobal pCtx,
 					      tDot11fTLVedca_pifs_param_attr *pSrc,
 					      uint8_t *pBuf,
@@ -33164,6 +33245,13 @@ static uint32_t pack_tlv_core(tpAniSirGlobal pCtx,
 					(pSrc + pTlv->offset), pBufRemaining,
 					nBufRemaining, &len);
 				break;
+			case SigTlvecsa_target_tsf_info_attr:
+				status |=
+					dot11f_pack_tlv_ecsa_target_tsf_info_attr(
+					pCtx, (tDot11fTLVecsa_target_tsf_info_attr *)
+					(pSrc + pTlv->offset), pBufRemaining,
+					nBufRemaining, &len);
+				break;
 			case SigTlvedca_pifs_param_attr:
 				status |=
 					dot11f_pack_tlv_edca_pifs_param_attr(