/** Compute the window scale value according to the given buffer size. @param[in] Tcb Pointer to the TCP_CB of this TCP instance. @return The scale value. **/ UINT8 TcpComputeScale ( IN TCP_CB *Tcb ) { UINT8 Scale; UINT32 BufSize; ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); BufSize = GET_RCV_BUFFSIZE (Tcb->Sk); Scale = 0; while ((Scale < TCP_OPTION_MAX_WS) && ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) { Scale++; } return Scale; }
/** Get the operational settings of this TCP instance. @param Tcb Pointer to the TCP_CB of this TCP instance. @param Mode Pointer to the buffer to store the operational settings. @retval EFI_SUCCESS The mode data is read. @retval EFI_NOT_STARTED No configuration data is available because this instance hasn't been started. **/ EFI_STATUS Tcp4GetMode ( IN TCP_CB *Tcb, IN OUT TCP4_MODE_DATA *Mode ) { SOCKET *Sock; EFI_TCP4_CONFIG_DATA *ConfigData; EFI_TCP4_ACCESS_POINT *AccessPoint; EFI_TCP4_OPTION *Option; EFI_IP4_PROTOCOL *Ip; Sock = Tcb->Sk; if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) { return EFI_NOT_STARTED; } if (Mode->Tcp4State != NULL) { *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; } if (Mode->Tcp4ConfigData != NULL) { ConfigData = Mode->Tcp4ConfigData; AccessPoint = &(ConfigData->AccessPoint); Option = ConfigData->ControlOption; ConfigData->TypeOfService = Tcb->Tos; ConfigData->TimeToLive = Tcb->Ttl; AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip); IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask); AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip); AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN); if (Option != NULL) { Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk); Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk); Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk); Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ; Option->DataRetries = Tcb->MaxRexmit; Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ; Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ; Option->KeepAliveProbes = Tcb->MaxKeepAlive; Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ; Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ; 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; } } Ip = Tcb->IpInfo->Ip.Ip4; ASSERT (Ip != NULL); return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData); }