Newer
Older
AMI-Aptio-BIOS-Reversed / PcAtChipsetPkg / PcatRealTimeClockSmm / PcatRealTimeClockSmm / MnpDxe / MnpDxe.h
/**
 * @file MnpDxe.h
 *
 * @brief MNP DXE Driver - Header with GUID definitions, protocol structures,
 *        and type declarations for the Managed Network Protocol DXE driver.
 *
 * Source: AmiNetworkPkg/UefiNetworkStack/Common/MnpDxe/
 * UEFI Phase: DXE
 *
 * This module implements the EFI Managed Network Protocol (MNP) service
 * binding and driver binding for managing network packet transmission and
 * reception. It provides a layered architecture:
 *   MNP_DEVICE_DATA   (per-SNP-adapter, size 0x110)
 *     -> MNP_SERVICE_DATA (per-VLAN service, size 0x60, signature 0x53706E4D)
 *          -> MNP_INSTANCE_DATA (per-opened-instance, size 0xE8, signature 0x49706E4D)
 *
 * Source files as seen in strings:
 *   MnpDriver.c     - Driver binding entry, Start/Stop, ServiceBinding Create/Destroy
 *   MnpConfig.c     - Device/instance configuration, buffer management (free/alloc Nbuf)
 *   MnpMain.c       - MNP protocol entry points (GetModeData, Configure, Groups, Transmit,
 *                     Receive, Cancel, Poll)
 *   MnpIo.c         - I/O processing: receive/send packets, timeout checks, polling
 *   MnpVlan.c       - VLAN management (add/remove/find VLANs, VLAN config protocol)
 *   ComponentName.c - Component name protocol (MnpGetDriverName, MnpGetControllerName)
 *
 * Dependencies:
 *   - SNP protocol (underlying Simple Network Protocol)
 *   - DPC protocol (deferred procedure call support)
 *   - Device Path protocol
 *   - VLAN Config protocol
 */

#ifndef __MNP_DXE_H__
#define __MNP_DXE_H__

#include "../uefi_headers/Uefi.h"

/*
 * =====================================================================
 * GUID DEFINITIONS
 * =====================================================================
 */

/** SNP protocol GUID - for locating the underlying SNP interface */
#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \
  { 0xA19832B9, 0xAC25, 0x11D3, { 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }

/** MNP protocol GUID - the service this driver installs */
#define EFI_MANAGED_NETWORK_PROTOCOL_GUID \
  { 0x552A84F1, 0x2CB6, 0x4B5D, { 0xA8, 0xCA, 0xD4, 0xCF, 0xB4, 0x23, 0xE3, 0x82 } }

/** MNP service binding GUID */
#define EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL_GUID \
  { 0xF36FF770, 0xA7E1, 0x42CF, { 0x9E, 0xD2, 0x56, 0xF0, 0xF2, 0x71, 0xF4, 0x4C } }

/** Device path protocol GUID */
#define EFI_DEVICE_PATH_PROTOCOL_GUID \
  { 0x09576E91, 0x6D3F, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }

/** VLAN config protocol GUID */
#define EFI_VLAN_CONFIG_PROTOCOL_GUID \
  { 0x9E23D768, 0xD2F4, 0x4366, { 0x9F, 0xC3, 0x89, 0xB2, 0x4E, 0x4C, 0x5E, 0x69 } }

/** Driver Binding protocol GUID - standard UEFI */
#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
  { 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } }

/** Component Name 2 protocol GUID */
#define EFI_COMPONENT_NAME2_PROTOCOL_GUID \
  { 0x6A7A5CFF, 0xE870, 0x4FBA, { 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14, 0x68 } }

/*
 * =====================================================================
 * SIGNATURE CONSTANTS
 * =====================================================================
 */

/**
 * MNP_DEVICE_DATA signature: 'M' | ('n' << 8) | (('p' | ('D' << 8)) << 16)
 * = 0x44706E4D = 1148218957  = "MnpD"
 */
#define MNP_DEVICE_DATA_SIGNATURE    1148218957    /* "MnpD" */

/**
 * MNP_SERVICE_DATA signature: 'M' | ('n' << 8) | (('p' | ('S' << 8)) << 16)
 * = 0x53706E4D = 1399877197   = "MnpS"
 */
#define MNP_SERVICE_DATA_SIGNATURE   1399877197    /* "MnpS" */

