Skip to content

Commit c0197e4

Browse files
committed
rtpengine: avoid looping when a server is enforced
(cherry picked from commit 0665f67)
1 parent bfcdd43 commit c0197e4

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

modules/rtpengine/rtpengine.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2834,13 +2834,12 @@ static bencode_item_t *rtpe_function_call(bencode_buffer_t *bencbuf, struct sip_
28342834
str error;
28352835
struct rtpe_node *node, *failed_node;
28362836
char *cp, *err = NULL;
2837-
pv_value_t val;
2837+
pv_value_t val, socket_val;
28382838
struct rtpe_ignore_node *ignore_list = NULL;
2839-
int ret;
2839+
int ret, forced_socket;
28402840
memset(&ng_flags, 0, sizeof(ng_flags));
28412841
error.len = 0;
28422842
error.s = "";
2843-
pv_value_t socket_val;
28442843

28452844
/*** get & init basic stuff needed ***/
28462845
if (rtpe_function_call_prepare(bencbuf, msg, op, &ng_flags, flags_str, body_in, extra_dict,&err) < 0)
@@ -2853,10 +2852,10 @@ static bencode_item_t *rtpe_function_call(bencode_buffer_t *bencbuf, struct sip_
28532852
}
28542853

28552854
/*** If the spvar "sock_var" has been specified, parse it into a (socket_val) STR variable ***/
2856-
if (spvar) {
2857-
memset(&socket_val, 0, sizeof(pv_value_t));
2855+
memset(&socket_val, 0, sizeof(pv_value_t));
2856+
if (spvar)
28582857
pv_get_spec_value(msg, spvar, &socket_val);
2859-
}
2858+
forced_socket = socket_val.rs.len > 0;
28602859

28612860
failed_node = NULL;
28622861

@@ -2873,16 +2872,23 @@ static bencode_item_t *rtpe_function_call(bencode_buffer_t *bencbuf, struct sip_
28732872
if (spvar && (socket_val.rs.len > 0)) {
28742873
LM_DBG("Sending command [%d] to RTPEngine socket: [%.*s] set id: [%d]\n", op, (int)(socket_val.rs.len), (char *)(socket_val.rs.s), set->id_set);
28752874
node = lookup_rtpe_node(set, &socket_val.rs);
2876-
if (node == NULL) {
2877-
RTPE_STOP_READ();
2878-
goto error;
2875+
socket_val.rs.s = NULL;
2876+
socket_val.rs.len = 0;
2877+
if (node && ((node->rn_disabled = rtpe_test(node, node->rn_disabled, 0)) ||
2878+
rtpe_is_ignore_node(ignore_list, node))) {
2879+
LM_DBG("RTPEngine socket [%.*s] is not available\n",
2880+
node->rn_url.len, node->rn_url.s);
2881+
node = NULL;
28792882
}
28802883

2884+
if (node == NULL && op == OP_OFFER)
2885+
node = select_rtpe_node(ng_flags.call_id, set, ignore_list);
2886+
} else if (forced_socket && op != OP_OFFER) {
2887+
node = NULL;
28812888
} else if (snode && snode->s) {
28822889
if ((node = get_rtpe_node(snode, set)) == NULL && op == OP_OFFER)
28832890
node = select_rtpe_node(ng_flags.call_id, set, ignore_list);
28842891
snode = NULL;
2885-
28862892
} else {
28872893
node = select_rtpe_node(ng_flags.call_id, set, ignore_list);
28882894
}
@@ -5030,6 +5036,7 @@ static int rtpengine_api_offer(struct rtp_relay_session *sess,
50305036
fill_rtpengine_node(server, &val.rs);
50315037
else
50325038
LM_ERR("could not retrieve the value of the used rtpengine!\n");
5039+
pv_set_value(NULL, &media_pvar, EQ_T, NULL);
50335040
}
50345041
return ret;
50355042
}

0 commit comments

Comments
 (0)