| 698 | return rv; |
| 699 | } |
| 700 | IIBPeer* ConnectPeer(const TIBConnectInfo& info, const TUdpAddress& peerAddr, const TUdpAddress& myAddr) override { |
| 701 | for (auto& channel : Channels) { |
| 702 | TIntrusivePtr<TIBPeer> peer = channel.second; |
| 703 | if (peer->PeerAddress == peerAddr) { |
| 704 | return peer.Get(); |
| 705 | } |
| 706 | } |
| 707 | TIntrusivePtr<TRCQueuePair> rcQP; |
| 708 | rcQP = new TRCQueuePair(Port->GetCtx(), CQ, BP.GetSRQ(), QP_SEND_QUEUE_SIZE); |
| 709 | |
| 710 | int qpn = rcQP->GetQPN(); |
| 711 | Y_ASSERT(Channels.find(qpn) == Channels.end()); |
| 712 | TIntrusivePtr<TIBPeer>& peer = Channels[qpn]; |
| 713 | peer = new TIBPeer(peerAddr, rcQP); |
| 714 | |
| 715 | TCmdHandshake handshake; |
| 716 | handshake.Command = CMD_HANDSHAKE; |
| 717 | handshake.PSN = rcQP->GetPSN(); |
| 718 | handshake.QPN = rcQP->GetQPN(); |
| 719 | handshake.SocketId = info.SocketId; |
| 720 | handshake.MyAddress = myAddr; |
| 721 | |
| 722 | TIntrusivePtr<TAddressHandle> serverAH; |
| 723 | if (info.LID != 0) { |
| 724 | serverAH = new TAddressHandle(Port, info.LID, CONNECT_SL); |
| 725 | } else { |
| 726 | TUdpAddress local = myAddr; |
| 727 | local.Port = 0; |
| 728 | TUdpAddress remote = peerAddr; |
| 729 | remote.Port = 0; |
| 730 | //printf("local Addr %s\n", GetAddressAsString(local).c_str()); |
| 731 | //printf("remote Addr %s\n", GetAddressAsString(remote).c_str()); |
| 732 | sockaddr_in6 remoteAddr; |
| 733 | GetWinsockAddrForMLNX(&remoteAddr, remote); |
| 734 | sockaddr_in6 localAddr; |
| 735 | GetWinsockAddrForMLNX(&localAddr, local); |
| 736 | // CRAP - somehow prevent connecting machines from different RoCE isles |
| 737 | serverAH = new TAddressHandle(Port, (sockaddr&)remoteAddr, (sockaddr&)localAddr, CONNECT_SL); |
| 738 | if (!serverAH->IsValid()) { |
| 739 | return nullptr; |
| 740 | } |
| 741 | } |
| 742 | BP.PostSend(WelcomeQP, serverAH, info.QPN, WELCOME_QKEY, &handshake, sizeof(handshake)); |
| 743 | //printf("send handshake\n"); |
| 744 | |
| 745 | return peer.Get(); |
| 746 | } |
| 747 | const TIBConnectInfo& GetConnectInfo() override { |
| 748 | return ConnectInfo; |
| 749 | } |