1 /** @file
2   Declaration of structures and functions of MnpDxe driver.
3 
4 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef _MNP_IMPL_H_
10 #define _MNP_IMPL_H_
11 
12 #include "MnpDriver.h"
13 
14 #define NET_ETHER_FCS_SIZE            4
15 
16 #define MNP_SYS_POLL_INTERVAL         (10 * TICKS_PER_MS)   // 10 milliseconds
17 #define MNP_TIMEOUT_CHECK_INTERVAL    (50 * TICKS_PER_MS)   // 50 milliseconds
18 #define MNP_MEDIA_DETECT_INTERVAL     (500 * TICKS_PER_MS)  // 500 milliseconds
19 #define MNP_TX_TIMEOUT_TIME           (500 * TICKS_PER_MS)  // 500 milliseconds
20 #define MNP_INIT_NET_BUFFER_NUM       512
21 #define MNP_NET_BUFFER_INCREASEMENT   64
22 #define MNP_MAX_NET_BUFFER_NUM        65536
23 #define MNP_TX_BUFFER_INCREASEMENT    32    // Same as the recycling Q length for xmit_done in UNDI command.
24 #define MNP_MAX_TX_BUFFER_NUM         65536
25 
26 #define MNP_MAX_RCVD_PACKET_QUE_SIZE  256
27 
28 #define MNP_RECEIVE_UNICAST           0x01
29 #define MNP_RECEIVE_BROADCAST         0x02
30 
31 #define UNICAST_PACKET                MNP_RECEIVE_UNICAST
32 #define BROADCAST_PACKET              MNP_RECEIVE_BROADCAST
33 
34 #define MNP_INSTANCE_DATA_SIGNATURE   SIGNATURE_32 ('M', 'n', 'p', 'I')
35 
36 #define MNP_INSTANCE_DATA_FROM_THIS(a) \
37   CR ( \
38   (a), \
39   MNP_INSTANCE_DATA, \
40   ManagedNetwork, \
41   MNP_INSTANCE_DATA_SIGNATURE \
42   )
43 
44 typedef struct {
45   UINT32                          Signature;
46 
47   MNP_SERVICE_DATA                *MnpServiceData;
48 
49   EFI_HANDLE                      Handle;
50 
51   LIST_ENTRY                      InstEntry;
52 
53   EFI_MANAGED_NETWORK_PROTOCOL    ManagedNetwork;
54 
55   BOOLEAN                         Configured;
56   BOOLEAN                         Destroyed;
57 
58   LIST_ENTRY                      GroupCtrlBlkList;
59 
60   NET_MAP                         RxTokenMap;
61 
62   LIST_ENTRY                      RxDeliveredPacketQueue;
63   LIST_ENTRY                      RcvdPacketQueue;
64   UINTN                           RcvdPacketQueueSize;
65 
66   EFI_MANAGED_NETWORK_CONFIG_DATA ConfigData;
67 
68   UINT8                           ReceiveFilter;
69 } MNP_INSTANCE_DATA;
70 
71 typedef struct {
72   LIST_ENTRY      AddrEntry;
73   EFI_MAC_ADDRESS Address;
74   INTN            RefCnt;
75 } MNP_GROUP_ADDRESS;
76 
77 typedef struct {
78   LIST_ENTRY        CtrlBlkEntry;
79   MNP_GROUP_ADDRESS *GroupAddress;
80 } MNP_GROUP_CONTROL_BLOCK;
81 
82 typedef struct {
83   LIST_ENTRY                        WrapEntry;
84   MNP_INSTANCE_DATA                 *Instance;
85   EFI_MANAGED_NETWORK_RECEIVE_DATA  RxData;
86   NET_BUF                           *Nbuf;
87   UINT64                            TimeoutTick;
88 } MNP_RXDATA_WRAP;
89 
90 #define MNP_TX_BUF_WRAP_SIGNATURE   SIGNATURE_32 ('M', 'T', 'B', 'W')
91 
92 typedef struct {
93   UINT32                  Signature;
94   LIST_ENTRY              WrapEntry;  // Link to FreeTxBufList
95   LIST_ENTRY              AllEntry;   // Link to AllTxBufList
96   BOOLEAN                 InUse;
97   UINT8                   TxBuf[1];
98 } MNP_TX_BUF_WRAP;
99 
100 /**
101   Initialize the mnp device context data.
102 
103   @param[in, out]  MnpDeviceData      Pointer to the mnp device context data.
104   @param[in]       ImageHandle        The driver image handle.
105   @param[in]       ControllerHandle   Handle of device to bind driver to.
106 
107   @retval EFI_SUCCESS           The mnp service context is initialized.
108   @retval EFI_UNSUPPORTED       ControllerHandle does not support Simple Network Protocol.
109   @retval Others                Other errors as indicated.
110 
111 **/
112 EFI_STATUS
113 MnpInitializeDeviceData (
114   IN OUT MNP_DEVICE_DATA   *MnpDeviceData,
115   IN     EFI_HANDLE        ImageHandle,
116   IN     EFI_HANDLE        ControllerHandle
117   );
118 
119 /**
120   Destroy the MNP device context data.
121 
122   @param[in, out]  MnpDeviceData      Pointer to the mnp device context data.
123   @param[in]       ImageHandle        The driver image handle.
124 
125 **/
126 VOID
127 MnpDestroyDeviceData (
128   IN OUT MNP_DEVICE_DATA   *MnpDeviceData,
129   IN     EFI_HANDLE        ImageHandle
130   );
131 
132 /**
133   Create mnp service context data.
134 
135   @param[in]       MnpDeviceData      Pointer to the mnp device context data.
136   @param[in]       VlanId             The VLAN ID.
137   @param[in]       Priority           The VLAN priority. If VlanId is 0,
138                                       Priority is ignored.
139 
140   @return A pointer to MNP_SERVICE_DATA or NULL if failed to create MNP service context.
141 
142 **/
143 MNP_SERVICE_DATA *
144 MnpCreateServiceData (
145   IN MNP_DEVICE_DATA     *MnpDeviceData,
146   IN UINT16              VlanId,
147   IN UINT8                Priority OPTIONAL
148   );
149 
150 /**
151   Initialize the mnp service context data.
152 
153   @param[in, out]  MnpServiceData     Pointer to the mnp service context data.
154   @param[in]       ImageHandle        The driver image handle.
155   @param[in]       ControllerHandle   Handle of device to bind driver to.
156 
157   @retval EFI_SUCCESS           The mnp service context is initialized.
158   @retval EFI_UNSUPPORTED       ControllerHandle does not support Simple Network Protocol.
159   @retval Others                Other errors as indicated.
160 
161 **/
162 EFI_STATUS
163 MnpInitializeServiceData (
164   IN OUT MNP_SERVICE_DATA    *MnpServiceData,
165   IN     EFI_HANDLE          ImageHandle,
166   IN     EFI_HANDLE          ControllerHandle
167   );
168 
169 /**
170   Destroy the MNP service context data.
171 
172   @param[in, out]  MnpServiceData    Pointer to the mnp service context data.
173 
174   @retval EFI_SUCCESS           The mnp service context is destroyed.
175   @retval Others                Errors as indicated.
176 
177 **/
178 EFI_STATUS
179 MnpDestroyServiceData (
180   IN OUT MNP_SERVICE_DATA    *MnpServiceData
181   );
182 
183 /**
184   Destroy all child of the MNP service data.
185 
186   @param[in, out]  MnpServiceData    Pointer to the mnp service context data.
187 
188   @retval EFI_SUCCESS           All child are destroyed.
189   @retval Others                Failed to destroy all child.
190 
191 **/
192 EFI_STATUS
193 MnpDestroyServiceChild (
194   IN OUT MNP_SERVICE_DATA    *MnpServiceData
195   );
196 
197 /**
198   Find the MNP Service Data for given VLAN ID.
199 
200   @param[in]  MnpDeviceData      Pointer to the mnp device context data.
201   @param[in]  VlanId             The VLAN ID.
202 
203   @return A pointer to MNP_SERVICE_DATA or NULL if not found.
204 
205 **/
206 MNP_SERVICE_DATA *
207 MnpFindServiceData (
208   IN MNP_DEVICE_DATA     *MnpDeviceData,
209   IN UINT16              VlanId
210   );
211 
212 /**
213   Initialize the mnp instance context data.
214 
215   @param[in]       MnpServiceData   Pointer to the mnp service context data.
216   @param[in, out]  Instance         Pointer to the mnp instance context data
217                                     to initialize.
218 
219 **/
220 VOID
221 MnpInitializeInstanceData (
222   IN     MNP_SERVICE_DATA    *MnpServiceData,
223   IN OUT MNP_INSTANCE_DATA   *Instance
224   );
225 
226 /**
227   Check whether the token specified by Arg matches the token in Item.
228 
229   @param[in]  Map               Pointer to the NET_MAP.
230   @param[in]  Item              Pointer to the NET_MAP_ITEM.
231   @param[in]  Arg               Pointer to the Arg, it's a pointer to the token to
232                                 check.
233 
234   @retval EFI_SUCCESS           The token specified by Arg is different from the
235                                 token in Item.
236   @retval EFI_ACCESS_DENIED     The token specified by Arg is the same as that in
237                                 Item.
238 
239 **/
240 EFI_STATUS
241 EFIAPI
242 MnpTokenExist (
243   IN NET_MAP         *Map,
244   IN NET_MAP_ITEM    *Item,
245   IN VOID            *Arg
246   );
247 
248 /**
249   Cancel the token specified by Arg if it matches the token in Item.
250 
251   @param[in, out]  Map               Pointer to the NET_MAP.
252   @param[in, out]  Item              Pointer to the NET_MAP_ITEM.
253   @param[in]       Arg               Pointer to the Arg, it's a pointer to the
254                                      token to cancel.
255 
256   @retval EFI_SUCCESS       The Arg is NULL, and the token in Item is cancelled,
257                             or the Arg isn't NULL, and the token in Item is
258                             different from the Arg.
259   @retval EFI_ABORTED       The Arg isn't NULL, the token in Item mathces the
260                             Arg, and the token is cancelled.
261 
262 **/
263 EFI_STATUS
264 EFIAPI
265 MnpCancelTokens (
266   IN OUT NET_MAP         *Map,
267   IN OUT NET_MAP_ITEM    *Item,
268   IN     VOID            *Arg
269   );
270 
271 /**
272   Flush the instance's received data.
273 
274   @param[in, out]  Instance              Pointer to the mnp instance context data.
275 
276 **/
277 VOID
278 MnpFlushRcvdDataQueue (
279   IN OUT MNP_INSTANCE_DATA   *Instance
280   );
281 
282 /**
283   Configure the Instance using ConfigData.
284 
285   @param[in, out]  Instance     Pointer to the mnp instance context data.
286   @param[in]       ConfigData   Pointer to the configuration data used to configure
287                                 the instance.
288 
289   @retval EFI_SUCCESS           The Instance is configured.
290   @retval EFI_UNSUPPORTED       EnableReceiveTimestamps is on and the
291                                 implementation doesn't support it.
292   @retval Others                Other errors as indicated.
293 
294 **/
295 EFI_STATUS
296 MnpConfigureInstance (
297   IN OUT MNP_INSTANCE_DATA                 *Instance,
298   IN     EFI_MANAGED_NETWORK_CONFIG_DATA   *ConfigData OPTIONAL
299   );
300 
301 /**
302   Do the group operations for this instance.
303 
304   @param[in, out]  Instance        Pointer to the instance context data.
305   @param[in]       JoinFlag        Set to TRUE to join a group. Set to TRUE to
306                                    leave a group/groups.
307   @param[in]       MacAddress      Pointer to the group address to join or leave.
308   @param[in]       CtrlBlk         Pointer to the group control block if JoinFlag
309                                    is FALSE.
310 
311   @retval EFI_SUCCESS              The group operation finished.
312   @retval EFI_OUT_OF_RESOURCES     Failed due to lack of memory resources.
313   @retval Others                   Other errors as indicated.
314 
315 **/
316 EFI_STATUS
317 MnpGroupOp (
318   IN OUT MNP_INSTANCE_DATA         *Instance,
319   IN     BOOLEAN                   JoinFlag,
320   IN     EFI_MAC_ADDRESS           *MacAddress OPTIONAL,
321   IN     MNP_GROUP_CONTROL_BLOCK   *CtrlBlk OPTIONAL
322   );
323 
324 /**
325   Validates the Mnp transmit token.
326 
327   @param[in]  Instance            Pointer to the Mnp instance context data.
328   @param[in]  Token               Pointer to the transmit token to check.
329 
330   @return The Token is valid or not.
331 
332 **/
333 BOOLEAN
334 MnpIsValidTxToken (
335   IN MNP_INSTANCE_DATA                       *Instance,
336   IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN    *Token
337   );
338 
339 /**
340   Build the packet to transmit from the TxData passed in.
341 
342   @param[in]   MnpServiceData      Pointer to the mnp service context data.
343   @param[in]   TxData              Pointer to the transmit data containing the information
344                                    to build the packet.
345   @param[out]  PktBuf              Pointer to record the address of the packet.
346   @param[out]  PktLen              Pointer to a UINT32 variable used to record the packet's
347                                    length.
348 
349   @retval EFI_SUCCESS           TxPackage is built.
350   @retval EFI_OUT_OF_RESOURCES  The deliver fails due to lack of memory resource.
351 
352 **/
353 EFI_STATUS
354 MnpBuildTxPacket (
355   IN     MNP_SERVICE_DATA                    *MnpServiceData,
356   IN     EFI_MANAGED_NETWORK_TRANSMIT_DATA   *TxData,
357      OUT UINT8                               **PktBuf,
358      OUT UINT32                              *PktLen
359   );
360 
361 /**
362   Synchronously send out the packet.
363 
364   This function places the packet buffer to SNP driver's tansmit queue. The packet
365   can be considered successfully sent out once SNP accept the packet, while the
366   packet buffer recycle is deferred for better performance.
367 
368   @param[in]       MnpServiceData      Pointer to the mnp service context data.
369   @param[in]       Packet              Pointer to the packet buffer.
370   @param[in]       Length              The length of the packet.
371   @param[in, out]  Token               Pointer to the token the packet generated from.
372 
373   @retval EFI_SUCCESS                  The packet is sent out.
374   @retval EFI_TIMEOUT                  Time out occurs, the packet isn't sent.
375   @retval EFI_DEVICE_ERROR             An unexpected network error occurs.
376 
377 **/
378 EFI_STATUS
379 MnpSyncSendPacket (
380   IN     MNP_SERVICE_DATA                        *MnpServiceData,
381   IN     UINT8                                   *Packet,
382   IN     UINT32                                  Length,
383   IN OUT EFI_MANAGED_NETWORK_COMPLETION_TOKEN    *Token
384   );
385 
386 /**
387   Try to deliver the received packet to the instance.
388 
389   @param[in, out]  Instance     Pointer to the mnp instance context data.
390 
391   @retval EFI_SUCCESS           The received packet is delivered, or there is no
392                                 packet to deliver, or there is no available receive
393                                 token.
394   @retval EFI_OUT_OF_RESOURCES  The deliver fails due to lack of memory resource.
395 
396 **/
397 EFI_STATUS
398 MnpInstanceDeliverPacket (
399   IN OUT MNP_INSTANCE_DATA   *Instance
400   );
401 
402 /**
403   Recycle the RxData and other resources used to hold and deliver the received
404   packet.
405 
406   @param[in]  Event               The event this notify function registered to.
407   @param[in]  Context             Pointer to the context data registered to the Event.
408 
409 **/
410 VOID
411 EFIAPI
412 MnpRecycleRxData (
413   IN EFI_EVENT     Event,
414   IN VOID          *Context
415   );
416 
417 /**
418   Try to receive a packet and deliver it.
419 
420   @param[in, out]  MnpDeviceData        Pointer to the mnp device context data.
421 
422   @retval EFI_SUCCESS           add return value to function comment
423   @retval EFI_NOT_STARTED       The simple network protocol is not started.
424   @retval EFI_NOT_READY         No packet received.
425   @retval EFI_DEVICE_ERROR      An unexpected error occurs.
426 
427 **/
428 EFI_STATUS
429 MnpReceivePacket (
430   IN OUT MNP_DEVICE_DATA   *MnpDeviceData
431   );
432 
433 /**
434   Allocate a free NET_BUF from MnpDeviceData->FreeNbufQue. If there is none
435   in the queue, first try to allocate some and add them into the queue, then
436   fetch the NET_BUF from the updated FreeNbufQue.
437 
438   @param[in, out]  MnpDeviceData        Pointer to the MNP_DEVICE_DATA.
439 
440   @return     Pointer to the allocated free NET_BUF structure, if NULL the
441               operation is failed.
442 
443 **/
444 NET_BUF *
445 MnpAllocNbuf (
446   IN OUT MNP_DEVICE_DATA   *MnpDeviceData
447   );
448 
449 /**
450   Try to reclaim the Nbuf into the buffer pool.
451 
452   @param[in, out]  MnpDeviceData         Pointer to the mnp device context data.
453   @param[in, out]  Nbuf                  Pointer to the NET_BUF to free.
454 
455 **/
456 VOID
457 MnpFreeNbuf (
458   IN OUT MNP_DEVICE_DATA   *MnpDeviceData,
459   IN OUT NET_BUF           *Nbuf
460   );
461 
462 /**
463   Allocate a free TX buffer from MnpDeviceData->FreeTxBufList. If there is none
464   in the queue, first try to recycle some from SNP, then try to allocate some and add
465   them into the queue, then fetch the NET_BUF from the updated FreeTxBufList.
466 
467   @param[in, out]  MnpDeviceData        Pointer to the MNP_DEVICE_DATA.
468 
469   @return     Pointer to the allocated free NET_BUF structure, if NULL the
470               operation is failed.
471 
472 **/
473 UINT8 *
474 MnpAllocTxBuf (
475   IN OUT MNP_DEVICE_DATA   *MnpDeviceData
476   );
477 
478 /**
479   Try to recycle all the transmitted buffer address from SNP.
480 
481   @param[in, out]  MnpDeviceData     Pointer to the mnp device context data.
482 
483   @retval EFI_SUCCESS             Successed to recycle the transmitted buffer address.
484   @retval Others                  Failed to recycle the transmitted buffer address.
485 
486 **/
487 EFI_STATUS
488 MnpRecycleTxBuf (
489   IN OUT MNP_DEVICE_DATA   *MnpDeviceData
490   );
491 
492 /**
493   Remove the received packets if timeout occurs.
494 
495   @param[in]  Event        The event this notify function registered to.
496   @param[in]  Context      Pointer to the context data registered to the event.
497 
498 **/
499 VOID
500 EFIAPI
501 MnpCheckPacketTimeout (
502   IN EFI_EVENT     Event,
503   IN VOID          *Context
504   );
505 
506 /**
507   Poll to update MediaPresent field in SNP ModeData by Snp.GetStatus().
508 
509   @param[in]  Event        The event this notify function registered to.
510   @param[in]  Context      Pointer to the context data registered to the event.
511 
512 **/
513 VOID
514 EFIAPI
515 MnpCheckMediaStatus (
516   IN EFI_EVENT     Event,
517   IN VOID          *Context
518   );
519 
520 /**
521   Poll to receive the packets from Snp. This function is either called by upperlayer
522   protocols/applications or the system poll timer notify mechanism.
523 
524   @param[in]  Event        The event this notify function registered to.
525   @param[in]  Context      Pointer to the context data registered to the event.
526 
527 **/
528 VOID
529 EFIAPI
530 MnpSystemPoll (
531   IN EFI_EVENT     Event,
532   IN VOID          *Context
533   );
534 
535 /**
536   Returns the operational parameters for the current MNP child driver. May also
537   support returning the underlying SNP driver mode data.
538 
539   The GetModeData() function is used to read the current mode data (operational
540   parameters) from the MNP or the underlying SNP.
541 
542   @param[in]  This          Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
543   @param[out] MnpConfigData Pointer to storage for MNP operational parameters. Type
544                             EFI_MANAGED_NETWORK_CONFIG_DATA is defined in "Related
545                             Definitions" below.
546   @param[out] SnpModeData   Pointer to storage for SNP operational parameters. This
547                             feature may be unsupported. Type EFI_SIMPLE_NETWORK_MODE
548                             is defined in the EFI_SIMPLE_NETWORK_PROTOCOL.
549 
550   @retval EFI_SUCCESS           The operation completed successfully.
551   @retval EFI_INVALID_PARAMETER This is NULL.
552   @retval EFI_UNSUPPORTED       The requested feature is unsupported in this
553                                 MNP implementation.
554   @retval EFI_NOT_STARTED       This MNP child driver instance has not been
555                                 configured. The default values are returned in
556                                 MnpConfigData if it is not NULL.
557   @retval Others                The mode data could not be read.
558 
559 **/
560 EFI_STATUS
561 EFIAPI
562 MnpGetModeData (
563   IN     EFI_MANAGED_NETWORK_PROTOCOL      *This,
564      OUT EFI_MANAGED_NETWORK_CONFIG_DATA   *MnpConfigData OPTIONAL,
565      OUT EFI_SIMPLE_NETWORK_MODE           *SnpModeData OPTIONAL
566   );
567 
568 /**
569   Sets or clears the operational parameters for the MNP child driver.
570 
571   The Configure() function is used to set, change, or reset the operational
572   parameters for the MNP child driver instance. Until the operational parameters
573   have been set, no network traffic can be sent or received by this MNP child
574   driver instance. Once the operational parameters have been reset, no more
575   traffic can be sent or received until the operational parameters have been set
576   again.
577   Each MNP child driver instance can be started and stopped independently of
578   each other by setting or resetting their receive filter settings with the
579   Configure() function.
580   After any successful call to Configure(), the MNP child driver instance is
581   started. The internal periodic timer (if supported) is enabled. Data can be
582   transmitted and may be received if the receive filters have also been enabled.
583   Note: If multiple MNP child driver instances will receive the same packet
584   because of overlapping receive filter settings, then the first MNP child
585   driver instance will receive the original packet and additional instances will
586   receive copies of the original packet.
587   Note: Warning: Receive filter settings that overlap will consume extra
588   processor and/or DMA resources and degrade system and network performance.
589 
590   @param[in]  This           Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
591   @param[in]  MnpConfigData  Pointer to configuration data that will be assigned
592                              to the MNP child driver instance. If NULL, the MNP
593                              child driver instance is reset to startup defaults
594                              and all pending transmit and receive requests are
595                              flushed. Type EFI_MANAGED_NETWORK_CONFIG_DATA is
596                              defined in EFI_MANAGED_NETWORK_PROTOCOL.GetModeData().
597 
598   @retval EFI_SUCCESS            The operation completed successfully.
599   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is
600                                  TRUE:
601                                  * This is NULL.
602                                  * MnpConfigData.ProtocolTypeFilter is not
603                                    valid.
604                                  The operational data for the MNP child driver
605                                  instance is unchanged.
606   @retval EFI_OUT_OF_RESOURCES   Required system resources (usually memory)
607                                  could not be allocated.
608                                  The MNP child driver instance has been reset to
609                                  startup defaults.
610   @retval EFI_UNSUPPORTED        The requested feature is unsupported in
611                                  this [MNP] implementation. The operational data
612                                  for the MNP child driver instance is unchanged.
613   @retval EFI_DEVICE_ERROR       An unexpected network or system error
614                                  occurred. The MNP child driver instance has
615                                  been reset to startup defaults.
616   @retval Others                 The MNP child driver instance has been reset to
617                                  startup defaults.
618 
619 **/
620 EFI_STATUS
621 EFIAPI
622 MnpConfigure (
623   IN EFI_MANAGED_NETWORK_PROTOCOL        *This,
624   IN EFI_MANAGED_NETWORK_CONFIG_DATA     *MnpConfigData OPTIONAL
625   );
626 
627 /**
628   Translates an IP multicast address to a hardware (MAC) multicast address. This
629   function may be unsupported in some MNP implementations.
630 
631   The McastIpToMac() function translates an IP multicast address to a hardware
632   (MAC) multicast address. This function may be implemented by calling the
633   underlying EFI_SIMPLE_NETWORK. MCastIpToMac() function, which may also be
634   unsupported in some MNP implementations.
635 
636   @param[in]  This        Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
637   @param[in]  Ipv6Flag    Set to TRUE to if IpAddress is an IPv6 multicast address.
638                           Set to FALSE if IpAddress is an IPv4 multicast address.
639   @param[in]  IpAddress   Pointer to the multicast IP address (in network byte
640                           order) to convert.
641   @param[out] MacAddress  Pointer to the resulting multicast MAC address.
642 
643   @retval EFI_SUCCESS           The operation completed successfully.
644   @retval EFI_INVALID_PARAMETER One of the following conditions is TRUE:
645                                  * This is NULL.
646                                  * IpAddress is NULL.
647                                  * IpAddress is not a valid multicast IP
648                                    address.
649                                  * MacAddress is NULL.
650   @retval EFI_NOT_STARTED       This MNP child driver instance has not been
651                                 configured.
652   @retval EFI_UNSUPPORTED       The requested feature is unsupported in this
653                                 MNP implementation.
654   @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred.
655   @retval Others                The address could not be converted.
656 **/
657 EFI_STATUS
658 EFIAPI
659 MnpMcastIpToMac (
660   IN     EFI_MANAGED_NETWORK_PROTOCOL    *This,
661   IN     BOOLEAN                         Ipv6Flag,
662   IN     EFI_IP_ADDRESS                  *IpAddress,
663      OUT EFI_MAC_ADDRESS                 *MacAddress
664   );
665 
666 /**
667   Enables and disables receive filters for multicast address. This function may
668   be unsupported in some MNP implementations.
669 
670   The Groups() function only adds and removes multicast MAC addresses from the
671   filter list. The MNP driver does not transmit or process Internet Group
672   Management Protocol (IGMP) packets. If JoinFlag is FALSE and MacAddress is
673   NULL, then all joined groups are left.
674 
675   @param[in]  This        Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
676   @param[in]  JoinFlag    Set to TRUE to join this multicast group.
677                           Set to FALSE to leave this multicast group.
678   @param[in]  MacAddress  Pointer to the multicast MAC group (address) to join or
679                           leave.
680 
681   @retval EFI_SUCCESS           The requested operation completed successfully.
682   @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
683                                 * This is NULL.
684                                 * JoinFlag is TRUE and MacAddress is NULL.
685                                 * MacAddress is not a valid multicast MAC
686                                   address.
687                                 * The MNP multicast group settings are
688                                   unchanged.
689   @retval EFI_NOT_STARTED       This MNP child driver instance has not been
690                                 configured.
691   @retval EFI_ALREADY_STARTED   The supplied multicast group is already joined.
692   @retval EFI_NOT_FOUND         The supplied multicast group is not joined.
693   @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred.
694                                 The MNP child driver instance has been reset to
695                                 startup defaults.
696   @retval EFI_UNSUPPORTED       The requested feature is unsupported in this MNP
697                                 implementation.
698   @retval Others                The requested operation could not be completed.
699                                 The MNP multicast group settings are unchanged.
700 
701 **/
702 EFI_STATUS
703 EFIAPI
704 MnpGroups (
705   IN EFI_MANAGED_NETWORK_PROTOCOL    *This,
706   IN BOOLEAN                         JoinFlag,
707   IN EFI_MAC_ADDRESS                 *MacAddress OPTIONAL
708   );
709 
710 /**
711   Places asynchronous outgoing data packets into the transmit queue.
712 
713   The Transmit() function places a completion token into the transmit packet
714   queue. This function is always asynchronous.
715   The caller must fill in the Token.Event and Token.TxData fields in the
716   completion token, and these fields cannot be NULL. When the transmit operation
717   completes, the MNP updates the Token.Status field and the Token.Event is
718   signaled.
719   Note: There may be a performance penalty if the packet needs to be
720   defragmented before it can be transmitted by the network device. Systems in
721   which performance is critical should review the requirements and features of
722   the underlying communications device and drivers.
723 
724 
725   @param[in]  This    Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
726   @param[in]  Token   Pointer to a token associated with the transmit data
727                       descriptor. Type EFI_MANAGED_NETWORK_COMPLETION_TOKEN
728                       is defined in "Related Definitions" below.
729 
730   @retval EFI_SUCCESS            The transmit completion token was cached.
731   @retval EFI_NOT_STARTED        This MNP child driver instance has not been
732                                  configured.
733   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is
734                                  TRUE:
735                                  * This is NULL.
736                                  * Token is NULL.
737                                  * Token.Event is NULL.
738                                  * Token.TxData is NULL.
739                                  * Token.TxData.DestinationAddress is not
740                                    NULL and Token.TxData.HeaderLength is zero.
741                                  * Token.TxData.FragmentCount is zero.
742                                  * (Token.TxData.HeaderLength +
743                                    Token.TxData.DataLength) is not equal to the
744                                    sum of the
745                                    Token.TxData.FragmentTable[].FragmentLength
746                                    fields.
747                                  * One or more of the
748                                    Token.TxData.FragmentTable[].FragmentLength
749                                    fields is zero.
750                                  * One or more of the
751                                    Token.TxData.FragmentTable[].FragmentBufferfields
752                                    is NULL.
753                                  * Token.TxData.DataLength is greater than MTU.
754   @retval EFI_ACCESS_DENIED      The transmit completion token is already in the
755                                  transmit queue.
756   @retval EFI_OUT_OF_RESOURCES   The transmit data could not be queued due to a
757                                  lack of system resources (usually memory).
758   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
759                                  The MNP child driver instance has been reset to
760                                  startup defaults.
761   @retval EFI_NOT_READY          The transmit request could not be queued because
762                                  the transmit queue is full.
763 
764 **/
765 EFI_STATUS
766 EFIAPI
767 MnpTransmit (
768   IN EFI_MANAGED_NETWORK_PROTOCOL            *This,
769   IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN    *Token
770   );
771 
772 /**
773   Aborts an asynchronous transmit or receive request.
774 
775   The Cancel() function is used to abort a pending transmit or receive request.
776   If the token is in the transmit or receive request queues, after calling this
777   function, Token.Status will be set to EFI_ABORTED and then Token.Event will be
778   signaled. If the token is not in one of the queues, which usually means that
779   the asynchronous operation has completed, this function will not signal the
780   token and EFI_NOT_FOUND is returned.
781 
782   @param[in]  This     Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
783   @param[in]  Token    Pointer to a token that has been issued by
784                        EFI_MANAGED_NETWORK_PROTOCOL.Transmit() or
785                        EFI_MANAGED_NETWORK_PROTOCOL.Receive(). If NULL, all
786                        pending tokens are aborted.
787 
788   @retval EFI_SUCCESS            The asynchronous I/O request was aborted and
789                                  Token.Event was signaled. When Token is NULL,
790                                  all pending requests were aborted and their
791                                  events were signaled.
792   @retval EFI_NOT_STARTED        This MNP child driver instance has not been
793                                  configured.
794   @retval EFI_INVALID_PARAMETER  This is NULL.
795   @retval EFI_NOT_FOUND          When Token is not NULL, the asynchronous I/O
796                                  request was not found in the transmit or
797                                  receive queue. It has either completed or was
798                                  not issued by Transmit() and Receive().
799 
800 **/
801 EFI_STATUS
802 EFIAPI
803 MnpCancel (
804   IN EFI_MANAGED_NETWORK_PROTOCOL            *This,
805   IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN    *Token OPTIONAL
806   );
807 
808 /**
809   Places an asynchronous receiving request into the receiving queue.
810 
811   The Receive() function places a completion token into the receive packet
812   queue. This function is always asynchronous.
813   The caller must fill in the Token.Event field in the completion token, and
814   this field cannot be NULL. When the receive operation completes, the MNP
815   updates the Token.Status and Token.RxData fields and the Token.Event is
816   signaled.
817 
818   @param[in]  This      Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
819   @param[in]  Token     Pointer to a token associated with the receive
820                         data descriptor. Type
821                         EFI_MANAGED_NETWORK_COMPLETION_TOKEN is defined in
822                         EFI_MANAGED_NETWORK_PROTOCOL.Transmit().
823 
824   @retval EFI_SUCCESS            The receive completion token was cached.
825   @retval EFI_NOT_STARTED        This MNP child driver instance has not been
826                                  configured.
827   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is
828                                  TRUE:
829                                  * This is NULL.
830                                  * Token is NULL.
831                                  * Token.Event is NULL
832   @retval EFI_OUT_OF_RESOURCES   The transmit data could not be queued due to a
833                                  lack of system resources (usually memory).
834   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
835                                  The MNP child driver instance has been reset to
836                                  startup defaults.
837   @retval EFI_ACCESS_DENIED      The receive completion token was already in the
838                                  receive queue.
839   @retval EFI_NOT_READY          The receive request could not be queued because
840                                  the receive queue is full.
841 
842 **/
843 EFI_STATUS
844 EFIAPI
845 MnpReceive (
846   IN EFI_MANAGED_NETWORK_PROTOCOL            *This,
847   IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN    *Token
848   );
849 
850 /**
851   Polls for incoming data packets and processes outgoing data packets.
852 
853   The Poll() function can be used by network drivers and applications to
854   increase the rate that data packets are moved between the communications
855   device and the transmit and receive queues.
856   Normally, a periodic timer event internally calls the Poll() function. But, in
857   some systems, the periodic timer event may not call Poll() fast enough to
858   transmit and/or receive all data packets without missing packets. Drivers and
859   applications that are experiencing packet loss should try calling the Poll()
860   function more often.
861 
862   @param[in]  This         Pointer to the EFI_MANAGED_NETWORK_PROTOCOL instance.
863 
864   @retval EFI_SUCCESS      Incoming or outgoing data was processed.
865   @retval EFI_NOT_STARTED  This MNP child driver instance has not been
866                            configured.
867   @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The
868                            MNP child driver instance has been reset to startup
869                            defaults.
870   @retval EFI_NOT_READY    No incoming or outgoing data was processed. Consider
871                            increasing the polling rate.
872   @retval EFI_TIMEOUT      Data was dropped out of the transmit and/or receive
873                            queue. Consider increasing the polling rate.
874 
875 **/
876 EFI_STATUS
877 EFIAPI
878 MnpPoll (
879   IN EFI_MANAGED_NETWORK_PROTOCOL    *This
880   );
881 
882 /**
883   Configure the Snp receive filters according to the instances' receive filter
884   settings.
885 
886   @param[in]  MnpDeviceData         Pointer to the mnp device context data.
887 
888   @retval     EFI_SUCCESS           The receive filters is configured.
889   @retval     EFI_OUT_OF_RESOURCES  The receive filters can't be configured due
890                                     to lack of memory resource.
891 
892 **/
893 EFI_STATUS
894 MnpConfigReceiveFilters (
895   IN MNP_DEVICE_DATA     *MnpDeviceData
896   );
897 
898 #endif
899