static void new_priority(struct sdp_media *media, enum ice_candidate_type type, unsigned int *tprefp, unsigned int *lprefp) { GQueue *cands; unsigned int lpref, tpref; u_int32_t prio; GList *l; struct sdp_attribute *a; struct attribute_candidate *c; lpref = 0; tpref = ice_type_preference(type); prio = ice_priority_pref(tpref, lpref, 1); cands = attr_list_get_by_id(&media->attributes, ATTR_CANDIDATE); if (!cands) goto out; for (l = cands->head; l; l = l->next) { a = l->data; c = &a->u.candidate; if (c->cand_parsed.priority <= prio && c->cand_parsed.type == type && c->cand_parsed.component_id == 1) { /* tpref should come out as 126 (if host) here, unless the client isn't following * the RFC, in which case we must adapt */ tpref = ice_type_pref_from_prio(c->cand_parsed.priority); lpref = ice_local_pref_from_prio(c->cand_parsed.priority); if (lpref) lpref--; else { /* we must deviate from the RFC recommended values */ if (tpref) tpref--; lpref = 65535; } prio = ice_priority_pref(tpref, lpref, 1); } } out: *tprefp = tpref; *lprefp = lpref; }
static void insert_candidate(struct sdp_chopper *chop, struct packet_stream *ps, unsigned int component, unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type, struct interface_address *ifa) { unsigned long priority; priority = ice_priority_pref(type_pref, local_pref, component); chopper_append_c(chop, "a=candidate:"); chopper_append_str(chop, &ifa->ice_foundation); chopper_append_printf(chop, " %u UDP %lu ", component, priority); insert_ice_address(chop, ps, ifa); chopper_append_c(chop, " typ "); chopper_append_c(chop, ice_candidate_type_str(type)); /* raddr and rport are required for non-host candidates: rfc5245 section-15.1 */ if(type != ICT_HOST) insert_raddr_rport(chop, ps, ifa); chopper_append_c(chop, "\r\n"); }
static void insert_candidate(struct sdp_chopper *chop, struct stream_fd *sfd, unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type) { unsigned long priority; struct packet_stream *ps = sfd->stream; const struct local_intf *ifa = sfd->local_intf; if (local_pref == -1) local_pref = ifa->unique_id; priority = ice_priority_pref(type_pref, local_pref, ps->component); chopper_append_c(chop, "a=candidate:"); chopper_append_str(chop, &ifa->ice_foundation); chopper_append_printf(chop, " %u UDP %lu ", ps->component, priority); insert_ice_address(chop, sfd); chopper_append_c(chop, " typ "); chopper_append_c(chop, ice_candidate_type_str(type)); /* raddr and rport are required for non-host candidates: rfc5245 section-15.1 */ if(type != ICT_HOST) insert_raddr_rport(chop, ps, ifa); chopper_append_c(chop, "\r\n"); }