X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FTcp4Dxe%2FTcp4Dispatcher.c;h=c6108e25149bf6a1223bfe7d5d407ff545f0d264;hp=9039905be655fc573bd46774d186e307c64bd5d8;hb=e48e37fce2611df7a52aff271835ff72ee396d9b;hpb=8a67d61da4d5a8f08a656cbeea2d902d0ad9042a diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c index 9039905be6..c6108e2514 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c @@ -104,7 +104,7 @@ Tcp4GetMode ( } if (Mode->Tcp4State) { - *(Mode->Tcp4State) = Tcb->State; + *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; } if (Mode->Tcp4ConfigData) { @@ -118,11 +118,11 @@ Tcp4GetMode ( AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; - EFI_IP4 (AccessPoint->StationAddress) = Tcb->LocalEnd.Ip; + CopyMem (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS)); AccessPoint->SubnetMask = Tcb->SubnetMask; AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); - EFI_IP4 (AccessPoint->RemoteAddress) = Tcb->RemoteEnd.Ip; + CopyMem (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS)); AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN); @@ -139,9 +139,10 @@ Tcp4GetMode ( Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ; Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ; - Option->EnableNagle = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE); - Option->EnableTimeStamp = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS); - Option->EnableWindowScaling = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS); + Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE)); + Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)); + Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) +; Option->EnableSelectiveAck = FALSE; Option->EnablePathMtuDiscovery = FALSE; @@ -202,7 +203,7 @@ Tcp4Bind ( if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { if (Cycle) { - TCP4_DEBUG_ERROR (("Tcp4Bind: no port can be allocated " + DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " "for this pcb\n")); return EFI_OUT_OF_RESOURCES; @@ -245,7 +246,17 @@ Tcp4FlushPcb ( TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; if (SOCK_IS_CONFIGURED (Sock)) { - NetListRemoveEntry (&Tcb->List); + RemoveEntryList (&Tcb->List); + + // + // Uninstall the device path protocl. + // + gBS->UninstallProtocolInterface ( + Sock->SockHandle, + &gEfiDevicePathProtocolGuid, + Sock->DevicePath + ); + gBS->FreePool (Sock->DevicePath); TcpSetVariableData (TcpProto->TcpService); } @@ -264,11 +275,11 @@ Tcp4AttachPcb ( TCP4_PROTO_DATA *ProtoData; IP_IO *IpIo; - Tcb = NetAllocateZeroPool (sizeof (TCP_CB)); + Tcb = AllocateZeroPool (sizeof (TCP_CB)); if (Tcb == NULL) { - TCP4_DEBUG_ERROR (("Tcp4ConfigurePcb: failed to allocate a TCB\n")); + DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n")); return EFI_OUT_OF_RESOURCES; } @@ -282,13 +293,13 @@ Tcp4AttachPcb ( Tcb->IpInfo = IpIoAddIp (IpIo); if (Tcb->IpInfo == NULL) { - NetFreePool (Tcb); + gBS->FreePool (Tcb); return EFI_OUT_OF_RESOURCES; } - NetListInit (&Tcb->List); - NetListInit (&Tcb->SndQue); - NetListInit (&Tcb->RcvQue); + InitializeListHead (&Tcb->List); + InitializeListHead (&Tcb->SndQue); + InitializeListHead (&Tcb->RcvQue); Tcb->State = TCP_CLOSED; Tcb->Sk = Sk; @@ -315,7 +326,7 @@ Tcp4DetachPcb ( IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo); - NetFreePool (Tcb); + gBS->FreePool (Tcb); ProtoData->TcpPcb = NULL; } @@ -341,7 +352,6 @@ Tcp4ConfigurePcb ( IN EFI_TCP4_CONFIG_DATA *CfgData ) { - IP_IO *IpIo; EFI_IP4_CONFIG_DATA IpCfgData; EFI_STATUS Status; EFI_TCP4_OPTION *Option; @@ -352,14 +362,13 @@ Tcp4ConfigurePcb ( TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved; Tcb = TcpProto->TcpPcb; - IpIo = TcpProto->TcpService->IpIo; ASSERT (Tcb != NULL); // // Add Ip for send pkt to the peer // - IpCfgData = mIpIoDefaultIpConfigData; + CopyMem (&IpCfgData, &mIpIoDefaultIpConfigData, sizeof (IpCfgData)); IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP; IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress; IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress; @@ -388,7 +397,7 @@ Tcp4ConfigurePcb ( Status = Tcp4Bind (&(CfgData->AccessPoint)); if (EFI_ERROR (Status)) { - TCP4_DEBUG_ERROR (("Tcp4ConfigurePcb: Bind endpoint failed " + DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed " "with %r\n", Status)); goto OnExit; @@ -398,8 +407,8 @@ Tcp4ConfigurePcb ( // Initalize the operating information in this Tcb // ASSERT (Tcb->State == TCP_CLOSED && - NetListIsEmpty (&Tcb->SndQue) && - NetListIsEmpty (&Tcb->RcvQue)); + IsListEmpty (&Tcb->SndQue) && + IsListEmpty (&Tcb->RcvQue)); TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); Tcb->State = TCP_CLOSED; @@ -429,37 +438,53 @@ Tcp4ConfigurePcb ( Tcb->TTL = CfgData->TimeToLive; Tcb->TOS = CfgData->TypeOfService; - Tcb->LocalEnd.Ip = EFI_IP4 (CfgData->AccessPoint.StationAddress); + Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress; + + CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR)); Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort); Tcb->SubnetMask = CfgData->AccessPoint.SubnetMask; - Tcb->RemoteEnd.Ip = EFI_IP4 (CfgData->AccessPoint.RemoteAddress); - Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); + if (CfgData->AccessPoint.ActiveFlag) { + CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); + Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); + } else { + Tcb->RemoteEnd.Ip = 0; + Tcb->RemoteEnd.Port = 0; + } Option = CfgData->ControlOption; if (Option != NULL) { SET_RCV_BUFFSIZE ( Sk, - TCP_COMP_VAL (TCP_RCV_BUF_SIZE_MIN, - TCP_RCV_BUF_SIZE, - TCP_RCV_BUF_SIZE, - Option->ReceiveBufferSize) + (UINT32) (TCP_COMP_VAL ( + TCP_RCV_BUF_SIZE_MIN, + TCP_RCV_BUF_SIZE, + TCP_RCV_BUF_SIZE, + Option->ReceiveBufferSize + ) + ) ); SET_SND_BUFFSIZE ( Sk, - TCP_COMP_VAL (TCP_SND_BUF_SIZE_MIN, - TCP_SND_BUF_SIZE, - TCP_SND_BUF_SIZE, - Option->SendBufferSize) + (UINT32) (TCP_COMP_VAL ( + TCP_SND_BUF_SIZE_MIN, + TCP_SND_BUF_SIZE, + TCP_SND_BUF_SIZE, + Option->SendBufferSize + ) + ) ); SET_BACKLOG ( Sk, - TCP_COMP_VAL (TCP_BACKLOG_MIN, - TCP_BACKLOG, - TCP_BACKLOG, - Option->MaxSynBackLog) + (UINT32) (TCP_COMP_VAL ( + TCP_BACKLOG_MIN, + TCP_BACKLOG, + TCP_BACKLOG, + Option->MaxSynBackLog + ) + ) ); Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL ( @@ -472,7 +497,7 @@ Tcp4ConfigurePcb ( TCP_FIN_WAIT2_TIME, TCP_FIN_WAIT2_TIME_MAX, TCP_FIN_WAIT2_TIME, - Option->FinTimeout * TCP_TICK_HZ + (UINT32) (Option->FinTimeout * TCP_TICK_HZ) ); if (Option->TimeWaitTimeout != 0) { @@ -480,7 +505,7 @@ Tcp4ConfigurePcb ( TCP_TIME_WAIT_TIME, TCP_TIME_WAIT_TIME_MAX, TCP_TIME_WAIT_TIME, - Option->TimeWaitTimeout * TCP_TICK_HZ + (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ) ); } else { Tcb->TimeWaitTimeout = 0; @@ -499,13 +524,13 @@ Tcp4ConfigurePcb ( TCP_KEEPALIVE_IDLE_MIN, TCP_KEEPALIVE_IDLE_MAX, TCP_KEEPALIVE_IDLE_MIN, - Option->KeepAliveTime * TCP_TICK_HZ + (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ) ); Tcb->KeepAlivePeriod = TCP_COMP_VAL ( TCP_KEEPALIVE_PERIOD_MIN, TCP_KEEPALIVE_PERIOD, TCP_KEEPALIVE_PERIOD, - Option->KeepAliveInterval * TCP_TICK_HZ + (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ) ); } @@ -513,7 +538,7 @@ Tcp4ConfigurePcb ( TCP_CONNECT_TIME_MIN, TCP_CONNECT_TIME, TCP_CONNECT_TIME, - Option->ConnectionTimeout * TCP_TICK_HZ + (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ) ); if (Option->EnableNagle == FALSE) { @@ -529,6 +554,15 @@ Tcp4ConfigurePcb ( } } + // + // The socket is bound, the is + // determined, construct the IP device path and install it. + // + Status = TcpInstallDevicePath (Sk); + if (EFI_ERROR (Status)) { + goto OnExit; + } + // // update state of Tcb and socket // @@ -673,6 +707,8 @@ Tcp4Dispatcher ( return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data); + default: + return EFI_UNSUPPORTED; } return EFI_SUCCESS;