1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <stdbool.h>
8#include <efi/types.h>
9
10#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \
11    {0xa19832b9, 0xac25, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}}
12extern efi_guid SimpleNetworkProtocol;
13
14#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000
15
16#define MAX_MCAST_FILTER_CNT 16
17typedef struct {
18    uint32_t State;
19    uint32_t HwAddressSize;
20    uint32_t MediaHeaderSize;
21    uint32_t MaxPacketSize;
22    uint32_t NvRamSize;
23    uint32_t NvRamAccessSize;
24    uint32_t ReceiveFilterMask;
25    uint32_t ReceiveFilterSetting;
26    uint32_t MaxMCastFilterCount;
27    uint32_t MCastFilterCount;
28    efi_mac_addr MCastFilter[MAX_MCAST_FILTER_CNT];
29    efi_mac_addr CurrentAddress;
30    efi_mac_addr BroadcastAddress;
31    efi_mac_addr PermanentAddress;
32    uint8_t IfType;
33    bool MacAddressChangeable;
34    bool MultipleTxSupported;
35    bool MediaPresentSupported;
36    bool MediaPresent;
37} efi_simple_network_mode;
38
39typedef enum {
40    EfiSimpleNetworkStopped,
41    EfiSimpleNetworkStarted,
42    EfiSimpleNetworkInitialized,
43    EfiSimpleNetworkMaxState
44} efi_simple_network_state;
45
46#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01
47#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02
48#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04
49#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08
50#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
51
52typedef struct {
53    uint64_t RxTotalFrames;
54    uint64_t RxGoodFrames;
55    uint64_t RxUndersizeFrames;
56    uint64_t RxOversizeFrames;
57    uint64_t RxDroppedFrames;
58    uint64_t RxUnicastFrames;
59    uint64_t RxBroadcastFrames;
60    uint64_t RxMulticastFrames;
61    uint64_t RxCrcErrorFrames;
62    uint64_t RxTotalBytes;
63    uint64_t TxTotalFrames;
64    uint64_t TxGoodFrames;
65    uint64_t TxUndersizeFrames;
66    uint64_t TxOversizeFrames;
67    uint64_t TxDroppedFrames;
68    uint64_t TxUnicastFrames;
69    uint64_t TxBroadcastFrames;
70    uint64_t TxMulticastFrames;
71    uint64_t TxCrcErrorFrames;
72    uint64_t TxTotalBytes;
73    uint64_t Collisions;
74    uint64_t UnsupportedProtocol;
75    uint64_t RxDuplicatedFrames;
76    uint64_t RxDecryptErrorFrames;
77    uint64_t TxErrorFrames;
78    uint64_t TxRetryFrames;
79} efi_network_statistics;
80
81#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT  0x01
82#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02
83#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT  0x04
84#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08
85
86typedef struct efi_simple_network_protocol {
87    uint64_t Revision;
88
89    efi_status (*Start) (struct efi_simple_network_protocol* self) EFIAPI;
90
91    efi_status (*Stop) (struct efi_simple_network_protocol* self) EFIAPI;
92
93    efi_status (*Initialize) (struct efi_simple_network_protocol* self,
94                              size_t extra_rx_buf_size, size_t extra_tx_buf_size) EFIAPI;
95
96    efi_status (*Reset) (struct efi_simple_network_protocol* self,
97                         bool extended_verification) EFIAPI;
98
99    efi_status (*Shutdown) (struct efi_simple_network_protocol* self) EFIAPI;
100
101    efi_status (*ReceiveFilters) (struct efi_simple_network_protocol* self,
102                                  uint32_t enable, uint32_t disable,
103                                  bool reset_mcast_filter, size_t mcast_filter_count,
104                                  efi_mac_addr* mcast_filter) EFIAPI;
105
106    efi_status (*StationAddress) (struct efi_simple_network_protocol* self,
107                                  bool reset, efi_mac_addr* new_addr) EFIAPI;
108
109    efi_status (*Statistics) (struct efi_simple_network_protocol* self,
110                              bool reset, size_t* stats_size,
111                              efi_network_statistics* stats_table) EFIAPI;
112
113    efi_status (*MCastIpToMac) (struct efi_simple_network_protocol* self,
114                                bool ipv6, efi_ip_addr* ip, efi_mac_addr* mac) EFIAPI;
115
116    efi_status (*NvData) (struct efi_simple_network_protocol* self,
117                          bool read_write, size_t offset, size_t buf_size, void* buf) EFIAPI;
118
119    efi_status (*GetStatus) (struct efi_simple_network_protocol* self,
120                             uint32_t* interrupt_status, void** tx_buf) EFIAPI;
121
122    efi_status (*Transmit) (struct efi_simple_network_protocol* self,
123                            size_t header_size, size_t buf_size, void* buf,
124                            efi_mac_addr* src, efi_mac_addr* dest, uint16_t* protocol) EFIAPI;
125
126    efi_status (*Receive) (struct efi_simple_network_protocol* self,
127                           size_t* header_size, size_t* buf_size, void* buf,
128                           efi_mac_addr* src, efi_mac_addr* dest, uint16_t* protocol) EFIAPI;
129
130    efi_event WaitForPacket;
131    efi_simple_network_mode* Mode;
132} efi_simple_network_protocol;
133