# IMS Online Charging Server (OCS) Module

## Admin Guide

### Overview

This module provides a simple Online Charging Server Module for working with the ims_charging module. It communicates with the ims_charging module via the Diameter-Ro Interface.

This module is dependent on the CDP (C Diameter Peer) modules for communicating with a Charging-Server as specified in 3GPP specification TS xx.xxx.

Please also refer to RFC 4006 (Diameter Credit-Control Application).

The module works will create fake SIP messages and provide them to an event route for further operations. It up to the script writer to do the processing.

### Dependencies

#### Kamailio Modules

The Following modules must be loaded before this module:

- CDP - C Diameter Peer

- CDP_AVP - CDP AVP Applications

#### External Libraries or Applications

No external libraries are required.

### Faked Messages

#### Translating SIP to Diameter

The incoming Charging requests are translated into the following methods:

- INVITE - For "Start" Charging Requests

- UPDATE - For "Interim" Charging Requests

- BYE - For "Stop" Charging Requests

#### SIP-Information in the faked messages

The faked messages contain the following information:

- Method - See previous section

- Request-URI - The dialed number of the call

- From-Header - The originator of the session

- To-Header - Same as request-URI

- Call-ID - The Diameter-Charging-ID (not the SIP-Call-ID)

- P-Requested-Units - The requested units for this call

- P-Used-Units - The used units for this call (only useful for Interim and Stop Events)

- P-Access-Network-Info - The used access network - if available

- P-Service-Identifier - The service identifier, if you want to differentiate different services (e.g. Audio and Video)

### Functions

#### `ccr_result(resultcode, grantedunits, finalunit)`

This method sets the response code of the Diameter Request.

Meaning of the parameters is as follows:

- resultcode - the Diameter Response code for the request. Typical response codes are:

  - 2001 - Ok

  - 5030 - User unknown

  - 5031 - Rating failed

  - 4010 - End-User Service denied (e.g. Service blocked)

  - 5006 - Resources exceeded (e.g. too many concurrent calls)

- grantedunits - the number of granted units for this particular user

- finalunit - indication, that all following requests will be denied (this is the final unit for the session)

This function can be used from the event route.

##### `ds_select_dst` usage

    ...
    ccr_result("2001", "600", "0");
    ...
    $var(result) = 2001;
    $var(granted) = $hdr(P-Requested-Units);
    $var(final) = 0;
    ccr_result("$var(result)", "$var(granted)", "$var(final)");
    ...
    ccr_result("2001", "$hdr(P-Requested-Units)", "0");
    ...

### Event routes

#### `ocs:ccr-orig`

This route is called for Charging Requests with the session-case "originating" - a call from a user to another destination.

    ...
    event_route[ocs:ccr-orig] {
    	xlog("Session-Case: Originating\n");
    	xlog("----------------------------------------\n");
    	if (is_method("INVITE")) {
    		xlog("START - Request\n");
    	} else if (is_method("UPDATE")) {
    		xlog("INTERIM - Request\n");
    	} else if (is_method("BYE")) {
    		xlog("STOP - Request\n");
    	}
    	xlog("----------------------------------------\n");
    	xlog("From:               $fu\n");
    	xlog("To:                 $ru\n");
    	xlog("Call-ID:            $ci\n");
    	xlog("Requested Units:    $hdr(P-Requested-Units)\n");
    	xlog("Used Units:         $hdr(P-Used-Units)\n");
    	xlog("Access Network:     $hdr(P-Access-Network-Info)\n");
    	xlog("Service Identifier: $hdr(P-Service-Identifier)\n");

    	ccr_result("2001", "600", "0");
    }
    ...

#### `ocs:ccr-term`

This route is called for Charging Requests with the session-case "terminating" - a call to a user from another destination.

You can have an "originating" and a "terminating" request for a single call, e.g. if a user calls another user. Since the Diameter-Session-ID is provided as "Call-ID", it will have a different Call-ID, since it is logical two separate sessions.

This route is optional.

    ...
    event_route[ocs:ccr-term] {
    	xlog("Session-Case: Terminating\n");
    	xlog("----------------------------------------\n");
    	if (is_method("INVITE")) {
    		xlog("START - Request\n");
    	} else if (is_method("UPDATE")) {
    		xlog("INTERIM - Request\n");
    	} else if (is_method("BYE")) {
    		xlog("STOP - Request\n");
    	}
    	xlog("----------------------------------------\n");
    	xlog("From:               $fu\n");
    	xlog("To:                 $ru\n");
    	xlog("Call-ID:            $ci\n");
    	xlog("Requested Units:    $hdr(P-Requested-Units)\n");
    	xlog("Used Units:         $hdr(P-Used-Units)\n");
    	xlog("Access Network:     $hdr(P-Access-Network-Info)\n");
    	xlog("Service Identifier: $hdr(P-Service-Identifier)\n");

    	ccr_result("2001", "600", "0");
    }
    ...