This documentation relates to an unstable version of Cipango.
visit the current release documentation home.

Diameter

Overview

Diameter support in Cipango is designed to offer a servlet-like programming model.

Configuration

Adding diameter support

Diameter support is optional and should be activated first.

Cipango should be start with configuration etc/cipango-diameter.xml. This can be done by adding the following two lines in start.d/100-sip.ini

OPTIONS=diameter
etc/cipango-diameter.xml

Logging

Diameter messages are logged in the file ${jetty.home}/logs/yyyy_mm_dd.diameter.log (replace yyyy_mm_dd by the current date).

API

Javadoc

Javadoc is available at http://www.cipango.org/javadoc/diameter-2.0/.

DiameterListener

To use diameter, a class implementing the DiameterListener must be declared within the application. This is similar to the TimerListener used for the SIP Servlet TimerService.This interface is then invoked when diameter messages are received.

The DiameterListener is defined as follows:

package org.cipango.diameter.api;

public interface DiameterListener extends EventListener
{
	/**
	 * The <code>handle</code> method is invoked by the container when a Diameter message should be
	 * passed to the application.
	 */
	void handle(DiameterServletMessage message) throws IOException;
}

The DiameterFactory

The DiameterFactory class is used to create instances of DiameterServletRequest.

Cipango makes an instance of org.cipango.diameter.api.DiameterFactory available to servlets via the servlet context attribute of the same name, org.cipango.diameter.api.DiameterFactory.

Usage

Send request

The following code sample illustrates how to create an UDR request:

protected void doRequest(SipServletRequest sipRequest) throws ServletException, IOException
{
    DiameterFactory factory = (DiameterFactory) getServletContext().getAttribute(DiameterFactory.class.getName());
    DiameterServletRequest request = factory.createRequest(sipRequest.getApplicationSession(),Sh.SH_APPLICATION_ID, Sh.UDR,"home1.net","hss1.home1.net");
    AVPList userIdentity = new AVPList();
    userIdentity.add(Cx.PUBLIC_IDENTITY, "sip:alice@atlanta.com");
    request.add(Sh.USER_IDENTITY, userIdentity);
    request.add(Sh.DATA_REFERENCE, Sh.DataReference.IMSUserState);
    request.setAttribute("request", sipRequest);
    request.send();
}

Handling answer

When the UDA answer is received, the handle method of the DiameterListener interface is invoked and the requested data could be retrieved as follows:

public void handle(DiameterServletMessage message) throws IOException
{
  try
  {
    if (!message.isRequest())
    {
    
      DiameterServletAnswer answer = (DiameterServletAnswer) message;
      byte[] data = answer.get(Sh.USER_DATA);
      // process sh data

      SipServletRequest request = (SipServletRequest) answer.getRequest().getAttribute("request");
      SipServletResponse response = request.createResponse(200);
      response.send();
      response.getApplicationSession().invalidate();
      
    }
    else
      // Error processing
  }
  catch (Throwable e)
  {    
    // Error processing
  }
}