Esempio n. 1
0
static void turn_handler2(int err, uint16_t scode, const char *reason,
			  const struct sa *relay_addr,
			  const struct sa *mapped_addr,
			  const struct stun_msg *msg,
			  void *arg)
{
	struct mnat_media *m = arg;
	(void)mapped_addr;
	(void)msg;

	if (!err && !scode) {

		sdp_media_set_laddr_rtcp(m->sdpm, relay_addr);

		m->addr2 = *relay_addr;

		if (m->turnc1 && !sa_isset(&m->addr1, SA_ALL))
			return;

		if (--m->sess->mediac)
			return;
	}

	m->sess->estabh(err, scode, reason, m->sess->arg);
}
Esempio n. 2
0
static void natpmp_resp_handler(int err, const struct natpmp_resp *resp,
				void *arg)
{
	struct comp *comp = arg;
	struct mnat_media *m = comp->media;
	struct sa map_addr;

	if (err) {
		warning("natpmp: response error: %m\n", err);
		complete(m->sess, err);
		return;
	}

	if (resp->op != NATPMP_OP_MAPPING_UDP)
		return;
	if (resp->result != NATPMP_SUCCESS) {
		warning("natpmp: request failed with result code: %d\n",
			resp->result);
		complete(m->sess, EPROTO);
		return;
	}

	if (resp->u.map.int_port != comp->int_port) {
		info("natpmp: ignoring response for internal_port=%u\n",
		     resp->u.map.int_port);
		return;
	}

	info("natpmp: mapping granted for comp %u:"
	     " internal_port=%u, external_port=%u, lifetime=%u\n",
	     comp->id,
	     resp->u.map.int_port, resp->u.map.ext_port,
	     resp->u.map.lifetime);

	map_addr = natpmp_extaddr;
	sa_set_port(&map_addr, resp->u.map.ext_port);
	comp->lifetime = resp->u.map.lifetime;

	/* Update SDP media with external IP-address mapping */
	if (comp->id == 1)
		sdp_media_set_laddr(m->sdpm, &map_addr);
	else
		sdp_media_set_laddr_rtcp(m->sdpm, &map_addr);

	comp->granted = true;

	tmr_start(&comp->tmr, comp->lifetime * 1000 * 3/4,
		  refresh_timeout, comp);

	is_complete(m->sess);
}
Esempio n. 3
0
File: pcp.c Progetto: GGGO/baresip
/* todo: detect multiple responses */
static void pcp_resp_handler(int err, struct pcp_msg *msg, void *arg)
{
	struct comp *comp = arg;
	struct mnat_media *m = comp->media;
	const struct pcp_map *map;

	if (err) {
		warning("pcp: mapping error: %m\n", err);

		complete(m->sess, err, NULL);
		return;
	}
	else if (msg->hdr.result != PCP_SUCCESS) {
		warning("pcp: mapping error: %s\n",
			pcp_result_name(msg->hdr.result));

		re_printf("%H\n", pcp_msg_print, msg);

		complete(m->sess, EPROTO, "pcp error");
		return;
	}

	map = pcp_msg_payload(msg);

	info("pcp: %s: mapping granted for %s:"
	     " internal_port=%u, external_addr=%J (lifetime %u seconds)\n",
	     sdp_media_name(m->sdpm),
	     comp->id==1 ? "RTP" : "RTCP",
	     map->int_port, &map->ext_addr,
	     msg->hdr.lifetime);

	/* Update SDP media with external IP-address mapping */
	if (comp->id == 1)
		sdp_media_set_laddr(m->sdpm, &map->ext_addr);
	else
		sdp_media_set_laddr_rtcp(m->sdpm, &map->ext_addr);

	comp->granted = true;
	m->srv_epoch = msg->hdr.epoch;

	is_complete(m->sess);
}