# &adminguide;

## Overview

This module can delegate processing of SIP requests to a group of workers in the configuration file by using event_route[core:pre-routing]. The async workers have to be defined with the global parameter. The worker process that received the message internally does the usual execution of the config script, running request_route or reply_route.

Note: the behaviour is different than the async module, because it does not create the transaction (obviously also not performing suspend).

Note: it does not propagate anything set in the event_route, therefore any set flag, or avp, etc. are lost. The SIP message is processed by the delegated worker as it was fresh received from the network (including parsing).

## Dependencies

### &kamailio; Modules

The following modules must be loaded before this module:

- None.

### External Libraries or Applications

The following libraries or applications must be installed before running &kamailio; with this module loaded:

- None

## Parameters

### `xdata (str)`

Name of a script variable from where to take additional data to be passed to special worker along with the SIP message. Same variable will be set by the special worker, therefore it has to be a writable variable. Moreover, it must be a variable that can be set without the SIP message structure, like $var(name), otherwise it can lead to a crash.

Default value: not set.

#### `xdata` usage

    ...
    modparam("sworker", "xdata", "$var(xdata)")
    ...

## Functions

### `sworker_active()`

Return 1 (true) if the processing happens in an async process, or -1 (false) if the processing is happening in a SIP receiving process.

This function can be used from REQUEST_ROUTE|CORE_REPLY_ROUTE.

#### `sworker_active()` usage

    ...
    request_route {
        ...
        if(sworker_active()) {
        }
        ...
    }
    ...

### `sworker_task(gname)`

Delegate the processing of SIP message to a group of async workers. The function is restricted to be used inside event_route[core:pre-routing].

The parameter gname provides the name of the group workers, it can contain pseudo-variables.

The function returns 1 (true) in case the task is delegated. After that, 'drop' must be used so processing of the message does not continue to request_route or reply_route in the same process, it is going to be done by the delegated group of workers. It returns -1 (false) in case there was a problem delegating the processing.

This function can be used from REQUEST_ROUTE|CORE_REPLY_ROUTE.

#### `sworker_task()` usage

    ...
    event_route[core:pre-routing] {
    	if(sworker_task("default")) {
    		xinfo("===== delegate processing [$Tf] [$si:$sp]\n");
    		drop;
    	}
    	xinfo("===== processing continues [$Tf] [$si:$sp]\n");
        ...
    }
    ...