Our evaluation of Android Gingerbread's native SIP calling with the Nexus S

This post is now outdated. Please check out our follow-up to this: Android SIP update, published 05/11/11.

About a month ago, I wrote a blog post Google announces native SIP internet calling with Gingerbread. We were excited to see the announcement, but I couldn't suppress my inner skeptic when I read that support for the platform's SIP and internet calling features on devices would be determined by manufacturers and associated carriers.

We got our hands on the Nexus S, and here are some of our initial thoughts on Google's native mobile internet calling:
To make an internet call, you must first have contacts with SIP addresses because the native dialer only allows you to input 10 digit numbers. The Nexus S also does not allow you to do transfers when you're on an internet call. You can have 2 calls up at once, switch between them, and merge them; but, the transfer function is nowhere to be found. I also found that if you have simultaneous internet calls going, and you hang up on one of them, the other call hangs up soon after.

We decided to run the native SIP client on the Nexus S through a full lab test, and here's what we found... This gets a bit technical: In summary, Android 2.3 provides basic SIP functionality, but does not yet implement enough SIP features to support interoperability with OnSIP. The four main issues for OnSIP interoperability are as follows:

  1. The auth user name is not configurable, which is required for registration.
  2. Proxy authentication is not supported, which is required for calls to the PSTN.
  3. SIP Replaces header is not supported, which is required for attended transfers.
  4. INVITES without SDP are not supported, which is required for music on hold.

1) SIP Authentication username not configurable - RFC 3261 Section 22.1

The Android 2.3 supplants the authorization user name with the AOR username. This means that only users who have the same authentication and AOR usernames will register with OnSIP. The inability to configure an authentication username is extremely limiting and is effectively incompatible with OnSIP.

View the trace [click again to close]

2) SIP Proxy-to-User Authentication - RFC 3261 Section 22.3

When Android 2.3 receives the 407 Proxy Authentication Required, it should, if it is able, re-originate the request with the proper credentials. It does not. As OnSIP utilizes this method, services that require authentication (e.g. calling the PSTN) do not work.

We use the authentication request to determine whom to bill. Blocking outbound calls to the PSTN may be an intentional move by Google as it makes it more difficult, although not much more difficult, for people to circumvent cell phone carriers and cut them out of the money loop entirely. If you do not want cell phone carriers' getting any of your money on outbound PSTN calls, there are always downloadable SIP clients, like Bria.

View the trace

3) SIP “Replaces” header not supported - RFC 3891

Android 2.3 does not support the SIP Replaces header. Because OnSIP utilizes this header during attended transfers, Android 2.3 cannot function as the target of attended transfers. Instead, the native app treats the transferee’s call as an additional call. Support for the Replaces header is not a core SIP requirement, but it is a requirement for OnSIP to support attended transfers.

View the trace

4) Rejecting INVITE without session offer - RFC 3261 Section 13.3.1.3

Android 2.3 rejects re-invites when the INVITE does not contain the Session Description Protocol, or SDP. OnSIP Music on Hold utilizes this functionality. In the following SIP trace, a Polycom 550 attempts to place Android 2.3 on hold (where we re-invited for our Hold Music) and Android 2.3 rejects the call with a 486 Busy Here.

View the trace

So what have we learned today? Native SIP support in Android 2.3 in its current form is fine if you just want to make/receive SIP calls. Additional features for business users will require some updates to the software.