B2B_ENTITIES

Anca-Maria Vamanu

OpenSIPS

Edited by

Anca-Maria Vamanu

Edited by

Ovidiu Sas

Revision History
Revision $Revision: 8103 $$Date: 2013-01-29 13:35:11 +0100 (Tue, 29 Jan 2013) $

Table of Contents

1. Admin Guide
1.1. Overview
1.2. Dependencies
1.2.1. OpenSIPS Modules
1.2.2. External Libraries or Applications
1.3. Exported Parameters
1.3.1. server_hsize (int)
1.3.2. client_hsize (int)
1.3.3. script_req_route (str)
1.3.4. script_reply_route (str)
1.3.5. db_url (str)
1.3.6. update_period (int)
1.3.7. b2b_key_prefix (string)
1.3.8. db_mode (int)
1.3.9. db_table (str)
1.3.10. replication_mode (int)
1.4. Exported Functions
2. Developer Guide
2.1. b2b_load_api(b2b_api_t* api)
2.2. server_new
2.3. client_new
2.4. send_request
2.5. send_reply
2.6. entity_delete
2.7. restore_logic_info
2.8. update_b2bl_param

List of Examples

1.1. Set server_hsize parameter
1.2. Set client_hsize parameter
1.3. Set script_req_route parameter
1.4. Set script_repl_route parameter
1.5. Set db_url parameter
1.6. Set update_period parameter
1.7. Set b2b_key_prefix parameter
1.8. Set db_mode parameter
1.9. Set db_table parameter
1.10. Set replication_mode parameter
2.1. b2b_api_t structure

Chapter 1. Admin Guide

1.1. Overview

The B2BUA implementation in OpenSIPS is separated in two layers:

  • a lower one(coded in this module)- which implements the basic functions of a UAS and UAC
  • a upper one - which represents the logic engine of B2BUA, responsible of actually implementing the B2BUA services using the functions offered by the low level.

This module stores records corresponding to the dialogs in which the B2BUA is involved. It exports an API to be called from other modules which offers functions for creating a new dialog record, for sending requests or replies in one dialog and will also notify the upper level module when a request or reply is received inside one stored dialog. The records are separated in two types: b2b server entities and b2b client entities depending on the mode they are created. An entity created for a received initial message will be a server entity, while a entity that will send an initial request(create a new dialog) will be a b2b client entity. The name corresponds to the behavior in the first transaction - if UAS - server entity and if UAC - client entity. This module does not implement a B2BUA alone, but needs a B2B logic implementing module.

The module is able to respond to authentication challanges if the uac_auth module is loaded first. The list of credentials for b2b authentication is also provided by the uac_auth module.

1.2. Dependencies

1.2.1. OpenSIPS Modules

  • tm

  • a db module

  • uac_auth (mandatory if authentication is required)

1.2.2. External Libraries or Applications

The following libraries or applications must be installed before running OpenSIPS with this module loaded:

  • none

1.3. Exported Parameters

1.3.1. server_hsize (int)

The size of the hash table that stores the b2b server entities. It is the 2 logarithmic value of the real size.

Default value is “9 (512 records).

Example 1.1. Set server_hsize parameter

...
modparam("b2b_entities", "server_hsize", 10)
...
	

1.3.2. client_hsize (int)

The size of the hash table that stores the b2b client entities. It is the 2 logarithmic value of the real size.

Default value is “9 (512 records).

Example 1.2. Set client_hsize parameter

...
modparam("b2b_entities", "client_hsize", 10)
...
	

1.3.3. script_req_route (str)

The name of the b2b script route that will be called when B2B requests are received.

Example 1.3. Set script_req_route parameter

...
modparam("b2b_entities", "script_req_route", "b2b_request")
...
	

1.3.4. script_reply_route (str)

The name of the b2b script route that will be called when B2B replies are received.

Example 1.4. Set script_repl_route parameter

...
modparam("b2b_entities", "script_reply_route", "b2b_reply")
...
	

1.3.5. db_url (str)

Database URL. It is not compulsory, if not set data is not stored in database.

Example 1.5. Set db_url parameter

...
modparam("b2b_entities", "db_url", "mysql://opensips:opensipsrw@127.0.0.1/opensips")
...
	

1.3.6. update_period (int)

The time interval at which to update the info in database.

Default value is “100”.

Example 1.6. Set update_period parameter

...
modparam("b2b_entities", "update_period", 60)
...
	

1.3.7. b2b_key_prefix (string)

