Example #1
0
static int gather_relay(struct agent *ag, struct ice_lcand *base,
			int turn_proto)
{
	struct candidate *cand = &ag->candv[ag->candc++];
	const char *proto_name = "";
	int err;

	if (ag->candc >= ARRAY_SIZE(ag->candv))
		return ENOMEM;

	cand->ag = ag;
	cand->base = base;
	cand->type = TYPE_TURN;
	cand->turn_proto = turn_proto;

	switch (turn_proto) {

	case IPPROTO_UDP:
		proto_name = stun_proto_udp;
		break;

	case IPPROTO_TCP:
		proto_name = stun_proto_tcp;
		break;
	}

	re_printf("resolving TURN-server '%s' for %s..\n",
		  ag->cli->param.turn_server, proto_name);

	err = stun_server_discover(&cand->stun_dns, cand->ag->cli->dnsc,
				   stun_usage_relay, proto_name,
				   sa_af(&base->attr.addr),
				   ag->cli->param.turn_server, 0,
				   stun_dns_handler, cand);
	if (err) {
		re_fprintf(stderr, "stun_server_discover failed (%m)\n",
			   err);
		return err;
	}

	return 0;
}
Example #2
0
static int session_alloc(struct mnat_sess **sessp, struct dnsc *dnsc,
			 const char *srv, uint16_t port,
			 const char *user, const char *pass,
			 struct sdp_session *ss, bool offerer,
			 mnat_estab_h *estabh, void *arg)
{
	struct mnat_sess *sess;
	int err;
	(void)ss;
	(void)offerer;

	if (!sessp || !dnsc || !srv || !user || !pass || !ss || !estabh)
		return EINVAL;

	sess = mem_zalloc(sizeof(*sess), session_destructor);
	if (!sess)
		return ENOMEM;

	err  = str_dup(&sess->user, user);
	err |= str_dup(&sess->pass, pass);
	if (err)
		goto out;

	sess->estabh = estabh;
	sess->arg    = arg;

	err = stun_server_discover(&sess->dnsq, dnsc,
				   stun_usage_relay, stun_proto_udp,
				   AF_INET, srv, port, dns_handler, sess);

 out:
	if (err)
		mem_deref(sess);
	else
		*sessp = sess;

	return err;
}