Newer
Older
};
if (ispresent(loc_sdp.media_list)) {
for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
if (ispresent(loc_sdp.media_list[j].bandwidth)) {
for(var integer i:=0; i< sizeof(loc_sdp.media_list[j].bandwidth); i:=i+1) {
if (match(loc_sdp.media_list[j].bandwidth[i],loc_bandw)) {
return(true);};
}
}
};
};
return(false);
}
/**
* @desc check if message body include SDP media (2nd parameter)
*
*/
function f_check_media(in SDP_Message loc_sdp, in template SDP_media_desc loc_media) runs on SipComponent return boolean {
if (ispresent(loc_sdp.media_list)) {
for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
if (match(loc_sdp.media_list[j].media_field.transport,loc_media.media_field.transport) and
match(loc_sdp.media_list[j].media_field.fmts,loc_media.media_field.fmts))
{return(true);};
};
}
return(false);
}
/**
* @desc
* check if message body include precondition mechanism (a=des and
* a=curr) retrun true, else false
* @param loc_sdp SDP message
*/
function f_check_precondition(in SDP_Message loc_sdp) runs on SipComponent return boolean {
if (f_check_attribute(loc_sdp, mw_attribute_des) or
f_check_attribute(loc_sdp, mw_attribute_curr))
{return(true);}
return(false);
}
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
/**
* @desc check if message body include SDP media direction return true, else false
*
*/
function f_check_media_direction(in SDP_Message loc_sdp) runs on SipComponent return boolean {
if (f_check_attribute(loc_sdp, mw_attribute_sendonly) or
f_check_attribute(loc_sdp, mw_attribute_recvonly) or
f_check_attribute(loc_sdp, mw_attribute_sendrecv) or
f_check_attribute(loc_sdp, mw_attribute_inactive))
{return(true);}
return(false);
}
/**
* @desc copy media/attribute lines from remote to local SDP variable
*
*/
function f_check_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
return boolean
{
var SDP_media_desc v_media := f_prepare_media(loc_sdp,loc_codec);
log("log0");
if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media)
{ log("log1"); return false };
if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport)
{ log("log2"); return false };
if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts)
{ log("remote:",vc_sdp_remote.media_list[0].media_field.fmts,"expect:",v_media.media_field.fmts); return false };
return true
}
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
/**
* @desc replace the first curr media attribute with the given value.
* @param p_sdp SDP message to modify
* @param p_curr new curr attribute
*/
function f_replace_curr_attribute(inout SDP_Message p_sdp, in SDP_attribute_curr p_curr) {
if(ispresent(p_sdp.media_list)) {
var integer mn := sizeof(p_sdp.media_list[0].attributes);
for(var integer i := 0; i<=mn; i := i+1) {
if(ischosen(p_sdp.media_list[0].attributes[i].curr)){
p_sdp.media_list[0].attributes[i].curr := p_curr;
i:=mn;
}
}
}
}
/**
* @desc append new media attribute to the first media description.
* @param p_sdp SDP message to modify
* @param p_att SDP attribute to appand
*/
function f_append_media_attribute(inout SDP_Message p_sdp, in SDP_attribute p_att) {
if(ispresent(p_sdp.media_list)) {
var integer mn := sizeof(p_sdp.media_list[0].attributes);
p_sdp.media_list[0].attributes[mn] := p_att;
}
}
/**
* @desc append new media to the existing media list in SDP
*
*/
function f_append_media(inout SDP_Message loc_SDP, in template SDP_media_desc loc_media)
{
var integer mn := sizeof(loc_SDP.media_list);
loc_SDP.media_list[mn] := valueof(loc_media);
}
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
/**
* @desc repare media/attribute lines
*
*/
function f_prepare_media(integer loc_sdp, integer loc_codec) runs on SipComponent
return SDP_media_desc
{
var charstring v_codecs[32] := {
"PCMU/8000", "GSM/8000", "G723/8000", "DVI4/8000",
"DVI4/16000", "LPC/8000", "PCMA/8000", "G722/8000",
"L16/44100/2", "L16/44100", "QCELP/8000", "CN/8000",
"MPA/90000", "G728/8000", "DVI4/11025", "DVI4/22050",
"G729/8000", "G726-40/8000", "G726-32/8000", "G726-24/8000",
"G726-16/8000", "G726D/8000", "G726E/8000", "GSM-EFR/8000",
"CelB/90000", "JPEG/90000", "Nv/90000", "H261/90000",
"MPV/90000", "MP2T/90000", "H263/90000", "H263-1998/90000"
}
var SDP_media_desc v_media :=
{
media_field := {
media := "audio",
ports := {
port_number := 10000,
num_of_ports:=omit },
transport := "RTP/AVP",
fmts := { "0" }
}, //m=audio 8500 RTP/AVP 0
information := omit,
connections := omit,
bandwidth := omit,
key := omit,
attributes := omit
};
if (32<loc_codec or loc_codec<1) {
log("Unexpected SDP variant");
setverdict(inconc);
return (v_media)}
if (loc_sdp == 1) {}
else if (loc_sdp == 2) {
v_media.media_field.fmts := {PX_SIP_SDP_dyn}; //{ "98", "0" };
v_media.attributes := {{
rtpmap := { attr_value := PX_SIP_SDP_dyn & " " & v_codecs[loc_codec-1] } // PX_SIP_SDP_dyn := 98
}}
} else if (loc_sdp == 3) {
v_media.media_field.fmts := { "8" }
} else if (loc_sdp == 4) {
v_media.media_field.fmts := { "99", "8" };
v_media.attributes := {{
rtpmap := { attr_value := "99 " & v_codecs[loc_codec-1] }
}}
} else if (loc_sdp == 5) {
v_media.media_field.media := "image";
v_media.media_field.transport := "udptl";
v_media.media_field.fmts := { "t38" }
} else if (loc_sdp == 6) {
v_media.media_field.media := "image";
v_media.media_field.transport := "tcptl";
v_media.media_field.fmts := { "t38" }
} else {
log("Unexpected SDP variant"); setverdict(inconc)
};
return (v_media);
}
/**
* @desc repare media/attribute lines
*
*/
function f_prepare_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
{
vc_sdp_local.media_list := {f_prepare_media(loc_sdp,loc_codec)};
}
/**
*
* @desc function that copy media/attribute lines from remote to local SDP variable
*/
function f_prepare_SDP_answer() runs on SipComponent
{
var integer mn, cn := 0, i, j, k :=0;
var charstring v_PT, v_rtpmap := "";
var SDP_attribute_list v_mediaAttributes := {};
//increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
// if more than one codec, select the firs one
for (i :=0; i < mn; i := i+1)
{
//for every single media
if (ispresent(vc_sdp_remote.media_list[i].attributes))
cn := sizeof(vc_sdp_remote.media_list[i].attributes);
if (sizeof(vc_sdp_remote.media_list[i].media_field.fmts)>0)
{
// select the first one
v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
for (j :=0; j<cn; j:=j+1)
{
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap))
if (v_PT == regexp(vc_sdp_remote.media_list[i].attributes[j].rtpmap.attr_value, "[ \t]#(0,)([\d]+)*", 0))
v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].
rtpmap.attr_value;
v_mediaAttributes[k] := {rtpmap := {attr_value := v_rtpmap}};
k := k+1;
} // else line is not copied
}
else
{
// simple copy of attribute
v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
k := k+1;
}
}
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
if (ispresent(vc_sdp_local.media_list[i].attributes))
{
cn := sizeof(vc_sdp_local.media_list[i].attributes);
for (j :=0; j<cn; j:=j+1)
{
// simplified handling of status attributes (copy/keep status from peer):
// a) copy/keep SDP_attribute_curr (invert tags if applicable)
if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr))
{
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local")
{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote"};
if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote")
{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local"};
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send")
{vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv"};
if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv")
{vc_sdp_local.media_list[i].attributes[j].curr.direction := "send"};
}
// b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
else if (ischosen(vc_sdp_local.media_list[i].attributes[j].des))
{
// invert local/remote status tags
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local")
{vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote"};
if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote")
{vc_sdp_local.media_list[i].attributes[j].des.statusType := "local"};
// invert send/recv direction tags
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send")
{vc_sdp_local.media_list[i].attributes[j].des.direction := "recv"};
if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv")
{vc_sdp_local.media_list[i].attributes[j].des.direction := "send"};
}
// c) simplification: assume no SDP_attribute_conf
else if (ischosen(vc_sdp_local.media_list[i].attributes[j].conf))
{
// todo: handle SDP_attribute_conf
}
}
};
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
}
}
// add handling of prenegotiation, change ports if required etc.
//if prenegotiation...
}
/**
* @desc reject SDP offer by setting media ports to 0
*
*/
function f_reject_SDP_offer() runs on SipComponent
{
var integer mn, i;
f_copy_SDP(); // TO BE DONE with more details!
//increase session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
// if more than one codec, select the firs one
mn:= sizeof(vc_sdp_local.media_list);
for (i :=0; i < mn; i := i+1)
{
vc_sdp_local.media_list[i].media_field.ports := {0, omit};
vc_sdp_local.media_list[i].attributes := omit; //{};
};
}
* @desc copies SDP message elements from remote to local component variable:
* - bandwidth
* - session version (will be incremented)
* - media list
* modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
* @param p_medianum list position number of the media (if value 0 identifies first media list element)
* @param p_direction the new direction attribute to be included in the media entry
function f_SIP_modMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
{
var boolean v_set_direction; // flag indicates if direction attribute has been modified
var integer v_mn := 0; // length of media list (number of entries)
var integer v_cn := 0; // number of attributes of a media entry
var integer i, j, k := 0;
var SDP_attribute_list v_mediaAttributes := {}; // collect the media attributes (to be assigned at end of function)
f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
// increment session version
vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
// if more than one codec, select the first one
v_mn:= sizeof(vc_sdp_local.media_list);
if (p_medianum == 0) //specific media requested
{
p_medianum := 1; // start checking from first media
};
if (p_medianum > 0) //specific media requested
{
if (not(p_medianum > v_mn))
{v_mn := p_medianum}
};
// handling of media list elements
for (i :=0; i < v_mn; i := i+1)
{
v_cn := 0; // initialize the number of attributes of the media list entry
if (ispresent(vc_sdp_local.media_list)) //media_list is optional
{
// log("vc_sdp_local.media_list[i] ",vc_sdp_local.media_list[i]);
if (ispresent(vc_sdp_local.media_list[i].attributes))
{
v_cn := sizeof(vc_sdp_local.media_list[i].attributes);
};
v_set_direction := false;
//if (sizeof(vc_sdp_local.media_list[i].media_field.fmts)>1)
// select the first one
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
for (j :=0; j<v_cn; j:=j+1)
{
if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly)
or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly)
or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive)
or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv))
{
v_mediaAttributes[k] := valueof(p_direction);
v_set_direction := true;
}
else // non-direction attributes will be copied
{
v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
k := k+1;
}
}
if (not v_set_direction)
{ v_mediaAttributes[k] := valueof(p_direction)};
vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
}
// add handling of prenegotiation, change ports if required etc.
//if prenegotiation...
}
/**
* @desc modify session and media attributes direction
*
*/
function f_SIP_modSessionDirection(template SDP_attribute p_direction) runs on SipComponent
{
var integer v_mn:= 0, i:=0;
if (ispresent(vc_sdp_local.attributes))
{ v_mn:= sizeof(vc_sdp_local.attributes);
for (i :=0; i < v_mn; i := i+1)
{//for every single attribute (that is not omit)
if (ischosen(vc_sdp_local.attributes[i].recvonly)
or ischosen(vc_sdp_local.attributes[i].sendonly)
or ischosen(vc_sdp_local.attributes[i].inactive)
or ischosen(vc_sdp_local.attributes[i].sendrecv))
{
vc_sdp_local.attributes[i] := valueof(p_direction);
v_set_direction := true;
}
}
if (not v_set_direction) // if not sent before
{
vc_sdp_local.attributes[v_mn] := valueof(p_direction);
};
}
else
{vc_sdp_local.attributes[0] := valueof(p_direction)};
}
/**
* @desc c
*
*/
/*
*
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
log(vc_request.messageBody.sdpMessageBody);log(p_direction_in);
if (not (ispresent(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
)))
{log("than branch of if");
if (
match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
not(f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
}
else {setverdict(fail);};}
else {setverdict(pass);log("attribute found in message body");};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session/media attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
log(vc_response.messageBody.sdpMessageBody);log(p_direction_in);
if (not (ispresent(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
)))
{log("than branch of if");
if (
match(valueof(p_direction_in),valueof(mw_attribute_sendrecv)) and
not(f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
}
else {setverdict(fail);};}
else {setverdict(pass);log("attribute found in message body");};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checksetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (ispresent(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in)
)))
{if (
match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
not(f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_session_attribute(vc_request.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
}
else {setverdict(fail);};};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
/*
*
* @desc check (from remote) and set (local) the session attribute lines on directions
* @param p_direction_in incoming SDP attribute that need to be checked
* @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
* @return
* @verdict
*/
function f_SIP_checkResponsesetSDPreqDirectionSession(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
{ var template SDP_attribute v_direction_out := p_direction_out;
// check incoming SDP attribute
if (not (ispresent(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)
)))
{if (
match(valueof(mw_attribute_sendrecv),valueof(p_direction_in)) and
not(f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendrecv) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_sendonly) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_recvonly) or
f_check_session_attribute(vc_response.messageBody.sdpMessageBody,mw_attribute_inactive)
)
){
log("no direction attributes with expectation: ", p_direction_in)
}
else {setverdict(fail);};};
if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
{v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);}
f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
}
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
/*
*
* @desc check (from remote) and set (local)the session/media attribute lines on directions
* @param p_direction_in attribute to be check
* @param p_direction_out attrubyte to be
* @return
* @verdict
*/
function f_SIP_checkSDPrespDirection(template SDP_attribute p_direction_in) runs on SipComponent
{
// check incoming SDP attribute
if (not (ispresent(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in)))
{setverdict(fail);};
}
/**
* @desc check media/attribute lines from remote
*
*/
function f_SIP_checkMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
return boolean
{
var integer v_mn, v_cn := 0, i, j;
var boolean v_result := false;
//increase session version
vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
// if more than one codec, select the firs one
v_mn:= sizeof(vc_sdp_remote.media_list);
if (p_medianum == 0) //specific media requested
{
p_medianum := 1; // start checking from first media
};
if (p_medianum > 0) //specific media requested
{
if (p_medianum > v_mn) {return false}
else {v_mn := p_medianum}
};
for (i :=p_medianum-1; i < v_mn; i := i+1)
{
//for every single media
if (ispresent(vc_sdp_remote.media_list[i].attributes))
{
v_cn := sizeof(vc_sdp_remote.media_list[i].attributes);
log (v_cn);
};
if (sizeof(vc_sdp_remote.media_list[i].attributes)>0)
{
// select the first one
log(vc_sdp_remote.media_list[i].attributes);
for (j :=0; j<sizeof(vc_sdp_remote.media_list[i].attributes); j:=j+1)
{
log(vc_sdp_remote.media_list[i].attributes[j]);
if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive)
or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv))
{
if (match(vc_sdp_remote.media_list[i].attributes[j],p_direction))
{ v_result := true; }
else { return false; }
}
//v_result := true; // TODO This is a shortcut since direction attributes are not decoded
}
}
}
return v_result
}
/**
* @desc copy media/attribute lines from remote to local SDP variable
*
*/
function f_copy_SDP() runs on SipComponent
if (ispresent(vc_sdp_remote.connection))
{vc_sdp_local.connection := vc_sdp_remote.connection}
else {vc_sdp_local.connection := omit};
vc_sdp_local.origin := vc_sdp_remote.origin;
vc_sdp_local.session_name := vc_sdp_remote.session_name;
if (ispresent(vc_sdp_remote.bandwidth))
{vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth}
else {vc_sdp_local.bandwidth := {}};
if (ispresent(vc_sdp_remote.media_list))
{
// // cleaning of media before assignment
// if (ispresent(vc_sdp_local.media_list))
// {
// for (var integer i:=0; i<sizeof(vc_sdp_local.media_list); i:=i+1)
// {
// vc_sdp_local.media_list[i] := omit ;
// }
// };
vc_sdp_local.media_list := vc_sdp_remote.media_list;
}
}
}//end group SDPOperations
group AwaitingMessage {
/**
*
* @desc Function for time delay
*/
function f_awaitingDelayTimer(float p_delay) runs on SipComponent
{
tc_tDelay.start(p_delay);
alt
{
[] tc_tDelay.timeout
{
setverdict (pass);
}
}
} //end f_awaitingDelayTimer
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
/**
*
* @desc Function waiting for any MSG -request/response
*/
function f_awaitingAnyPassOnTimeout() runs on SipComponent
{
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive //TAU error if expect (*)
{
tc_wait.stop;
vc_boo_response:=true;
vc_boo_request:=true;
//setverdict(pass)
}
[] tc_wait.timeout
{
vc_boo_response:=false;
vc_boo_request:=false;
//setverdict (pass)
}
}
} //end f_awaitingResponsePassOnTimeout
/**
*
* @desc Function waiting for no MSG -request/response
*/
function f_awaitingNonePassOnTimeout() runs on SipComponent
{
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] tc_wait.timeout
{
setverdict (pass);
}
}
} //end f_awaitingResponsePassOnTimeout
/**
*
* @desc function awaits REGISTER
* @param p_register expected REGISTER request
*/
function f_awaitingREGISTER(in template REGISTER_Request p_register) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_register)-> value v_request sender vc_sent_label
{
f_setHeadersOnReceiptOfREGISTER(v_request);
}
{
setverdict (fail);
}
}
/**
*
* @desc function awaits SUBSCRIBE
* @param p_register expected SUBSCRIBE request
*/
function f_awaitingSUBSCRIBE(in template SUBSCRIBE_Request p_subscribe) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
[] SIPP.receive(p_subscribe)-> value v_request sender vc_sent_label
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
}
[] SIPP.receive(mw_SUBSCRIBE_Request_Base)-> value v_request sender vc_sent_label
{
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
//f_send200OK();
}
*
* @desc function awaits REGISTER and sends a 200 OK response
* @param p_reply flag used to avoid the 200OK response sending
*/
function f_awaitingREGISTER_sendReply(in template REGISTER_Request p_register, in boolean p_reply) runs on SipComponent
{
var Request v_request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[] SIPP.receive(p_register)-> value v_request sender vc_sent_label
{
vc_request := v_request;
f_setHeadersOnReceiptOfREGISTER(v_request);
//Answer to the Request
if (p_reply) {f_send200OK();};
}
{
setverdict (fail);
}
}
/**
*
* @desc Function waiting for a 200 OK response
* @param p_cSeq_s current cSeq expectation
*/
function f_awaitingOkResponse(inout CSeq p_cSeq_s) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
setverdict(pass)
}
} //end awaitingOkResponse
/**
*
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponse(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (p_Response) -> value vc_response
{
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
}
}
} //end f_awaitingResponse
/**
*
* @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
* @param p_Response expected response message
*/
function f_awaitingResponseSendACK(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
LibSip_Steps.f_setHeadersACK();
f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
setverdict(pass);
} //end f_awaitingResponse
/**
*
* @desc Function waiting for a response
* @param p_Response expected response message
*/
function f_awaitingResponsePassOnTimeout(in template Response p_Response) runs on SipComponent
{
tc_resp.start(PX_SIP_TRESP);
alt
{
[] SIPP.receive (p_Response) -> value vc_response
{
f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
vc_boo_response:=true;
//setverdict(pass)
}
{
vc_boo_response:=false;
//setverdict (pass)
}
}
} //end f_awaitingResponsePassOnTimeout
/**
* @desc await INFO request
* reply with 200 OK
*/
function f_awaitingINFO_sendReply(in template INFO_Request p_info) runs on SipComponent
var INFO_Request v_request;
tc_wait.start(PX_SIP_TWAIT);
[] SIPP.receive(p_info)-> value v_request sender vc_sent_label
tc_wait.stop;
f_setHeadersOnReceiptOfRequest(v_request);
//Answer to the INFO
f_send200OK();
}
}
} // end of f_awaitingINFO_sendReply
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[vc_interface_isc]SIPP.receive (mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
setverdict(fail);
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
//clear session - send 486 and await ACK
f_sendResponse(m_Response_Base(c_statusLine486,vc_callId,vc_cSeq,vc_caller_From,vc_caller_To,vc_via));
f_awaitingACK(mw_ACK_Request_Base(?));
//await 486 which go towards and send ACK
f_awaitingResponse(mw_Response_Base(c_statusLine486,?,?));
f_SendACK(m_ACK_Request_Base(vc_requestUri,vc_callId,vc_cSeq,vc_from,vc_to,vc_via));
syncPort.send(m_syncClientStop);
stop
}
} //end f_awaitingINVITE
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
/**
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_No100Response(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
//SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
}
} //end f_awaitingInviteRequest
/**
*
* @desc function awaiting for an incoming INVITE
* @param p_request expected message
*/
function f_awaitingINVITE_PassOnTimeout(template INVITE_Request p_request) runs on SipComponent
{
var INVITE_Request v_INVITE_Request;
tc_wait.start(PX_SIP_TWAIT);
alt
{
[]SIPP.receive (p_request) -> value v_INVITE_Request sender vc_sent_label
{
tc_wait.stop;
vc_ignore_invite := true;
vc_first_recv:= true; // communication has started
vc_boo_request := true;
f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
}
[]tc_wait.timeout
{
vc_boo_request := false;
}
}
} //end f_awaitingInviteRequest
/**