RestComm SIpServlet - Sip Servlet as Application Server in IMS network

605 Views Asked by At

I'm trying to develop an IMS application server using a RestComm SipServlet. Initially my aim is just to insert the AS in the call flow without doing anything special. enter image description here

The application Server has just to doStuff and forward initial invite. The problem is that the sip stack by RestComm does not remove the Route from the Invite addind it to the route header therefor the invite is routed to the AS again generating a loop. When I try to edit the SipRequest removing Route Header the AS answer with a 500 due to the fact that I can't modify system header.

Here a snippet of the code

    @Override
protected final void doInvite(SipServletRequest request)
        throws ServletException, IOException {

    //DO STUFF
    System.out.println("RECEIVED AN INVITE");

    //      These lines generate a 500
    //      request.removeHeader("route");
    //      request.removeHeader("route");

    ProxyImpl p = (ProxyImpl) request.getProxy(true);
    p.setRecordRoute(false);
    p.setSupervised(true);
    p.setParallel(true);
    p.proxyTo(request.getRequestURI());
    p.startProxy();

}

I'm going crazy :/ Hope someone can give me some suggestions...

3

There are 3 best solutions below

1
On

I am also new to Sip Servlets but when I was reading documentation I encountered on this info:

"A route modifier, which consists of one of the following strings: ROUTE, ROUTE_BACK or NO_ROUTE. The route modifier is used in conjunction with the route information to route a request externally." related to mobicents-dar.properties.

Maybe it helps.

0
On

Unlikely I am still struggling with the original problem. I have been inspecting on the hint Bartek gave to me. Unluckly the documentation is very poor and, probably I'm not understanding it completely. Anyway I will share my results manipulating dar properties file. Definitions are taken from the SipServlet Specification v1.1

ROUTE modifier indicates that SipApplicationRouterInfo.getRoutes() returns valid routes. It is up to the container to decide whether they are external or if an internal route was returned. All of the routes returned MUST be of the same type, so the container can make the determination by examining the first route only.

    2017-10-10 15:55:01,372 ERROR [SipApplicationDispatcherImpl] (pool-AffinityJAIN-thread-1) Unexpected exception while processing request 
    INVITE sip:[email protected] SIP/2.0
    Via: SIP/2.0/TCP 10.39.117.121:50302;rport=50302;branch=z9hG4bKPj921L-Q-IghWuH.rSX.uNoNMh9T7gZilB;received=10.39.117.121
    Via: SIP/2.0/TCP 10.39.117.93:6560;received=10.39.117.93;branch=z9hG4bK+aa78dad05a4a559d9e4635f37906172a1+sip+5+a64ded2b
    Route: <sip:[email protected];lr>
    Route: <sip:[email protected]:5054;lr;orig>
    Record-Route: <sip:sprout.dev.mydomain.sys:5054;transport=TCP;lr;service=scscf;billing-role=charge-orig>
    Record-Route: <sip:10.39.117.93:6560;lr>
    From: "itsme" <sip:[email protected]>;tag=10.39.117.93+5+2cdeefc2+8fc7709c
    To: <sip:[email protected]>
    CSeq: 1 INVITE
    Expires: 180
    Call-Info: <sip:10.39.117.93:6560>;method="NOTIFY;Event=telephone-event;Duration=2000"
    P-Charging-Function-Addresses: ccf=pri_ccf_address
    Supported: outbound,path,replaces
    P-Charging-Vector: icid-value="0be3bd9333dd5089baf80bf17225e3d6";orig-ioi=mydomain.net
    Contact: <sip:[email protected]:46973;transport=tcp;rinstance=e637627c20b12d87;ob>;+sip.instance="<urn:uuid:968fdfa1-95d3-59cb-acb3-403d721daeee>"
    P-Asserted-Identity: <sip:[email protected]>
    Max-Forwards: 68
    Call-ID: 0gQAAC8WAAACBAAALxYAAOYHyDdZmVO7ntMtj/[email protected]
    Allow: SUBSCRIBE,NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS
    User-Agent: X-Lite release 5.0.1 stamp 86895
    P-Visited-Network-ID: perim.dev.ims.ext1.net
    Accept: application/sdp,application/dtmf-relay
    Session-Expires: 600
    P-Served-User: <sip:[email protected]>;regstate=reg;sescase=orig
    Content-Type: application/sdp
    Content-Length: 281

    v=0
    o=- 14048926850737 14048926850737 IN IP4 10.39.117.93
    s=-
    c=IN IP4 10.39.117.93
    t=0 0
    m=audio 45234 RTP/AVP 120 0 101
    a=sendrecv
    a=rtpmap:120 opus/48000/2
    a=rtpmap:101 telephone-event/8000
    a=fmtp:120 useinbandfec=1; usedtx=1; maxaveragebitrate=64000
    a=fmtp:101 0-15

    org.mobicents.servlet.sip.core.DispatcherException: Impossible to parse the route returned by the application router into a compliant address
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:575)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.dispatchMessage(InitialRequestDispatcher.java:299)
            at org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl.processRequest(SipApplicationDispatcherImpl.java:927)
            at gov.nist.javax.sip.EventScanner.deliverRequestEvent(EventScanner.java:250)
            at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:146)
            at gov.nist.javax.sip.SipProviderImpl.handleEvent(SipProviderImpl.java:185)
            at gov.nist.javax.sip.DialogFilter.processRequest(DialogFilter.java:1328)
            at gov.nist.javax.sip.stack.SIPServerTransactionImpl.processRequest(SIPServerTransactionImpl.java:851)
            at gov.nist.javax.sip.stack.ConnectionOrientedMessageChannel.processMessage(ConnectionOrientedMessageChannel.java:473)
            at gov.nist.javax.sip.parser.NioPipelineParser$Dispatch.run(NioPipelineParser.java:132)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
            at gov.nist.javax.sip.MDCScheduledTHExecutor$MDCFuture.run(MDCScheduledTHExecutor.java:57)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    Caused by: java.text.ParseException: :Bad address spec
            at gov.nist.javax.sip.parser.Parser.createParseException(Parser.java:45)
            at gov.nist.javax.sip.parser.AddressParser.address(AddressParser.java:120)
            at gov.nist.javax.sip.parser.StringMsgParser.parseAddress(StringMsgParser.java:328)
            at gov.nist.javax.sip.address.AddressFactoryImpl.createAddress(AddressFactoryImpl.java:124)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:537)
    ... 17 more