/**
 * MNP_INSTANCE_DATA signature: 'M' | ('n' << 8) | (('p' | ('I' << 8)) << 16)
 * = 0x49706E4D = 1232105037   = "MnpI"
 */
#define MNP_INSTANCE_DATA_SIGNATURE  1232105037    /* "MnpI" */

/**
 * NET_BUF signature: 'n' | ('b' << 8) | (('u' | ('f' << 8)) << 16)
 * = 0x6675626E = 1718968942   = "nbuf"
 */
#define NET_BUF_SIGNATURE            1718968942    /* "nbuf" */

/**
 * NET_BUF_QUEUE signature: 'n' | ('b' << 8) | (('q' | ('u' << 8)) << 16)
 * = 0x7571626E = 1970365038   = "nbqu"
 */
#define NET_BUF_QUEUE_SIGNATURE      1970365038    /* "nbqu" */

/**
 * NET_VECTOR signature: 'n' | ('v' << 8) | (('e' | ('c' << 8)) << 16)
 * = 0x6365766E = 1667593838   = "nvec"
 */
#define NET_VECTOR_SIGNATURE         1667593838    /* "nvec" */

/*
 * =====================================================================
 * GLOBAL POINTERS (imported via DXE libraries)
 * =====================================================================
 */

extern EFI_HANDLE               gImageHandle;           /* at 0xA9D0 */
extern EFI_SYSTEM_TABLE        *gSystemTable;           /* at 0xA9C0 */
extern EFI_BOOT_SERVICES       *gBootServices;          /* at 0xA9C8, aliased as BootServices */
extern EFI_RUNTIME_SERVICES    *gRuntimeServices;       /* at 0xA9D8, aliased as RuntimeServices */
extern VOID                    *gDpcProtocol;           /* at 0xA9F8, DPC protocol registered */

/*
 * =====================================================================
 * FORWARD DECLARATIONS
 * =====================================================================
 */

typedef struct _MNP_DEVICE_DATA   MNP_DEVICE_DATA;
typedef struct _MNP_SERVICE_DATA  MNP_SERVICE_DATA;
typedef struct _MNP_INSTANCE_DATA MNP_INSTANCE_DATA;

/*
 * =====================================================================
 * ADDITIONAL EFI / MISCELLANEOUS GUID DECLARATIONS
 * =====================================================================
 */

/** Driver Binding Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiDriverBindingProtocolGuid;

/** Component Name 2 Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiComponentName2ProtocolGuid;

/** Component Name Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiComponentNameProtocolGuid;

/** MNP Protocol GUID */
extern EFI_GUID gEfiManagedNetworkProtocolGuid;

/** MNP Service Binding Protocol GUID (AMI) */
extern EFI_GUID gEfiManagedNetworkServiceBindingProtocolGuid;

/** Loaded Image Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiLoadedImageProtocolGuid;

/** DPC Protocol GUID (MdeModulePkg) */
extern EFI_GUID gEfiDpcProtocolGuid;

/** Network Stack Variable Vendor GUID for "NetworkStackVar" */
extern EFI_GUID gNetworkStackVarGuid;

/** VLAN Config Protocol GUID (AMI-specific) */
extern EFI_GUID gVlanConfigProtocolGuid;

/** Simple Network Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiSimpleNetworkProtocolGuid;

/** Device Path Protocol GUID (Standard UEFI) */
extern EFI_GUID gEfiDevicePathProtocolGuid;

/** VLAN_TPID: 0x8100 in big-endian (appears as 0x0081 in little-endian memory) */
#define VLAN_TPID  0x8100

/*
 * =====================================================================
 * CR MACRO for container-of-pointer operations
 * =====================================================================
 */

