message: net: make outgoing I2P connections from CConnman
diff: @@ -423,10 +423,20 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
  bool connected = false;
  std::unique_ptr<Sock> sock;
  proxyType proxy;
  + CAddress addr_bind;
  + assert(!addr_bind.IsValid());
  +
  if (addrConnect.IsValid()) {
  bool proxyConnectionFailed = false;
  - if (GetProxy(addrConnect.GetNetwork(), proxy)) {
  + if (addrConnect.GetNetwork() == NET_I2P && m_i2p_sam_session.get() != nullptr) {
  + i2p::Connection conn;
  + if (m_i2p_sam_session->Connect(addrConnect, conn, proxyConnectionFailed)) {
  + connected = true;
  + sock = std::make_unique<Sock>(std::move(conn.sock));
  + addr_bind = CAddress{conn.me, NODE_NONE};
  + }
  + } else if (GetProxy(addrConnect.GetNetwork(), proxy)) {
  sock = CreateSock(proxy.proxy);
  if (!sock) {
  return nullptr;
  @@ -466,7 +476,9 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
  // Add node
  NodeId id = GetNewNodeId();
  uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
  - CAddress addr_bind = GetBindAddress(sock->Get());
  + if (!addr_bind.IsValid()) {
  + addr_bind = GetBindAddress(sock->Get());
  + }
  CNode* pnode = new CNode(id, nLocalServices, sock->Release(), addrConnect, CalculateKeyedNetGroup(addrConnect), nonce, addr_bind, pszDest ? pszDest : "", conn_type, /* inbound_onion */ false);
  pnode->AddRef();
  