The string to use when generating the key ( it is inserted in the SIP messages as callid or to tag. It is useful to set this prefix if you use more instances of opensips B2BUA cascaded in the same architecture. Sometimes opensips B2BUA looks at the callid or totag to see if it has the format it uses to determine if the request was sent by it.

Default value is “B2B”.

Example 1.7. Set b2b_key_prefix parameter

...
modparam("b2b_entities", "b2b_key_prefix", "B2B1")
...
	

1.3.8. db_mode (int)

The B2B modules have support for the 3 type of database storage

  • NO DB STORAGE - set this parameter to 0
  • WRITE THROUGH (synchronous write in database) - set this parameter to 1
  • WRITE BACK (update in db from time to time) - set this parameter to 2

Default value is “2” (WRITE BACK).

Example 1.8. Set db_mode parameter

...
modparam("b2b_entities", "db_mode", 1)
...
	

1.3.9. db_table (str)

The name of the table that will be used for storing B2B entities

Default value is “b2b_entities

Example 1.9. Set db_table parameter

...
modparam("b2b_entities", "db_table", "some table name")
...
	

1.3.10. replication_mode (int)

Controls if the callid should be the same in more instances running at the same time. 0 will lead to generating of different callid's per instance 1 will lead to generating of the same callid's in more instances

Default value is “0

Example 1.10. Set replication_mode parameter

...
modparam("b2b_entities", "replication_mode", 1)
...
	

1.4. Exported Functions

The module does not export functions to be used in configuration script.

Chapter 2. Developer Guide

The module provides an API that can be used from other OpenSIPS modules. The API offers the functions for creating and handing dialogs. A dialog can be created on a receipt initial message, and this will correspond to a b2b server entity, or initiated by the server and in this case a client entity will be created in b2b_entities module.

2.1.  b2b_load_api(b2b_api_t* api)

This function binds the b2b_entities modules and fills the structure the exported functions that will be described in detail.

Example 2.1. b2b_api_t structure

...
typedef struct b2b_api {
	b2b_server_new_t          server_new;
	b2b_client_new_t          client_new;

	b2b_send_request_t        send_request;
	b2b_send_reply_t          send_reply;

	b2b_entity_delete_t       entity_delete;

	b2b_restore_linfo_t       restore_logic_info;
	b2b_update_b2bl_param_t   update_b2bl_param;
}b2b_api_t;
...

2.2.  server_new

Field type:

...
typedef str* (*b2b_server_new_t) (struct sip_msg* ,b2b_notify_t , void* param);
...

This function asks the b2b_entities modules to create a new server entity record. The internal processing actually extracts the dialog information from the message and constructs a record that will be stored in a hash table. The second parameters is a pointer to a function that the b2b_entities module will call when a event will come for that dialog (a request or reply). The third parameter is a pointer to a value that will be stored and given as a parameter when the notify function will be called(it has to be allocated in shared memory).

The return value is an identifier for the record that will be mentioned when calling other functions that represent actions in the dialog(send request, send reply).

The notify function has the following prototype:

...
typedef int (*b2b_notify_t)(struct sip_msg* msg, str* id, int type, void* param);
...

This function is called when a request or reply is received for a dialog handled by b2b_entities. The first parameter is the message, the second is the identifier for the dialog, the third is a flag that says which is the type of the message(it has two possible values - B2B_REQUEST and B2B_REPLY). The last parameter is the parameter by the upper module when the entity was created.

2.3.  client_new

Field type:

...
typedef str* (*b2b_client_new_t) (client_info_t* , b2b_notify_t b2b_cback,
		b2b_add_dlginfo_t add_dlginfo_f, str* param);
...

This function asks the b2b_entities modules to create a new client entity record and also create a new dialog by sending an initial message. The parameters are all the values needed for the initial request to which the notify function and parameter are added. The b2b_cback parameter is a pointer to the callback that must be called when an event happens(receiving a reply or request) in the dialog created with this function. The add_dlginfo_f parameter is also a function pointer to a callback that will be called when a final success response will be received for the created dialog. The callback will receive as parameter the complete dialog information for the record. It should be stored and used when calling send_request or send_reply functions.

The return value is an identifier for the record that will be mentioned when calling other functions that represent actions in the dialog(send request, send reply).

2.4.  send_request

Field type:

...
typedef int (*b2b_send_request_t)(enum b2b_entity_type ,str* b2b_key, str* method,
		str* extra_headers, str* body, b2b_dlginfo_t*);
...

This function asks the b2b_entities modules to send a request inside a b2b dialog identified by b2b_key. The first parameter is the entity type and can have two values: B2B_SERVER and B2B_CLIENT. The second is the identifier returned by the create function(server_new or client_new) and the next are the informations needed for the new request: method, extra_headers, body. The last parameter contains the dialog information - callid, to tag, from tag. These are needed to make a perfect match to of b2b_entities record for which a new request must be sent.

The return value is 0 for success and a negative value for error.

2.5.  send_reply

Field type:

...
typedef int (*b2b_send_reply_t)(enum b2b_entity_type et, str* b2b_key, int code, str* text,
		str* body, str* extra_headers, b2b_dlginfo_t* dlginfo);
...

This function asks the b2b_entities modules to send a reply inside a b2b dialog identified by b2b_key. The first parameter is the entity type and can have two values: B2B_SERVER and B2B_CLIENT. The second is the identifier returned by the create function(server_new or client_new) and the next are the informations needed for the new reply: code, text, body, extra_headers. The last parameter contains the dialog information used for matching the right record.

The return value is 0 for success and a negative value for error.

2.6.  entity_delete

Field type:

...
typedef void (*b2b_entity_delete_t)(enum b2b_entity_type et, str* b2b_key,
	 b2b_dlginfo_t* dlginfo);
...

This function must be called by the upper level function to delete the records in b2b_entities. The records are not cleaned up by the b2b_entities module and the upper level module must take care to delete them.

2.7.  restore_logic_info

Field type:

...
typedef int (*b2b_restore_linfo_t)(enum b2b_entity_type type, str* key,
		b2b_notify_t cback);
...

This function is used at startup when loading the data from the database to restore the pointer to the callback function.

2.8.  update_b2bl_param

Field type:

...
typedef int (*b2b_update_b2bl_param_t)(enum b2b_entity_type type, str* key,
		str* param);
...

This function can be used to change the logic param stored for an entity ( useful in case an entity is moved between logic records).