#ifndef CR_CHECK
#define CR_CHECK(Record, Signature) \
  DEBUG_CODE_BEGIN ( \
    if ((Record)->Signature != Signature) { \
      DEBUG ((DEBUG_ERROR, "CR has Bad Signature at %a:%d\n", __FILE__, __LINE__)); \
    } \
    DEBUG_CODE_END ()
#endif

#ifndef CR
#define CR(Record, TYPE, Field, Signature) \
  (TYPE *)((UINT8 *)(Record) - OFFSET_OF (TYPE, Field))
#endif

/*
 * =====================================================================
 * MNP_RXDATA_WRAP / NET_BUF forward declarations from DxeNetLib
 * =====================================================================
 */

/** NET_BUF_REFCOUNT threshold: if refcount > 2, copy before mutating */
#define NET_BUF_MAX_SHARED_REF  2

/** MNP_MAX_RCV_QUEUE_SIZE: maximum queued received packets per instance */
#define MNP_MAX_RCV_QUEUE_SIZE  256

/*
 * =====================================================================
 * NET_BUF (from MdeModulePkg DxeNetLib)
 * =====================================================================
 */

/**
 * NET_BUF - network packet buffer (signature at +0x00 = NET_BUF_SIGNATURE)
 * Known offsets from decompiled code:
 *   +0x08: RefCnt (UINT64)
 *   +0x84 (0x54 from Nbuf): TotalSize (UINT32)
 *   +0x08 from header: DataLength or BlockSize
 */
typedef struct _NET_BUF {
    UINT32              Signature;          /* +0x00: NET_BUF_SIGNATURE */
    UINT64              RefCnt;             /* +0x08: Reference count */
    /* ... internal pool/block fields ... */
    UINT32              TotalSize;          /* +0x84: Total data size in this buf */
    UINT32              BlockOpOffset;      /* various offsets for block ops */
    /* BlockOp protocol is at offset 0x38 (56 bytes from start) in some contexts */
} NET_BUF;

/**
 * NET_BUF_QUEUE - queue of NET_BUF entries (signature = NET_BUF_QUEUE_SIGNATURE)
 *   +0x00: Signature ("nbqu")
 *   +0x08: Count (UINT64)
 *   +0x10: LIST_ENTRY head
 */
typedef struct _NET_BUF_QUEUE {
    UINT32              Signature;          /* +0x00: NET_BUF_QUEUE_SIGNATURE */
    UINT64              Count;              /* +0x08: Number of buffers */
    LIST_ENTRY          BufList;            /* +0x10: Buffer linked list */
} NET_BUF_QUEUE;

/*
 * =====================================================================
 * MNP_RXDATA_WRAP - received data wrapper (allocated per packet)
 * =====================================================================
 *
 * Fields from the receive-data wrapper create/free helpers:
 *   +0x00: Link (LIST_ENTRY)
 *   +0x10: Instance (MNP_INSTANCE_DATA *)   -> a2[2]
 *   +0x28: Event (EFI_EVENT)                -> a2[5]
 *   +0x68: Nbuf (NET_BUF *)                 -> a2[13]
 *   +0x??: Timeout (UINT64)                 -> +0x70 = a2[14]
 *   +0x??: Timeout value (UINT32 from instance)
 */
typedef struct _MNP_RXDATA_WRAP {
    LIST_ENTRY          Link;               /* +0x00: Link in received queue */
    MNP_INSTANCE_DATA  *Instance;           /* +0x10: Owning instance */
    EFI_EVENT           Event;              /* +0x28: Recycle event */
    NET_BUF            *Nbuf;               /* +0x68: Received packet buffer */
    UINT64              Timeout;            /* +0x70: Timeout countdown (usec) */
    UINT32              TimeoutValue;       /* +0x??: Original timeout value */
} MNP_RXDATA_WRAP;

/*
 * =====================================================================
 * MNP_GROUP_ADDRESS - multicast group address tracking
 * =====================================================================
 *
 * From the multicast group control block allocation (size 56 = 0x38):
 *   +0x00: Link (LIST_ENTRY)
 *   +0x10: MacAddress (EFI_MAC_ADDRESS) - offset 0x10 in allocation
 *   +0x30: RefCnt (UINT64)              - reference counter field
 */
typedef struct _MNP_GROUP_ADDRESS {
    LIST_ENTRY          Link;               /* +0x00: Link in MnpDeviceData->GroupAddressList */
    EFI_MAC_ADDRESS     MacAddress;         /* +0x10: MAC address */
    UINT64              RefCnt;             /* +0x30: Reference count */
} MNP_GROUP_ADDRESS;

/**
 * MNP_GROUP_CTRL_BLK - per-instance multicast group control block
 *   +0x00: Link (LIST_ENTRY)
 *   +0x10: GroupAddress (MNP_GROUP_ADDRESS *)
 *   Allocated by the group control block helper (size 24 = 0x18 bytes)
 */
typedef struct _MNP_GROUP_CTRL_BLK {
    LIST_ENTRY           Link;               /* +0x00: Link in Instance->GroupCtrlBlkList */
    MNP_GROUP_ADDRESS   *GroupAddress;       /* +0x10: Pointer to global group address */
} MNP_GROUP_CTRL_BLK;

/*
 * =====================================================================
 * MNP_CONFIGURE_DATA - configuration data for MNP.Configure()
 * =====================================================================
 *
 * 20 bytes total (0x14). Copied into instance data at offset +0xD0.
 * Fields accessed via byte offsets:
 *   +0x0A: EnableUnicastReceive    (from code at Instance+0xDA)
 *   +0x0B: EnableMulticastReceive  (from code at Instance+0xDB)
 *   +0x0C: EnablePromiscuousReceive (from code at Instance+0xDC)
 *   +0x0D: FlushQueues              (from code at Instance+0xDD)
 *   +0x0E: EnableReceiveTimestamps
 *   +0x10: TimeoutValue (UINT32)
 */
typedef struct {
    UINT8               EnableUnicastReceive;       /* +0x0A */
    UINT8               EnableMulticastReceive;     /* +0x0B */
    UINT8               EnablePromiscuousReceive;   /* +0x0C */
    UINT8               FlushQueues;                /* +0x0D */
    UINT8               EnableReceiveTimestamps;    /* +0x0E */
    UINT8               Reserved[1];                /* +0x0F */
    UINT16              TimeoutValue;               /* +0x10 */
} MNP_CONFIGURE_DATA;

/*
 * =====================================================================
 * MNP_DEVICE_DATA (size 0x110 based on allocation)
 * =====================================================================
 *
 * Signature: MNP_DEVICE_DATA_SIGNATURE (0x44706E4D = "MnpD")
 * Allocated: MnpDriverBindingStart
 * Initialized: MnpInitializeDeviceData
 * Teardown: MnpCleanDeviceData / MnpStop
 *
 * Known field offsets from decompiled code:
 */
struct _MNP_DEVICE_DATA {
    UINT32              Signature;              /* +0x000: MNP_DEVICE_DATA_SIGNATURE */

    EFI_HANDLE          ControllerHandle;       /* +0x008: Controller handle */
    EFI_HANDLE          ImageHandle;            /* +0x010: Driver image handle */

    VOID               *SnpInterface;           /* +0x018: SNP protocol interface (through driver binding) */
    EFI_HANDLE          SnpDevicePathHandle;    /* +0x020: Device path handle */

    /* -- Service and group lists -- */
    LIST_ENTRY          ServiceList;            /* +0x028: List of MNP_SERVICE_DATA (from MnpDriver.c) */
    LIST_ENTRY          GroupAddressList;       /* +0x038: List of MNP_GROUP_ADDRESS */

    /* -- Initialization tracking -- */
    UINT64              RefCount;               /* +0x048: Child service data count */

    UINT64              Field_0x50;             /* +0x050: */
    VOID               *MnpServiceSnp;          /* +0x058: SNP from MNP_SERVICE_DATA */

    UINT64              SnpModeData;            /* +0x060: SNP mode data pointer */

    UINT32              BufferLength;           /* +0x0F0: Max packet buf size (Snp->Mode->HdrSize + 8 + Snp->Mode->MediaHdrSize) */
    UINT32              HeaderLength;           /* +0x0F4: Aligned header length */

    UINT32              ConfiguredChildren;     /* +0x0??: Count of configured children */
    UINT32              McastFilterCnt;         /* +0x0??: Count of multicast filters */
    UINT32              McastFilterCnt2;        /* +0x0??: Secondary multicast counter */
    UINT32              EnableVlan;             /* +0x0??: EnableVlan flag */
    UINT32              EnablePromiscuous;      /* +0x0??: EnablePromiscuous flag */

    LIST_ENTRY          FreeNbufQue;            /* +0x080: NET_BUF_QUEUE (Signature +0x80 = 0x7571626E) */
    LIST_ENTRY          GroupAddressList2;      /* +0x0A0: Second group list reference */

    /* -- Counters -- */
    UINT64              TotalFreeNbufs;         /* +0x0B8: Total free NET_BUFs allocated */
    UINT64              CurrentFreeNbufs;       /* +0x0B4: Current free NET_BUFs */

    /* -- Event handles -- */
    EFI_EVENT           TxTimeoutEvent;         /* +0x078: Transmit timeout event (actually +0x78 from base) */
    EFI_EVENT           PollTimerEvent;         /* +0x0C0: Polling timer event */
    EFI_EVENT           TimeoutCheckEvent;      /* +0x0D0: Packet timeout check event */
    EFI_EVENT           MediaDetectEvent;       /* +0x0D8: Media detection event */

    BOOLEAN             PollingEnabled;         /* +0x0C8: Whether polling timer is active */

    /* -- Receive buffer -- */
    NET_BUF            *RcvPacket;             /* +0x0F8: Current receive NET_BUF */
    VOID               *RcvBufPool;            /* +0x100: Pool for receive buffer */
};

/*
 * =====================================================================
 * MNP_SERVICE_DATA (size 0x60 = 96 bytes)
 * =====================================================================
 *
 * Signature: MNP_SERVICE_DATA_SIGNATURE (0x53706E4D = "MnpS")
 * CR_OFFSET from MnpDriverSupported: -8 (ServiceData is CR for SNPModeData + 0x28)
 */
struct _MNP_SERVICE_DATA {
    UINT32              Signature;              /* +0x00: MNP_SERVICE_DATA_SIGNATURE */
    LIST_ENTRY          Link;                   /* +0x08: Link in MnpDeviceData->ServiceList */
    MNP_DEVICE_DATA    *MnpDeviceData;          /* +0x18: Back pointer to owning device */
    EFI_HANDLE          ControllerHandle;       /* +0x20: Controller handle */
    EFI_HANDLE          Handle;                 /* +0x28: Protocol handle for MNP */

    /* MNP protocol interface is at offset 0x28 (size 0x40) */
    UINT8               MnpProtocolBuffer[0x40];/* +0x28: EFI_MANAGED_NETWORK_PROTOCOL */

    LIST_ENTRY          InstanceList;           /* +0x68: List of MNP_INSTANCE_DATA */
    LIST_ENTRY          VlanList;               /* +0x78: List of VLAN entries */

    UINT16              VlanId;                 /* +0x5C: VLAN ID (0 = untagged) */
    UINT8               Priority;               /* +0x5E: VLAN priority */
    UINT64              NumChildren;            /* +0x50: Number of child instances */
};

/*
 * =====================================================================
 * MNP_INSTANCE_DATA (size 0xE8 = 232 bytes)
 * =====================================================================
 *
 * Signature: MNP_INSTANCE_DATA_SIGNATURE (0x49706E4D = "MnpI")
 * CR_OFFSET: -0x28 (from protocol interface pointer)
 *
 * Allocated by MnpServiceBindingCreateChild (232 bytes)
 * Initialized by MnpInitInstanceData
 */
struct _MNP_INSTANCE_DATA {
    UINT32              Signature;              /* +0x00: MNP_INSTANCE_DATA_SIGNATURE */
    MNP_SERVICE_DATA   *MnpServiceData;         /* +0x08: Back pointer to service data */

    /* EFI_MANAGED_NETWORK_PROTOCOL installed on this instance */
    UINT8               ProtocolBuffer[0x40];   /* +0x28: Copied from service data */

    BOOLEAN             IsConfigured;           /* +0x68: Whether MnpConfigure() has been called */
    BOOLEAN             IsDestroyed;            /* +0x69: Set during destroy */

    MNP_CONFIGURE_DATA  ConfigData;             /* +0xD0: Last config copied */

    /* -- Receive queue -- */
    LIST_ENTRY          RcvdPacketQueue;        /* +0x70: Queue of MNP_RXDATA_WRAP */
    UINT64              RcvdPacketQueueSize;    /* +0xA0: Queue length */

    /* -- Token maps -- */
    VOID                RxTokenMap;             /* +0x80: NET_MAP for RX tokens */
    VOID                TxTokenMap;             /* +0x80+? NET_MAP for TX tokens */

    /* -- Group control blocks -- */
    LIST_ENTRY          GroupCtrlBlkList;       /* +0x70: List of MNP_GROUP_CTRL_BLK */
    UINT64              GroupCtrlBlkCount;      /* +0xA0: Count */

    UINT8               Reserved1[0x10];        /* +0xA8-0xB8 padding */
    UINT64              RxTokenCount;           /* +0xB8: Received token count */
    UINT64              TxTokenCount;           /* +0xC0: Transmit token count */

    UINT32              TimeoutValue;           /* +0x??: Configured packet timeout */
};

/*
 * =====================================================================
 * MNP_CONFIG_DATA - the configuration data structure passed to Configure
 * =====================================================================
 */
typedef struct {
    UINT32              ReceivedQueueTimeoutValue;
    UINT32              TransmitQueueTimeoutValue;
    UINT16              ProtocolTypeFilter;
    BOOLEAN             EnableUnicastReceive;
    BOOLEAN             EnableMulticastReceive;
    BOOLEAN             EnableBroadcastReceive;
    BOOLEAN             EnablePromiscuousReceive;
    BOOLEAN             FlushQueues;
    BOOLEAN             EnableReceiveTimestamps;
    BOOLEAN             DisableBackgroundPolling;
} MNP_CONFIG_DATA;

/*
 * =====================================================================
 * EFI_MANAGED_NETWORK_PROTOCOL (simplified from UEFI spec)
 * =====================================================================
 */

typedef struct _EFI_MANAGED_NETWORK_PROTOCOL EFI_MANAGED_NETWORK_PROTOCOL;

/* EFI_MNP_GET_MODE_DATA */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_GET_MODE_DATA)(
    IN  EFI_MANAGED_NETWORK_PROTOCOL *This,
    OUT VOID                         *MnpConfigData    OPTIONAL,
    OUT VOID                         *SnpModeData      OPTIONAL
    );

