Scrubbed more.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4Dxe / Ip4Impl.h
1 /** @file\r
2 \r
3 Copyright (c) 2005 - 2007, Intel Corporation                                                         \r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution.  The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12 Module Name:\r
13 \r
14   Ip4Impl.h\r
15 \r
16 Abstract:\r
17 \r
18   Ip4 internal functions and type defintions.\r
19 \r
20 \r
21 **/\r
22 \r
23 #ifndef __EFI_IP4_IMPL_H__\r
24 #define __EFI_IP4_IMPL_H__\r
25 \r
26 #include <PiDxe.h>\r
27 \r
28 #include <Protocol/Ip4.h>\r
29 #include <Protocol/Ip4Config.h>\r
30 #include <Protocol/Arp.h>\r
31 #include <Protocol/ManagedNetwork.h>\r
32 \r
33 #include <Library/DebugLib.h>\r
34 #include <Library/UefiRuntimeServicesTableLib.h>\r
35 #include <Library/UefiDriverEntryPoint.h>\r
36 #include <Library/UefiBootServicesTableLib.h>\r
37 #include <Library/BaseLib.h>\r
38 #include <Library/UefiLib.h>\r
39 #include <Library/NetLib.h>\r
40 #include <Library/BaseMemoryLib.h>\r
41 #include <Library/MemoryAllocationLib.h>\r
42 \r
43 #include "Ip4Common.h"\r
44 #include "Ip4Driver.h"\r
45 #include "Ip4If.h"\r
46 #include "Ip4Icmp.h"\r
47 #include "Ip4Option.h"\r
48 #include "Ip4Igmp.h"\r
49 #include "Ip4Route.h"\r
50 #include "Ip4Input.h"\r
51 #include "Ip4Output.h"\r
52 \r
53 typedef enum {\r
54   IP4_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'P'),\r
55   IP4_SERVICE_SIGNATURE  = EFI_SIGNATURE_32 ('I', 'P', '4', 'S'),\r
56 \r
57   //\r
58   // The state of IP4 protocol. It starts from UNCONFIGED. if it is\r
59   // successfully configured, it goes to CONFIGED. if configure NULL\r
60   // is called, it becomes UNCONFIGED again. If (partly) destoried, it\r
61   // becomes DESTORY.\r
62   //\r
63   IP4_STATE_UNCONFIGED   = 0,\r
64   IP4_STATE_CONFIGED,\r
65   IP4_STATE_DESTORY,\r
66 \r
67   //\r
68   // The state of IP4 service. It starts from UNSTARTED. It transits\r
69   // to STARTED if autoconfigure is started. If default address is\r
70   // configured, it becomes CONFIGED. and if partly destoried, it goes\r
71   // to DESTORY.\r
72   //\r
73   IP4_SERVICE_UNSTARTED  = 0,\r
74   IP4_SERVICE_STARTED,\r
75   IP4_SERVICE_CONFIGED,\r
76   IP4_SERVICE_DESTORY\r
77 } IP4_IMPL_ENUM_TYPES;\r
78 \r
79 ///\r
80 /// IP4_TXTOKEN_WRAP wraps the upper layer's transmit token.\r
81 /// The user's data is kept in the Packet. When fragment is\r
82 /// needed, each fragment of the Packet has a reference to the\r
83 /// Packet, no data is actually copied. The Packet will be\r
84 /// released when all the fragments of it have been recycled by\r
85 /// MNP. Upon then, the IP4_TXTOKEN_WRAP will be released, and\r
86 /// user's event signalled.\r
87 ///\r
88 typedef struct {\r
89   IP4_PROTOCOL              *IpInstance;\r
90   EFI_IP4_COMPLETION_TOKEN  *Token;\r
91   NET_BUF                   *Packet;\r
92   BOOLEAN                   Sent;\r
93   INTN                      Life;\r
94 } IP4_TXTOKEN_WRAP;\r
95 \r
96 ///\r
97 /// IP4_RXDATA_WRAP wraps the data IP4 child delivers to the\r
98 /// upper layers. The received packet is kept in the Packet.\r
99 /// The Packet itself may be constructured from some fragments.\r
100 /// All the fragments of the Packet is organized by a\r
101 /// IP4_ASSEMBLE_ENTRY structure. If the Packet is recycled by\r
102 /// the upper layer, the assemble entry and its associated\r
103 /// fragments will be freed at last.\r
104 ///\r
105 typedef struct {\r
106   LIST_ENTRY                Link;\r
107   IP4_PROTOCOL              *IpInstance;\r
108   NET_BUF                   *Packet;\r
109   EFI_IP4_RECEIVE_DATA      RxData;\r
110 } IP4_RXDATA_WRAP;\r
111 \r
112 typedef struct _IP4_PROTOCOL {\r
113   UINT32                    Signature;\r
114 \r
115   EFI_IP4_PROTOCOL          Ip4Proto;\r
116   EFI_HANDLE                Handle;\r
117   INTN                      State;\r
118 \r
119   IP4_SERVICE               *Service;\r
120   LIST_ENTRY                Link; // Link to all the IP protocol from the service\r
121 \r
122   //\r
123   // User's transmit/receive tokens, and received/deliverd packets\r
124   //\r
125   NET_MAP                   RxTokens;\r
126   NET_MAP                   TxTokens;   // map between (User's Token, IP4_TXTOKE_WRAP)\r
127   LIST_ENTRY                Received;   // Received but not delivered packet\r
128   LIST_ENTRY                Delivered;  // Delivered and to be recycled packets\r
129   EFI_LOCK                  RecycleLock;\r
130 \r
131   //\r
132   // Instance's address and route tables. There are two route tables.\r
133   // RouteTable is used by the IP4 driver to route packet. EfiRouteTable\r
134   // is used to communicate the current route info to the upper layer.\r
135   //\r
136   IP4_INTERFACE             *Interface;\r
137   LIST_ENTRY                AddrLink;   // Ip instances with the same IP address.\r
138   IP4_ROUTE_TABLE           *RouteTable;\r
139 \r
140   EFI_IP4_ROUTE_TABLE       *EfiRouteTable;\r
141   UINT32                    EfiRouteCount;\r
142 \r
143   //\r
144   // IGMP data for this instance\r
145   //\r
146   IP4_ADDR                  *Groups;  // stored in network byte order\r
147   UINT32                    GroupCount;\r
148 \r
149   EFI_IP4_CONFIG_DATA       ConfigData;\r
150 \r
151 } IP4_PROTOCOL;\r
152 \r
153 typedef struct _IP4_SERVICE {\r
154   UINT32                          Signature;\r
155   EFI_SERVICE_BINDING_PROTOCOL    ServiceBinding;\r
156   INTN                            State;\r
157   BOOLEAN                         InDestory;\r
158 \r
159   //\r
160   // List of all the IP instances and interfaces, and default\r
161   // interface and route table and caches.\r
162   //\r
163   UINTN                           NumChildren;\r
164   LIST_ENTRY                      Children;\r
165 \r
166   LIST_ENTRY                      Interfaces;\r
167 \r
168   IP4_INTERFACE                   *DefaultInterface;\r
169   IP4_ROUTE_TABLE                 *DefaultRouteTable;\r
170 \r
171   //\r
172   // Ip reassemble utilities, and IGMP data\r
173   //\r
174   IP4_ASSEMBLE_TABLE              Assemble;\r
175   IGMP_SERVICE_DATA               IgmpCtrl;\r
176 \r
177   //\r
178   // Low level protocol used by this service instance\r
179   //\r
180   EFI_HANDLE                      Image;\r
181   EFI_HANDLE                      Controller;\r
182 \r
183   EFI_HANDLE                      MnpChildHandle;\r
184   EFI_MANAGED_NETWORK_PROTOCOL    *Mnp;\r
185 \r
186   EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;\r
187   EFI_SIMPLE_NETWORK_MODE         SnpMode;\r
188 \r
189   EFI_EVENT                       Timer;\r
190 \r
191   //\r
192   // Auto configure staff\r
193   //\r
194   EFI_IP4_CONFIG_PROTOCOL         *Ip4Config;\r
195   EFI_EVENT                       DoneEvent;\r
196   EFI_EVENT                       ReconfigEvent;\r
197   EFI_EVENT                       ActiveEvent;\r
198 \r
199   //\r
200   // The string representation of the current mac address of the\r
201   // NIC this IP4_SERVICE works on.\r
202   //\r
203   CHAR16                          *MacString;\r
204 } IP4_SERVICE;\r
205 \r
206 #define IP4_INSTANCE_FROM_PROTOCOL(Ip4) \\r
207           CR ((Ip4), IP4_PROTOCOL, Ip4Proto, IP4_PROTOCOL_SIGNATURE)\r
208 \r
209 #define IP4_SERVICE_FROM_PROTOCOL(Sb)   \\r
210           CR ((Sb), IP4_SERVICE, ServiceBinding, IP4_SERVICE_SIGNATURE)\r
211 \r
212 #define IP4_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured)\r
213 \r
214 extern EFI_IP4_PROTOCOL mEfiIp4ProtocolTemplete;\r
215 \r
216 EFI_STATUS\r
217 Ip4ServiceConfigMnp (\r
218   IN IP4_SERVICE            *IpSb,\r
219   IN BOOLEAN                Force\r
220   );\r
221 \r
222 VOID\r
223 Ip4InitProtocol (\r
224   IN IP4_SERVICE            *IpSb,\r
225   IN IP4_PROTOCOL           *IpInstance\r
226   );\r
227 \r
228 EFI_STATUS\r
229 Ip4CleanProtocol (\r
230   IN  IP4_PROTOCOL          *IpInstance\r
231   );\r
232 \r
233 EFI_STATUS\r
234 Ip4Cancel (\r
235   IN IP4_PROTOCOL             *IpInstance,\r
236   IN EFI_IP4_COMPLETION_TOKEN *Token\r
237   );\r
238 \r
239 EFI_STATUS\r
240 Ip4Groups (\r
241   IN IP4_PROTOCOL           *IpInstance,\r
242   IN BOOLEAN                JoinFlag,\r
243   IN EFI_IPv4_ADDRESS       *GroupAddress\r
244   );\r
245 \r
246 VOID\r
247 EFIAPI\r
248 Ip4TimerTicking (\r
249   IN EFI_EVENT              Event,\r
250   IN VOID                   *Context\r
251   );\r
252 \r
253 EFI_STATUS\r
254 Ip4SentPacketTicking (\r
255   IN NET_MAP                *Map,\r
256   IN NET_MAP_ITEM           *Item,\r
257   IN VOID                   *Context\r
258   );\r
259 #endif\r