|
|
@ -264,9 +264,9 @@ static void redis_delete_call(struct call *c, struct redis *r) { |
|
|
for (k = ml->medias.head; k; k = k->next) { |
|
|
for (k = ml->medias.head; k; k = k->next) { |
|
|
media = k->data; |
|
|
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); |
|
|
|
|
|
|
|
|
(long long unsigned) k->data, (long long unsigned) k->data); |
|
|
|
|
|
|
|
|
for (n = media->endpoint_maps; n; n = n->next) |
|
|
for (n = media->endpoint_maps; n; n = n->next) |
|
|
redis_pipe(r, "DEL map-%llu sfds-%llu", |
|
|
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, |
|
|
static int redis_tags_populate(struct redis *r, struct redis_list *tags, struct redis_list *streams, |
|
|
struct redis_list *sfds) |
|
|
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 list_item *it_tag, *it_media, *it_em; |
|
|
|
|
|
struct packet_stream *it_stream; |
|
|
struct call_monologue *ml; |
|
|
struct call_monologue *ml; |
|
|
struct redis_list rl_medias, rl_ems; |
|
|
struct redis_list rl_medias, rl_ems; |
|
|
int i; |
|
|
int i; |
|
|
struct call_media *med; |
|
|
struct call_media *med; |
|
|
str s; |
|
|
str s; |
|
|
struct endpoint_map *em; |
|
|
|
|
|
|
|
|
struct endpoint_map *em = NULL; |
|
|
struct callmaster *cm; |
|
|
struct callmaster *cm; |
|
|
struct in6_addr in6a; |
|
|
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) { |
|
|
for (l_tags = tags->q.head; l_tags; l_tags = l_tags->next) { |
|
|
it_tag = l_tags->data; |
|
|
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->monologue = ml; |
|
|
med->call = ml->call; |
|
|
med->call = ml->call; |
|
|
med->index = i; |
|
|
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); |
|
|
g_queue_push_tail(&ml->medias, med); |
|
|
|
|
|
|
|
|
if (redis_hash_get_str(&s, &it_media->rh, "type")) |
|
|
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; |
|
|
goto free2; |
|
|
em->wildcard = redis_hash_get_bool_flag(&it_em->rh, "wildcard"); |
|
|
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; |
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
free3: |
|
|
|
|
|
redis_destroy_hash(&pt_hash); |
|
|
|
|
|
if (pt) { |
|
|
|
|
|
g_slice_free1(sizeof(*pt), pt); |
|
|
|
|
|
} |
|
|
free2: |
|
|
free2: |
|
|
med->endpoint_maps = g_slist_delete_link(med->endpoint_maps, med->endpoint_maps); |
|
|
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: |
|
|
free1: |
|
|
g_queue_pop_tail(&ml->medias); |
|
|
g_queue_pop_tail(&ml->medias); |
|
|
g_queue_clear(&med->streams); |
|
|
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 */ |
|
|
/* must be called lock-free */ |
|
|
void redis_update(struct call *c, struct redis *r) { |
|
|
void redis_update(struct call *c, struct redis *r) { |
|
|
GSList *l, *n; |
|
|
GSList *l, *n; |
|
|
|
|
|
GList *pt_list, *pt_iter; |
|
|
GList *k, *m; |
|
|
GList *k, *m; |
|
|
struct call_monologue *ml; |
|
|
struct call_monologue *ml; |
|
|
struct call_media *media; |
|
|
struct call_media *media; |
|
|
struct packet_stream *ps; |
|
|
struct packet_stream *ps; |
|
|
struct stream_fd *sfd; |
|
|
struct stream_fd *sfd; |
|
|
struct endpoint_map *ep; |
|
|
struct endpoint_map *ep; |
|
|
|
|
|
struct rtp_payload_type *pt; |
|
|
char a[64]; |
|
|
char a[64]; |
|
|
|
|
|
unsigned int pt_index; |
|
|
|
|
|
|
|
|
if (!r) |
|
|
if (!r) |
|
|
return; |
|
|
return; |
|
|
@ -1210,9 +1253,22 @@ void redis_update(struct call *c, struct redis *r) { |
|
|
(long long unsigned) media, (long long unsigned) ep); |
|
|
(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 media-%llu 86400", (long long unsigned) media); |
|
|
redis_pipe(r, "EXPIRE streams-%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 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", |
|
|
redis_pipe(r, "LPUSH medias-%llu %llu", |
|
|
(long long unsigned) ml, (long long unsigned) media); |
|
|
(long long unsigned) ml, (long long unsigned) media); |
|
|
} |
|
|
} |
|
|
|