From 2cf93904df5fb9db87e2fd8f480162f8b7c5faca Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 13 Apr 2017 14:36:19 -0400 Subject: [PATCH] TT#12800 restore SSRC table from redis Change-Id: I9c6a5a33ae14e803e5badade8307d4f53f7a04a2 --- daemon/redis.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/daemon/redis.c b/daemon/redis.c index f066e7f89..b22b9ceaf 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -700,6 +700,16 @@ INLINE str *json_reader_get_string_value_uri_enc(JsonReader *root_reader) { str *out = str_uri_decode_len(s, strlen(s)); return out; // must be free'd } +// XXX rework restore procedure to use functions like this everywhere and eliminate the GHashTable +INLINE long long json_reader_get_ll(JsonReader *root_reader, const char *key) { + if (!json_reader_read_member(root_reader, key)) + return -1; + str *ret = json_reader_get_string_value_uri_enc(root_reader); + long long r = strtoll(ret->s, NULL, 10); + free(ret); + json_reader_end_member(root_reader); + return r; +} static int json_get_hash(struct redis_hash *out, const char *key, unsigned int id, JsonReader *root_reader) @@ -1379,6 +1389,28 @@ static int json_link_maps(struct call *c, struct redis_list *maps, return 0; } +static int json_build_ssrc(struct call *c, JsonReader *root_reader) { + if (!json_reader_read_member(root_reader, "ssrc_table")) + return -1; + int nmemb = json_reader_count_elements(root_reader); + for (int jidx=0; jidx < nmemb; ++jidx) { + if (!json_reader_read_element(root_reader, jidx)) + return -1; + + u_int32_t ssrc = json_reader_get_ll(root_reader, "ssrc"); + struct ssrc_entry *se = get_ssrc(ssrc, c->ssrc_hash); + se->input_ctx.srtp_index = json_reader_get_ll(root_reader, "in_srtp_index"); + se->input_ctx.srtcp_index = json_reader_get_ll(root_reader, "in_srtcp_index"); + se->output_ctx.srtp_index = json_reader_get_ll(root_reader, "out_srtp_index"); + se->output_ctx.srtcp_index = json_reader_get_ll(root_reader, "out_srtcp_index"); + se->payload_type = json_reader_get_ll(root_reader, "payload_type"); + + json_reader_end_element(root_reader); + } + json_reader_end_member (root_reader); + return 0; +} + static void json_restore_call(struct redis *r, struct callmaster *m, const str *callid, enum call_type type) { redisReply* rr_jsonStr; struct redis_hash call; @@ -1485,8 +1517,9 @@ static void json_restore_call(struct redis *r, struct callmaster *m, const str * err = "failed to link maps"; if (json_link_maps(c, &maps, &sfds, root_reader)) goto err8; - - // XXX restore SSRC table + err = "failed to restore SSRC table"; + if (json_build_ssrc(c, root_reader)) + goto err8; // presence of this key determines whether we were recording at all if (!redis_hash_get_str(&s, &call, "recording_meta_prefix")) {