Jump to main content

##

# 1.2.5.2.32 TCPIP_MAC_PacketRx Function

## C

    TCPIP_MAC_PACKET* TCPIP_MAC_PacketRx(
        DRV_HANDLE hMac,
        TCPIP_MAC_RES* pRes,
        const TCPIP_MAC_PACKET_RX_STAT** ppPktStat
    );

## Description

This is the MAC receive function.

Once a pending packet is available in the MAC driver internal RX queues this function will dequeue the packet and hand it over to the MAC driver's client - i.e., the stack - for further processing.

The flags for a RX packet have to be updated by the MAC driver: TCPIP_MAC_PKT_FLAG_RX has to be set. If the MAC supports it, it should set:

- TCPIP_MAC_PKT_FLAG_UNICAST has to be set if that packet is a unicast packet
- TCPIP_MAC_PKT_FLAG_BCAST has to be set if that packet is a broadcast packet
- TCPIP_MAC_PKT_FLAG_MCAST has to be set if that packet is a multicast packet
- TCPIP_MAC_PKT_FLAG_QUEUED has to be set
- TCPIP_MAC_PKT_FLAG_SPLIT has to be set if the packet has multiple data segments

Additional information about the packet is available by providing the pRes and ppPktStat fields.

## Precondtions

TCPIP_MAC_Initialize() should have been called. TCPIP_MAC_Open() should have been called to obtain a valid handle.

## Parameters

Parameters | Description
--- | ---
hMac | Handle identifying the MAC driver client.
pRes | Optional pointer to an address that will receive an additional result associated with the operation. Can be 0 if not needed.
ppPktStat | Optional pointer to an address that will receive the received packet status. Note that this pointer cannot be used once the packet acknowledgment function was called. Can be 0 if not needed.

## Returns

- Valid pointer to an available RX packet.
- 0 if no packet pending/available.

## Remarks

The MAC driver should dequeue and return to the caller just one single packet, and not multiple chained packets.

Once the higher level layers in the stack are done with processing the RX packet, they have to call the corresponding packet acknowledgment function that tells the owner of that packet that it can resume control of that packet.

Once the stack modules are done processing the RX packets and the acknowledge function is called it is up to the driver design to reuse the RX packets, or simply return them to the pool they were allocated from (assuming that some sort of allocation is implemented). This document makes no requirement about how the MAC RX packets are obtained, using dynamic or static allocation techniques. This is up to the design of the MAC.

The MAC driver can use the TCPIP_MAC_Process() for obtaining new RX packets if needed.

Not all the MACs have hardware support for the received packet status. If the MAC driver cannot supply the TCPIP_MAC_PACKET_RX_STAT info, it should set the ppPktStat to 0.