Main Content

Generate and Parse WLAN MAC Frames

This example shows how to configure and generate WLAN MAC frames, then recover the payload of MSDUs by parsing the MAC frame.


The IEEE® 802.11™ family of standards supports four types of MAC frame: control, data, management, and extension. Within each of these types, the standard defines a range of subtypes, each of which serves a specific purpose in an 802.11™ network.

This example demonstrates how to configure, generate, and parse MPDUs and A-MPDUs by using WLAN Toolbox™ configuration objects and functions.

Generate and Decode MPDU

Create a MAC frame configuration object for a Data frame, specifying a high-efficiency single-user (HE SU) physical layer (PHY) configuration.

cfgMPDU = wlanMACFrameConfig('FrameType','Data','FrameFormat','HE-SU');

Specify an MSDU as a numeric vector of octets in bit format. You can also specify MSDUs as a character vector or string of octets in hexadecimal format.

msdu = randi([0 255],32,1);

Generate the MPDU by calling the wlanMACFrame function, specifying bits as the output format.

[mpdu,mpduLength] = wlanMACFrame(msdu,cfgMPDU,'OutputFormat','bits');

Recover the MSDU by calling the wlanMPDUDecode function. The function also returns the MAC frame configuration object and the status of the decoding. Check that the decoding operation returns the correct frame format and display the status.

[rxCfgMPDU,payload,status] = wlanMPDUDecode(mpdu,wlanHESUConfig);

Generate and Parse A-MPDU

Create a configuration object for a QoS Data MAC frame, specifying an HE SU PHY configuration. Enable MPDU aggregation and disable MSDU aggregation.

cfgAMPDU = wlanMACFrameConfig('FrameType','QoS Data','FrameFormat','HE-SU',... 

Specify a cell array of MSDUs, specifying each MSDU as a numeric vector of octets in bit format. You can also specify MSDUs as a character vector or string of octets in hexadecimal format.

msduList = repmat({randi([0 255],32,1)},1,4);

Generate the MPDU for a HE SU PHY configuration by calling the wlanMACFrame function.

cfgPHY = wlanHESUConfig('MCS',5);
[ampdu,ampduLength] = wlanMACFrame(msduList,cfgAMPDU,cfgPHY,'OutputFormat','bits');

Deaggregate the A-MPDU to return the MPDU list by calling the wlanAMPDUDeaggregate function. The function also returns the result of the delimiter cyclic redundancy check (CRC) and the status of A-MPDU deaggregation.

[mpduList,delimiterCRCFailure,status] = wlanAMPDUDeaggregate(ampdu,cfgPHY);

Display the number of delimiter CRC failures and the status of deaggregation.


Obtain the MSDUs by decoding the deaggregated MPDUs with the wlanMPDUDecode function and display the status of the decoding process.

if strcmp(status,'Success')
    for i = 1:numel(mpduList)
        if ~delimiterCRCFailure(i)
            [cfg,msdu,decodeStatus] = wlanMPDUDecode(mpduList{i},cfgPHY,'DataFormat','octets');
            disp(['MPDU ' num2str(i) ' decoding status: ' char(decodeStatus)])
MPDU 1 decoding status: Success
MPDU 2 decoding status: Success
MPDU 3 decoding status: Success
MPDU 4 decoding status: Success

Related Topics