/* EFI_MNP_CONFIGURE */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_CONFIGURE)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *MnpConfigData     OPTIONAL
    );

/* EFI_MNP_MULTICAST_JOIN (MnpGroups) */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_MULTICAST_JOIN)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN BOOLEAN                      Flag,
    IN EFI_MAC_ADDRESS             *MacAddress     OPTIONAL,
    IN VOID                        *ExtParameters  OPTIONAL
    );

/* EFI_MNP_TRANSMIT */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_TRANSMIT)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token
    );

/* EFI_MNP_RECEIVE */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_RECEIVE)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token
    );

/* EFI_MNP_CANCEL */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_CANCEL)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token    OPTIONAL
    );

/* EFI_MNP_POLL */
typedef
EFI_STATUS
(EFIAPI *EFI_MNP_POLL)(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This
    );

struct _EFI_MANAGED_NETWORK_PROTOCOL {
    UINT64                      Revision;
    EFI_MNP_GET_MODE_DATA       GetModeData;
    EFI_MNP_CONFIGURE           Configure;
    EFI_MNP_MULTICAST_JOIN      MulticastReceive;
    EFI_MNP_TRANSMIT            Transmit;
    EFI_MNP_RECEIVE             Receive;
    EFI_MNP_CANCEL              Cancel;
    EFI_MNP_POLL                Poll;
};

