====== Upgrade Kamailio from v4.0.x to v4.1.0 ====== The page contains the details about the changes that were made to old components during the development of v4.1.0 compared with what existed in v4.0.x. It does not include the brand new modules, focusing on how to upgrade database and configuration file from v4.0.x to run with Kamailio devel. ===== Previous Stable Release ===== If you look for the guidelines to upgrade to previous stable release, see: * [[install:upgrade:3.3.x-to-4.0.0|Upgrade Kamailio v3.3.x to v4.0.0]]. ===== Modules ===== These sections presents notes, listed by modules, about changes that need to be made to Kamailio configuration file when upgrading from Kamailio v4.0.x to devel. ==== TBA ==== * short description ===== Database ===== ==== MySQL - Updates to old database tables ==== Next are the SQL statements that must be executed to get the database structure required by modules that existed in v4.0.x. ALTER TABLE dbaliases DROP INDEX alias_idx; # was UNIQUE (alias_username,alias_domain) ALTER TABLE dbaliases ADD INDEX alias_idx (alias_username,alias_domain); ALTER TABLE dbaliases ADD INDEX alias_user_idx (alias_username); INSERT INTO version (table_name, table_version) values ('acc_cdrs','1'); CREATE TABLE acc_cdrs ( id int(10) unsigned NOT NULL AUTO_INCREMENT, start_time varchar(32) NOT NULL DEFAULT '', end_time varchar(32) NOT NULL DEFAULT '', duration varchar(32) NOT NULL DEFAULT '', PRIMARY KEY (id), KEY start_time_idx (start_time) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO version (table_name, table_version) values ('mohqcalls','1'); CREATE TABLE mohqcalls ( id int(10) unsigned NOT NULL AUTO_INCREMENT, mohq_id int(10) unsigned NOT NULL, call_id varchar(100) NOT NULL, call_status int(10) unsigned NOT NULL, call_from varchar(100) NOT NULL, call_contact varchar(100) DEFAULT NULL, call_time datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY mohqcalls_idx (call_id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO version (table_name, table_version) values ('mohqueues','1'); CREATE TABLE mohqueues ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(25) NOT NULL, uri varchar(100) NOT NULL, mohdir varchar(100) DEFAULT NULL, mohfile varchar(100) NOT NULL, debug int(11) NOT NULL, PRIMARY KEY (id), UNIQUE KEY mohqueue_uri_idx (uri), UNIQUE KEY mohqueue_name_idx (name) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO version (table_name, table_version) values ('rtpproxy','1'); CREATE TABLE rtpproxy ( id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, setid VARCHAR(32) DEFAULT 00 NOT NULL, url VARCHAR(64) DEFAULT '' NOT NULL, flags INT DEFAULT 0 NOT NULL, weight INT DEFAULT 1 NOT NULL, description VARCHAR(64) DEFAULT '' NOT NULL ); The default engine has been set to InnoDB. Not really necessary for most of the tables, but if you want to change it, use following statements: ALTER TABLE acc ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE active_watchers ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE address ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE aliases ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE carrier_name ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE carrierfailureroute ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE carrierroute ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE cpl ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE dbaliases ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE dialog ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE dialog_vars ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE dialplan ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE dispatcher ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `domain` ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE domain_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE domain_name ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE domainpolicy ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE globalblacklist ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE grp ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE htable ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE imc_members ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE imc_rooms ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE lcr_gw ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE lcr_rule ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE lcr_rule_target ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE location ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE location_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE missed_calls ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE mtree ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE mtrees ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE pdt ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE pl_pipes ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE presentity ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE pua ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE purplemap ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE re_grp ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE rls_presentity ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE rls_watchers ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE sca_subscriptions ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE silo ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE sip_trace ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE speed_dial ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE subscriber ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `trusted` ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uacreg ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_credentials ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_domain ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_domain_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_global_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_uri ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_uri_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uid_user_attrs ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE uri ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE userblacklist ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE usr_preferences ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE version ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE watchers ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE xcap ENGINE=InnoDB DEFAULT CHARSET=latin1; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ===== Configuration File Language ===== ==== Core Parameters ==== * **syn_branch** has been removed - core acts now always as syn_branch=0 - the Via header branch value is computed based on transaction attributes * **dns_naptr_ignore_rfc** has been added. Specifies if the Order field in a NAPTR record should be respected. Old code, and still default, is to ignore. ==== Behaviour ==== === Comparison with $null === In short * now: if($var(a)==$null) is always false * previous: if($var(a)==$null) was true if $var(a) had the value 0 **//Details//** **$null** is a special variable that was meant to test if a variable is defined or not (exists or not). It was introduced during Kamailio 1.x series (OpenSER at that time). For example: if($avp(x)==$null) Should return true if there was no value assigned to $avp(x). However, some variables are defined always (eventually initialized to 0), such as $var(a) or $shv(b). Starting with v3.0.0 when the core from Kamailio point of view was refactored, as part of integration with SER, the comparison with $null mistakenly became the same as comparison with integer 0 (zero). Some of the comparisons kept working, but some gave wrong result: $avp(x)=0; if($avp(x)==$null) was true, but actually $avp(x) was defined, having value 0. Issue was reported on: * https://sip-router.org/tracker/index.php?do=details&task_id=358&project=1 **//Solution//** Don't compare $var(...) and $shv(...) with $null, they are always defined and initialized to 0. You can eventually compare them with 0 (instead of $null).