// Copyright 2021 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.

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_IP6_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_IP6_H_

#include <stdbool.h>
#include <zircon/compiler.h>

#include <efi/types.h>

__BEGIN_CDECLS

typedef struct {
  uint8_t DefaultProtocol;
  bool AcceptAnyProtocol;
  bool AcceptIcmpErrors;
  bool AcceptPromiscuous;
  efi_ipv6_addr DestinationAddress;
  efi_ipv6_addr StationAddress;
  uint8_t TrafficClass;
  uint8_t HopLimit;
  uint32_t FlowLabel;
  uint32_t ReceiveTimeout;
  uint32_t TransmitTimeout;
} efi_ip6_config_data;

typedef struct {
  efi_ipv6_addr Address;
  uint8_t PrefixLength;
} efi_ip6_address_info;

typedef struct {
  efi_ipv6_addr Gateway;
  efi_ipv6_addr Destination;
  uint8_t PrefixLength;
} efi_ip6_route_table;

typedef enum {
  EfiNeighborInComplete,
  EfiNeighborReachable,
  EfiNeighborStale,
  EfiNeighborDelay,
  EfiNeighborProbe
} efi_ip6_neighbor_state;

typedef struct {
  efi_ipv6_addr Neighbor;
  efi_mac_addr LinkAddress;
  efi_ip6_neighbor_state State;
} efi_ip6_neighbor_cache;

typedef struct {
  uint8_t Type;
  uint8_t Code;
} efi_ip6_icmp_type;

typedef struct {
  bool IsStarted;
  uint32_t MaxPacketSize;
  efi_ip6_config_data ConfigData;
  bool IsConfigured;
  uint32_t AddressCount;
  efi_ip6_address_info* AddressList;
  uint32_t GroupCount;
  efi_ipv6_addr* GroupTable;
  uint32_t RouteCount;
  efi_ip6_route_table* RouteTable;
  uint32_t NeighborCount;
  efi_ip6_neighbor_cache* NeighborCache;
  uint32_t PrefixCount;
  efi_ip6_address_info* PrefixTable;
  uint32_t IcmpTypeCount;
  efi_ip6_icmp_type* IcmpTypeList;
} efi_ip6_mode_data;

__END_CDECLS

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_IP6_H_