/*
 * =====================================================================
 * VLAN_CONFIG_PROTOCOL (from AmiNetworkPkg)
 * =====================================================================
 */
typedef struct _VLAN_CONFIG_PROTOCOL VLAN_CONFIG_PROTOCOL;

typedef
EFI_STATUS
(EFIAPI *VLAN_CONFIG_SET)(
    IN VLAN_CONFIG_PROTOCOL *This,
    IN UINT16               VlanId,
    IN UINT8                Priority
    );

typedef
EFI_STATUS
(EFIAPI *VLAN_CONFIG_FIND)(
    IN  VLAN_CONFIG_PROTOCOL *This,
    IN  UINT16               VlanId       OPTIONAL,
    OUT UINT16               *Number      OPTIONAL,
    OUT VOID                 **Buffer      OPTIONAL
    );

typedef
EFI_STATUS
(EFIAPI *VLAN_CONFIG_REMOVE)(
    IN VLAN_CONFIG_PROTOCOL *This,
    IN UINT16               VlanId
    );

struct _VLAN_CONFIG_PROTOCOL {
    VLAN_CONFIG_SET         Set;
    VLAN_CONFIG_FIND        Find;
    VLAN_CONFIG_REMOVE      Remove;
};

/*
 * =====================================================================
 * FUNCTION PROTOTYPES
 * =====================================================================
 */

