// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_MANAGED_NETWORK_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_MANAGED_NETWORK_H_

#include <efi/protocol/simple-network.h>
#include <efi/types.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_sync_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_sync_completion_token* token) EFIAPI;

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

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

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

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_MANAGED_NETWORK_H_
