|
|
|
|
@ -264,9 +264,9 @@ static void redis_delete_call(struct call *c, struct redis *r) {
|
|
|
|
|
for (k = ml->medias.head; k; k = k->next) {
|
|
|
|
|
media = k->data;
|
|
|
|
|
|
|
|
|
|
redis_pipe(r, "DEL media-%llu streams-%llu maps-%llu",
|
|
|
|
|
redis_pipe(r, "DEL media-%llu streams-%llu maps-%llu payload_types-%llu",
|
|
|
|
|
(long long unsigned) k->data, (long long unsigned) k->data,
|
|
|
|
|
(long long unsigned) k->data);
|
|
|
|
|
(long long unsigned) k->data, (long long unsigned) k->data);
|
|
|
|
|
|
|
|
|
|
for (n = media->endpoint_maps; n; n = n->next)
|
|
|
|
|
redis_pipe(r, "DEL map-%llu sfds-%llu",
|
|
|
|
|
@ -694,16 +694,21 @@ static int redis_link_sfds(struct redis_list *sfds, struct redis_list *streams)
|
|
|
|
|
static int redis_tags_populate(struct redis *r, struct redis_list *tags, struct redis_list *streams,
|
|
|
|
|
struct redis_list *sfds)
|
|
|
|
|
{
|
|
|
|
|
GList *l_tags, *l_medias, *l_ems;
|
|
|
|
|
GList *l_tags, *l_medias, *l_ems, *l_streams;
|
|
|
|
|
struct list_item *it_tag, *it_media, *it_em;
|
|
|
|
|
struct packet_stream *it_stream;
|
|
|
|
|
struct call_monologue *ml;
|
|
|
|
|
struct redis_list rl_medias, rl_ems;
|
|
|
|
|
int i;
|
|
|
|
|
struct call_media *med;
|
|
|
|
|
str s;
|
|
|
|
|
struct endpoint_map *em;
|
|
|
|
|
struct endpoint_map *em = NULL;
|
|
|
|
|
struct callmaster *cm;
|
|
|
|
|
struct in6_addr in6a;
|
|
|
|
|
struct rtp_payload_type *pt = NULL;
|
|
|
|
|
struct redis_hash pt_hash;
|
|
|
|
|
unsigned int pt_index, pt_totals;
|
|
|
|
|
char hash_key[32];
|
|
|
|
|
|
|
|
|
|
for (l_tags = tags->q.head; l_tags; l_tags = l_tags->next) {
|
|
|
|
|
it_tag = l_tags->data;
|
|
|
|
|
@ -726,6 +731,7 @@ static int redis_tags_populate(struct redis *r, struct redis_list *tags, struct
|
|
|
|
|
med->monologue = ml;
|
|
|
|
|
med->call = ml->call;
|
|
|
|
|
med->index = i;
|
|
|
|
|
med->rtp_payload_types = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, __payload_type_free);
|
|
|
|
|
g_queue_push_tail(&ml->medias, med);
|
|
|
|
|
|
|
|
|
|
if (redis_hash_get_str(&s, &it_media->rh, "type"))
|
|
|
|
|
@ -789,14 +795,48 @@ static int redis_tags_populate(struct redis *r, struct redis_list *tags, struct
|
|
|
|
|
goto free2;
|
|
|
|
|
em->wildcard = redis_hash_get_bool_flag(&it_em->rh, "wildcard");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get payload_types hash content (e.g 0:pt0, 1:pt1, ...)
|
|
|
|
|
if (redis_get_hash(&pt_hash, r, "payload_types", it_media->id))
|
|
|
|
|
goto free3;
|
|
|
|
|
|
|
|
|
|
// fill media rtp_payload_types
|
|
|
|
|
pt_totals = (unsigned int)g_hash_table_size(pt_hash.ht);
|
|
|
|
|
for (pt_index = 0; pt_index < pt_totals; pt_index++) {
|
|
|
|
|
pt = g_slice_alloc0(sizeof(*pt));
|
|
|
|
|
if (!pt) {
|
|
|
|
|
goto free3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(hash_key,"%u", pt_index);
|
|
|
|
|
if (redis_hash_get_unsigned(&pt->payload_type, &pt_hash, hash_key)) {
|
|
|
|
|
goto free3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_hash_table_insert(med->rtp_payload_types, &pt->payload_type, pt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fill streams rtp_stats
|
|
|
|
|
for (l_streams = med->streams.head; l_streams; l_streams = l_streams->next) {
|
|
|
|
|
it_stream = l_streams->data;
|
|
|
|
|
__rtp_stats_update(it_stream->rtp_stats, med->rtp_payload_types);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
free3:
|
|
|
|
|
redis_destroy_hash(&pt_hash);
|
|
|
|
|
if (pt) {
|
|
|
|
|
g_slice_free1(sizeof(*pt), pt);
|
|
|
|
|
}
|
|
|
|
|
free2:
|
|
|
|
|
med->endpoint_maps = g_slist_delete_link(med->endpoint_maps, med->endpoint_maps);
|
|
|
|
|
g_slice_free1(sizeof(*em), em);
|
|
|
|
|
if (em) {
|
|
|
|
|
g_slice_free1(sizeof(*em), em);
|
|
|
|
|
}
|
|
|
|
|
free1:
|
|
|
|
|
g_queue_pop_tail(&ml->medias);
|
|
|
|
|
g_queue_clear(&med->streams);
|
|
|
|
|
@ -1061,13 +1101,16 @@ static void redis_update_dtls_fingerprint(struct redis *r, const char *pref, voi
|
|
|
|
|
/* must be called lock-free */
|
|
|
|
|
void redis_update(struct call *c, struct redis *r) {
|
|
|
|
|
GSList *l, *n;
|
|
|
|
|
GList *pt_list, *pt_iter;
|
|
|
|
|
GList *k, *m;
|
|
|
|
|
struct call_monologue *ml;
|
|
|
|
|
struct call_media *media;
|
|
|
|
|
struct packet_stream *ps;
|
|
|
|
|
struct stream_fd *sfd;
|
|
|
|
|
struct endpoint_map *ep;
|
|
|
|
|
struct rtp_payload_type *pt;
|
|
|
|
|
char a[64];
|
|
|
|
|
unsigned int pt_index;
|
|
|
|
|
|
|
|
|
|
if (!r)
|
|
|
|
|
return;
|
|
|
|
|
@ -1210,9 +1253,22 @@ void redis_update(struct call *c, struct redis *r) {
|
|
|
|
|
(long long unsigned) media, (long long unsigned) ep);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pt_list = g_hash_table_get_values(media->rtp_payload_types);
|
|
|
|
|
pt_index = 0;
|
|
|
|
|
for (pt_iter = pt_list; pt_iter; pt_iter = pt_iter->next) {
|
|
|
|
|
pt = pt_iter->data;
|
|
|
|
|
redis_pipe(r, "HSET payload_types-%llu %u %u",
|
|
|
|
|
(long long unsigned) media,
|
|
|
|
|
(unsigned int) pt_index,
|
|
|
|
|
(unsigned int) pt->payload_type);
|
|
|
|
|
pt_index++;
|
|
|
|
|
}
|
|
|
|
|
g_list_free(pt_list);
|
|
|
|
|
|
|
|
|
|
redis_pipe(r, "EXPIRE media-%llu 86400", (long long unsigned) media);
|
|
|
|
|
redis_pipe(r, "EXPIRE streams-%llu 86400", (long long unsigned) media);
|
|
|
|
|
redis_pipe(r, "EXPIRE maps-%llu 86400", (long long unsigned) media);
|
|
|
|
|
redis_pipe(r, "EXPIRE payload_types-%llu 86400", (long long unsigned) media);
|
|
|
|
|
redis_pipe(r, "LPUSH medias-%llu %llu",
|
|
|
|
|
(long long unsigned) ml, (long long unsigned) media);
|
|
|
|
|
}
|
|
|
|
|
|