static void turn_handler1(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(m->sdpm, relay_addr); m->addr1 = *relay_addr; if (m->turnc2 && !sa_isset(&m->addr2, SA_ALL)) return; if (--m->sess->mediac) return; } m->sess->estabh(err, scode, reason, m->sess->arg); }
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); }
/* 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); }