// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <efi/types.h>
#include <efi/protocol/simple-network.h>

#define EFI_MANAGED_NETWORK_PROTOCOL_GUID \
    {0x7ab33a91, 0xace5, 0x4326,{0xb5, 0x72, 0xe7, 0xee, 0x33, 0xd3, 0x9f, 0x16}}
extern efi_guid ManagedNetworkProtocol;

typedef struct {
    efi_time  Timestamp;
    efi_event RecycleEvent;
    uint32_t PacketLength;
    uint32_t HeaderLength;
    uint32_t AddressLength;
    uint32_t DataLength;
    bool BroadcastFlag;
    bool MulticastFlag;
    bool PromiscuousFlag;
    uint16_t  ProtocolType;
    void* DestinationAddress;
    void* SourceAddress;
    void* MediaHeader;
    void* PacketData;
} efi_managed_network_receive_data;

typedef struct {
    uint32_t FragmentLength;
    void* FragmentBuffer;
} efi_managed_network_fragment_data;

typedef struct {
    efi_mac_addr* DestinationAddress;
    efi_mac_addr* SourceAddress;
    uint16_t ProtocolType;
    uint32_t DataLength;
    uint16_t HeaderLength;
    uint16_t FragmentCount;
    efi_managed_network_fragment_data FragmentTable[1];
} efi_managed_network_transmit_data;

typedef struct {
    uint32_t ReceivedQueueTimeoutValue;
    uint32_t TransmitQueueTimeoutValue;
    uint16_t ProtocolTypeFilter;
    bool EnableUnicastReceive;
    bool EnableMulticastReceive;
    bool EnableBroadcastReceive;
    bool EnablePromiscuousReceive;
    bool FlushQueuesOnReset;
    bool EnableReceiveTimestamps;
    bool DisableBackgroundPolling;
} efi_managed_network_config_data;

typedef struct {
    efi_event Event;
    efi_status Status;
    union {
        efi_managed_network_receive_data* RxData;
        efi_managed_network_transmit_data* TxData;
    } Packet;
} efi_managed_network_completion_token;

typedef struct efi_managed_network_protocol {
    efi_status (*GetModeData) (struct efi_managed_network_protocol* self,
                               efi_managed_network_config_data* mnp_config_data,
                               efi_simple_network_mode* snp_mode_data) EFIAPI;

    efi_status (*Configure) (struct efi_managed_network_protocol* self,
                             efi_managed_network_config_data* mnp_config_data) EFIAPI;

    efi_status (*McastIpToMac) (struct efi_managed_network_protocol* self,
                                bool ipv6_flag, efi_ip_addr* ip_addr, efi_mac_addr* mac_addr) EFIAPI;

    efi_status (*Groups) (struct efi_managed_network_protocol* self, bool join_flag,
                          efi_mac_addr* mac_addr) EFIAPI;

    efi_status (*Transmit) (struct efi_managed_network_protocol* self,
                            efi_managed_network_completion_token* token) EFIAPI;

    efi_status (*Receive) (struct efi_managed_network_protocol* self,
                           efi_managed_network_completion_token* token) EFIAPI;

    efi_status (*Cancel) (struct efi_managed_network_protocol* self,
                          efi_managed_network_completion_token* token) EFIAPI;

    efi_status (*Poll) (struct efi_managed_network_protocol* self) EFIAPI;
} efi_managed_network_protocol;