I tryied also using the route field to point to the IMS node in order to forward back the SIP message. It works but I think that in this way the AS is not added in a Record-Route header and it cause a loop.

ROUTE_BACK directs the container to push its own route before pushing the external routes obtained from SipApplicationRouterInfo.getRoutes(). Application Router Behavior

In this case I have the following error and the AS answer with a 500.

    2017-10-10 15:52:57,276 ERROR [SipApplicationDispatcherImpl] (pool-AffinityJAIN-thread-14) Unexpected exception while processing request 
    INVITE sip:[email protected] SIP/2.0
    Via: SIP/2.0/TCP 10.39.117.121:43312;rport=43312;branch=z9hG4bKPj5IBDrImFUbO1J.J1LrwUcUQ-rsT28TRh;received=10.39.117.121
    Via: SIP/2.0/TCP 10.39.117.93:6560;received=10.39.117.93;branch=z9hG4bK+84bf75e3c2c4ccae314be5e5849bd4961+sip+3+a64ded21
    Route: <sip:[email protected];lr>
    Route: <sip:odi_kMFF/[email protected]:5054;lr;orig>
    Record-Route: <sip:sprout.dev.mydomain.sys:5054;transport=TCP;lr;service=scscf;billing-role=charge-orig>
    Record-Route: <sip:10.39.117.93:6560;lr>
    From: "Gennaro" <sip:[email protected]>;tag=10.39.117.93+3+7334eef2+84ee6a06
    To: <sip:[email protected]>
    CSeq: 1 INVITE
    Expires: 180
    Call-Info: <sip:10.39.117.93:6560>;method="NOTIFY;Event=telephone-event;Duration=2000"
    P-Charging-Function-Addresses: ccf=pri_ccf_address
    Supported: outbound,path,replaces
    P-Charging-Vector: icid-value="4167d34dd3fb232bb1f5fcf458dc1a9e";orig-ioi=mydomain.net
    Contact: <sip:[email protected]:46973;transport=tcp;rinstance=e637627c20b12d87;ob>;+sip.instance="<urn:uuid:968fdfa1-95d3-59cb-acb3-403d721daeee>"
    P-Asserted-Identity: <sip:[email protected]>
    Max-Forwards: 68
    Call-ID: 0gQAAC8WAAACBAAALxYAAK2OW7qCKhw2LAbw9q+UyCfK2Js5PtCkUUpQsljED2+H/[email protected]
    Allow: SUBSCRIBE,NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS
    User-Agent: X-Lite release 5.0.1 stamp 86895
    P-Visited-Network-ID: perim.dev.ims.ext1.net
    Accept: application/sdp,application/dtmf-relay
    Session-Expires: 600
    P-Served-User: <sip:[email protected]>;regstate=reg;sescase=orig
    Content-Type: application/sdp
    Content-Length: 281

    v=0
    o=- 76884298267467 76884298267467 IN IP4 10.39.117.93
    s=-
    c=IN IP4 10.39.117.93
    t=0 0
    m=audio 45230 RTP/AVP 120 0 101
    a=sendrecv
    a=rtpmap:120 opus/48000/2
    a=rtpmap:101 telephone-event/8000
    a=fmtp:120 useinbandfec=1; usedtx=1; maxaveragebitrate=64000
    a=fmtp:101 0-15

    java.lang.IllegalArgumentException: not allowed to set parameter, the URI is not modifiable
            at org.mobicents.servlet.sip.address.SipURIImpl.setParameter(SipURIImpl.java:401)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:591)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.dispatchMessage(InitialRequestDispatcher.java:299)
            at org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl.processRequest(SipApplicationDispatcherImpl.java:927)
            at gov.nist.javax.sip.EventScanner.deliverRequestEvent(EventScanner.java:250)
            at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:146)
            at gov.nist.javax.sip.SipProviderImpl.handleEvent(SipProviderImpl.java:185)
            at gov.nist.javax.sip.DialogFilter.processRequest(DialogFilter.java:1328)
            at gov.nist.javax.sip.stack.SIPServerTransactionImpl.processRequest(SIPServerTransactionImpl.java:851)
            at gov.nist.javax.sip.stack.ConnectionOrientedMessageChannel.processMessage(ConnectionOrientedMessageChannel.java:473)
            at gov.nist.javax.sip.parser.NioPipelineParser$Dispatch.run(NioPipelineParser.java:132)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
            at gov.nist.javax.sip.MDCScheduledTHExecutor$MDCFuture.run(MDCScheduledTHExecutor.java:57)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)