/* ---- Module entry (MnpDriver.c) ---- */
EFI_STATUS
EFIAPI
MnpDriverEntryPoint(
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE    *SystemTable
    );

/* ---- Driver Binding (MnpDriver.c) ---- */
EFI_STATUS
EFIAPI
MnpDriverBindingSupported(
    IN EFI_DRIVER_BINDING_PROTOCOL  *This,
    IN EFI_HANDLE                   ControllerHandle,
    IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath
    );

EFI_STATUS
EFIAPI
MnpDriverBindingStart(
    IN EFI_DRIVER_BINDING_PROTOCOL  *This,
    IN EFI_HANDLE                   ControllerHandle,
    IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath
    );

EFI_STATUS
EFIAPI
MnpDriverBindingStop(
    IN EFI_DRIVER_BINDING_PROTOCOL  *This,
    IN EFI_HANDLE                   ControllerHandle,
    IN UINTN                        NumberOfChildren,
    IN EFI_HANDLE                  *ChildHandleBuffer
    );

/* ---- Service Binding (MnpDriver.c) ---- */
EFI_STATUS
EFIAPI
MnpServiceBindingCreateChild(
    IN EFI_SERVICE_BINDING_PROTOCOL  *This,
    IN EFI_HANDLE                    *ChildHandle
    );

