+EFI_STATUS\r
+TcpInstallDevicePath (\r
+ IN SOCKET *Sock\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Install the device path protocol on the TCP instance.\r
+\r
+Arguments:\r
+\r
+ Sock - Pointer to the socket representing the TCP instance.\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - The device path protocol is installed.\r
+ other - Failed to install the device path protocol.\r
+\r
+--*/\r
+{\r
+ TCP4_PROTO_DATA *TcpProto;\r
+ TCP4_SERVICE_DATA *TcpService;\r
+ TCP_CB *Tcb;\r
+ IPv4_DEVICE_PATH Ip4DPathNode;\r
+ EFI_STATUS Status;\r
+\r
+ TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
+ TcpService = TcpProto->TcpService;\r
+ Tcb = TcpProto->TcpPcb;\r
+\r
+ NetLibCreateIPv4DPathNode (\r
+ &Ip4DPathNode,\r
+ TcpService->ControllerHandle,\r
+ Tcb->LocalEnd.Ip,\r
+ NTOHS (Tcb->LocalEnd.Port),\r
+ Tcb->RemoteEnd.Ip,\r
+ NTOHS (Tcb->RemoteEnd.Port),\r
+ EFI_IP_PROTO_TCP,\r
+ Tcb->UseDefaultAddr\r
+ );\r
+\r
+ Sock->DevicePath = AppendDevicePathNode (\r
+ Sock->ParentDevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode\r
+ );\r
+ if (Sock->DevicePath == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Status = gBS->InstallProtocolInterface (\r
+ &Sock->SockHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ Sock->DevicePath\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ NetFreePool (Sock->DevicePath);\r
+ }\r
+\r
+ return Status;\r
+}\r