sip-lab 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -2
- package/prebuilds/linux-x64/sip-lab.node +0 -0
- package/samples/{183_session_progress.js.future → 183_session_progress.js} +156 -7
- package/samples/rtp_and_srtp.js +466 -0
- package/samples/rtp_and_srtp.rtp_refused.js +430 -0
- package/samples/rtp_and_srtp.unbalanced_sdp_answer.js.future +189 -0
- package/samples/srtp.js +14 -16
- package/src/sip.cpp +53 -22
package/src/sip.cpp
CHANGED
|
@@ -424,6 +424,8 @@ struct Call {
|
|
|
424
424
|
|
|
425
425
|
pjmedia_sdp_session *active_local_sdp;
|
|
426
426
|
pjmedia_sdp_session *active_remote_sdp;
|
|
427
|
+
|
|
428
|
+
bool local_sdp_answer_already_set;
|
|
427
429
|
};
|
|
428
430
|
|
|
429
431
|
#define MAX_TCP_DATA 4096
|
|
@@ -2071,9 +2073,9 @@ int pjw_call_respond(long call_id, const char *json) {
|
|
|
2071
2073
|
set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
|
|
2072
2074
|
goto out;
|
|
2073
2075
|
}
|
|
2076
|
+
call->pending_rdata = 0;
|
|
2074
2077
|
|
|
2075
2078
|
call->pending_request = -1;
|
|
2076
|
-
call->pending_rdata = 0;
|
|
2077
2079
|
}
|
|
2078
2080
|
|
|
2079
2081
|
goto out;
|
|
@@ -2084,13 +2086,16 @@ int pjw_call_respond(long call_id, const char *json) {
|
|
|
2084
2086
|
|
|
2085
2087
|
if (call->pending_rdata && call->pending_rdata->msg_info.msg->body &&
|
|
2086
2088
|
call->pending_rdata->msg_info.msg->body->len) {
|
|
2087
|
-
if
|
|
2088
|
-
|
|
2089
|
-
|
|
2089
|
+
if(!call->local_sdp_answer_already_set) {
|
|
2090
|
+
if (!process_media(call, call->inv->dlg, document, true)) {
|
|
2091
|
+
goto out;
|
|
2092
|
+
}
|
|
2090
2093
|
|
|
2091
|
-
|
|
2094
|
+
status = pjsip_inv_set_sdp_answer(call->inv, call->local_sdp);
|
|
2095
|
+
call->local_sdp_answer_already_set = true;
|
|
2096
|
+
}
|
|
2092
2097
|
} else {
|
|
2093
|
-
|
|
2098
|
+
printf("delayed media. we need to send the offer\n");
|
|
2094
2099
|
if (!process_media(call, call->inv->dlg, document, false)) {
|
|
2095
2100
|
goto out;
|
|
2096
2101
|
}
|
|
@@ -2114,15 +2119,17 @@ int pjw_call_respond(long call_id, const char *json) {
|
|
|
2114
2119
|
|
|
2115
2120
|
call->inv_initial_answer_required = false;
|
|
2116
2121
|
|
|
2117
|
-
if (code >= 200) {
|
|
2122
|
+
if (code >= 200 && code < 300) {
|
|
2118
2123
|
status = pjsip_rx_data_free_cloned(call->pending_rdata);
|
|
2119
2124
|
if (status != PJ_SUCCESS) {
|
|
2120
2125
|
set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
|
|
2121
2126
|
goto out;
|
|
2122
2127
|
}
|
|
2123
|
-
|
|
2124
|
-
call->pending_request = -1;
|
|
2125
2128
|
call->pending_rdata = 0;
|
|
2129
|
+
|
|
2130
|
+
if (code >= 200 && code < 300) {
|
|
2131
|
+
call->pending_request = -1;
|
|
2132
|
+
}
|
|
2126
2133
|
}
|
|
2127
2134
|
} else {
|
|
2128
2135
|
status = pjsip_inv_answer(call->inv, code, &r,
|
|
@@ -2133,7 +2140,20 @@ int pjw_call_respond(long call_id, const char *json) {
|
|
|
2133
2140
|
goto out;
|
|
2134
2141
|
}
|
|
2135
2142
|
|
|
2136
|
-
|
|
2143
|
+
if (code >= 200 && code < 300) {
|
|
2144
|
+
if(call->pending_rdata) {
|
|
2145
|
+
status = pjsip_rx_data_free_cloned(call->pending_rdata);
|
|
2146
|
+
if (status != PJ_SUCCESS) {
|
|
2147
|
+
set_error("pjsip_rx_data_free_cloned failed with status=%i", status);
|
|
2148
|
+
goto out;
|
|
2149
|
+
}
|
|
2150
|
+
call->pending_rdata = 0;
|
|
2151
|
+
}
|
|
2152
|
+
|
|
2153
|
+
if (code >= 200 && code < 300) {
|
|
2154
|
+
call->pending_request = -1;
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2137
2157
|
|
|
2138
2158
|
if (!add_headers(call->inv->dlg->pool, tdata, document)) {
|
|
2139
2159
|
goto out;
|
|
@@ -2145,6 +2165,10 @@ int pjw_call_respond(long call_id, const char *json) {
|
|
|
2145
2165
|
set_error("pjsip_inv_send_msg failed with status=%i", status);
|
|
2146
2166
|
goto out;
|
|
2147
2167
|
}
|
|
2168
|
+
|
|
2169
|
+
if(code >= 200 && code < 300) {
|
|
2170
|
+
call->local_sdp_answer_already_set = false;
|
|
2171
|
+
}
|
|
2148
2172
|
out:
|
|
2149
2173
|
PJW_UNLOCK();
|
|
2150
2174
|
if (pjw_errorstring[0]) {
|
|
@@ -4076,10 +4100,11 @@ int find_sdp_media_by_media_endpt(const pjmedia_sdp_session *sdp,
|
|
|
4076
4100
|
printf("find_sdp_media_by_media_endpt %x\n", me);
|
|
4077
4101
|
for (int i = 0; i < sdp->media_count; i++) {
|
|
4078
4102
|
pjmedia_sdp_media *media = sdp->media[i];
|
|
4079
|
-
printf("i=%d me->port=%i media->desc.port=%i me->media=%.*s media->desc.media=%.*s\n", i, me->port, media->desc.port, me->media.slen, me->media.ptr, media->desc.media.slen, media->desc.media.ptr);
|
|
4103
|
+
printf("i=%d me->port=%i media->desc.port=%i me->media=%.*s media->desc.media=%.*s me->transport=%.*s media->desc.transport=%.*s\n", i, me->port, media->desc.port, me->media.slen, me->media.ptr, media->desc.media.slen, media->desc.media.ptr, me->transport.slen, me->transport.ptr, media->desc.transport.slen, media->desc.transport.ptr);
|
|
4080
4104
|
|
|
4081
4105
|
if ((me->port == media->desc.port) &&
|
|
4082
|
-
(pj_strcmp(&me->media, &media->desc.media) == 0)
|
|
4106
|
+
(pj_strcmp(&me->media, &media->desc.media) == 0) &&
|
|
4107
|
+
(pj_strcmp(&me->transport, &media->desc.transport) == 0)) {
|
|
4083
4108
|
*media_out = media;
|
|
4084
4109
|
printf("found\n");
|
|
4085
4110
|
return i;
|
|
@@ -4128,10 +4153,10 @@ void gen_media_json(char *dest, int len, Call *call,
|
|
|
4128
4153
|
if(!me->port) {
|
|
4129
4154
|
switch (me->type) {
|
|
4130
4155
|
case ENDPOINT_TYPE_AUDIO:
|
|
4131
|
-
p += sprintf(p, "{\"type\": \"audio\", \"
|
|
4156
|
+
p += sprintf(p, "{\"type\": \"audio\", \"protocol\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
|
|
4132
4157
|
break;
|
|
4133
4158
|
case ENDPOINT_TYPE_MRCP:
|
|
4134
|
-
p += sprintf(p, "{\"type\": \"mrcp\", \"
|
|
4159
|
+
p += sprintf(p, "{\"type\": \"mrcp\", \"protocol\": \"%.*s\", \"port\": 0}", me->transport.slen, me->transport.ptr);
|
|
4135
4160
|
break;
|
|
4136
4161
|
default:
|
|
4137
4162
|
p += sprintf(p, "{\"type\": \"unknown\", \"port\": 0}");
|
|
@@ -4163,7 +4188,7 @@ void gen_media_json(char *dest, int len, Call *call,
|
|
|
4163
4188
|
pj_str_t *remote_addr = &remote_conn->addr;
|
|
4164
4189
|
|
|
4165
4190
|
p += sprintf(p,
|
|
4166
|
-
"{\"type\": \"audio\", \"
|
|
4191
|
+
"{\"type\": \"audio\", \"protocol\": \"%.*s\", \"local\": {\"addr\": \"%.*s\", "
|
|
4167
4192
|
"\"port\": %d, \"mode\": \"%s\"}, \"remote\": {\"addr\": "
|
|
4168
4193
|
"\"%.*s\", \"port\": %d, \"mode\": \"%s\"}, \"fmt\": [",
|
|
4169
4194
|
me->transport.slen, me->transport.ptr,
|
|
@@ -4188,7 +4213,7 @@ void gen_media_json(char *dest, int len, Call *call,
|
|
|
4188
4213
|
}
|
|
4189
4214
|
case ENDPOINT_TYPE_MRCP: {
|
|
4190
4215
|
p += sprintf(p,
|
|
4191
|
-
"{\"type\": \"mrcp\", \"
|
|
4216
|
+
"{\"type\": \"mrcp\", \"protocol\": \"%.*s\", \"local\": {\"port\": %d}, "
|
|
4192
4217
|
"\"remote\": {\"port\": %d}}",
|
|
4193
4218
|
me->transport.slen, me->transport.ptr,
|
|
4194
4219
|
local_sdp->media[idx]->desc.port,
|
|
@@ -4414,18 +4439,24 @@ MediaEndpoint *find_media_endpt_by_sdp_media(Call *call,
|
|
|
4414
4439
|
|
|
4415
4440
|
if (pj_strcmp2(&local_media->desc.media, "audio") == 0) {
|
|
4416
4441
|
if (ENDPOINT_TYPE_AUDIO == me->type) {
|
|
4417
|
-
|
|
4418
|
-
|
|
4442
|
+
if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
|
|
4443
|
+
in_use_chart[i] = true;
|
|
4444
|
+
return me;
|
|
4445
|
+
}
|
|
4419
4446
|
}
|
|
4420
4447
|
} else if (pj_strcmp2(&local_media->desc.media, "video") == 0) {
|
|
4421
4448
|
if (ENDPOINT_TYPE_VIDEO == me->type) {
|
|
4422
|
-
|
|
4423
|
-
|
|
4449
|
+
if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
|
|
4450
|
+
in_use_chart[i] = true;
|
|
4451
|
+
return me;
|
|
4452
|
+
}
|
|
4424
4453
|
}
|
|
4425
4454
|
} else if (pj_strcmp2(&local_media->desc.media, "application") == 0) {
|
|
4426
4455
|
if (ENDPOINT_TYPE_MRCP == me->type) {
|
|
4427
|
-
|
|
4428
|
-
|
|
4456
|
+
if (pj_strcmp(&local_media->desc.transport, &me->transport)) {
|
|
4457
|
+
in_use_chart[i] = true;
|
|
4458
|
+
return me;
|
|
4459
|
+
}
|
|
4429
4460
|
}
|
|
4430
4461
|
} else {
|
|
4431
4462
|
printf("local_media->desc.media=%.*s\n", local_media->desc.media.slen,
|