Call Advertising Architecture - ReVisited

56 views
Skip to first unread message

soulkitchen

unread,
Nov 1, 2010, 7:48:18 PM11/1/10
to mobicents-public
Hello all,

I have been trying to implement a call advertising example, and from
previous discussions on the group, I decided to try an Early Media
solution. However, my attempts were unsuccessful. Basically, I still
cannot make out at which points exactly I should start the RTP and
media sessions. I am still a newbie in SIP and MGCP, and I cannot find
any enlightening resources on the net, so all I can do is try to mimic
mobicents JSR 309 examples. But I was not successful upto now.
Basically, I am trying to modify the JSR 309 Media application. The
scenario is like this;

- Bob makes a call to Alice(INVITE), using Mobicents as the outbound
proxy.
- Mobicents server plays an announcement to Bob, if he presses 1, he
will listen to an advertisement and then Alice will be called. If he
presses 0, he can skip the advertisement and Alice will be called
directly.

There are 3 main stages in the JSR 309 example as far as I can see,

- Upon receiving the invite request, the example creates a new media
session, creates the network connection, and processes the SDP offer
of the UAC. Also, it sends an OK response to UAC upon an
SDPPortManager success event, sending the SDP offer of the Media
server.
- Upon receiving the ACK from UAC, it joins the media gateway and the
RTP session is ready to play announcements and DTMF events.

For an early media case, I am trying to implement the same scenario,
but changing the signalling steps a bit.. The steps I tried was like
the following;

- Upon receiving the invite, I tried sending SC_RINGING, then create
media session,create network connection, process SDP offer of the
UAC.
- Then upon receiving SDPPortManager success event, try to send a 183
to UAC, including the SDP offer of Media server.
- Wait a PRACK from UAC, and upon receiving it, send an OK to UAC, and
try to join the media gateway.


INVITE:
SipServletResponse sipServletResponse =
request.createResponse(SipServletResponse.SC_RINGING);
sipServletResponse.send();
MsControlFactory msControlFactory =
(MsControlFactory)getServletContext().getAttribute(Constants.MS_CONTROL_FACTORY);
// Create new media session and store in SipSession
MediaSession mediaSession =
(MediaSession)msControlFactory.createMediaSession();
sipSession.setAttribute("MEDIA_SESSION", mediaSession);
mediaSession.setAttribute("SIP_SESSION", sipSession);
// Store INVITE so it can be responded to later
sipSession.setAttribute("UNANSWERED_INVITE", request);
// Create a new NetworkConnection and store in SipSession
NetworkConnection conn =
mediaSession.createNetworkConnection(NetworkConnection.BASIC);
SdpPortManager sdpManag = conn.getSdpPortManager();
NetworkConnectionListener ncListener = new
NetworkConnectionListener();
sdpManag.addListener(ncListener);
byte[] sdpOffer = request.getRawContent();
sdpManag.processSdpOffer(sdpOffer);
............

Network Connection Listener onEvent method:

