/* also regenerates all_pairs_list */ static void __recalc_pair_prios(struct ice_agent *ag) { struct ice_candidate_pair *pair; GList *l; GQueue nominated, valid, succ, all; ilog(LOG_DEBUG, "Recalculating all ICE pair priorities"); g_tree_remove_all(&nominated, ag->nominated_pairs); g_tree_remove_all(&succ, ag->succeeded_pairs); g_tree_remove_all(&valid, ag->valid_pairs); g_tree_remove_all(&all, ag->all_pairs); for (l = ag->candidate_pairs.head; l; l = l->next) { pair = l->data; __do_ice_pair_priority(pair); /* this changes the packets, so we must keep these from being seen as retransmits */ __new_stun_transaction(pair); } g_tree_add_all(ag->nominated_pairs, &nominated); g_tree_add_all(ag->succeeded_pairs, &succ); g_tree_add_all(ag->valid_pairs, &valid); g_tree_add_all(ag->all_pairs, &all); __all_pairs_list(ag); }
/* agent must be locked */ static struct ice_candidate_pair *__pair_candidate(struct interface_address *addr, struct ice_agent *ag, struct ice_candidate *cand, struct packet_stream *ps) { struct ice_candidate_pair *pair; if (addr->family != family_from_address(&cand->endpoint.ip46)) return NULL; pair = g_slice_alloc0(sizeof(*pair)); pair->agent = ag; pair->remote_candidate = cand; pair->local_address = addr; pair->packet_stream = ps; if (cand->component_id != 1) PAIR_SET(pair, FROZEN); __do_ice_pair_priority(pair); __new_stun_transaction(pair); g_queue_push_tail(&ag->candidate_pairs, pair); g_hash_table_insert(ag->pair_hash, pair, pair); g_tree_insert(ag->all_pairs, pair, pair); ilog(LOG_DEBUG, "Created candidate pair "PAIR_FORMAT" between %s and %s, type %s", PAIR_FMT(pair), smart_ntop_buf(&addr->addr), smart_ntop_ep_buf(&cand->endpoint), ice_candidate_type_str(cand->type)); return pair; }
/* agent must be locked */ static struct ice_candidate_pair *__pair_candidate(struct stream_fd *sfd, struct ice_agent *ag, struct ice_candidate *cand) { struct ice_candidate_pair *pair; if (sfd->socket.family != cand->endpoint.address.family) return NULL; pair = g_slice_alloc0(sizeof(*pair)); pair->agent = ag; pair->remote_candidate = cand; pair->local_intf = sfd->local_intf; pair->sfd = sfd; if (cand->component_id != 1) PAIR_SET(pair, FROZEN); __do_ice_pair_priority(pair); __new_stun_transaction(pair); g_queue_push_tail(&ag->candidate_pairs, pair); g_hash_table_insert(ag->pair_hash, pair, pair); g_tree_insert(ag->all_pairs, pair, pair); ilog(LOG_DEBUG, "Created candidate pair "PAIR_FORMAT" between %s and %s, type %s", PAIR_FMT(pair), sockaddr_print_buf(&sfd->socket.local.address), endpoint_print_buf(&cand->endpoint), ice_candidate_type_str(cand->type)); return pair; }
static void __nominate_pairs(struct ice_agent *ag) { GQueue complete; GList *l; struct ice_candidate_pair *pair; ilog(LOG_DEBUG, "Start nominating ICE pairs"); AGENT_SET(ag, NOMINATING); ZERO(ag->start_nominating); __get_complete_succeeded_pairs(&complete, ag); for (l = complete.head; l; l = l->next) { pair = l->data; ilog(LOG_DEBUG, "Nominating ICE pair "PAIR_FORMAT, PAIR_FMT(pair)); PAIR_CLEAR(pair, IN_PROGRESS); PAIR_SET2(pair, NOMINATED, TO_USE); pair->retransmits = 0; __new_stun_transaction(pair); g_queue_push_tail(&ag->triggered, pair); } g_queue_clear(&complete); }