Example #1
0
RefPtr<NrSocketBase> TestNrSocket::create_external_socket(
    const nr_transport_addr &dest_addr) const {
  MOZ_ASSERT(nat_->enabled_);
  MOZ_ASSERT(!nat_->is_an_internal_tuple(dest_addr));

  int r;
  nr_transport_addr nat_external_addr;

  // Open the socket on an arbitrary port, on the same address.
  // TODO(bug 1170299): Remove const_cast when no longer necessary
  if ((r = nr_transport_addr_copy(
             &nat_external_addr,
             const_cast<nr_transport_addr*>(&internal_socket_->my_addr())))) {
    r_log(LOG_GENERIC,LOG_CRIT, "%s: Failure in nr_transport_addr_copy: %d",
                                __FUNCTION__, r);
    return nullptr;
  }

  if ((r = nr_transport_addr_set_port(&nat_external_addr, 0))) {
    r_log(LOG_GENERIC,LOG_CRIT, "%s: Failure in nr_transport_addr_set_port: %d",
                                __FUNCTION__, r);
    return nullptr;
  }

  RefPtr<NrSocketBase> external_socket;
  r = NrSocketBase::CreateSocket(&nat_external_addr, &external_socket);

  if (r) {
    r_log(LOG_GENERIC,LOG_CRIT, "%s: Failure in NrSocket::create: %d",
                                __FUNCTION__, r);
    return nullptr;
  }

  return external_socket;
}
void NrIceResolverFake::resolve_cb(NR_SOCKET s, int how, void *cb_arg) {
  MOZ_ASSERT(cb_arg);
  PendingResolution *pending = static_cast<PendingResolution *>(cb_arg);

  const PRNetAddr *addr=pending->resolver_->Resolve(pending->hostname_);

  if (addr) {
    nr_transport_addr transport_addr;

    int r = nr_praddr_to_transport_addr(addr, &transport_addr, 0);
    MOZ_ASSERT(!r);
    if (r)
      goto abort;

    r=nr_transport_addr_set_port(&transport_addr, pending->port_);
    MOZ_ASSERT(!r);
    if (r)
      goto abort;

    /* Fill in the address string */
    r=nr_transport_addr_fmt_addr_string(&transport_addr);
    MOZ_ASSERT(!r);
    if (r)
      goto abort;

    pending->cb_(pending->cb_arg_, &transport_addr);
    delete pending;
    return;
  }

abort:
  // Resolution failed.
  pending->cb_(pending->cb_arg_, nullptr);

  delete pending;
}