Interop NY 2010 report

My coworker and I collaborated on a short report for our management to summarize our time in New York for Interop 2010. Not much VoIP here, but all the “cloud” talk makes me think we won’t be hosting IP PBXes on-premises for much longer. Cloud VoIP providers + highly tuned Internet connections + mobility will be the next thing.

Training

The full day of training, held on Tuesday the 19th, was Virtualization Management Day and covered a broad range of topics beginning with motivations to virtualize servers, storage, and network; strategy; and operations/management. VMware, which is the most widely deployed, was discussed the most, but other virtualization platforms received some discussion as well.

[Penn State’s Telecommunications and Networking Services (TNS)] may be ahead of the pack in terms of server virtualization: we have about 75% of our servers virtualized, whereas the average for most shops is less than 30% virtualized at this point. We also have virtualized many of our mission-critical applications, including DHCP services, [our trouble-ticket system] and the network management system. Many other shops have only virtualized their simple applications so far.

Through our training, we see new opportunities to save money and infrastructure resources through advanced concepts of network and storage virtualization. In TNS we have built a solid foundation with our VMware clusters and can continue to build on it.

Conference

Conference sessions were varied but focused on the major topics of virtualization, cloud computing (including private clouds–virtual resource environments internal to an organization–and public clouds–resources provided by third parties via the internet), and next-generation networking, including wireless.

As environments become more and more virtualized, networking changes, including security (firewalls) and layer 2. We learned about some new tech that will help us to reduce our network infrastructure and move more of the network functions into the virtual space.

Cloud computing is emerging as a way to efficiently distribute computing resources where needed, easily. TNS’s virtual server environment is a strong start in this direction.

A session on backup, disaster recovery, and availability confirmed that we have made a good start on these in the virtual environment and gave some tips on how to use virtual machine image backups for a more robust disaster recovery scheme.

One of the keynote presentations and a conference session discussed the push for all-wireless out to the edge.  At this point, the contention is that speeds and security models are adequate to use wireless at the edge, instead of wiring the offices.  It’s an interesting concept and is gaining momentum.  It will be interesting to watch as this movement progresses further.

Exhibition

The vendor exhibition gave us a few opportunities to talk with network monitoring system vendors, which we had hoped to do to consider some alternatives to [our current NMS]. We also had the chance to see the current datacenter tech landscape by reviewing the various products being shown at the expo.

Using FreeSWITCH to add Google Voice to Asterisk

Michigan Telephone and I have been discussing using FreeSWITCH as an on-box adjunct to Asterisk to enable cutting-edge features, such as Google Voice integration, without having to use development-level Asterisk code. Here’s how to set up a very minimal FreeSWITCH on the same server as Asterisk for this very purpose.

References, at the top of the post to suggest that you read these first:

The steps:

FreeSWITCH

  1. Follow the installation guide to retrieve the development version of FreeSWITCH from the git repository. Warning! The Subversion repository is old, and so is the tarball, which claims to be a nightly snapshot. It is not. Only git will get you the current code.
  2. Build:
    • ./bootstrap.sh
    • Edit modules.conf in the source directory and uncomment endpoints/mod_dingaling. Later, once you see the minimal installation we’re producing, you may want to comment out other unused modules to save some build time.
    • ./configure, make, and make install. My Asterisk box already had most of the required libraries; only libtiff-devel was missing (needed for the spandsp module). I was able to retrieve libraries and headers with yum (yum install libtiff-devel for example). The make process will alert you of anything missing. Just install the requirements and then make again, and it will pick up where it left off.
  3. FreeSWITCH will now be installed in /usr/local/freeswitch and is contained within this directory and subdirectories. I noticed that it builds its own copy of iksemel, which I already have installed elsewhere for Asterisk’s use, but the custom libs are in /usr/local/freeswitch/lib so there is no interference.
  4. Delete the contents of /usr/local/freeswitch/conf. You can get them back later if you want by doing make samples from your FreeSWITCH source directory, but for this minimal installation, we can put all of the configuration in a single file and be sure nothing else is loading.
  5. I spent some time trying to optimize the FreeSWITCH config so that it contains just enough to act as a gateway between Asterisk (using SIP) and Google Voice. My freeswitch.xml config, appended to this post, should work for anyone following these steps. Copy it to the /usr/local/freeswitch/conf directory, editing the lines related to GMail login.