NO_ROUTE indicates that Application Router is not returning any routes and the SipApplicationRouterInfo.getRoutes() value, if any, should be disregarded.

In this case the request seems to stuck in the AS with no way to forward the request to the IMS node.

Hope this explain the situation. Thanks

0
On

The problem is that the application router does not recognize that the route is to itself, so it doesn't remove it. If you turn-on DEBUG level logging, you will see something like:

DEBUG [org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl] (Mobicents-SIP-Servlets-UDPMessageChannelThread-1) the triplet host/port/transport : tas.core.ims1.test/-1/UDP is external : true

Notice that it get resolves to external. Try adding a hostnames attribute to the SIP connector:

<subsystem xmlns="urn:org.mobicents:sip-servlets-as8:1.0" application-router="configuration/dars/mobicents-dar.properties" stack-properties="configuration/mss-sip-stack.properties" path-name="org.mobicents.ext" app-dispatcher-class="org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl" concurrency-control-mode="SipApplicationSession" congestion-control-interval="-1">
    <connector name="sip-udp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-udp" use-static-address="true" static-server-address="2345:470:eb88:150::23" hostnames="tas.core.ims1.test"/>
    <connector name="sip-tcp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-tcp" use-static-address="true" static-server-address="2345:470:eb88:150::23" hostnames="tas.core.ims1.test"/>
    ...
</subsystem>

Another option would be to use the hostname rather than the IP address in the static-server-address attribute:

<subsystem xmlns="urn:org.mobicents:sip-servlets-as8:1.0" application-router="configuration/dars/mobicents-dar.properties" stack-properties="configuration/mss-sip-stack.properties" path-name="org.mobicents.ext" app-dispatcher-class="org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl" concurrency-control-mode="SipApplicationSession" congestion-control-interval="-1">
    <connector name="sip-udp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-udp" use-static-address="true" static-server-address="tas.core.ims1.test"/>
    <connector name="sip-tcp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-tcp" use-static-address="true" static-server-address="tas.core.ims1.test"/>
    ...
</subsystem>

Checking the log again, you will notice that it now resolves to internal:

DEBUG [org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl] (Mobicents-SIP-Servlets-UDPMessageChannelThread-1) the triplet host/port/transport : tas.core.ims1.test/-1/UDP is external : false

It will also now pop-off the route to itself. In my case, if I print-out the popped route by calling SipServletRequest::getPoppedRoute(), I see:

Route: <sip:[email protected];lr>