public void onEvent(SdpPortManagerEvent event) {
SdpPortManager sdpManager = event.getSource();
NetworkConnection conn = sdpManager.getContainer();
MediaSession mediaSession = event.getSource().getMediaSession();
SipSession sipSession =
(SipSession)mediaSession.getAttribute("SIP_SESSION");
SipServletRequest inv =
(SipServletRequest)sipSession.getAttribute("UNANSWERED_INVITE");
if(event.isSuccessful()) {
SipServletResponse resp =
inv.createResponse(SipServletResponse.SC_SESSION_PROGRESS);
try {
byte[] sdp = event.getMediaServerSdp();
resp.setContent(sdp, "application/sdp");
// Send Session Progress Response 183
resp.send();
if (logger.isDebugEnabled()) {
logger.debug("Sent OK Response for INVITE");
}
sipSession.setAttribute("NETWORK_CONNECTION", conn);
..........

PRACK:
SipServletResponse resp =
req.createResponse(SipServletResponse.SC_OK);
resp.send();
SipSession sipSession = req.getSession();
MediaSession ms =
(MediaSession)sipSession.getAttribute("MEDIA_SESSION");
try {
MediaGroup mg =
ms.createMediaGroup(MediaGroup.PLAYER_SIGNALDETECTOR);
mg.addListener(new MyJoinEventListener(getPrompter(), sipSession));
NetworkConnection nc =
(NetworkConnection)sipSession.getAttribute("NETWORK_CONNECTION");
mg.joinInitiate(Direction.DUPLEX, nc, this);
sipSession.setAttribute("MediaGroup", mg);

.....

I tried the implementation with X-Lite, without success, but it seems
X-Lite does not support early media.. So, I tried another client
(MizuPhone), but I also failed..


CDATA[INVITE sip:al...@127.0.0.1 SIP/2.0
Via: SIP/2.0/UDP
10.32.182.17:22871;rport=22871;branch=z9hG4bK-92570808820f-27005080;received=127.0.0.1
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
To: <sip:al...@127.0.0.1>
Max-Forwards: 70
Call-ID: xr22271241916c15...@127.0.0.1
Sy.Device: C4283845849
Sy.LoginName: soulkitchen
Sy.NetType: pr
CSeq: 15807 INVITE
Contact: <sip:b...@10.32.182.17:22871>
Allow:
INVITE,REGISTER,UPDATE,OPTIONS,PING,BYE,CANCEL,ACK,PRACK,COMET,REFER,MESSAGE,SUBSCRIBE,NOTIFY,PUBLISH,INFO,DO,SHAREDFN
Allow-Events: presence,refer,telephone-event,keep-alive,message-
summary,dialog
Supported: privacy,replaces,mizutech
Accept: application/sdp,application/dtmf-relay,audio/telephone-
event,message/sipfrag,text/plain,text/html
User-Agent: MizuPhone/2.1.0
FinalUA: MizuPhone
Sy.AddrList: 127.0.0.1:22871
Expires: 130
Content-Type: application/sdp
Content-Length: 536

v=0
o=bob 3 4 IN IP4 10.32.182.17
s=Mizu
c=IN IP4 10.32.182.17
t=0 0
m=audio 30755 RTP/AVP 106 105 18 0 8 97 104 4 101
a=rtpmap:106 speex/32000
a=fmtp:106 mode=8;mode=any
a=rtpmap:105 speex/16000
a=fmtp:105 mode=8;mode=any
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:104 speex/8000
a=fmtp:104 mode=3;mode=any
a=rtpmap:4 G7231/8000
a=fmtp:4 bitrate=6.3;annexa=yes
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv


CDATA[SIP/2.0 180 Ringing
To:
<sip:al...@127.0.0.1>;tag=71318696_2bc520d1_848e6d13-396a-4573-8d0f-5a359afce2cd
Via: SIP/2.0/UDP
10.32.182.17:22871;rport=22871;branch=z9hG4bK-92570808820f-27005080;received=127.0.0.1
CSeq: 15807 INVITE
Call-ID: xr22271241916c15...@127.0.0.1
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Length: 0


CDATA[SIP/2.0 488 Not Acceptable here
To:
<sip:al...@127.0.0.1>;tag=71318696_2bc520d1_848e6d13-396a-4573-8d0f-5a359afce2cd
Via: SIP/2.0/UDP
10.32.182.17:22871;rport=22871;branch=z9hG4bK-92570808820f-27005080;received=127.0.0.1
CSeq: 15807 INVITE
Call-ID: xr22271241916c15...@127.0.0.1
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Length: 0

ACK sip:127.0.0.1:5080 SIP/2.0
Via: SIP/2.0/UDP
10.32.182.17:22871;branch=z9hG4bK-92570808820f-27005080;received=127.0.0.1
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
To:
<sip:al...@127.0.0.1>;tag=71318696_2bc520d1_848e6d13-396a-4573-8d0f-5a359afce2cd
Max-Forwards: 70
Call-ID: xr22271241916c15...@127.0.0.1
CSeq: 15807 ACK
User-Agent: MizuPhone/2.1.0
FinalUA: MizuPhone
Content-Length: 0

As I can see from the logs, something does not go well, when I try to
send the SC-RINGING response.. My Network connection listener receives
a SdpPortManagerEvent.SDP_NOT_ACCEPTABLE event instead of a success
event. On the media server I see

01:39:35,762 ERROR [CreateConnectionAction] Could not apply remote
descriptor
java.net.SocketException: Network is unreachable: connect
at sun.nio.ch.Net.connect(Native Method)
at
sun.nio.ch.DatagramChannelImpl.connect(DatagramChannelImpl.java:530)
at
org.mobicents.media.server.impl.rtp.RtpSocketImpl.setPeer(RtpSocketImpl.java:
414)
at
org.mobicents.media.server.RtpConnectionImpl.setRemoteDescriptor(RtpConnectionImpl.java:
361)
at
org.mobicents.media.server.ctrl.mgcp.CreateConnectionAction.createRtpConnection(CreateConnectionAction.java:
121)
at
org.mobicents.media.server.ctrl.mgcp.CreateConnectionAction.call(CreateConnectionAction.java:
413)
at
org.mobicents.media.server.ctrl.mgcp.CreateConnectionAction.call(CreateConnectionAction.java:
42)
at
org.mobicents.media.server.ctrl.mgcp.MgcpController.processMgcpCommandEvent(MgcpController.java:
221)
.........

At this point, I am completely stuck.. Can somebody tell me what I am
doing wrong?

Thanks in advance,

Regards,

Fatih

Vladimir Ralev

unread,
Nov 1, 2010, 8:15:50 PM11/1/10
to mobicent...@googlegroups.com
You phone advertises a prive IP address 10.32.182.17 and the media server tries to send packets there.

The only possible reason for netwrok unreachable error is that the media server machine doesn't have any routes to this private network 10.32.182.x

You may be able to fix this by configuring your phone to advertise itself with reachable address.

Also you might try to avoid using 127.0.0.1 for the same reason.

Fatih Algan

unread,
Nov 1, 2010, 8:20:26 PM11/1/10
to mobicent...@googlegroups.com
Ooops, I really did not see that between all the logs, how stupid of me.. I'll try to take care of this issue. However, what do you think of the rest of the implementation? Does it seem to be correct at first sight at least?

Regards,

Fatih

2010/11/2 Vladimir Ralev <vladimi...@gmail.com>

Fatih Algan

unread,
Nov 2, 2010, 3:44:47 PM11/2/10
to mobicent...@googlegroups.com
Hi All,

OK.. I got the IP bind address issue fixed, and retried the scenario again. Unfortunately, after sending the 183 response, the UA does not respond me with a PRACK. Instead it remains locked in the RINGING state..

INVITE sip:al...@127.0.0.1 SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055820cf-27005080
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Max-Forwards: 70
Sy.Device: C4220837533
Sy.LoginName: soulkitchen
Sy.NetType: pr
CSeq: 26819 INVITE
Allow: INVITE,REGISTER,UPDATE,OPTIONS,PING,BYE,CANCEL,ACK,PRACK,COMET,REFER,MESSAGE,SUBSCRIBE,NOTIFY,PUBLISH,INFO,DO,SHAREDFN
Allow-Events: presence,refer,telephone-event,keep-alive,message-summary,dialog
Supported: privacy,replaces,mizutech
Accept: application/sdp,application/dtmf-relay,audio/telephone-event,message/sipfrag,text/plain,text/html
User-Agent: MizuPhone/2.1.0
FinalUA: MizuPhone
Sy.AddrList: 127.0.0.1:22871
Expires: 130
Content-Type: application/sdp
Content-Length: 530

v=0
o=bob 3 4 IN IP4 127.0.0.1
s=Mizu
c=IN IP4 127.0.0.1
t=0 0
m=audio 30755 RTP/AVP 106 105 18 0 8 97 104 4 101
a=rtpmap:106 speex/32000
a=fmtp:106 mode=8;mode=any
a=rtpmap:105 speex/16000
a=fmtp:105 mode=8;mode=any
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:104 speex/8000
a=fmtp:104 mode=3;mode=any
a=rtpmap:4 G7231/8000
a=fmtp:4 bitrate=6.3;annexa=yes
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv


CDATA[SIP/2.0 180 Ringing
To: <sip:al...@127.0.0.1>;tag=74500755_2bc520d1_2a4d9f79-ee86-40df-8336-92741593c820
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055820cf-27005080
CSeq: 26819 INVITE
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Length: 0


SIP/2.0 183 Session progress
To: <sip:al...@127.0.0.1>;tag=74500755_2bc520d1_2a4d9f79-ee86-40df-8336-92741593c820
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055820cf-27005080
CSeq: 26819 INVITE
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Type: application/sdp
Content-Length: 233

v=0
o=- 1403447 1403447 IN IP4 127.0.0.1
s=Mobicents Media Server
c=IN IP4 127.0.0.1
t=0 0
m=audio 1286 RTP/AVP 0 101
a=rtpmap:0 pcmu/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=control:audio
a=silenceSupp:off

The media server logs only show the following info:
21:34:33,271 INFO  [CreateConnectionAction] Response TX = 168839177, Response: 200 The requested transaction was executed normally.

At this point, I am stuck again. I cannot make out if the failure is due to the MizuPhone UA or it is because I am doing something wrong. Does anybody have any comments to help me understand what is going on?

Regards,

Fatih


2010/11/2 Fatih Algan <fatih...@gmail.com>

Vladimir Ralev

unread,
Nov 2, 2010, 3:52:01 PM11/2/10
to mobicent...@googlegroups.com
After ringing your servlet must send SIP 200 OK. Then your phone must send ACK. PRACK should not be expected in this case as you dont have 100rel header. Post MSS logs if you are doing this already.

Fatih Algan

unread,
Nov 2, 2010, 4:12:42 PM11/2/10
to mobicent...@googlegroups.com
OK, I am a little bit lost here.. If I send a 200 OK response after ringing, then this will not be an early media session anymore. It will be a regular media session. What I would like to do is establishing an early media session with bob before the call from Bob to Alice is setup, play an advertisement to Bob, get some DTMF input from Bob, process it, and when I am finished with it allow Bob start the session with Alice by sending the initial invite request of Bob to Alice. Then Alice will respond with probably with 180 and 200 respectively.. 

The mss logs are listed below;

22:10:43,853 INFO  [nist] <message
time="1288728643626"
isSender="false" 
transactionId="z9hg4bk-13155568011f-27005080" 
callId="e1-16879853209c4603449e127001b0f" 
firstLine="REGISTER sip:localhost SIP/2.0" 
>
<![CDATA[REGISTER sip:localhost SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-13155568011f-27005080
From: "soulkitchen" <sip:bob@localhost>;tag=localhost
To: "soulkitchen" <sip:bob@localhost>
Max-Forwards: 70
Call-ID: e1-16879853209c4603449e127001b0f
Sy.Device: C4220837533
Sy.LoginName: soulkitchen
Credit: req
Sy.NetType: pr
CSeq: 26799 REGISTER
Allow: INVITE,REGISTER,UPDATE,OPTIONS,PING,BYE,CANCEL,ACK,PRACK,COMET,REFER,MESSAGE,SUBSCRIBE,NOTIFY,PUBLISH,INFO,DO,SHAREDFN
Allow-Events: presence,refer,telephone-event,keep-alive,message-summary,dialog
Supported: privacy,replaces,mizutech
Accept: application/sdp,application/dtmf-relay,audio/telephone-event,message/sipfrag,text/plain,text/html
User-Agent: MizuPhone/2.1.0
FinalUA: MizuPhone
Expires: 120
Event: registration
Content-Length: 0

]]>
</message>

22:10:43,930 INFO  [CallAdvertiserServlet] Received register request: "soulkitchen" <sip:bob@localhost>
22:10:43,940 INFO  [CallAdvertiserServlet] User sip:bob@localhost registered with an Expire time of 120
22:10:43,942 INFO  [nist] <message
time="1288728643941"
isSender="true" 
transactionId="z9hg4bk-13155568011f-27005080" 
callId="e1-16879853209c4603449e127001b0f" 
firstLine="SIP/2.0 200 OK" 
>
<![CDATA[SIP/2.0 200 OK
To: "soulkitchen" <sip:bob@localhost>;tag=20952622_2bc520d1_95419264-be7e-45a8-b805-89d16ac13d95
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-13155568011f-27005080
CSeq: 26799 REGISTER
Call-ID: e1-16879853209c4603449e127001b0f
From: "soulkitchen" <sip:bob@localhost>;tag=localhost
Content-Length: 0

]]>
</message>

22:10:43,942 INFO  [InitialRequestDispatcher] Request event dispatched to com.bridge.sip.CallAdvertisingApplication
22:10:48,888 INFO  [nist] <message
time="1288728648885"
isSender="false" 
transactionId="z9hg4bk-8103055520cf-27005080" 
firstLine="INVITE sip:al...@127.0.0.1 SIP/2.0" 
>
<![CDATA[INVITE sip:al...@127.0.0.1 SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055520cf-27005080
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Max-Forwards: 70
]]>
</message>

22:10:48,900 INFO  [CallAdvertiserServlet] CallAdvertiserServlet: Got request:
INVITE
22:10:48,908 INFO  [nist] <message
time="1288728648907"
isSender="true" 
transactionId="z9hg4bk-8103055520cf-27005080" 
firstLine="SIP/2.0 180 Ringing" 
>
<![CDATA[SIP/2.0 180 Ringing
To: <sip:al...@127.0.0.1>;tag=90954962_2bc520d1_3c72c29f-35ff-47ca-9e43-67a82977b322
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055520cf-27005080
CSeq: 26819 INVITE
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Length: 0

]]>
</message>

22:10:48,914 INFO  [InitialRequestDispatcher] Request event dispatched to com.bridge.sip.CallAdvertisingApplication
22:10:49,032 INFO  [nist] <message
time="1288728649017"
isSender="true" 
transactionId="z9hg4bk-8103055520cf-27005080" 
firstLine="SIP/2.0 183 Session progress" 
>
<![CDATA[SIP/2.0 183 Session progress
To: <sip:al...@127.0.0.1>;tag=90954962_2bc520d1_3c72c29f-35ff-47ca-9e43-67a82977b322
Via: SIP/2.0/UDP 127.0.0.1:22871;branch=z9hG4bK-8103055520cf-27005080
CSeq: 26819 INVITE
From: "soulkitchen" <sip:b...@127.0.0.1>;tag=127.0.0.1
Contact: <sip:127.0.0.1:5080>
Content-Type: application/sdp
Content-Length: 233

v=0
o=- 3579170 3579170 IN IP4 127.0.0.1
s=Mobicents Media Server
c=IN IP4 127.0.0.1
t=0 0
m=audio 1686 RTP/AVP 0 101
a=rtpmap:0 pcmu/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=control:audio
a=silenceSupp:off
]]>
</message>


2010/11/2 Vladimir Ralev <vladimi...@gmail.com>

Tom Smith

unread,
Nov 2, 2010, 5:33:43 PM11/2/10
to mobicent...@googlegroups.com
I don't think sending 183 will help you here, as the SDP in the 200
must match the SDP in the 183.

Tom Smith

unread,
Nov 2, 2010, 5:37:12 PM11/2/10
to mobicent...@googlegroups.com
Responding to my own post - I now realize that when using reliable
provisional responses, you may not have this restriction. Sorry for
posting before researching thoroughly.

Fatih Algan

unread,
Nov 2, 2010, 7:49:50 PM11/2/10
to mobicent...@googlegroups.com
Thanks Tom,

As far as I can understand, there is also a problem with the Sip client I am using. It does not send 100rel header during the initial invite. I am still a newbie in SIP but as far as I understand after a small google search, a UA that supports reliable provisional ACK should send this header. At this point I am also stuck. 

I switched back to another implementation which is much less elegant. Basically, I start a media session with Bob, and after the media session ends, I send a BYE to bob, initiate INVITE to Alice in a new Sip session, and upon receiving the OK from Alice, I place a second INVITE request to Bob.

If anybody has any ideas, please tell. I think this Early Media issue also could be a good contribution to Sip Servlet Examples of Mobicents.

Regards,

Fatih   

2010/11/2 Tom Smith <yot...@gmail.com>

Sachin Parnami

unread,
Nov 2, 2010, 11:38:38 PM11/2/10
to mobicent...@googlegroups.com
You are right, until unless INVITE's allow header conatins the 100rel, your user agent will not be able to respond to it.
Better to use SIPp in that case, to create you own scenario.

AFAIK, Kapanga sends 100rel.

Sending INVITE again (Re-INVITE) might be a work around but IMHO not a right approach, when you already have UPDATE to support early media session.

Regards,
Sachin Parnami

aayush

unread,
Nov 2, 2010, 11:56:26 PM11/2/10
to mobicent...@googlegroups.com

Without 100rel support,you can proceed like this:

1. When Bob calls Alice, create a conference with two participants..namely - Bob and the announcement/ADVT that you play.

2. Once you are done with the announcement or when Bob pushes some DTMF (whatever is the criteria)..send an invite to alice and make her join the conference.

3. Once alice joins..you also have the option to play mid call announcements and call pulse tones in the conversation.

On Nov 3, 2010 9:08 AM, "Sachin Parnami" <sachin...@gmail.com> wrote:

You are right, until unless INVITE's allow header conatins the 100rel, your user agent will not be able to respond to it.
Better to use SIPp in that case, to create you own scenario.

AFAIK, Kapanga sends 100rel.

Sending INVITE again (Re-INVITE) might be a work around but IMHO not a right approach, when you already have UPDATE to support early media session.

Regards,
Sachin Parnami






On Wed, Nov 3, 2010 at 5:19 AM, Fatih Algan <fatih...@gmail.com> wrote:
>
> Thanks Tom,
>

> ...

Sachin Parnami

unread,
Nov 3, 2010, 2:31:07 AM11/3/10
to mobicent...@googlegroups.com
@Aayush

How would charging aspect will be taken care in such scenario?

Regards,
Sachin Parnami

aayush

unread,
Nov 3, 2010, 6:14:13 AM11/3/10
to mobicent...@googlegroups.com

Charging triggers would go as expected. ACRs after the receipt of every 200 OK and if its prepaid then CCRs at the receipt/sending of every INVITE.

How those triggers have to be rated is a decision of the OFCS and the OCS.

On Nov 3, 2010 12:01 PM, "Sachin Parnami" <sachin...@gmail.com> wrote:

@Aayush

How would charging aspect will be taken care in such scenario?

Regards,
Sachin Parnami






On Wed, Nov 3, 2010 at 9:26 AM, aayush <abhatnag...@gmail.com> wrote:
>

> Without 100rel s...

Reply all
Reply to author
Forward
0 new messages