EFI_STATUS
EFIAPI
MnpServiceBindingDestroyChild(
    IN EFI_SERVICE_BINDING_PROTOCOL  *This,
    IN EFI_HANDLE                     ChildHandle
    );

/* ---- Component Name (ComponentName.c) ---- */
EFI_STATUS
EFIAPI
MnpComponentNameGetDriverName(
    IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
    IN  CHAR8                        *Language,
    OUT CHAR16                      **DriverName
    );

EFI_STATUS
EFIAPI
MnpComponentNameGetControllerName(
    IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
    IN  EFI_HANDLE                    ControllerHandle,
    IN  EFI_HANDLE                    ChildHandle      OPTIONAL,
    IN  CHAR8                        *Language,
    OUT CHAR16                      **ControllerName
    );

/* ---- MNP Protocol (MnpMain.c) ---- */
EFI_STATUS
EFIAPI
MnpGetModeData(
    IN  EFI_MANAGED_NETWORK_PROTOCOL *This,
    OUT VOID                         *MnpConfigData    OPTIONAL,
    OUT VOID                         *SnpModeData      OPTIONAL
    );

EFI_STATUS
EFIAPI
MnpConfigure(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *MnpConfigData     OPTIONAL
    );

EFI_STATUS
EFIAPI
MnpGroups(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN BOOLEAN                       Flag,
    IN EFI_MAC_ADDRESS             *MacAddress     OPTIONAL,
    IN VOID                        *ExtParameters  OPTIONAL
    );

EFI_STATUS
EFIAPI
MnpTransmit(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token
    );

EFI_STATUS
EFIAPI
MnpReceive(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token
    );

EFI_STATUS
EFIAPI
MnpCancel(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This,
    IN VOID                         *Token    OPTIONAL
    );

EFI_STATUS
EFIAPI
MnpPoll(
    IN EFI_MANAGED_NETWORK_PROTOCOL *This
    );

/* ---- VLAN Config protocol (MnpVlan.c) ---- */
EFI_STATUS
EFIAPI
MnpVlanSet(
    IN VLAN_CONFIG_PROTOCOL *This,
    IN UINT16                VlanId,
    IN UINT8                 Priority
    );

EFI_STATUS
EFIAPI
MnpVlanFind(
    IN  VLAN_CONFIG_PROTOCOL *This,
    IN  UINT16                VlanId       OPTIONAL,
    OUT UINT16               *Number,
    OUT VOID                 **Buffer
    );

EFI_STATUS
EFIAPI
MnpVlanRemove(
    IN VLAN_CONFIG_PROTOCOL *This,
    IN UINT16                VlanId
    );

/* ---- Internal I/O functions (MnpIo.c) ---- */
EFI_STATUS
MnpReceivePacket(
    IN MNP_DEVICE_DATA *MnpDeviceData
    );

VOID
MnpCheckPacketTimeout(
    IN EFI_EVENT            Event,
    IN VOID                *Context
    );

VOID
MnpMediaDetect(
    IN EFI_EVENT            Event,
    IN VOID                *Context
    );

VOID
MnpPollTimer(
    IN EFI_EVENT            Event,
    IN VOID                *Context
    );

EFI_STATUS
MnpSyncSendPacket(
    IN MNP_SERVICE_DATA    *MnpServiceData,
    IN VOID                *Token
    );

VOID
MnpDeliverPacket(
    IN MNP_INSTANCE_DATA   *Instance
    );

VOID
MnpDispatchPacket(
    IN MNP_SERVICE_DATA    *MnpServiceData,
    IN NET_BUF             *Nbuf
    );

/* ---- Internal Config functions (MnpConfig.c) ---- */
EFI_STATUS
MnpInitializeDeviceData(
    IN MNP_DEVICE_DATA     *MnpDeviceData,
    IN VOID                *ControllerHandle,
    IN EFI_HANDLE           ImageHandle
    );

VOID
MnpCleanDeviceData(
    IN MNP_DEVICE_DATA *MnpDeviceData,
    IN VOID            *ImageHandle
    );

