|
|
|
@ -35,7 +35,7 @@
|
|
|
|
|
|
|
|
|
|
struct sdp_fragment {
|
|
|
|
|
ng_buffer *ngbuf;
|
|
|
|
|
struct timeval received;
|
|
|
|
|
int64_t received;
|
|
|
|
|
sdp_streams_q streams;
|
|
|
|
|
sdp_ng_flags flags;
|
|
|
|
|
};
|
|
|
|
@ -50,8 +50,8 @@ static struct ice_candidate_pair *__pair_lookup(struct ice_agent *, struct ice_c
|
|
|
|
|
static void __recalc_pair_prios(struct ice_agent *ag);
|
|
|
|
|
static void __role_change(struct ice_agent *ag, int new_controlling);
|
|
|
|
|
static void __get_complete_components(candidate_pair_q *out, struct ice_agent *ag, GTree *t, unsigned int);
|
|
|
|
|
static void __agent_schedule(struct ice_agent *ag, unsigned long);
|
|
|
|
|
static void __agent_schedule_abs(struct ice_agent *ag, const struct timeval tv);
|
|
|
|
|
static void __agent_schedule(struct ice_agent *ag, int64_t);
|
|
|
|
|
static void __agent_schedule_abs(struct ice_agent *ag, int64_t tv);
|
|
|
|
|
static void __agent_deschedule(struct ice_agent *ag);
|
|
|
|
|
static void __ice_agent_free_components(struct ice_agent *ag);
|
|
|
|
|
static void __agent_shutdown(struct ice_agent *ag);
|
|
|
|
@ -132,7 +132,7 @@ static void queue_sdp_fragment(ng_buffer *ngbuf, call_t *call, str *key, sdp_str
|
|
|
|
|
STR_FMT_M(&flags->call_id), STR_FMT_M(&flags->from_tag));
|
|
|
|
|
|
|
|
|
|
struct sdp_fragment *frag = g_new0(__typeof(*frag), 1);
|
|
|
|
|
frag->received = timeval_from_us(rtpe_now);
|
|
|
|
|
frag->received = rtpe_now;
|
|
|
|
|
frag->ngbuf = obj_get(ngbuf);
|
|
|
|
|
if (streams) {
|
|
|
|
|
frag->streams = *streams;
|
|
|
|
@ -174,7 +174,7 @@ void dequeue_sdp_fragments(struct call_monologue *monologue) {
|
|
|
|
|
|
|
|
|
|
struct sdp_fragment *frag;
|
|
|
|
|
while ((frag = t_queue_pop_head(frags))) {
|
|
|
|
|
if (timeval_diff(timeval_from_us(rtpe_now), frag->received) > MAX_FRAG_AGE)
|
|
|
|
|
if (rtpe_now - frag->received > MAX_FRAG_AGE)
|
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
|
|
ilog(LOG_DEBUG, "Dequeuing SDP fragment for " STR_FORMAT_M "/" STR_FORMAT_M,
|
|
|
|
@ -194,7 +194,7 @@ static gboolean fragment_check_cleanup(str *key, fragment_q *frags, void *p) {
|
|
|
|
|
return TRUE;
|
|
|
|
|
while (frags->length) {
|
|
|
|
|
struct sdp_fragment *frag = frags->head->data;
|
|
|
|
|
if (!all && timeval_diff(timeval_from_us(rtpe_now), frag->received) <= MAX_FRAG_AGE)
|
|
|
|
|
if (!all && rtpe_now - frag->received <= MAX_FRAG_AGE)
|
|
|
|
|
break;
|
|
|
|
|
t_queue_pop_head(frags);
|
|
|
|
|
fragment_free(frag);
|
|
|
|
@ -663,16 +663,16 @@ static void __ice_agent_free(struct ice_agent *ag) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __agent_schedule(struct ice_agent *ag, unsigned long usec) {
|
|
|
|
|
struct timeval nxt;
|
|
|
|
|
static void __agent_schedule(struct ice_agent *ag, int64_t usec) {
|
|
|
|
|
int64_t nxt;
|
|
|
|
|
|
|
|
|
|
nxt = timeval_from_us(rtpe_now);
|
|
|
|
|
nxt = timeval_add_usec(nxt, usec);
|
|
|
|
|
nxt = rtpe_now;
|
|
|
|
|
nxt += usec;
|
|
|
|
|
__agent_schedule_abs(ag, nxt);
|
|
|
|
|
}
|
|
|
|
|
static void __agent_schedule_abs(struct ice_agent *ag, const struct timeval tv) {
|
|
|
|
|
struct timeval nxt;
|
|
|
|
|
long long diff;
|
|
|
|
|
static void __agent_schedule_abs(struct ice_agent *ag, int64_t tv) {
|
|
|
|
|
int64_t nxt;
|
|
|
|
|
int64_t diff;
|
|
|
|
|
|
|
|
|
|
if (!ag)
|
|
|
|
|
return;
|
|
|
|
@ -684,11 +684,11 @@ static void __agent_schedule_abs(struct ice_agent *ag, const struct timeval tv)
|
|
|
|
|
mutex_lock(&tt->lock);
|
|
|
|
|
if (ag->tt_obj.last_run.tv_sec) {
|
|
|
|
|
/* make sure we don't run more often than we should */
|
|
|
|
|
diff = timeval_diff(nxt, ag->tt_obj.last_run);
|
|
|
|
|
diff = nxt - timeval_us(ag->tt_obj.last_run);
|
|
|
|
|
if (diff < TIMER_RUN_INTERVAL * 1000)
|
|
|
|
|
nxt = timeval_add_usec(nxt, TIMER_RUN_INTERVAL * 1000 - diff);
|
|
|
|
|
nxt += TIMER_RUN_INTERVAL * 1000 - diff;
|
|
|
|
|
}
|
|
|
|
|
timerthread_obj_schedule_abs_nl(&ag->tt_obj, nxt);
|
|
|
|
|
timerthread_obj_schedule_abs_nl(&ag->tt_obj, timeval_from_us(nxt));
|
|
|
|
|
mutex_unlock(&tt->lock);
|
|
|
|
|
}
|
|
|
|
|
static void __agent_deschedule(struct ice_agent *ag) {
|
|
|
|
@ -747,7 +747,7 @@ static void __do_ice_check(struct ice_candidate_pair *pair) {
|
|
|
|
|
pair->retransmits++;
|
|
|
|
|
}
|
|
|
|
|
pair->retransmit += pair->retransmit_ms * 1000; // XXX convert to micro
|
|
|
|
|
__agent_schedule_abs(pair->agent, timeval_from_us(pair->retransmit));
|
|
|
|
|
__agent_schedule_abs(pair->agent, pair->retransmit);
|
|
|
|
|
memcpy(transact, pair->stun_transaction, sizeof(transact));
|
|
|
|
|
|
|
|
|
|
pair->was_controlling = AGENT_ISSET(ag, CONTROLLING);
|
|
|
|
@ -928,7 +928,7 @@ check:
|
|
|
|
|
if (have_more)
|
|
|
|
|
__agent_schedule(ag, 0);
|
|
|
|
|
else if (next_run.tv_sec)
|
|
|
|
|
__agent_schedule_abs(ag, next_run); /* for retransmits */
|
|
|
|
|
__agent_schedule_abs(ag, timeval_us(next_run)); /* for retransmits */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __agent_shutdown(struct ice_agent *ag) {
|
|
|
|
@ -1416,7 +1416,7 @@ int ice_response(stream_fd *sfd, const endpoint_t *src,
|
|
|
|
|
if (__check_succeeded_complete(ag)) {
|
|
|
|
|
ag->start_nominating = rtpe_now;
|
|
|
|
|
ag->start_nominating += 100000;
|
|
|
|
|
__agent_schedule_abs(ag, timeval_from_us(ag->start_nominating));
|
|
|
|
|
__agent_schedule_abs(ag, ag->start_nominating);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|