2 Interface function of the Socket.
4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
13 Check whether the Event is in the List.
15 @param[in] List Pointer to the token list to be searched.
16 @param[in] Event The event to be checked.
18 @retval TRUE The specific Event exists in the List.
19 @retval FALSE The specific Event is not in the List.
23 SockTokenExistedInList (
28 LIST_ENTRY
*ListEntry
;
29 SOCK_TOKEN
*SockToken
;
31 NET_LIST_FOR_EACH (ListEntry
, List
) {
32 SockToken
= NET_LIST_USER_STRUCT (
38 if (Event
== SockToken
->Token
->Event
) {
47 Call SockTokenExistedInList() to check whether the Event is
48 in the related socket's lists.
50 @param[in] Sock Pointer to the instance's socket.
51 @param[in] Event The event to be checked.
53 @retval TRUE The Event exists in related socket's lists.
54 @retval FALSE The Event is not in related socket's lists.
63 if (SockTokenExistedInList (&Sock
->SndTokenList
, Event
) ||
64 SockTokenExistedInList (&Sock
->ProcessingSndTokenList
, Event
) ||
65 SockTokenExistedInList (&Sock
->RcvTokenList
, Event
) ||
66 SockTokenExistedInList (&Sock
->ListenTokenList
, Event
)
72 if ((Sock
->ConnectionToken
!= NULL
) && (Sock
->ConnectionToken
->Event
== Event
)) {
76 if ((Sock
->CloseToken
!= NULL
) && (Sock
->CloseToken
->Event
== Event
)) {
84 Buffer a token into the specific list of the socket Sock.
86 @param[in] Sock Pointer to the instance's socket.
87 @param[in] List Pointer to the list to store the token.
88 @param[in] Token Pointer to the token to be buffered.
89 @param[in] DataLen The data length of the buffer contained in Token.
91 @return Pointer to the token that wraps Token. If NULL, an error condition occurred.
102 SOCK_TOKEN
*SockToken
;
104 SockToken
= AllocateZeroPool (sizeof (SOCK_TOKEN
));
105 if (NULL
== SockToken
) {
108 "SockBufferIOToken: No Memory to allocate SockToken\n")
114 SockToken
->Sock
= Sock
;
115 SockToken
->Token
= (SOCK_COMPLETION_TOKEN
*)Token
;
116 SockToken
->RemainDataLen
= DataLen
;
117 InsertTailList (List
, &SockToken
->TokenList
);
123 Destroy the socket Sock and its associated protocol control block.
125 @param[in, out] Sock The socket to be destroyed.
127 @retval EFI_SUCCESS The socket Sock was destroyed successfully.
128 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
137 TCP_PROTO_DATA
*ProtoData
;
139 EFI_GUID
*IpProtocolGuid
;
140 EFI_GUID
*TcpProtocolGuid
;
143 ASSERT ((Sock
!= NULL
) && (Sock
->ProtoHandler
!= NULL
));
145 if (Sock
->InDestroy
) {
149 Sock
->InDestroy
= TRUE
;
151 if (Sock
->IpVersion
== IP_VERSION_4
) {
152 IpProtocolGuid
= &gEfiIp4ProtocolGuid
;
153 TcpProtocolGuid
= &gEfiTcp4ProtocolGuid
;
155 IpProtocolGuid
= &gEfiIp6ProtocolGuid
;
156 TcpProtocolGuid
= &gEfiTcp6ProtocolGuid
;
159 ProtoData
= (TCP_PROTO_DATA
*)Sock
->ProtoReserved
;
160 Tcb
= ProtoData
->TcpPcb
;
162 ASSERT (Tcb
!= NULL
);
165 // Close the IP protocol.
168 Tcb
->IpInfo
->ChildHandle
,
170 ProtoData
->TcpService
->IpIo
->Image
,
174 if (Sock
->DestroyCallback
!= NULL
) {
175 Sock
->DestroyCallback (Sock
, Sock
->Context
);
179 // Retrieve the protocol installed on this sock
181 Status
= gBS
->OpenProtocol (
187 EFI_OPEN_PROTOCOL_GET_PROTOCOL
190 if (EFI_ERROR (Status
)) {
193 "SockDestroyChild: Open protocol installed on socket failed with %r\n",
199 // Uninstall the protocol installed on this sock
201 gBS
->UninstallMultipleProtocolInterfaces (
208 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
209 if (EFI_ERROR (Status
)) {
212 "SockDestroyChild: Get the lock to access socket failed with %r\n",
216 return EFI_ACCESS_DENIED
;
220 // force protocol layer to detach the PCB
222 Status
= Sock
->ProtoHandler (Sock
, SOCK_DETACH
, NULL
);
224 if (EFI_ERROR (Status
)) {
227 "SockDestroyChild: Protocol detach socket failed with %r\n",
231 Sock
->InDestroy
= FALSE
;
232 } else if (SOCK_IS_CONFIGURED (Sock
)) {
233 SockConnFlush (Sock
);
234 SockSetState (Sock
, SO_CLOSED
);
236 Sock
->ConfigureState
= SO_UNCONFIGURED
;
239 EfiReleaseLock (&(Sock
->Lock
));
241 if (EFI_ERROR (Status
)) {
250 Create a socket and its associated protocol control block
251 with the initial data SockInitData and protocol specific
254 @param[in] SockInitData Initial data to setting the socket.
256 @return Pointer to the newly created socket. If NULL, an error condition occurred.
261 IN SOCK_INIT_DATA
*SockInitData
267 EFI_GUID
*TcpProtocolGuid
;
270 // create a new socket
272 Sock
= SockCreate (SockInitData
);
276 "SockCreateChild: No resource to create a new socket\n")
282 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
283 if (EFI_ERROR (Status
)) {
286 "SockCreateChild: Get the lock to access socket failed with %r\n",
293 // inform the protocol layer to attach the socket
294 // with a new protocol control block
296 Status
= Sock
->ProtoHandler (Sock
, SOCK_ATTACH
, NULL
);
297 EfiReleaseLock (&(Sock
->Lock
));
298 if (EFI_ERROR (Status
)) {
301 "SockCreateChild: Protocol failed to attach a socket with %r\n",
311 if (Sock
->DestroyCallback
!= NULL
) {
312 Sock
->DestroyCallback (Sock
, Sock
->Context
);
315 if (Sock
->IpVersion
== IP_VERSION_4
) {
316 TcpProtocolGuid
= &gEfiTcp4ProtocolGuid
;
318 TcpProtocolGuid
= &gEfiTcp6ProtocolGuid
;
327 EFI_OPEN_PROTOCOL_GET_PROTOCOL
330 // Uninstall the protocol installed on this sock
332 gBS
->UninstallMultipleProtocolInterfaces (
343 Configure the specific socket Sock using configuration data ConfigData.
345 @param[in] Sock Pointer to the socket to be configured.
346 @param[in] ConfigData Pointer to the configuration data.
348 @retval EFI_SUCCESS The socket configured successfully.
349 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
350 socket is already configured.
361 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
362 if (EFI_ERROR (Status
)) {
365 "SockConfigure: Get the access for socket failed with %r",
369 return EFI_ACCESS_DENIED
;
372 if (SOCK_IS_CONFIGURED (Sock
)) {
373 Status
= EFI_ACCESS_DENIED
;
377 ASSERT (Sock
->State
== SO_CLOSED
);
379 Status
= Sock
->ProtoHandler (Sock
, SOCK_CONFIGURE
, ConfigData
);
382 EfiReleaseLock (&(Sock
->Lock
));
388 Initiate a connection establishment process.
390 @param[in] Sock Pointer to the socket to initiate the
392 @param[in] Token Pointer to the token used for the connection
395 @retval EFI_SUCCESS The connection initialized successfully.
396 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
397 socket is closed, or the socket is not configured to
398 be an active one, or the token is already in one of
400 @retval EFI_NO_MAPPING The IP address configuration operation is not
402 @retval EFI_NOT_STARTED The socket is not configured.
414 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
415 if (EFI_ERROR (Status
)) {
418 "SockConnect: Get the access for socket failed with %r",
422 return EFI_ACCESS_DENIED
;
425 if (SOCK_IS_NO_MAPPING (Sock
)) {
426 Status
= EFI_NO_MAPPING
;
430 if (SOCK_IS_UNCONFIGURED (Sock
)) {
431 Status
= EFI_NOT_STARTED
;
435 if (!SOCK_IS_CLOSED (Sock
) || !SOCK_IS_CONFIGURED_ACTIVE (Sock
)) {
436 Status
= EFI_ACCESS_DENIED
;
440 Event
= ((SOCK_COMPLETION_TOKEN
*)Token
)->Event
;
442 if (SockTokenExisted (Sock
, Event
)) {
443 Status
= EFI_ACCESS_DENIED
;
447 Sock
->ConnectionToken
= (SOCK_COMPLETION_TOKEN
*)Token
;
448 SockSetState (Sock
, SO_CONNECTING
);
449 Status
= Sock
->ProtoHandler (Sock
, SOCK_CONNECT
, NULL
);
452 EfiReleaseLock (&(Sock
->Lock
));
457 Issue a listen token to get an existed connected network instance
458 or wait for a connection if there is none.
460 @param[in] Sock Pointer to the socket to accept connections.
461 @param[in] Token The token to accept a connection.
463 @retval EFI_SUCCESS Either a connection is accepted or the Token is
464 buffered for further acception.
465 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
466 socket is closed, or the socket is not configured to
467 be a passive one, or the token is already in one of
469 @retval EFI_NO_MAPPING The IP address configuration operation is not
471 @retval EFI_NOT_STARTED The socket is not configured.
472 @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limits.
481 EFI_TCP4_LISTEN_TOKEN
*ListenToken
;
482 LIST_ENTRY
*ListEntry
;
487 ASSERT (SockStream
== Sock
->Type
);
489 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
490 if (EFI_ERROR (Status
)) {
493 "SockAccept: Get the access for socket failed with %r",
497 return EFI_ACCESS_DENIED
;
500 if (SOCK_IS_NO_MAPPING (Sock
)) {
501 Status
= EFI_NO_MAPPING
;
505 if (SOCK_IS_UNCONFIGURED (Sock
)) {
506 Status
= EFI_NOT_STARTED
;
510 if (!SOCK_IS_LISTENING (Sock
)) {
511 Status
= EFI_ACCESS_DENIED
;
515 Event
= ((SOCK_COMPLETION_TOKEN
*)Token
)->Event
;
517 if (SockTokenExisted (Sock
, Event
)) {
518 Status
= EFI_ACCESS_DENIED
;
522 ListenToken
= (EFI_TCP4_LISTEN_TOKEN
*)Token
;
525 // Check if a connection has already in this Sock->ConnectionList
527 NET_LIST_FOR_EACH (ListEntry
, &Sock
->ConnectionList
) {
528 Socket
= NET_LIST_USER_STRUCT (ListEntry
, SOCKET
, ConnectionList
);
530 if (SOCK_IS_CONNECTED (Socket
)) {
531 ListenToken
->NewChildHandle
= Socket
->SockHandle
;
532 SIGNAL_TOKEN (&(ListenToken
->CompletionToken
), EFI_SUCCESS
);
534 RemoveEntryList (ListEntry
);
536 ASSERT (Socket
->Parent
!= NULL
);
538 Socket
->Parent
->ConnCnt
--;
542 "SockAccept: Accept a socket, now conncount is %d",
543 Socket
->Parent
->ConnCnt
)
545 Socket
->Parent
= NULL
;
552 // Buffer this token for latter incoming connection request
554 if (NULL
== SockBufferToken (Sock
, &(Sock
->ListenTokenList
), Token
, 0)) {
555 Status
= EFI_OUT_OF_RESOURCES
;
559 EfiReleaseLock (&(Sock
->Lock
));
565 Issue a token with data to the socket to send out.
567 @param[in] Sock Pointer to the socket to process the token with
569 @param[in] Token The token with data that needs to send out.
571 @retval EFI_SUCCESS The token processed successfully.
572 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
573 socket is closed, or the socket is not in a
574 synchronized state , or the token is already in one
575 of this socket's lists.
576 @retval EFI_NO_MAPPING The IP address configuration operation is not
578 @retval EFI_NOT_STARTED The socket is not configured.
579 @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limits.
588 SOCK_IO_TOKEN
*SndToken
;
591 EFI_TCP4_TRANSMIT_DATA
*TxData
;
593 SOCK_TOKEN
*SockToken
;
596 ASSERT (SockStream
== Sock
->Type
);
598 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
599 if (EFI_ERROR (Status
)) {
602 "SockSend: Get the access for socket failed with %r",
606 return EFI_ACCESS_DENIED
;
609 if (SOCK_IS_NO_MAPPING (Sock
)) {
610 Status
= EFI_NO_MAPPING
;
614 SndToken
= (SOCK_IO_TOKEN
*)Token
;
615 TxData
= (EFI_TCP4_TRANSMIT_DATA
*)SndToken
->Packet
.TxData
;
617 if (SOCK_IS_UNCONFIGURED (Sock
)) {
618 Status
= EFI_NOT_STARTED
;
622 if (!(SOCK_IS_CONNECTING (Sock
) || SOCK_IS_CONNECTED (Sock
))) {
623 Status
= EFI_ACCESS_DENIED
;
628 // check if a token is already in the token buffer
630 Event
= SndToken
->Token
.Event
;
632 if (SockTokenExisted (Sock
, Event
)) {
633 Status
= EFI_ACCESS_DENIED
;
637 DataLen
= TxData
->DataLength
;
640 // process this sending token now or buffer it only?
642 FreeSpace
= SockGetFreeSpace (Sock
, SOCK_SND_BUF
);
644 if ((FreeSpace
< Sock
->SndBuffer
.LowWater
) || !SOCK_IS_CONNECTED (Sock
)) {
645 SockToken
= SockBufferToken (
652 if (NULL
== SockToken
) {
653 Status
= EFI_OUT_OF_RESOURCES
;
656 SockToken
= SockBufferToken (
658 &Sock
->ProcessingSndTokenList
,
663 if (NULL
== SockToken
) {
666 "SockSend: Failed to buffer IO token into socket processing SndToken List\n",
670 Status
= EFI_OUT_OF_RESOURCES
;
674 Status
= SockProcessTcpSndData (Sock
, TxData
);
676 if (EFI_ERROR (Status
)) {
679 "SockSend: Failed to process Snd Data\n",
683 RemoveEntryList (&(SockToken
->TokenList
));
684 FreePool (SockToken
);
689 EfiReleaseLock (&(Sock
->Lock
));
694 Issue a token to get data from the socket.
696 @param[in] Sock Pointer to the socket to get data from.
697 @param[in] Token The token to store the received data from the
700 @retval EFI_SUCCESS The token processed successfully.
701 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
702 socket is closed, or the socket is not in a
703 synchronized state , or the token is already in one
704 of this socket's lists.
705 @retval EFI_NO_MAPPING The IP address configuration operation is not
707 @retval EFI_NOT_STARTED The socket is not configured.
708 @retval EFI_CONNECTION_FIN The connection is closed and there is no more data.
709 @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit.
718 SOCK_IO_TOKEN
*RcvToken
;
723 ASSERT (SockStream
== Sock
->Type
);
725 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
726 if (EFI_ERROR (Status
)) {
729 "SockRcv: Get the access for socket failed with %r",
733 return EFI_ACCESS_DENIED
;
736 if (SOCK_IS_NO_MAPPING (Sock
)) {
737 Status
= EFI_NO_MAPPING
;
741 if (SOCK_IS_UNCONFIGURED (Sock
)) {
742 Status
= EFI_NOT_STARTED
;
746 if (!(SOCK_IS_CONNECTED (Sock
) || SOCK_IS_CONNECTING (Sock
))) {
747 Status
= EFI_ACCESS_DENIED
;
751 RcvToken
= (SOCK_IO_TOKEN
*)Token
;
754 // check if a token is already in the token buffer of this socket
756 Event
= RcvToken
->Token
.Event
;
757 if (SockTokenExisted (Sock
, Event
)) {
758 Status
= EFI_ACCESS_DENIED
;
762 RcvToken
= (SOCK_IO_TOKEN
*)Token
;
763 RcvdBytes
= GET_RCV_DATASIZE (Sock
);
766 // check whether an error has happened before
768 if (EFI_ABORTED
!= Sock
->SockError
) {
769 SIGNAL_TOKEN (&(RcvToken
->Token
), Sock
->SockError
);
770 Sock
->SockError
= EFI_ABORTED
;
775 // check whether can not receive and there is no any
776 // data buffered in Sock->RcvBuffer
778 if (SOCK_IS_NO_MORE_DATA (Sock
) && (0 == RcvdBytes
)) {
779 Status
= EFI_CONNECTION_FIN
;
783 if (RcvdBytes
!= 0) {
784 SockProcessRcvToken (Sock
, RcvToken
);
786 Status
= Sock
->ProtoHandler (Sock
, SOCK_CONSUMED
, NULL
);
788 if (NULL
== SockBufferToken (Sock
, &Sock
->RcvTokenList
, RcvToken
, 0)) {
789 Status
= EFI_OUT_OF_RESOURCES
;
794 EfiReleaseLock (&(Sock
->Lock
));
799 Reset the socket and its associated protocol control block.
801 @param[in, out] Sock Pointer to the socket to be flushed.
803 @retval EFI_SUCCESS The socket is flushed successfully.
804 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
814 ASSERT (SockStream
== Sock
->Type
);
816 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
817 if (EFI_ERROR (Status
)) {
820 "SockFlush: Get the access for socket failed with %r",
824 return EFI_ACCESS_DENIED
;
827 if (!SOCK_IS_CONFIGURED (Sock
)) {
828 Status
= EFI_ACCESS_DENIED
;
832 Status
= Sock
->ProtoHandler (Sock
, SOCK_FLUSH
, NULL
);
833 if (EFI_ERROR (Status
)) {
836 "SockFlush: Protocol failed handling SOCK_FLUSH with %r",
843 SOCK_ERROR (Sock
, EFI_ABORTED
);
844 SockConnFlush (Sock
);
845 SockSetState (Sock
, SO_CLOSED
);
847 Sock
->ConfigureState
= SO_UNCONFIGURED
;
850 EfiReleaseLock (&(Sock
->Lock
));
855 Close or abort the socket associated connection.
857 @param[in, out] Sock Pointer to the socket of the connection to close
859 @param[in] Token The token for a close operation.
860 @param[in] OnAbort TRUE for aborting the connection; FALSE to close it.
862 @retval EFI_SUCCESS The close or abort operation initialized
864 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
865 socket is closed, or the socket is not in a
866 synchronized state , or the token is already in one
867 of this socket's lists.
868 @retval EFI_NO_MAPPING The IP address configuration operation is not
870 @retval EFI_NOT_STARTED The socket is not configured.
883 ASSERT (SockStream
== Sock
->Type
);
885 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
886 if (EFI_ERROR (Status
)) {
889 "SockClose: Get the access for socket failed with %r",
893 return EFI_ACCESS_DENIED
;
896 if (SOCK_IS_NO_MAPPING (Sock
)) {
897 Status
= EFI_NO_MAPPING
;
901 if (SOCK_IS_UNCONFIGURED (Sock
)) {
902 Status
= EFI_NOT_STARTED
;
906 if (SOCK_IS_DISCONNECTING (Sock
)) {
907 Status
= EFI_ACCESS_DENIED
;
911 Event
= ((SOCK_COMPLETION_TOKEN
*)Token
)->Event
;
913 if (SockTokenExisted (Sock
, Event
)) {
914 Status
= EFI_ACCESS_DENIED
;
918 Sock
->CloseToken
= Token
;
919 SockSetState (Sock
, SO_DISCONNECTING
);
922 Status
= Sock
->ProtoHandler (Sock
, SOCK_ABORT
, NULL
);
924 Status
= Sock
->ProtoHandler (Sock
, SOCK_CLOSE
, NULL
);
928 EfiReleaseLock (&(Sock
->Lock
));
933 Abort the socket associated connection, listen, transmission or receive request.
935 @param[in, out] Sock Pointer to the socket to abort.
936 @param[in] Token Pointer to a token that has been issued by
937 Connect(), Accept(), Transmit() or Receive(). If
938 NULL, all pending tokens issued by the four
939 functions listed above will be aborted.
941 @retval EFI_UNSUPPORTED The operation is not supported in the current
952 Status
= EFI_SUCCESS
;
954 ASSERT (SockStream
== Sock
->Type
);
956 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
957 if (EFI_ERROR (Status
)) {
960 "SockCancel: Get the access for socket failed with %r",
964 return EFI_ACCESS_DENIED
;
967 if (SOCK_IS_UNCONFIGURED (Sock
)) {
968 Status
= EFI_NOT_STARTED
;
973 // 1. Check ConnectionToken.
975 if ((Token
== NULL
) || ((SOCK_COMPLETION_TOKEN
*)Token
== Sock
->ConnectionToken
)) {
976 if (Sock
->ConnectionToken
!= NULL
) {
977 SIGNAL_TOKEN (Sock
->ConnectionToken
, EFI_ABORTED
);
978 Sock
->ConnectionToken
= NULL
;
982 Status
= EFI_SUCCESS
;
988 // 2. Check ListenTokenList.
990 Status
= SockCancelToken (Token
, &Sock
->ListenTokenList
);
991 if ((Token
!= NULL
) && !EFI_ERROR (Status
)) {
996 // 3. Check RcvTokenList.
998 Status
= SockCancelToken (Token
, &Sock
->RcvTokenList
);
999 if ((Token
!= NULL
) && !EFI_ERROR (Status
)) {
1004 // 4. Check SndTokenList.
1006 Status
= SockCancelToken (Token
, &Sock
->SndTokenList
);
1007 if ((Token
!= NULL
) && !EFI_ERROR (Status
)) {
1012 // 5. Check ProcessingSndTokenList.
1014 Status
= SockCancelToken (Token
, &Sock
->ProcessingSndTokenList
);
1017 EfiReleaseLock (&(Sock
->Lock
));
1022 Get the mode data of the low layer protocol.
1024 @param[in] Sock Pointer to the socket to get mode data from.
1025 @param[in, out] Mode Pointer to the data to store the low layer mode
1028 @retval EFI_SUCCESS The mode data was obtained successfully.
1029 @retval EFI_NOT_STARTED The socket is not configured.
1038 return Sock
->ProtoHandler (Sock
, SOCK_MODE
, Mode
);
1042 Add or remove route information in IP route table associated
1045 @param[in] Sock Pointer to the socket associated with the IP route
1046 table to operate on.
1047 @param[in] RouteInfo Pointer to the route information to be processed.
1049 @retval EFI_SUCCESS The route table updated successfully.
1050 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
1051 @retval EFI_NO_MAPPING The IP address configuration operation is not
1053 @retval EFI_NOT_STARTED The socket is not configured.
1064 Status
= EfiAcquireLockOrFail (&(Sock
->Lock
));
1065 if (EFI_ERROR (Status
)) {
1068 "SockRoute: Get the access for socket failed with %r",
1072 return EFI_ACCESS_DENIED
;
1075 if (SOCK_IS_NO_MAPPING (Sock
)) {
1076 Status
= EFI_NO_MAPPING
;
1080 if (SOCK_IS_UNCONFIGURED (Sock
)) {
1081 Status
= EFI_NOT_STARTED
;
1085 Status
= Sock
->ProtoHandler (Sock
, SOCK_ROUTE
, RouteInfo
);
1088 EfiReleaseLock (&(Sock
->Lock
));