Hi Saúl,
On Aug 17, 2011, at 3:32 AM, Saúl Ibarra Corretgé wrote:
>
> On Aug 16, 2011, at 3:14 PM, Jeff Pyle wrote:
>
>> Hi Saúl,
>>
>> Correct, no SDP mangling functions in this proxy. But in other proxies
>> where I use engage_media_relay() I do have this:
>>
>> # Mangle the origin if the B2B is in use
>> if (is_dlg_flag_set("24") && search("Content-Type:
>> application/sdp")) {
>> subst_body('/^o=(.*) IN IP4 .*/o=\1 IN IP4
>> 127.0.0.1/');
>> }
>>
>> This overwrites the origin line of the SDP with 127.0.0.1 in the event I'm
>> using the B2B topology hiding scenario upstream (dialog flag 24). It seems
>> to work pretty well, and to the best of my knowledge I've never had a
>> conflict with Mediaproxy.
>>
>> Back to this proxy, to the issue at hand. Here's what we've got: The LCR
>> engine runs and loads a carrier list. A request_route section loads the
>> prefs for the carrier and verifies it's viability. Once we find a viable
>> one, we finish up with this portion of the script:
>>
>> if ([ $avp(s:car_flags) & 128 ] && !isflagset(27)) {
>> #_#xlog("L_INFO", "Using media proxy on call to $rd - $ci\n");
>> set_dlg_flag("26");
>> use_media_proxy();
>> }
>>
>> if (![ $avp(s:car_flags) & 128 ] && is_dlg_flag_set("26")) {
>> #_#xlog("L_INFO", "Ending media session on call to $rd -
>> $ci\n");
>> reset_dlg_flag("26");
>> end_media_session();
>> }
>>
>> if !(t_relay("0x05")) {
>> sl_reply_error();
>> }
>>
>> The 128-bit of the AVP is the carrier flag indicating a media relay
>> requirement. Script flag 27 is set further up in the script by a check for
>> a custom header indicating a previous proxy in the signal flow has already
>> invoked a media relay, so we don't need to here. I use dialog flag 26 to
>> indicate whether the media relay has been called or not, checking for its
>> presence in stanzas like this in the onreply_route:
>>
>> if (is_dlg_flag_set("26") && has_body("application/sdp")) {
>> #_#xlog("L_INFO", "Using media proxy in onreply_route -
>> $ci\n");
>> use_media_proxy();
>> }
>>
>> Prior to the script above the onreply_route and failure_route are armed.
>> The failure route will send the transaction back up to the request_route
>> that loads the carrier info if certain response codes are received, like a
>> 503, ultimately reaching this script again on the way out the door towards
>> the next carrier. This is the only place the media functions appear in the
>> request_route. There are no media functions in the failure_routes.
>> onreply_route and loose_route have items such as the one above.
>>
>> If the first attempted carrier destination has the media relay 128 bit set,
>> the call fails and is sent back around for the next carrier and this next
>> carrier also has it set, the top stanza above will run again (intentionally)
>> to refresh the media session. If I do not re-run use_media_relay() on
>> subsequent attempts requiring the relay, I get one-way audio. Not ending
>> the session is not enough. In my testing it seems I have to re-run the
>> function each time I run through the script to send to the next carrier,
>> assuming this next carrier needs media relay. If the next carrier does not,
>> the second stanza hits and we close down the media session we've started
>> during the first iteration.
>>
>
> How do you jump from the failure route back to the request route? route(X) or
> are you t_relay-ing to yourself? I don't remember right now exactly to which
> message changes would be applied if you do stuff on the failure route.
With a route[x] statement. I had some of these functions occurring at the
failure route, but I had the same issues. I tried to simply things by having
everything happen at the same place, in this case, in the request_route just
prior to the t_relay out to the carrier.
>> Everything above works okay in testing. It's only in production do I start
>> to see a small percentage of 400s and 488s coming back from the term
>> carriers because of the mangled SDP lines. I can take the call flow of one
>> of the failed calls, duplicate it, and it will work fine. That leads me to
>> believe there's some sort of timing issue at work here causing the
>> unintended SDP manglage even though I'm running only one of these functions
>> at a time.
>>
>> Does anything jump out at you?
>>
>
> Since the routing script will be executed top to bottom, I don't see how
> timing could be an issue here :-S Sorry I can't be of much help here, if
> something comes to ming I'll come back to you.
My thought on timing was items not being updated between Opensips processes, or
perhaps within the dispatcher itself. I have a fresh 400 example in front of
me where the first carrier attempt required media relay, returned a 503, so we
looped around to the second carrier attempt, also requiring a media relay. If
that execution of use_media_relay caused another session to be generated
somewhere, instead of updating the original one from the previous carrier
attempt, I can see where it might cause this symptom where it appears the
function was called twice. Or am I barking up the wrong tree?
- Jeff
>
> Regards,
>
> --
> Saúl Ibarra Corretgé
> AG Projects
>
>
>
>
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users