據載荷傳輸到MAC子層就稱之爲MSDU,在MSDU的前面加上MHR,後面加上MFR就構成了MAC數據幀,也就是MPDU。其中MFR包含幀控制域、序列號和尋址信息域。MFR由16bitFCS構成。MPDU傳輸到物理層後就作爲物理層數據靜載荷,也就是PSDU。PSDU的前面加上SHR和PHR就形成了PPDU,其中SHR包含前導序列和SFD域;PHR由PSDU的長度值(字節表示)組成。
MAC_McpsDataAlloc獲得的一段ram,裏面包含了tx buffer打包到MPDU中,其中一個固定的offset(24字節)後指向MSDU。
MAC_McpsDataAlloc分配幀緩衝區時,會分配出整個PSDU需要的空間,而msdu.p是指向PSDU中MAC payload對應的offset。但是MAC_CbackEvent返回 MAC_MCPS_DATA_CNF時,msdu.p指向出錯,誤指向了幀頭。
通過加入以下代碼可以修正
if ( event == MAC_MCPS_DATA_CNF )
{
uint8 *originalMsdup = (uint8 *)pData->dataCnf.pDataReq + sizeof(macMcpsDataReq_t) + MAC_DATA_OFFSET;
pData->dataCnf.pDataReq->msdu.len -= (uint8)(originalMsdup - pData->dataCnf.pDataReq->msdu.p);
pData->dataCnf.pDataReq->msdu.p = originalMsdup;
}