Asterisk

  1. If you’re set up for NAT, you may not (probably don’t) have the loopback network configured in your sip.conf as a local (non-NAT) network. Add localnet = 127.0.0.0/255.255.255.0 to [general] in sip.conf or the sip_nat.file if you’re using FreePBX. Otherwise, Asterisk will try to use NAT-traversal methods for the Asterisk-FreeSWITCH on-box trunk.
  2. Set up a new SIP trunk. In FreePBX, name the peer “freeswitch” and use these trunk details:

    host=127.0.0.1
    port=5050
    qualify=30000
    type=friend

    (FreePBX now sets up contexts appropriately within from-trunk, so the context line can be omitted here unless you wish to specify one.) The non-FreePBX method would be to create a [freeswitch] block in sip.conf with the aforementioned details and an appropriate context= line. That’s it. No registration, no usernames, nothing–we are authenticating by IP address and port only.

  3. Set up appropriate inbound and outbound routes in FreePBX or in your extensions.conf dialplan. This is outside the scope of this how-to.

Firewall

FreeSWITCH and/or the GTalk/Jingle protocol use more RTP ports than what I had previously configured in my router-firewall for Asterisk. So I updated my firewall to include UDP ports 10000-65000.

Google Voice and GMail

  1. Log into the GMail account with an associated Google Voice number, bring up the chat window and enable voice calling. Call a number and see that it works through your browser.
  2. Log into Google Voice and instruct it to route calls to Google Chat. According to the FreeSWITCH wiki, the FreeSWITCH integration only works when call screening is turned on. (Why?) So turn it on. Call your Google Voice number from any phone and see that it rings through to your browser. Then sign out of chat.

Get it started

With these settings in place, Asterisk should be listening to FreeSWITCH on 127.0.0.1 port 5060, and FreeSWITCH should be listening to Asterisk on 127.0.0.1 port 5050. Furthermore, FreeSWITCH should be able to navigate a NAT and talk to the Google Talk server and, using the latest FreeSWITCH code, send and receive calls on the Google Voice number.

Start FreeSWITCH. /usr/local/freeswitch/bin/freeswitch -c will give you a console and once you have worked out the bugs, you can run it in the background with -nc instead.

Does it work?

Let me know if you have followed these instructions and achieved success. I was able to send and receive calls with Google Voice, with working DTMF and mostly acceptable audio quality. 

Place test calls with dl_debug on in the FreeSWITCH console to see the XMPP messages. I spent a lot of time examining these and Wireshark captures to find RTP issues (solved in the config and with the firewall adjustments).

I was disappointed that the audio was sometimes jittery, which I never see with the Gizmo5 or PSTN Google Voice transports. I don’t know if it was from the Internet or from the server itself, but I can say that FreeSWITCH in this very minimal mode seems to add very little additional memory or CPU usage.

Appendix: the config 
My single-config-file freeswitch.xml. Cut, paste and use. Replace YOURUSERNAME, YOURPASSWORD, and YOURDID with your settings. A veteran FreeSWITCH user could help me optimize this even more.

