/** If AP->StationPort isn't zero, check whether the access point is registered, else generate a random station port for this access point. @param AP Pointer to the access point. @retval EFI_SUCCESS The check is passed or the port is assigned. @retval EFI_INVALID_PARAMETER The non-zero station port is already used. @retval EFI_OUT_OF_RESOURCES No port can be allocated. **/ EFI_STATUS Tcp4Bind ( IN EFI_TCP4_ACCESS_POINT *AP ) { BOOLEAN Cycle; if (0 != AP->StationPort) { // // check if a same endpoint is bound // if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) { return EFI_INVALID_PARAMETER; } } else { // // generate a random port // Cycle = FALSE; if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) { mTcp4RandomPort = TCP4_PORT_KNOWN; } mTcp4RandomPort++; while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) { mTcp4RandomPort++; if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { if (Cycle) { DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " "for this pcb\n")); return EFI_OUT_OF_RESOURCES; } mTcp4RandomPort = TCP4_PORT_KNOWN + 1; Cycle = TRUE; } } AP->StationPort = mTcp4RandomPort; } return EFI_SUCCESS; }
/** If TcpAp->StationPort isn't zero, check whether the access point is registered, else generate a random station port for this access point. @param[in] TcpAp Pointer to the access point. @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6 @retval EFI_SUCCESS The check passed or the port is assigned. @retval EFI_INVALID_PARAMETER The non-zero station port is already used. @retval EFI_OUT_OF_RESOURCES No port can be allocated. **/ EFI_STATUS TcpBind ( IN TCP_ACCESS_POINT *TcpAp, IN UINT8 IpVersion ) { BOOLEAN Cycle; EFI_IP_ADDRESS Local; UINT16 *Port; UINT16 *RandomPort; if (IpVersion == IP_VERSION_4) { IP4_COPY_ADDRESS (&Local, &TcpAp->Tcp4Ap.StationAddress); Port = &TcpAp->Tcp4Ap.StationPort; RandomPort = &mTcp4RandomPort; } else { IP6_COPY_ADDRESS (&Local, &TcpAp->Tcp6Ap.StationAddress); Port = &TcpAp->Tcp6Ap.StationPort; RandomPort = &mTcp6RandomPort; } if (0 != *Port) { // // Check if a same endpoing is bound. // if (TcpFindTcbByPeer (&Local, *Port, IpVersion)) { return EFI_INVALID_PARAMETER; } } else { // // generate a random port // Cycle = FALSE; if (TCP_PORT_USER_RESERVED == *RandomPort) { *RandomPort = TCP_PORT_KNOWN; } (*RandomPort)++; while (TcpFindTcbByPeer (&Local, *RandomPort, IpVersion)) { (*RandomPort)++; if (*RandomPort <= TCP_PORT_KNOWN) { if (Cycle) { DEBUG ( (EFI_D_ERROR, "TcpBind: no port can be allocated for this pcb\n") ); return EFI_OUT_OF_RESOURCES; } *RandomPort = TCP_PORT_KNOWN + 1; Cycle = TRUE; } } *Port = *RandomPort; } return EFI_SUCCESS; }