EFI_STATUS
MnpAddFreeNbuf(
    IN MNP_DEVICE_DATA     *MnpDeviceData,
    IN UINTN                Count
    );

NET_BUF *
MnpAllocNbuf(
    IN MNP_DEVICE_DATA     *MnpDeviceData
    );

VOID
MnpFreeNbuf(
    IN MNP_DEVICE_DATA     *MnpDeviceData,
    IN NET_BUF             *Nbuf
    );

VOID
MnpConfigInstance(
    IN MNP_INSTANCE_DATA   *Instance,
    IN MNP_CONFIGURE_DATA  *ConfigData    OPTIONAL
    );

EFI_STATUS
MnpConfigReceiveFilters(
    IN MNP_DEVICE_DATA *MnpDeviceData
    );

/* ---- Event handlers ---- */
EFI_STATUS
MnpStart(
    IN MNP_SERVICE_DATA    *MnpServiceData,
    IN BOOLEAN              IsConfig,
    IN BOOLEAN              EnablePoll
    );

EFI_STATUS
MnpStop(
    IN MNP_SERVICE_DATA    *MnpServiceData
    );

/* ---- Internal VLAN helpers (MnpVlan.c) ---- */
UINT8
MnpParseVlanTag(
    IN  MNP_DEVICE_DATA  *MnpDeviceData,
    IN  NET_BUF          *Nbuf,
    OUT UINT16           *VlanId
    );

VOID
MnpInsertVlanTag(
    IN     MNP_SERVICE_DATA  *MnpServiceData,
    IN     VOID              *Packet,
    IN OUT UINT8            **MacHeader,
    IN OUT UINT32           *HeaderLen
    );

MNP_SERVICE_DATA *
MnpFindServiceByVlanId(
    IN MNP_DEVICE_DATA  *MnpDeviceData,
    IN UINT16            VlanId
    );

EFI_STATUS
MnpReadVlanConfiguration(
    IN  MNP_DEVICE_DATA  *MnpDeviceData,
    OUT UINT16           *NumberOfVlan,
    OUT UINT8          **VlanBuffer
    );

/* ---- Module entry helpers (ModuleEntry.c) ---- */
VOID
MnpInitializeGlobals(
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE    *SystemTable
    );

EFI_STATUS
MnpInstallDriverProtocols(
    IN EFI_HANDLE  ImageHandle
    );

EFI_STATUS
EFIAPI
MnpDpcCallback(
    IN VOID  *Context
    );

EFI_DEVICE_PATH_PROTOCOL *
MnpCreateDevicePathWithMac(
    IN VLAN_CONFIG_PROTOCOL  *VlanConfig,
    IN UINT8                 *MacAddr
    );

/* ---- Global GUID variables (defined in ModuleEntry.c) ---- */
extern EFI_GUID  gEfiDriverBindingProtocolGuid;
extern EFI_GUID  gEfiComponentName2ProtocolGuid;
extern EFI_GUID  gEfiComponentNameProtocolGuid;
extern EFI_GUID  gEfiManagedNetworkProtocolGuid;
extern EFI_GUID  gEfiManagedNetworkServiceBindingProtocolGuid;
extern EFI_GUID  gEfiLoadedImageProtocolGuid;
extern EFI_GUID  gEfiDpcProtocolGuid;
extern EFI_GUID  gNetworkStackVarGuid;
extern EFI_GUID  gVlanConfigProtocolGuid;
extern EFI_GUID  gEfiSimpleNetworkProtocolGuid;
extern EFI_GUID  gEfiDevicePathProtocolGuid;

/* ---- Internal data ---- */
extern UINT8     gMnpVlanTemplateMac[6];

/* ---- Driver Binding protocol table (MnpDriver.c) ---- */
extern EFI_DRIVER_BINDING_PROTOCOL   gMnpDriverBinding;
extern EFI_COMPONENT_NAME2_PROTOCOL  gMnpComponentName2;
extern EFI_COMPONENT_NAME_PROTOCOL   gMnpComponentName;

/* ---- Internal function forward declarations (from library/support) ---- */
VOID *
NetbufGetRawData(
    IN NET_BUF  *Nbuf
    );

VOID
NetbufTrim(
    IN NET_BUF  *Nbuf,
    IN UINTN     Size,
    IN UINTN     TrimType
    );

#define NET_BUF_TRIM_HEAD  0

#endif /* __MNP_DXE_H__ */