<?xml version=”1.0″?>
<document type=”freeswitch/xml”>
        
  <include>
    <!– this is a good place to pre-define globals if you want –>
    <X-PRE-PROCESS cmd=”set” data=”global_codec_prefs=G7221@32000h,G7221@16000h,G722,PCMU,PCMA,GSM”/>
  </include>
  <section name=”configuration” description=”Various Configuration”>
      
    <configuration name=”modules.conf” description=”Modules”>
      <modules>
        <load module=”mod_console”/>
        <load module=”mod_logfile”/>
        <load module=”mod_sofia”/>
        <load module=”mod_dingaling”/>
        <load module=”mod_commands”/>
        <load module=”mod_dptools”/>
        <load module=”mod_dialplan_xml”/>
      </modules>
    </configuration>
            
    <configuration name=”console.conf” description=”Console Logger”>
      <mappings>
        <map name=”all” value=”console,debug,info,notice,warning,err,crit,alert”/>
      </mappings>
      <settings>
        <param name=”colorize” value=”true”/>
        <param name=”loglevel” value=”info”/>
      </settings>
    </configuration>
      
    <configuration name=”switch.conf” description=”Core Configuration”>
      <cli-keybindings>
        <key name=”1″ value=”help”/>
        <key name=”2″ value=”status”/>
        <key name=”3″ value=”show channels”/>
        <key name=”4″ value=”show calls”/>
        <key name=”5″ value=”sofia status”/>
        <key name=”6″ value=”dingaling status”/>
        <key name=”7″ value=”reloadxml”/>
      </cli-keybindings> 
              
      <settings>
        <param name=”colorize-console” value=”true”/>
        <param name=”max-sessions” value=”1000″/>
        <param name=”sessions-per-second” value=”30″/>
        <param name=”loglevel” value=”debug”/>
        <param name=”dump-cores” value=”yes”/>
        <param name=”rtp-enable-zrtp” value=”false”/>
      </settings>
    </configuration>
    <configuration name=”logfile.conf” description=”File Logging”>
      <settings>
        <param name=”rotate-on-hup” value=”true”/>
      </settings>
      <profiles>
        <profile name=”default”>
          <settings>
            <param name=”rollover” value=”10485760″/>
          </settings>
          <mappings>
            <map name=”all” value=”debug,info,notice,warning,err,crit,alert”/>
          </mappings>
        </profile>
      </profiles>
    </configuration>
    <configuration name=”sofia.conf” description=”sofia Endpoint”>
      <global_settings>
        <param name=”log-level” value=”0″/>
        <param name=”debug-presence” value=”0″/>
      </global_settings>
      <profiles>
        <profile name=”freeswitch-sip”>
          <gateways>
            <gateway name=”asterisk-local”>
              <param name=”username” value=”freeswitch”/>
              <param name=”password” value=”0″/>
              <param name=”proxy” value=”127.0.0.1:5060″/>
              <param name=”register” value=”false”/>
              <param name=”retry-seconds” value=”30″/>
              <param name=”caller-id-in-from” value=”true”/>
            </gateway>
          </gateways>
          <domains>
            <domain name=”all” alias=”true” parse=”false”/>
          </domains>
          
          <settings>
            <param name=”debug” value=”0″/>
            <param name=”sip-trace” value=”no”/>
            <param name=”log-auth-failures” value=”false”/>
            <param name=”forward-unsolicited-mwi-notify” value=”false”/>
            <param name=”context” value=”asterisk”/>
            <param name=”rfc2833-pt” value=”101″/>
            <param name=”sip-port” value=”5050″/>
            <param name=”dialplan” value=”XML”/>
            <param name=”dtmf-type” value=”info”/>
            <param name=”inbound-codec-prefs” value=”$${global_codec_prefs}”/>
            <param name=”outbound-codec-prefs” value=”$${global_codec_prefs}”/>
            <param name=”use-rtp-timer” value=”true”/>
            <param name=”rtp-timer-name” value=”soft”/>
            <param name=”vad” value=”none”/>
            <param name=”rtp-ip” value=”127.0.0.1″/>
            <param name=”sip-ip” value=”127.0.0.1″/>
            <param name=”inbound-codec-negotiation” value=”generous”/>
            <param name=”tls” value=”false”/>
            <param name=”nonce-ttl” value=”60″/>
            <!–<param name=”disable-transcoding” value=”true”/>–>
            <param name=”auth-calls” value=”false”/>
            <param name=”auth-all-packets” value=”false”/>
            
            <param name=”ext-rtp-ip” value=”127.0.0.1″/>
            <param name=”ext-sip-ip” value=”127.0.0.1″/>
        
            <param name=”rtp-timeout-sec” value=”300″/>
            <param name=”rtp-hold-timeout-sec” value=”1800″/>
        
            <param name=”challenge-realm” value=”auto_from”/>
          </settings>
        </profile>
      </profiles>
    </configuration>
            
    <configuration name=”dingaling.conf” description=”XMPP Jingle Endpoint”>
      <settings>
        <param name=”debug” value=”0″/>
        <param name=”codec-prefs” value=”PCMU”/>
      </settings>
              
      <profile type=”client”>
        <param name=”name” value=”gtalk”/>
        <param name=”login” value=”YOURUSERNAME@gmail.com/freeswitch”/>
        <param name=”password” value=”YOURPASSWORD”/>
        <param name=”dialplan” value=”XML”/>
        <param name=”context” value=”gtalk”/>
        <param name=”message” value=”This is FreeSWITCH”/>
        <param name=”auto-reply” value=”This is an automated system for audio calls only. Please do not chat.”/>
        <param name=”rtp-ip” value=”auto”/>
        <param name=”candidate-acl” value=”wan.auto”/>
        <param name=”local-network-acl” value=”localnet.auto”/>
        <param name=”ext-rtp-ip” value=”stun:stun.freeswitch.org”/>
        <param name=”auto-login” value=”true”/>
        <param name=”sasl” value=”plain”/>
        <param name=”server” value=”talk.google.com”/>
        <param name=”tls” value=”true”/>
        <!– disable to trade async for more calls –>
        <param name=”use-rtp-timer” value=”false”/>
        <!– default extension (if one cannot be determined) –>
        <param name=”exten” value=”gtalk-in”/>
      </profile>
    </configuration>
    <configuration name=”post_load_modules.conf” description=”Post-load modules” />
  </section>
  <section name=”dialplan” description=”Regex/XML Dialplan”>
    <context name=”asterisk”>
      <extension name=”asterisk-outbound”>
        <condition field=”destination_number” expression=”^(.*)$”>
          <action application=”ring_ready” />
          <action application=”set” data=”hangup_after_bridge=true”/>
          <action application=”set” data=”bridge_generate_comfort_noise=true”/>
          <action application=”bridge” data=”dingaling/gtalk/+$1@voice.google.com”/>
        </condition>
      </extension>
    </context>
    <context name=”gtalk”>
      <extension name=”gtalk-in”>
        <condition field=”destination_number” expression=”^(.*)$”>
          <action application=”set” data=”hangup_after_bridge=true”/>
          <action application=”set” data=”effective_caller_id_name=${caller_id_number}”/>
          <action application=”set” data=”execute_on_answer=send_dtmf 1″/>
          <action application=”set” data=”bridge_generate_comfort_noise=true”/>
          <!– <action application=”answer” /> Add this to answer the call before bridge to * –>
          <!– <action application=”ring_ready” /> Or GV Voicemail will get it if you don’t ans. –>
          <!– <action application=”set” data=”ringback=%(2000, 4000, 440.0, 480.0)” /> –>
          <action application=”bridge” data=”sofia/gateway/asterisk-local/YOURDID” />
        </condition>
      </extension>
    </context>
  </section>
