manager version: 11.1.3.40
https://www.thirdlane.com/forum/trunk-incoming-calls-400-bad-to-header
https://kamailio.org/docs/modules/4.3.x/modules/htable.html
https://www.kamailio.org/wiki/cookbooks/5.2.x/pseudovariables
$ci - Call-Id
$ci - reference to body of call-id header
$hdr(name) - represents the body of first header identified by 'name'
// part 1 --
modparam("htable", "htable", "frompstn_request=>size=6")
* entry 2 ^ 6 = 64
// part 2 -- request_route {
// my idea, reinitialize htable variable after handling this packet
if ($sht(frompstn_request=>$ci::FROM) != $null) {
xlog("L_DBG", "== TRACE. $ci - CANCEL. Htable frompstn_request has record for $ci Clearing it\n");
$sht(frompstn_request=>$ci::FROM) = $null;
}
// part 3 -- route[FROMPSTN]
if (is_method("INVITE")) {
xlog("L_DBG", "== TRACE. $ci - FROMPSTN. INVITE\n");
$sht(frompstn_request=>$ci::FROM) = $hdr(From);
}
// part 4 -- route[BYE] {
$var(frompstn_request_bye) = "0";
$var(frompstn_request) = $sht(frompstn_request=>$ci::FROM);
if ($var(frompstn_request) != "0") {
$var(frompstn_request_bye) = $var(frompstn_request);
xlog("L_DBG", "== TRACE. $ci - BYE. Htable frompstn_request has record for $ci Clearing it\n");
$sht(frompstn_request=>$ci::FROM) = $null;
}
// part 5 -- route[TRUNK_MANAGE] {
if (is_method("BYE")) {
if ($var(frompstn_request_bye) != "0") {
xlog("L_DBG", "== TRACE. $ci - TRUNK_MANAGE. BYE. frompstn_request_bye is set\n");
xlog("L_DBG", "== TRACE. $ci - TRUNK_MANAGE. Adjusting To header\n");
remove_hf("To");
insert_hf("To: $var(frompstn_request_bye)\r\n", "Call-ID");
}
} else {
$var(frompstn_request_from_hdr) = $sht(frompstn_request=>$ci::FROM);
if ($var(frompstn_request_from_hdr) != "0") {
xlog("L_DBG", "== TRACE. $ci - TRUNK_MANAGE. frompstn_request htable record was found\n");
xlog("L_DBG", "== TRACE. $ci - TRUNK_MANAGE. Adjusting To header\n");
remove_hf("To");
insert_hf("To: $var(frompstn_request_from_hdr)\r\n", "Call-ID");
}
}