</document>

1950s phone booth; starting bid $750

The first of six 1950s phone booths removed from the student union is now up for bid on eBay. Starting bid, set by the University? $750. 

We are hoping that a student and/or alumnus would find them valuable and enjoy them for years to come,” said the senior director of the student union. 

She forgot the adjective wealthy.

UPDATE 10/20/2010 11:00a.m. Auction ended. No bids. Perhaps Surplus will re-list at a more reasonable starting bid.

Asterisk 1.8.0 RC3 and Google Voice

New features in Asterisk 1.8 may drag me out of the comfortable stability that is version 1.4.

Release candidate 3 of version 1.8.0 was announced last week, and it includes an updated chan_gtalk module that enables communications with the Gmail web client and its protocol/codecs. It’s neither standard SIP nor XMPP-Jingle, which I hope is yet to come, but the updated module is the last link necessary to allow directly placing and receiving calls through Google Voice. From the Google Voice web interface, you can specify Gmail Chat as one of your phones to ring on an incoming call. And this comment from the Asterisk code repository shows how to make outbound Google Voice calls in one line from the dialplan.

What else? Secure RTP, SIP over TCP, IPv6 (yes, I run IPv6 at home) are a few that showed up through the development of 1.6.x and I hope are considered stable in the 1.8 release. If anyone is running the release candidate or development code please let me know about your experience in stability and usability of new features.