summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bsc-nat/BSCNAT_Tests.ttcn64
-rw-r--r--bsc-nat/BSC_MS_ConnectionHandler.ttcn27
-rw-r--r--bsc-nat/BSC_MS_Simulation.ttcn104
-rw-r--r--bsc-nat/MSC_ConnectionHandler.ttcn74
-rwxr-xr-xbsc-nat/MSC_Simulation.ttcn8
-rwxr-xr-xbsc-nat/gen_links.sh2
-rwxr-xr-xbsc-nat/regen_makefile.sh2
-rw-r--r--bsc/BSC_Tests.ttcn589
-rw-r--r--bsc/BSC_Tests_CBSP.ttcn132
-rw-r--r--bsc/MSC_ConnectionHandler.ttcn248
-rw-r--r--bsc/expected-results.xml5
-rw-r--r--bsc/osmo-bsc.cfg33
-rwxr-xr-xbsc/regen_makefile.sh2
-rw-r--r--bts/BTS_Tests.ttcn661
-rw-r--r--bts/BTS_Tests_LAPDm.ttcn484
-rwxr-xr-xbts/regen_makefile.sh2
-rwxr-xr-xcbc/gen_links.sh5
-rwxr-xr-xcbc/regen_makefile.sh3
-rw-r--r--deps/Makefile1
-rw-r--r--ggsn_tests/GGSN_Tests.ttcn35
-rw-r--r--ggsn_tests/expected-results.xml3
-rwxr-xr-xggsn_tests/gen_links.sh2
-rw-r--r--hlr/HLR_Tests.ttcn296
-rw-r--r--hlr/expected-results.xml8
-rw-r--r--hlr/osmo-hlr.cfg23
-rw-r--r--library/BSSGP_Emulation.ttcn75
-rw-r--r--library/BSSMAP_Templates.ttcn5
-rw-r--r--library/CBSP_Templates.ttcn144
-rw-r--r--library/DIAMETER_CodecPort.ttcn81
-rw-r--r--library/DIAMETER_CodecPort_CtrlFunct.ttcn44
-rw-r--r--library/DIAMETER_CodecPort_CtrlFunctDef.cc56
-rw-r--r--library/DIAMETER_Emulation.ttcn427
-rw-r--r--library/DIAMETER_Templates.ttcn821
-rw-r--r--library/DIAMETER_Types.ttcn6652
-rw-r--r--library/GSUP_Types.ttcn123
-rw-r--r--library/GTP_Templates.ttcn12
-rw-r--r--library/GTPv2_CodecPort.ttcn57
-rw-r--r--library/GTPv2_PrivateExtensions.ttcn21
-rw-r--r--library/GTPv2_Templates.ttcn323
-rw-r--r--library/IPA_Emulation.ttcnpp12
-rw-r--r--library/L1CTL_PortType.ttcn14
-rw-r--r--library/L1CTL_Types.ttcn42
-rw-r--r--library/L3_Templates.ttcn33
-rw-r--r--library/MGCP_CodecPort.ttcn36
-rw-r--r--library/MGCP_Emulation.ttcn55
-rw-r--r--library/NAS_Templates.ttcn1011
-rw-r--r--library/Osmocom_CTRL_Adapter.ttcn3
-rw-r--r--library/Osmocom_CTRL_Functions.ttcn35
-rw-r--r--library/Osmocom_CTRL_Types.ttcn46
-rw-r--r--library/RAN_Adapter.ttcnpp19
-rw-r--r--library/RAN_Emulation.ttcnpp196
-rw-r--r--library/RSL_Emulation.ttcn2
-rw-r--r--library/RSL_Types.ttcn46
-rw-r--r--library/RTP_Emulation.ttcn45
-rw-r--r--library/S1AP_CodecPort.ttcn82
-rw-r--r--library/S1AP_CodecPort_CtrlFunct.ttcn44
-rw-r--r--library/S1AP_CodecPort_CtrlFunctDef.cc56
-rw-r--r--library/S1AP_Emulation.ttcn681
-rw-r--r--library/SGsAP_Emulation.ttcn8
-rw-r--r--library/TRXC_Types.ttcn11
-rw-r--r--library/ranap/RANAP_Templates.ttcn165
-rw-r--r--library/s1ap/S1AP_CommonDataTypes.asn34
-rw-r--r--library/s1ap/S1AP_Constants.asn478
-rw-r--r--library/s1ap/S1AP_Containers.asn199
-rw-r--r--library/s1ap/S1AP_EncDec.cc64
-rw-r--r--library/s1ap/S1AP_IEs.asn2801
-rw-r--r--library/s1ap/S1AP_PDU_Contents.asn3128
-rw-r--r--library/s1ap/S1AP_PDU_Descriptions.asn742
-rw-r--r--library/s1ap/S1AP_Templates.ttcn907
-rw-r--r--library/s1ap/S1AP_Types.ttcn7
-rwxr-xr-xlibrary/s1ap/regen_makefile.sh9
-rw-r--r--library/sabp/SABP_CommonDataTypes.asn16
-rw-r--r--library/sabp/SABP_Constants.asn66
-rw-r--r--library/sabp/SABP_Containers.asn94
-rw-r--r--library/sabp/SABP_IEs.asn203
-rw-r--r--library/sabp/SABP_PDU_Contents.asn447
-rw-r--r--library/sabp/SABP_PDU_Descriptions.asn168
-rw-r--r--library/sabp/SABP_Types.ttcn7
-rw-r--r--mgw/MGCP_Test.ttcn48
-rw-r--r--mgw/osmo-mgw.cfg37
-rw-r--r--mme/LTE_CryptoFunctionDefs.cc189
-rw-r--r--mme/LTE_CryptoFunctions.ttcn263
-rw-r--r--mme/MME_Tests.cfg18
-rw-r--r--mme/MME_Tests.default12
-rw-r--r--mme/MME_Tests.ttcn572
-rw-r--r--mme/MME_Tests_SGsAP.ttcn210
-rwxr-xr-xmme/gen_links.sh61
-rw-r--r--mme/key_derivation.c82
-rw-r--r--mme/key_derivation.h21
-rwxr-xr-xmme/regen_makefile.sh9
-rw-r--r--mme/snow-3g.c589
-rw-r--r--mme/snow-3g.h68
-rw-r--r--msc/BSC_ConnectionHandler.ttcn103
-rw-r--r--msc/MSC_Tests.ttcn580
-rw-r--r--msc/MSC_Tests_Iu.ttcn2
-rw-r--r--msc/expected-results.xml128
-rwxr-xr-xmsc/regen_makefile.sh2
-rw-r--r--pcu/PCU_Tests.ttcn28
-rw-r--r--pcu/PCU_Tests_RAW.ttcn2
-rwxr-xr-xsccp/regen_makefile.sh2
-rwxr-xr-xselftest/regen_makefile.sh2
-rw-r--r--sgsn/SGSN_Tests.cfg18
-rw-r--r--sgsn/SGSN_Tests.ttcn257
-rwxr-xr-xsgsn/gen_links.sh30
-rw-r--r--sgsn/osmo-sgsn.cfg72
-rwxr-xr-xsgsn/regen_makefile.sh6
-rwxr-xr-xsip/regen_makefile.sh2
-rwxr-xr-xstart-testsuite.sh10
108 files changed, 26269 insertions, 820 deletions
diff --git a/bsc-nat/BSCNAT_Tests.ttcn b/bsc-nat/BSCNAT_Tests.ttcn
index 2fab4a3..41d58d7 100644
--- a/bsc-nat/BSCNAT_Tests.ttcn
+++ b/bsc-nat/BSCNAT_Tests.ttcn
@@ -16,15 +16,22 @@ import from Osmocom_Types all;
import from IPL4asp_Types all;
import from IPA_Emulation all;
+import from RAN_Emulation all;
import from MTP3asp_Types all;
+import from Osmocom_CTRL_Functions all;
+import from Osmocom_CTRL_Types all;
+import from Osmocom_CTRL_Adapter all;
+
import from SCCP_Types all;
import from SCCPasp_Types all;
import from SCCP_Emulation all;
import from MSC_Simulation all;
+import from MSC_ConnectionHandler all;
import from BSC_MS_Simulation all;
+import from BSC_MS_ConnectionHandler all;
import from Osmocom_VTY_Functions all;
import from TELNETasp_PortType all;
@@ -45,7 +52,7 @@ type record MscState {
SCCP_PAR_Address sccp_addr_own
}
-type component test_CT {
+type component test_CT extends CTRL_Adapter_CT {
var MscState msc[NUM_MSC];
var BscState bsc[NUM_BSC];
@@ -62,6 +69,9 @@ modulepar {
PortNumber mp_msc_port := 5000;
charstring mp_msc_ip := "127.0.0.1";
+ /* port number to which to establish the IPA CTRL connection */
+ integer mp_nat_ctrl_port := 4250;
+ /* port number to which to establish the SCCPLite connection */
PortNumber mp_nat_port := 5000;
charstring mp_nat_ip := "127.0.0.1";
@@ -135,18 +145,21 @@ function f_init_vty(charstring id := "foo") runs on test_CT {
f_vty_transceive(BSCNATVTY, "enable");
}
-function f_init(boolean use_osmux) runs on test_CT {
+function f_init(void_fn_bsc_ms fn_bsc_ms, void_fn_bsc fn_bsc, BssmapCreateCallback cb_msc, boolean use_osmux) runs on test_CT {
var integer i;
var charstring id;
f_init_vty("VirtBSCNAT");
f_vty_allow_osmux(use_osmux);
+ f_ipa_ctrl_start(mp_nat_ip, mp_nat_ctrl_port);
for (i := 0; i < NUM_MSC; i := i+1) {
f_init_MscState(msc[i], mp_msc_pc +i, mp_bsc_pc, mp_msc_ssn, mp_bsc_ssn);
id := "MSC" & int2str(i);
msc[i].MSC := MSC_CT.create(id);
- msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i, msc[i].sccp_pars, msc[i].sccp_addr_own, id));
+ msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i,
+ msc[i].sccp_pars, msc[i].sccp_addr_own,
+ cb_msc, id));
}
/* Wait for bsc_nat to attach to MSC. Before that all BSC connections will be dropped */
@@ -156,19 +169,18 @@ function f_init(boolean use_osmux) runs on test_CT {
f_init_BscState(bsc[i], mp_bsc_pc +i, mp_msc_pc, mp_bsc_ssn, mp_msc_ssn);
id := "BSC" & int2str(i);
bsc[i].BSC := BSC_CT.create(id);
+ var BSC_MS_TestHdlrParams pars;
+ pars.sccp_addr_own := bsc[i].sccp_addr_own;
+ pars.sccp_addr_remote := bsc[i].sccp_addr_peer;
+ pars.use_osmux := use_osmux;
bsc[i].BSC.start(BSC_MS_Simulation.main(mp_nat_ip, mp_nat_port, mp_bsc_ip, mp_bsc_port+i,
- bsc[i].sccp_pars, bsc[i].sccp_addr_own,
- bsc[i].sccp_addr_peer, use_osmux, id));
+ bsc[i].sccp_pars, pars, fn_bsc_ms, fn_bsc, id));
}
}
-function f_TC_recv_dump(boolean use_osmux := false) runs on test_CT {
+function f_wait_finish(timer T) runs on test_CT {
var integer i;
- timer T := 30.0;
-
- f_init(use_osmux);
-
alt {
/* wait for BSC to stop. The idea is that the BSC components terminate first */
[] bsc[0].BSC.done { }
@@ -180,6 +192,20 @@ function f_TC_recv_dump(boolean use_osmux := false) runs on test_CT {
for (i := 0; i < NUM_MSC; i := i+1) {
msc[i].MSC.stop;
}
+ setverdict(pass);
+}
+
+
+function f_TC_recv_dump(boolean use_osmux := false) runs on test_CT {
+ timer T := 30.0;
+ T.start;
+
+ f_init(refers(bsc_ms_establish_fully),
+ refers(bsc_do_nothing),
+ refers(CreateCallback_establish_fully),
+ use_osmux);
+
+ f_wait_finish(T);
}
testcase TC_recv_dump() runs on test_CT {
@@ -190,9 +216,27 @@ testcase TC_recv_dump_osmux() runs on test_CT {
f_TC_recv_dump(true);
}
+testcase TC_ctrl_location() runs on test_CT {
+ timer T := 30.0;
+ T.start;
+
+ f_init(refers(bsc_ms_do_nothing),
+ refers(bsc_ctrl_location),
+ refers(CreateCallback_establish_fully),
+ false);
+
+ f_ctrl_exp_trap(IPA_CTRL, "net.0.bsc.0.bts.0.location-state",
+ "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01",
+ 10.0);
+ f_ctrl_set(IPA_CTRL, "net.0.bsc.0.rf_locked", "1");
+
+ f_wait_finish(T);
+}
+
control {
execute( TC_recv_dump() );
execute( TC_recv_dump_osmux() );
+ execute( TC_ctrl_location() );
}
}
diff --git a/bsc-nat/BSC_MS_ConnectionHandler.ttcn b/bsc-nat/BSC_MS_ConnectionHandler.ttcn
index f9f4db0..f011c39 100644
--- a/bsc-nat/BSC_MS_ConnectionHandler.ttcn
+++ b/bsc-nat/BSC_MS_ConnectionHandler.ttcn
@@ -25,6 +25,8 @@ import from MGCP_Types all;
import from MGCP_Templates all;
import from SDP_Types all;
+type function void_fn_bsc_ms(charstring id) runs on BSC_MS_ConnHdlr;
+
/* this component represents a single subscriber connection at the MSC.
* There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.
* We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */
@@ -34,8 +36,15 @@ type component BSC_MS_ConnHdlr extends RAN_ConnHdlr {
var MgcpConnectionId g_mgcp_conn_id;
var SDP_Message g_sdp;
var BSC_State g_state;
+ var BSC_MS_TestHdlrParams g_pars;
}
+type record BSC_MS_TestHdlrParams {
+ SCCP_PAR_Address sccp_addr_own,
+ SCCP_PAR_Address sccp_addr_remote,
+ boolean use_osmux
+};
+
/* Callback function from general RAN_Emulation whenever a new incoming
* SCCP connection arrivces. Must create + start a new component */
private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
@@ -63,7 +72,7 @@ const RanOps BSC_MS_RanOps := {
decode_dtap := false,
role_ms := true,
protocol := RAN_PROTOCOL_BSSAP,
- /* Always false. We don't want to enable Osmux signalling in SCCPLite messages: */
+ transport := BSSAP_TRANSPORT_AoIP,
use_osmux := false,
sccp_addr_local := omit,
sccp_addr_peer := omit
@@ -90,7 +99,7 @@ type enumerated BSC_State {
}
/* main function processing various incoming events */
-function main(SCCP_PAR_Address sccp_addr_own, SCCP_PAR_Address sccp_addr_remote, boolean use_osmux)
+function bsc_ms_establish_fully(charstring id)
runs on BSC_MS_ConnHdlr {
var PDU_BSSAP bssap;
var MgcpCommand mgcp_cmd;
@@ -104,8 +113,8 @@ runs on BSC_MS_ConnHdlr {
/* generate and send the Complete Layer3 Info */
bssap := f_gen_cl3('901770123456789'H);
var BSSAP_Conn_Req creq := {
- addr_peer := sccp_addr_remote,
- addr_own := sccp_addr_own,
+ addr_peer := g_pars.sccp_addr_remote,
+ addr_own := g_pars.sccp_addr_own,
bssap := bssap
}
g_state := BSC_STATE_WAIT_ASS_REQ;
@@ -130,12 +139,12 @@ runs on BSC_MS_ConnHdlr {
/* respond with CRCX_ACK */
g_state := BSC_STATE_WAIT_MDCX;
- if (use_osmux != f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {
- setverdict(fail, log2str("Received Osmux CID presence doesn't match presence expectancy (", use_osmux, ")"));
+ if (g_pars.use_osmux != f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {
+ setverdict(fail, log2str("Received Osmux CID presence doesn't match presence expectancy (", g_pars.use_osmux, ")"));
self.stop;
}
- if (use_osmux) {
+ if (g_pars.use_osmux) {
osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);
mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, g_mgcp_conn_id, osmux_cid, g_sdp);
} else {
@@ -201,4 +210,8 @@ runs on BSC_MS_ConnHdlr {
}
}
+function bsc_ms_do_nothing(charstring id)
+runs on BSC_MS_ConnHdlr {
+}
+
}
diff --git a/bsc-nat/BSC_MS_Simulation.ttcn b/bsc-nat/BSC_MS_Simulation.ttcn
index d4e37a4..0582576 100644
--- a/bsc-nat/BSC_MS_Simulation.ttcn
+++ b/bsc-nat/BSC_MS_Simulation.ttcn
@@ -10,10 +10,14 @@ module BSC_MS_Simulation {
* SPDX-License-Identifier: GPL-2.0-or-later
*/
+import from Osmocom_Types all;
import from IPL4asp_Types all;
import from IPA_Emulation all;
+import from Osmocom_CTRL_Functions all;
+import from Osmocom_CTRL_Types all;
+
import from SCCP_Types all;
import from SCCPasp_Types all;
import from SCCP_Emulation all;
@@ -23,6 +27,9 @@ import from RAN_Emulation all;
import from BSC_MS_ConnectionHandler all;
+type function void_fn_bsc(charstring id) runs on BSC_CT;
+type record of BSC_MS_ConnHdlr BSC_MS_ConnHdlrList;
+
type component BSC_CT {
/* component references */
var IPA_Emulation_CT vc_IPA;
@@ -30,10 +37,10 @@ type component BSC_CT {
var RAN_Emulation_CT vc_BSSMAP;
/* test port to SCCP emulation */
port SCCPasp_PT SCCP;
+ /* test port to SCCPLite CTRL over IPA emulation */
+ port IPA_CTRL_PT SCCPLITE_IPA_CTRL;
- var SCCP_PAR_Address g_sccp_addr_own;
- var SCCP_PAR_Address g_sccp_addr_remote;
- var boolean g_use_osmux;
+ var BSC_MS_TestHdlrParams g_pars;
var charstring g_bsc_num_str;
}
@@ -42,21 +49,58 @@ modulepar {
integer mp_num_iterations := 10;
}
+/* helper function to create and connect a BSC_MS_ConnHdlr component */
+private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
+ /* connect client BSSAP port to BSSAP dispatcher */
+ connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+}
+
+private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_CT return BSC_MS_ConnHdlr {
+ var BSC_MS_ConnHdlr vc_conn;
+ vc_conn := BSC_MS_ConnHdlr.create(id);
+ f_connect_handler(vc_conn);
+ vc_conn.start(f_handler_init(fn, id, pars));
+ return vc_conn;
+}
+
+/* first function inside ConnHdlr component; sets g_pars + starts function */
+private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_MS_ConnHdlr {
+ if (isvalue(pars)) {
+ g_pars := valueof(pars);
+ }
+ fn.apply(id);
+}
+
+function bsc_do_nothing(charstring id)
+runs on BSC_CT {
+}
+
+/* Submit a location-state TRAP BSC->BSC-NAT */
+function bsc_ctrl_location(charstring id)
+runs on BSC_CT {
+ log("Starting main of BSC_CT");
+ f_ctrl_trap(SCCPLITE_IPA_CTRL, "bts.0.location-state",
+ "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01");
+ f_ctrl_exp_set(SCCPLITE_IPA_CTRL, "rf_locked", "1", "1");
+ /* Leave some time for SET_REPLY to reach the other side before closing
+ conn towards BSC-NAT, otherwise TCP FIN is sent before SET_REPLY and
+ bsc-nat sends a CTRL ERR to whoever sent the SET cmd. */
+ f_sleep(1.0);
+}
+
function main(charstring remote_ip, PortNumber remote_port,
charstring local_ip, PortNumber local_port,
MSC_SCCP_MTP3_parameters sccp_pars,
- SCCP_PAR_Address sccp_addr_own,
- SCCP_PAR_Address sccp_addr_remote,
- boolean use_osmux, charstring id) runs on BSC_CT
+ BSC_MS_TestHdlrParams pars,
+ void_fn_bsc_ms fn_bsc_ms, void_fn_bsc fn_bsc, charstring id) runs on BSC_CT
{
var integer i := 0;
- timer T := 1.0;
+ timer T := 2.0;
var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
ccm_pars.name := id;
-
- g_sccp_addr_own := sccp_addr_own;
- g_sccp_addr_remote := sccp_addr_remote;
- g_use_osmux := use_osmux;
+ g_pars := pars;
/* create components for IPA/SCCP/BSS[M]AP stack */
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
@@ -73,6 +117,11 @@ function main(charstring remote_ip, PortNumber remote_port,
/* connect BSSMAP dispatcher to IPA_Emulation MGCP */
connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);
+ /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
+ connect(vc_BSSMAP:CTRL, vc_IPA:IPA_CTRL_PORT);
+
+ /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
+ connect(self:SCCPLITE_IPA_CTRL, vc_BSSMAP:CTRL_CLIENT);
/* start components */
vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
@@ -80,11 +129,24 @@ function main(charstring remote_ip, PortNumber remote_port,
vc_BSSMAP.start(RAN_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_RanOps, id));
/* Initial delay to wait for IPA connection establishment */
- T.start(2.0);
- T.timeout;
+ T.start;
+ alt {
+ [] SCCPLITE_IPA_CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
+ [] T.timeout {
+ setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
+ mtc.stop;
+ }
+ }
+
+ var BSC_MS_ConnHdlrList vc_conns;
+ for (i := 0; i < mp_num_iterations; i := i+1) {
+ vc_conns[i] := f_start_handler(fn_bsc_ms, id & "-MS-" & int2str(i), g_pars);
+ }
+
+ fn_bsc.apply(id);
for (i := 0; i < mp_num_iterations; i := i+1) {
- f_start_BSC_MS(id & "-MS-" & int2str(i));
+ vc_conns[i].done;
}
/* explicitly stop all components that we started above */
@@ -93,18 +155,4 @@ function main(charstring remote_ip, PortNumber remote_port,
vc_SCCP.stop;
}
-function f_start_BSC_MS(charstring id) runs on BSC_CT {
- var BSC_MS_ConnHdlr vc_conn;
-
- /* start new component */
- vc_conn := BSC_MS_ConnHdlr.create(id);
- /* connect client BSSAP port to BSSAP dispatcher */
- connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
- /* start component */
- vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote, g_use_osmux));
- /* blocking wait until component terminates. If you want to start MSs in parallel,
- * you have to remove this statement here */
- vc_conn.done;
-}
-
}
diff --git a/bsc-nat/MSC_ConnectionHandler.ttcn b/bsc-nat/MSC_ConnectionHandler.ttcn
index 89728b4..e4d3816 100644
--- a/bsc-nat/MSC_ConnectionHandler.ttcn
+++ b/bsc-nat/MSC_ConnectionHandler.ttcn
@@ -21,6 +21,8 @@ import from MGCP_Types all;
import from MGCP_Templates all;
import from SDP_Types all;
+type function void_fn_msc(charstring id) runs on MSC_ConnHdlr;
+
/* this component represents a single subscriber connection at the MSC.
* There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.
* We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */
@@ -32,24 +34,38 @@ type component MSC_ConnHdlr extends RAN_ConnHdlr {
var MgcpEndpoint g_ep_name;
var MgcpCallId g_call_id;
var MgcpConnectionId g_mgcp_conn_id;
+ var MSC_TestHdlrParams g_pars;
}
-/* Callback function from general BSSMAP_Emulation whenever a new incoming
- * SCCP connection arrivces. Must create + start a new component */
-private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)
-runs on RAN_Emulation_CT return RAN_ConnHdlr {
- var MSC_ConnHdlr vc_conn;
- /* Create a new RAN_ConnHdlr component */
- vc_conn := MSC_ConnHdlr.create(g_ran_id & "-Conn-" & int2str(conn_ind.connectionId));
- /* connect it to the port */
+type record MSC_TestHdlrParams {
+ integer connection_id,
+ integer e1_timeslot
+};
+
+/* helper function to create and connect a MSC_ConnHdlr component */
+private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on RAN_Emulation_CT {
+ /* connect client BSSAP port to BSSAP dispatcher */
connect(vc_conn:BSSAP, self:CLIENT);
- /* start it */
- vc_conn.start(MSC_ConnectionHandler.main(conn_ind.connectionId, g_next_e1_ts));
- /* increment next E1 timeslot */
- g_next_e1_ts := g_next_e1_ts + 1;
+}
+
+private function f_msc_start_handler(void_fn_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit)
+runs on RAN_Emulation_CT return MSC_ConnHdlr {
+ var MSC_ConnHdlr vc_conn;
+ vc_conn := MSC_ConnHdlr.create(id);
+ f_connect_handler(vc_conn);
+ vc_conn.start(f_handler_init(fn, id, pars));
return vc_conn;
}
+/* first function inside ConnHdlr component; sets g_pars + starts function */
+private function f_handler_init(void_fn_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit)
+runs on MSC_ConnHdlr {
+ if (isvalue(pars)) {
+ g_pars := valueof(pars);
+ }
+ fn.apply(id);
+}
+
/* Callback function from general BSSMAP_Emulation whenever a connectionless
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
private function UnitdataCallback(PDU_BSSAP bssap)
@@ -63,12 +79,30 @@ runs on RAN_Emulation_CT return template PDU_BSSAP {
return resp;
}
+/* Callback function from general BSSMAP_Emulation whenever a new incoming
+ * SCCP connection arrivces. Must create + start a new component */
+private function CreateCallback_generic(void_fn_msc fn, BSSAP_N_CONNECT_ind conn_ind, charstring id)
+runs on RAN_Emulation_CT return RAN_ConnHdlr {
+ var MSC_ConnHdlr vc_conn;
+ var MSC_TestHdlrParams pars;
+ pars.connection_id := conn_ind.connectionId;
+ pars.e1_timeslot := g_next_e1_ts;
+
+ /* Create a new RAN_ConnHdlr component */
+ vc_conn := f_msc_start_handler(fn, g_ran_id & "-Conn-" & int2str(conn_ind.connectionId), pars);
+
+ /* increment next E1 timeslot */
+ g_next_e1_ts := g_next_e1_ts + 1;
+ return vc_conn;
+}
+
const RanOps MSC_RanOps := {
- create_cb := refers(CreateCallback),
+ create_cb := omit,
unitdata_cb := refers(UnitdataCallback),
decode_dtap := false,
role_ms := false,
protocol := RAN_PROTOCOL_BSSAP,
+ transport := BSSAP_TRANSPORT_AoIP,
use_osmux := false,
sccp_addr_local := omit,
sccp_addr_peer := omit
@@ -83,14 +117,20 @@ type enumerated MSC_State {
MSC_STATE_WAIT_DLCX_ACK
}
+/* Callback function from general BSSMAP_Emulation whenever a new incoming
+ * SCCP connection arrivces. Must create + start a new component */
+function CreateCallback_establish_fully(BSSAP_N_CONNECT_ind conn_ind, charstring id)
+runs on RAN_Emulation_CT return RAN_ConnHdlr {
+ return CreateCallback_generic(refers(f_msc_establish_fully), conn_ind, id);
+}
/* main function processing various incoming events */
-function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr {
+function f_msc_establish_fully(charstring id) runs on MSC_ConnHdlr {
var MgcpResponse mgcp_rsp;
timer T := 5.0;
- g_sccp_conn_id := connection_id;
+ g_sccp_conn_id := g_pars.connection_id;
g_call_id := f_mgcp_alloc_call_id();
- g_ep_name := hex2str(int2hex(e1_timeslot, 1)) & "@mgw";
+ g_ep_name := hex2str(int2hex(g_pars.e1_timeslot, 1)) & "@mgw";
/* we just accepted an incoming SCCP connection, start guard timer */
T.start;
@@ -102,7 +142,7 @@ function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr {
[g_state == MSC_STATE_NONE] BSSAP.receive(tr_BSSMAP_ComplL3) -> value bssap {
/* respond with ASSIGNMENT CMD */
g_state := MSC_STATE_WAIT_ASS_COMPL;
- BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, e1_timeslot)));
+ BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, g_pars.e1_timeslot)));
}
[g_state == MSC_STATE_WAIT_ASS_COMPL] BSSAP.receive(tr_BSSMAP_AssignmentComplete(?,*)) {
/* FIXME: Send MGCP CRCX */
diff --git a/bsc-nat/MSC_Simulation.ttcn b/bsc-nat/MSC_Simulation.ttcn
index bc47f89..14229cc 100755
--- a/bsc-nat/MSC_Simulation.ttcn
+++ b/bsc-nat/MSC_Simulation.ttcn
@@ -38,7 +38,8 @@ modulepar {
function main(charstring local_ip, PortNumber local_port,
MSC_SCCP_MTP3_parameters sccp_pars,
- SCCP_PAR_Address sccp_addr_own, charstring id) runs on MSC_CT
+ SCCP_PAR_Address sccp_addr_own,
+ BssmapCreateCallback cb, charstring id) runs on MSC_CT
{
/* create components */
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
@@ -64,7 +65,10 @@ function main(charstring local_ip, PortNumber local_port,
vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));
vc_SCCP.start(SCCPStart(sccp_pars));
- vc_BSSMAP.start(RAN_Emulation.main(MSC_ConnectionHandler.MSC_RanOps, id & "-BSSMAP"));
+
+ var RanOps ranops := MSC_ConnectionHandler.MSC_RanOps;
+ ranops.create_cb := cb;
+ vc_BSSMAP.start(RAN_Emulation.main(ranops, id & "-BSSMAP"));
/* wait until termination of respective components */
vc_IPA.done;
diff --git a/bsc-nat/gen_links.sh b/bsc-nat/gen_links.sh
index 01d4c7b..5da9d4e 100755
--- a/bsc-nat/gen_links.sh
+++ b/bsc-nat/gen_links.sh
@@ -52,7 +52,7 @@ FILES="RTP_EncDec.cc RTP_Types.ttcn"
gen_links $DIR $FILES
DIR=../library
-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_VTY_Functions.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn"
+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn Osmocom_VTY_Functions.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn BSSAP_CodecPort.ttcn"
gen_links $DIR $FILES
ignore_pp_results
diff --git a/bsc-nat/regen_makefile.sh b/bsc-nat/regen_makefile.sh
index 0f3cfab..c9d744e 100755
--- a/bsc-nat/regen_makefile.sh
+++ b/bsc-nat/regen_makefile.sh
@@ -4,6 +4,6 @@ MAIN=BSCNAT_Tests.ttcn
FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc RTP_EncDec.cc SDP_EncDec.cc *.c MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc"
-export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"
+export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP -DIPA_EMULATION_CTRL -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_CTRL -DUSE_MTP3_DISTRIBUTOR"
../regen-makefile.sh $MAIN $FILES
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index a84277f..327326d 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -38,6 +38,7 @@ import from RSL_Emulation all;
import from MGCP_Emulation all;
import from MGCP_Templates all;
import from MGCP_Types all;
+import from MGCP_CodecPort all;
import from Osmocom_CTRL_Functions all;
import from Osmocom_CTRL_Types all;
@@ -80,6 +81,8 @@ type component test_CT extends CTRL_Adapter_CT {
/* array of per-BTS RSL test ports */
port IPA_RSL_PT IPA_RSL[NUM_BTS];
port IPA_CODEC_PT IPA; /* Required for compilation of TC_rsl_unknown_unit_id() */
+ /* CTRL muxed over IPA in SCCPlite conn BSC<->MSC (or BSC-NAT) */
+ port IPA_CTRL_PT SCCPLITE_IPA_CTRL;
var MGCP_Emulation_CT vc_MGCP;
port TELNETasp_PT BSCVTY;
@@ -292,7 +295,10 @@ function f_init_mgcp(charstring id) runs on test_CT {
callagent_ip := mp_bsc_ip,
callagent_udp_port := -1,
mgw_ip := mp_test_ip,
- mgw_udp_port := 2427
+ mgw_udp_port := 2427,
+ /* Enable it for SCCPlite, since we have 2 MGCP sockets towards MGW (UDP one +
+ the on with MGCP over IPA forwarded from MSC one) */
+ multi_conn_mode := (mp_bssap_cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER)
};
vc_MGCP := MGCP_Emulation_CT.create(id);
@@ -350,6 +356,7 @@ function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false, boolea
var RanOps ranops := MSC_RanOps;
ranops.use_osmux := g_osmux_enabled;
f_ran_adapter_init(g_bssap, mp_bssap_cfg, "VirtMSC", ranops);
+ connect(self:SCCPLITE_IPA_CTRL, g_bssap.vc_RAN:CTRL_CLIENT);
f_ran_adapter_start(g_bssap);
} else {
f_ran_adapter_init(g_bssap, mp_bssap_cfg, "VirtMSC", omit);
@@ -650,11 +657,7 @@ function f_gen_ass_req(boolean osmux_enabled := false) return PDU_BSSAP {
}
} else {
var BSSMAP_IE_CircuitIdentityCode cic := valueof(ts_BSSMAP_IE_CIC(0,1));
- if (osmux_enabled) {
- ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit, osmux_cid));
- } else {
- ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit));
- }
+ ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit));
}
return ass_cmd;
}
@@ -684,11 +687,7 @@ function f_gen_exp_compl(boolean expect_osmux := false) return template PDU_BSSA
}
} else {
/* CIC is optional "*" as the MSC allocated it */
- if (expect_osmux) {
- exp_compl := tr_BSSMAP_AssignmentComplete(*, omit, osmux_cid);
- } else {
- exp_compl := tr_BSSMAP_AssignmentComplete(*, omit);
- }
+ exp_compl := tr_BSSMAP_AssignmentComplete(*, omit);
}
return exp_compl;
}
@@ -1212,6 +1211,32 @@ testcase TC_ctrl() runs on test_CT {
setverdict(pass);
}
+/* Verify that Upon receival of SET "location", BSC forwards a TRAP
+ "location-state" over the SCCPlite IPA conn */
+testcase TC_ctrl_location() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ var integer bts_nr := 0;
+
+ f_init(1, true);
+ f_sleep(1.0);
+
+ f_ctrl_set_bts(IPA_CTRL, bts_nr, "location", "1234567,fix3d,0.340000,0.560000,0.780000");
+ f_ctrl_exp_trap(SCCPLITE_IPA_CTRL, "bts." & int2str(bts_nr) & ".location-state",
+ "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01");
+
+ f_ctrl_set(SCCPLITE_IPA_CTRL, "rf_locked", "1");
+ f_sleep(2.0);
+
+ f_ctrl_set_bts(IPA_CTRL, bts_nr, "location", "1234888,fix3d,0.350000,0.570000,0.790000");
+ f_ctrl_exp_trap(SCCPLITE_IPA_CTRL, "bts." & int2str(bts_nr) & ".location-state",
+ "1234888,fix3d,0.350000,0.570000,0.790000,operational,locked,off,001,01");
+
+ /* should match the one from config */
+ f_ctrl_set(SCCPLITE_IPA_CTRL, "rf_locked", "0");
+
+ setverdict(pass);
+}
+
function f_bssap_tx_ud(template PDU_BSSAP bssap) runs on test_CT {
BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, bssap));
}
@@ -1271,7 +1296,7 @@ private function f_pageing_helper(hexstring imsi,
f_bssap_tx_ud(ts_BSSMAP_Paging(imsi, cid_list, tmsi, bssmap_chneed));
-/* FIXME: Disabled due to bugs in both GSM_RR_Types and MobileL3_CommonIE_Types IMSI encoder
+/* FIXME: Disabled due to bugs in both GSM_RR_Types and MobileL3_CommonIE_Types IMSI encoder
if (isvalue(tmsi)) {
mi := valueof(t_Osmo_MI_TMSI(oct2int(valueof(tmsi))));
} else {
@@ -1579,17 +1604,22 @@ testcase TC_paging_imsi_a_reset() runs on test_CT {
f_shutdown_helper();
}
-/* Verify how we handle unsolicited Paging Response, for instance because we
- * receive a Paging Response after T3113 expired (and subscriber information was
- * dropped). See OS#3680.
+/* Verify how we handle unsolicited Paging Response. In case of an unsolicit
+ * paging response we can not know which MSC is in charge, so we will blindly
+ * pick the first configured MSC. This behavior is required in order to make
+ * MT-CSFB calls working because in those cases the BSC can not know that the
+ * MSC has already paged the subscriver via SGs. So any MT-CSFB call will look
+ * like an unsolicited Paging Response to the MSC.
*/
testcase TC_paging_resp_unsol() runs on test_CT {
f_init(1);
+ timer T := 5.0;
var BSSAP_N_CONNECT_ind rx_c_ind;
var DchanTuple dt;
var PDU_ML3_MS_NW l3 := valueof(ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010008880018'H))));
+ var octetstring rr_pag_resp := enc_PDU_ML3_MS_NW(l3);
/* Send CHAN RQD and wait for allocation; acknowledge it */
dt.rsl_chan_nr := f_chreq_act_ack();
@@ -1597,10 +1627,22 @@ testcase TC_paging_resp_unsol() runs on test_CT {
/* Send unsolicited Paging response (no matching Paging CMD stored in BSC) */
f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), enc_PDU_ML3_MS_NW(l3)));
- /* expect BSC to disable the channel */
- f_expect_chan_rel(0, dt.rsl_chan_nr, expect_rll_rel_req := false);
- setverdict(pass);
+ /* Expevct a CR with a matching Paging response on the A-Interface */
+ T.start;
+ alt {
+ [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(rr_pag_resp))) {
+ setverdict(pass);
+ }
+ [] BSSAP.receive {
+ setverdict(fail, "Received unexpected message on A-Interface!");
+ }
+ [] T.timeout {
+ setverdict(fail, "Received nothing on A-Interface!");
+ }
+ }
+
+ setverdict(pass);
}
/* Test RSL link drop causes counter increment */
@@ -1694,8 +1736,13 @@ private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on test_CT {
connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
}
+ if (isvalue(bts[2])) {
+ connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);
+ connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);
+ }
connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);
connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
+ connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);
}
function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit)
@@ -2811,6 +2858,11 @@ runs on MSC_ConnHdlr {
f_vty_transceive(BSCVTY, cmd & suffix);
}
+/* Even though the VTY command to trigger handover takes a new BTS number as argument, behind the scenes osmo-bsc always
+ * translates that to a target ARFCN+BSIC first. See bsc_vty.c trigger_ho_or_as(), which puts the selected BTS' neighbor
+ * ident key (ARFCN + BSIC) in the struct passed on to handover_request(). handover_start() then resolves that to a
+ * viable actual neighbor cell. So from the internal osmo-bsc perspective, we always request handover to an ARFCN + BSIC
+ * pair, not really to a specific BTS number. */
private function f_vty_handover(integer bts_nr, integer trx_nr, RslChannelNr chan_nr,
integer new_bts_nr)
runs on MSC_ConnHdlr {
@@ -2828,6 +2880,7 @@ private function f_tc_ho_int(charstring id) runs on MSC_ConnHdlr {
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
f_establish_fully(ass_cmd, exp_compl);
+ f_bts_0_cfg({"neighbor bts 1"});
var HandoverState hs := {
rr_ho_cmpl_seen := false,
@@ -2866,6 +2919,40 @@ testcase TC_ho_int() runs on test_CT {
vc_conn.done;
}
+/* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
+private function f_expect_dlcx_conns() runs on MSC_ConnHdlr {
+ var MgcpCommand mgcp;
+ var template MgcpResponse mgcp_resp;
+ var MGCP_RecvFrom mrf;
+ var template MgcpMessage msg_resp;
+ var template MgcpMessage msg_dlcx := {
+ command := tr_DLCX()
+ }
+
+ if (g_pars.aoip) {
+ MGCP.receive(tr_DLCX()) -> value mgcp {
+ log("Got first DLCX: ", mgcp);
+ MGCP.send(ts_DLCX_ACK2(mgcp.line.trans_id));
+ };
+
+ MGCP.receive(tr_DLCX()) -> value mgcp {
+ log("Got second DLCX: ", mgcp);
+ MGCP.send(ts_DLCX_ACK2(mgcp.line.trans_id));
+ };
+ } else {
+ /* For SCCPLite, BSC doesn't handle the MSC-side */
+ MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_dlcx)) -> value mrf {
+ log("Got first DLCX: ", mrf.msg.command);
+ msg_resp := {
+ response := ts_DLCX_ACK2(mrf.msg.command.line.trans_id)
+ }
+ MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));
+ };
+ }
+
+ BSSAP.receive(tr_BSSMAP_ClearComplete);
+}
+
private function f_tc_ho_out_of_this_bsc(charstring id) runs on MSC_ConnHdlr {
g_pars := f_gen_test_hdlr_pars();
@@ -2875,6 +2962,7 @@ private function f_tc_ho_out_of_this_bsc(charstring id) runs on MSC_ConnHdlr {
var template PDU_BSSAP exp_compl := f_gen_exp_compl();
f_establish_fully(ass_req, exp_compl);
+ f_bts_0_cfg({"neighbor lac 99 arfcn 123 bsic any"});
f_vty_transceive(BSCVTY, "handover any to arfcn 123 bsic any");
BSSAP.receive(tr_BSSMAP_HandoverRequired);
@@ -2916,17 +3004,7 @@ private function f_tc_ho_out_of_this_bsc(charstring id) runs on MSC_ConnHdlr {
var BssmapCause cause := enum2int(cause_val);
BSSAP.send(ts_BSSMAP_ClearCommand(cause));
- /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
- var MgcpCommand mgcp;
- interleave {
- [] BSSAP.receive(tr_BSSMAP_ClearComplete);
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
- }
+ f_expect_dlcx_conns();
setverdict(pass);
f_sleep(1.0);
}
@@ -2951,6 +3029,7 @@ private function f_tc_ho_out_fail_no_msc_response(charstring id) runs on MSC_Con
var template PDU_BSSAP exp_compl := f_gen_exp_compl();
f_establish_fully(ass_req, exp_compl);
+ f_bts_0_cfg({"neighbor lac 99 arfcn 123 bsic any"});
f_vty_transceive(BSCVTY, "handover any to arfcn 123 bsic any");
BSSAP.receive(tr_BSSMAP_HandoverRequired);
@@ -2997,6 +3076,7 @@ private function f_tc_ho_out_fail_rr_ho_failure(charstring id) runs on MSC_ConnH
var template PDU_BSSAP exp_compl := f_gen_exp_compl();
f_establish_fully(ass_req, exp_compl);
+ f_bts_0_cfg({"neighbor lac 99 arfcn 123 bsic any"});
f_vty_transceive(BSCVTY, "handover any to arfcn 123 bsic any");
BSSAP.receive(tr_BSSMAP_HandoverRequired);
@@ -3069,9 +3149,10 @@ testcase TC_ho_out_fail_rr_ho_failure() runs on test_CT {
vc_conn.done;
}
-/* BSC asks for inter-BSC HO, receives BSSMAP Handover Command, but MS reports
- * RR Handover Failure. */
-private function f_tc_ho_out_fail_no_ho_detect(charstring id) runs on MSC_ConnHdlr {
+/* BSC asks for inter-BSC-out HO, receives BSSMAP Handover Command, but then no reply is received about HO outcome
+ * (neither BSSMAP Clear Command for success nor RR Handover Failure). 48.008 3.1.5.3.3 "Abnormal Conditions" applies
+ * and the lchan is released. */
+private function f_tc_ho_out_fail_no_result_after_ho_cmd(charstring id) runs on MSC_ConnHdlr {
g_pars := f_gen_test_hdlr_pars();
var PDU_BSSAP ass_req := f_gen_ass_req();
@@ -3080,6 +3161,7 @@ private function f_tc_ho_out_fail_no_ho_detect(charstring id) runs on MSC_ConnHd
var template PDU_BSSAP exp_compl := f_gen_exp_compl();
f_establish_fully(ass_req, exp_compl);
+ f_bts_0_cfg({"neighbor lac 99 arfcn 123 bsic any"});
f_vty_transceive(BSCVTY, "handover any to arfcn 123 bsic any");
BSSAP.receive(tr_BSSMAP_HandoverRequired);
@@ -3114,9 +3196,16 @@ private function f_tc_ho_out_fail_no_ho_detect(charstring id) runs on MSC_ConnHd
}
}
- /* The MS never shows up on the remote BSS. Eventually the BSC times
- * out and we run into 3GPP TS 48.008 3.1.5.3.3 "Abnormal Conditions":
- * RR should be released and Clear Request should go to the MSC. */
+ /* We get neither success nor failure report from the remote BSS. Eventually T8 times out and we run into 3GPP
+ * TS 48.008 3.1.5.3.3 "Abnormal Conditions": Clear Request should go to the MSC, and RR should be released
+ * after Clear Command */
+
+ var PDU_BSSAP rx_clear_request;
+ BSSAP.receive(tr_BSSMAP_ClearRequest) -> value rx_clear_request;
+ log("Got BSSMAP Clear Request");
+ /* Instruct BSC to clear channel */
+ var BssmapCause cause := bit2int(rx_clear_request.pdu.bssmap.clearRequest.cause.causeValue);
+ BSSAP.send(ts_BSSMAP_ClearCommand(cause));
var MgcpCommand mgcp;
interleave {
@@ -3130,27 +3219,20 @@ private function f_tc_ho_out_fail_no_ho_detect(charstring id) runs on MSC_ConnHd
log("Got RF Chan Rel");
RSL.send(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr));
}
- [] BSSAP.receive(tr_BSSMAP_ClearRequest) {
- log("Got BSSMAP Clear Request");
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
}
+ f_expect_dlcx_conns();
+
setverdict(pass);
f_sleep(1.0);
}
-testcase TC_ho_out_fail_no_ho_detect() runs on test_CT {
+testcase TC_ho_out_fail_no_result_after_ho_cmd() runs on test_CT {
var MSC_ConnHdlr vc_conn;
f_init(1, true);
f_sleep(1.0);
- vc_conn := f_start_handler(refers(f_tc_ho_out_fail_no_ho_detect));
+ vc_conn := f_start_handler(refers(f_tc_ho_out_fail_no_result_after_ho_cmd));
vc_conn.done;
}
@@ -3179,7 +3261,7 @@ private function f_tc_ho_into_this_bsc(charstring id) runs on MSC_ConnHdlr {
var octetstring ho_command_str;
BSSAP.receive(tr_BSSMAP_HandoverRequestAcknowledge(?)) -> value rx_bssap;
-
+
ho_command_str := rx_bssap.pdu.bssmap.handoverRequestAck.layer3Information.layer3info;
log("Received L3 Info in HO Request Ack: ", ho_command_str);
var PDU_ML3_NW_MS ho_command := dec_PDU_ML3_NW_MS(ho_command_str);
@@ -3284,17 +3366,7 @@ private function f_tc_ho_in_fail_msc_clears(charstring id) runs on MSC_ConnHdlr
var BssmapCause cause := enum2int(cause_val);
BSSAP.send(ts_BSSMAP_ClearCommand(cause));
- /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
- var MgcpCommand mgcp;
- interleave {
- [] BSSAP.receive(tr_BSSMAP_ClearComplete);
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
- }
+ f_expect_dlcx_conns();
setverdict(pass);
f_sleep(1.0);
@@ -3376,17 +3448,7 @@ private function f_tc_ho_in_fail_msc_clears_after_ho_detect(charstring id) runs
var BssmapCause cause := enum2int(cause_val);
BSSAP.send(ts_BSSMAP_ClearCommand(cause));
- /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
- var MgcpCommand mgcp;
- interleave {
- [] BSSAP.receive(tr_BSSMAP_ClearComplete);
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
- }
+ f_expect_dlcx_conns();
setverdict(pass);
f_sleep(1.0);
}
@@ -3465,17 +3527,7 @@ private function f_tc_ho_in_fail_no_detect(charstring id) runs on MSC_ConnHdlr {
var BssmapCause cause := enum2int(cause_val);
BSSAP.send(ts_BSSMAP_ClearCommand(cause));
- /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
- var MgcpCommand mgcp;
- interleave {
- [] BSSAP.receive(tr_BSSMAP_ClearComplete);
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
- }
+ f_expect_dlcx_conns();
setverdict(pass);
f_sleep(1.0);
@@ -3542,24 +3594,13 @@ private function f_tc_ho_in_fail_no_detect2(charstring id) runs on MSC_ConnHdlr
BSSAP.receive(tr_BSSMAP_HandoverFailure);
/* MSC plays dumb and sends no Clear Command */
-
- /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */
var PDU_BSSAP rx_clear_request;
- var MgcpCommand mgcp;
- interleave {
- [] BSSAP.receive(tr_BSSMAP_ClearRequest) -> value rx_clear_request {
+
+ BSSAP.receive(tr_BSSMAP_ClearRequest) -> value rx_clear_request {
var BssmapCause cause := bit2int(rx_clear_request.pdu.bssmap.clearRequest.cause.causeValue);
BSSAP.send(ts_BSSMAP_ClearCommand(cause));
};
- [] BSSAP.receive(tr_BSSMAP_ClearComplete);
-
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got first DLCX: ", mgcp);
- }
- [] MGCP.receive(tr_DLCX()) -> value mgcp {
- log("Got second DLCX: ", mgcp);
- }
- }
+ f_expect_dlcx_conns();
setverdict(pass);
f_sleep(1.0);
}
@@ -3577,6 +3618,353 @@ testcase TC_ho_in_fail_no_detect2() runs on test_CT {
vc_conn.done;
}
+type record of charstring Commands;
+
+private function f_bts_0_cfg(Commands cmds := {}) runs on MSC_ConnHdlr
+{
+ f_vty_enter_cfg_bts(BSCVTY, 0);
+ for (var integer i := 0; i < sizeof(cmds); i := i+1) {
+ f_vty_transceive(BSCVTY, cmds[i]);
+ }
+ f_vty_transceive(BSCVTY, "end");
+}
+
+private function f_probe_for_handover(charstring log_label,
+ charstring log_descr,
+ charstring handover_vty_cmd,
+ boolean expect_handover,
+ boolean is_inter_bsc_handover := false)
+runs on MSC_ConnHdlr
+{
+ var RSL_Message rsl;
+
+ var charstring log_msg := " (expecting handover)"
+ if (not expect_handover) {
+ log_msg := " (expecting NO handover)";
+ }
+ log("f_probe_for_handover starting: " & log_label & ": " & log_descr & log_msg);
+ f_vty_transceive(BSCVTY, handover_vty_cmd);
+
+ /* We're going to thwart any and all handover attempts, just be ready to handle (and ignore) handover target
+ * lchans to be established on bts 1 or bts 2. */
+ f_rslem_suspend(RSL1_PROC);
+ f_rslem_suspend(RSL2_PROC);
+
+ timer T := 2.0;
+ T.start;
+
+ alt {
+ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {
+ var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);
+ log("Rx L3 from net: ", l3);
+ if (ischosen(l3.msgs.rrm.handoverCommand)) {
+ var RslChannelNr new_chan_nr;
+ var GsmArfcn arfcn;
+ f_ChDesc2RslChanNr(l3.msgs.rrm.handoverCommand.channelDescription2,
+ new_chan_nr, arfcn);
+ log("Handover to new chan ", new_chan_nr, " on ARFCN ", arfcn);
+ log(l3.msgs.rrm.handoverCommand);
+
+ /* Need to register for new lchan on new BTS -- it's either bts 1 or bts 2. It doesn't really
+ * matter on which BTS it really is, we're not going to follow through an entire handover
+ * anyway. */
+ f_rslem_register(0, new_chan_nr, RSL1_PROC);
+ f_rslem_resume(RSL1_PROC);
+ f_rslem_register(0, new_chan_nr, RSL2_PROC);
+ f_rslem_resume(RSL2_PROC);
+
+ if (expect_handover and not is_inter_bsc_handover) {
+ setverdict(pass);
+ log("f_probe_for_handover(" & log_label & "): Got RSL Handover Command as expected.");
+ } else {
+ setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected none, but got RSL Handover Command. "
+ & log_label & ": " & log_descr);
+ }
+
+ log("f_probe_for_handover(" & log_label & "): Ending the test: Handover Failure stops the procedure.");
+ /* osmo-bsc has triggered Handover. That's all we need to know for this test, reply with
+ * Handover Failure. */
+ f_rsl_send_l3(ts_RRM_HandoverFailure('00'O));
+
+ /* target BTS is told to release lchan again; don't care which BTS nor what messages. */
+ f_sleep(0.5);
+ RSL1.clear;
+ RSL2.clear;
+ log("f_probe_for_handover(" & log_label & "): done (got RSL Handover Command)");
+ break;
+ } else {
+ repeat;
+ }
+ }
+ [] BSSAP.receive(tr_BSSMAP_HandoverRequired) {
+ if (expect_handover and is_inter_bsc_handover) {
+ setverdict(pass);
+ log("f_probe_for_handover(" & log_label & "): Got BSSMAP Handover Required as expected.");
+ } else {
+ setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected none, but got BSSMAP Handover Required. "
+ & log_label & ": " & log_descr);
+ }
+
+ log("f_probe_for_handover(" & log_label & "): done (got BSSMAP Handover Required)");
+
+ /* Note: f_tc_ho_neighbor_config_start() sets T7, the timeout for BSSMAP Handover Required, to
+ * 1 second. There is no legal way to quickly abort a handover after a BSSMAP Handover Required,
+ * setting a short timeout and waiting is the only way. */
+ log("f_probe_for_handover(" & log_label & "): waiting for inter-BSC HO to time out...");
+ f_sleep(1.5);
+ log("f_probe_for_handover(" & log_label & "): ...done");
+
+ break;
+ }
+ [] T.timeout {
+ if (expect_handover) {
+ setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected Handover, but got none. "
+ & log_label & ": " & log_descr);
+ } else {
+ setverdict(pass);
+ log("f_probe_for_handover(" & log_label & "): Got no Handover, as expected.");
+ }
+ log("f_probe_for_handover(" & log_label & "): done (got no Handover)");
+ break;
+ }
+ }
+
+ f_rslem_resume(RSL1_PROC);
+ f_rslem_resume(RSL2_PROC);
+ f_sleep(3.0);
+ RSL.clear;
+
+ log("f_probe_for_handover(" & log_label & "): done clearing");
+}
+
+/* Test the effect of various neighbor configuration scenarios:
+ *
+ * To avoid complexity, block off any actual handover operation, and always remain on the lchan at bts 0.
+ * Reconfigure the neighbors for bts 0, trigger a Handover, and probe whether osmo-bsc does or doesn't start HO.
+ */
+private function f_tc_ho_neighbor_config_start() runs on MSC_ConnHdlr {
+ g_pars := f_gen_test_hdlr_pars();
+ var template PDU_BSSAP exp_compl := f_gen_exp_compl();
+ var PDU_BSSAP ass_cmd := f_gen_ass_req();
+ const OCT8 kc := '0001020304050607'O;
+
+ ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+ ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
+
+ /* Establish lchan at bts 0 */
+ f_establish_fully(ass_cmd, exp_compl);
+
+ /* Shorten the inter-BSC Handover timeout, to not wait so long for inter-BSC Handovers */
+ f_vty_enter_cfg_network(BSCVTY);
+ f_vty_transceive(BSCVTY, "timer T7 1");
+ f_vty_transceive(BSCVTY, "end");
+}
+
+private function f_tc_ho_neighbor_config_1(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 1. No 'neighbor' config");
+ f_bts_0_cfg({"no neighbors"});
+ f_probe_for_handover("1.a", "HO to bts 1 works, implicitly listed as neighbor (legacy behavior when none are configured)",
+ "handover any to arfcn 871 bsic 11",
+ true);
+
+ f_probe_for_handover("1.b", "HO to unknown cell does not start",
+ "handover any to arfcn 13 bsic 39",
+ false);
+
+ f_probe_for_handover("1.c", "HO to 871-12 is ambiguous = error",
+ "handover any to arfcn 871 bsic 12",
+ false);
+
+ f_probe_for_handover("1.d", "HO to 871-11 still works (verify that this test properly cleans up)",
+ "handover any to arfcn 871 bsic 11",
+ true);
+}
+private function f_tc_ho_neighbor_config_2(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 2. explicit local neighbor: 'neighbor bts 1'");
+ f_bts_0_cfg({"neighbor bts 1"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("2.a", "HO to bts 1 works, explicitly listed as neighbor",
+ "handover any to arfcn 871 bsic 11",
+ true);
+
+ f_probe_for_handover("2.b", "HO to bts 2 doesn't work, not listed as neighbor",
+ "handover any to arfcn 871 bsic 12",
+ false);
+}
+private function f_tc_ho_neighbor_config_3(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 3. explicit local neighbor: 'neighbor bts 2'");
+ f_bts_0_cfg({"no neighbors", "neighbor bts 2"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("3.a", "HO to bts 1 doesn't work, not listed as neighbor",
+ "handover any to arfcn 871 bsic 11",
+ false);
+ f_probe_for_handover("3.b", "HO to bts 2 works, explicitly listed as neighbor; no ambiguity because bts 3 is not listed as neighbor",
+ "handover any to arfcn 871 bsic 12",
+ true);
+}
+private function f_tc_ho_neighbor_config_4(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 4. explicit remote neighbor: 'neighbor lac 99 arfcn 123 bsic 45'");
+ f_bts_0_cfg({"no neighbors", "neighbor lac 99 arfcn 123 bsic 45"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("4.a", "HO to bts 1 doesn't work, not listed as neighbor",
+ "handover any to arfcn 871 bsic 11",
+ false);
+ f_probe_for_handover("4.b", "HO to bts 2 doesn't work, not listed as neighbor",
+ "handover any to arfcn 871 bsic 12",
+ false);
+ f_probe_for_handover("4.c", "HO to 123-45 triggers inter-BSC HO",
+ "handover any to arfcn 123 bsic 45",
+ true, true);
+}
+private function f_tc_ho_neighbor_config_5(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 5. explicit remote neighbor re-using ARFCN+BSIC: 'neighbor lac 99 arfcn 871 bsic 12'");
+ f_bts_0_cfg({"no neighbors", "neighbor lac 99 arfcn 871 bsic 12"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("5.a", "HO to 871-12 triggers inter-BSC HO (ignoring local cells with same ARFCN+BSIC)",
+ "handover any to arfcn 871 bsic 12",
+ true, true);
+}
+private function f_tc_ho_neighbor_config_6(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 6. config error: explicit local and remote neighbors with ambiguous ARFCN+BSIC:"
+ & " 'neighbor bts 2; neighbor lac 99 arfcn 871 bsic 12'");
+ f_bts_0_cfg({"no neighbors", "neighbor bts 2", "neighbor lac 99 arfcn 871 bsic 12"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("6.a", "HO to 871-12 is ambiguous = error",
+ "handover any to arfcn 871 bsic 12",
+ false);
+}
+private function f_tc_ho_neighbor_config_7(charstring id) runs on MSC_ConnHdlr {
+ f_tc_ho_neighbor_config_start();
+
+ /*
+ * bts 0 ARFCN 871 BSIC 10
+ * bts 1 ARFCN 871 BSIC 11
+ * bts 2 ARFCN 871 BSIC 12
+ * bts 3 ARFCN 871 BSIC 12 serves as ambiguity for bts 2, re-using the ARFCN+BSIC
+ */
+
+ log("f_tc_ho_neighbor_config: 7. explicit local and remote neighbors:"
+ & " 'neighbor bts 2; neighbor lac 99 arfcn 123 bsic 45'");
+ f_bts_0_cfg({"no neighbors", "neighbor bts 2", "neighbor lac 99 arfcn 123 bsic 45"});
+ f_sleep(0.5);
+
+ f_probe_for_handover("7.a", "HO to 871-12 does HO to bts 2",
+ "handover any to arfcn 871 bsic 12",
+ true);
+ f_probe_for_handover("7.b", "HO to 123-45 triggers inter-BSC HO",
+ "handover any to arfcn 123 bsic 45",
+ true, true);
+}
+
+testcase TC_ho_neighbor_config_1() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_1));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_2() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_2));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_3() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_3));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_4() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_4));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_5() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_5));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_6() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_6));
+ vc_conn.done;
+}
+testcase TC_ho_neighbor_config_7() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ f_init(3, true);
+ f_sleep(1.0);
+ vc_conn := f_start_handler(refers(f_tc_ho_neighbor_config_7));
+ vc_conn.done;
+}
+
/* OS#3041: Open and close N connections in a normal fashion, and expect no
* BSSMAP Reset just because of that. */
testcase TC_bssap_rlsd_does_not_cause_bssmap_reset() runs on test_CT {
@@ -3995,6 +4383,9 @@ control {
execute( TC_ctrl_msc_connection_status() );
execute( TC_ctrl_msc0_connection_status() );
execute( TC_ctrl() );
+ if (mp_bssap_cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER) {
+ execute( TC_ctrl_location() );
+ }
/* RSL DCHAN Channel ACtivation / Deactivation */
execute( TC_chan_act_noreply() );
@@ -4119,7 +4510,7 @@ control {
execute( TC_ho_out_of_this_bsc() );
execute( TC_ho_out_fail_no_msc_response() );
execute( TC_ho_out_fail_rr_ho_failure() );
- execute( TC_ho_out_fail_no_ho_detect() );
+ execute( TC_ho_out_fail_no_result_after_ho_cmd() );
execute( TC_ho_into_this_bsc() );
execute( TC_ho_in_fail_msc_clears() );
@@ -4127,6 +4518,14 @@ control {
execute( TC_ho_in_fail_no_detect() );
execute( TC_ho_in_fail_no_detect2() );
+ execute( TC_ho_neighbor_config_1() );
+ execute( TC_ho_neighbor_config_2() );
+ execute( TC_ho_neighbor_config_3() );
+ execute( TC_ho_neighbor_config_4() );
+ execute( TC_ho_neighbor_config_5() );
+ execute( TC_ho_neighbor_config_6() );
+ execute( TC_ho_neighbor_config_7() );
+
execute( TC_bssap_rlsd_does_not_cause_bssmap_reset() );
execute( TC_bssmap_clear_does_not_cause_bssmap_reset() );
execute( TC_ms_rel_ind_does_not_cause_bssmap_reset() );
diff --git a/bsc/BSC_Tests_CBSP.ttcn b/bsc/BSC_Tests_CBSP.ttcn
index 9d02dd7..f403422 100644
--- a/bsc/BSC_Tests_CBSP.ttcn
+++ b/bsc/BSC_Tests_CBSP.ttcn
@@ -1,5 +1,17 @@
module BSC_Tests_CBSP {
+/* CBSP Integration Tests for OsmoBSC
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This test suite tests OsmoBSC while emulating the CBC (Cell Broadcast Centre)
+ */
+
import from General_Types all;
import from Osmocom_Types all;
import from GSM_Types all;
@@ -121,20 +133,20 @@ function f_cbsp_write(uint16_t msg_id, uint16_t ser_no,
template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,
template (value) CBSP_Category category := CBSP_CATEG_NORMAL,
uint16_t rep_period := 10, uint16_t num_bcast_req := 1,
- uint8_t dcs := 0, CBSP_IEs content,
+ uint8_t dcs := 0, uint8_t channel_ind := 0, CBSP_IEs content,
template BSSMAP_FIELD_CellIdentificationList success_list := ?,
template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT {
var template (value) CBSP_PDU tx;
var template CBSP_PDU rx;
var CBSP_IEs pages := {f_gen_page()};
- tx := ts_CBSP_WRITE_CBS(msg_id, ser_no, cell_list, category,
+ tx := ts_CBSP_WRITE_CBS(msg_id, ser_no, cell_list, channel_ind, category,
rep_period, num_bcast_req, dcs, content);
CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));
if (istemplatekind(fail_list, "omit")) {
- rx := tr_CBSP_WRITE_CBS_COMPL(msg_id, ser_no, success_list);
+ rx := tr_CBSP_WRITE_CBS_COMPL(msg_id, ser_no, success_list, channel_ind);
} else {
- rx := tr_CBSP_WRITE_CBS_FAIL(msg_id, ser_no, fail_list, *, success_list);
+ rx := tr_CBSP_WRITE_CBS_FAIL(msg_id, ser_no, fail_list, *, success_list, channel_ind);
}
alt {
[] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {
@@ -146,7 +158,39 @@ function f_cbsp_write(uint16_t msg_id, uint16_t ser_no,
}
}
-function f_cbsp_kill(uint16_t msg_id, uint16_t ser_no,
+/* send a REPLACE CBS to the BSC; expect either COMPLETE or FAILURE in response*/
+function f_cbsp_replace(uint16_t msg_id, uint16_t new_ser_no, uint16_t old_ser_no,
+ template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,
+ template (value) CBSP_Category category := CBSP_CATEG_NORMAL,
+ uint16_t rep_period := 10, uint16_t num_bcast_req := 1,
+ uint8_t dcs := 0, uint8_t channel_ind := 0, CBSP_IEs content,
+ template BSSMAP_FIELD_CellIdentificationList success_list := ?,
+ template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT {
+ var template (value) CBSP_PDU tx;
+ var template CBSP_PDU rx;
+ var CBSP_IEs pages := {f_gen_page()};
+
+ tx := ts_CBSP_REPLACE_CBS(msg_id, new_ser_no, old_ser_no, cell_list, channel_ind, category,
+ rep_period, num_bcast_req, dcs, content);
+ CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));
+ if (istemplatekind(fail_list, "omit")) {
+ rx := tr_CBSP_REPLACE_CBS_COMPL(msg_id, new_ser_no, old_ser_no, ?, success_list,
+ channel_ind);
+ } else {
+ rx := tr_CBSP_REPLACE_CBS_FAIL(msg_id, new_ser_no, old_ser_no, fail_list, *, success_list,
+ channel_ind);
+ }
+ alt {
+ [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {
+ setverdict(pass);
+ }
+ [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], ?)) {
+ setverdict(fail, "Received unexpected CBSP");
+ }
+ }
+}
+/* send a KILL CBS to the BSC; expect either COMPLETE or FAILURE in response*/
+function f_cbsp_kill(uint16_t msg_id, uint16_t ser_no, template (omit) uint8_t channel_ind := 0,
template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,
template BSSMAP_FIELD_CellIdentificationList success_list := ?,
template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT
@@ -154,12 +198,14 @@ function f_cbsp_kill(uint16_t msg_id, uint16_t ser_no,
var template (value) CBSP_PDU tx;
var template CBSP_PDU rx;
- tx := ts_CBSP_KILL(msg_id, ser_no, cell_list);
+ tx := ts_CBSP_KILL(msg_id, ser_no, cell_list, channel_ind);
CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));
if (istemplatekind(fail_list, "omit")) {
- rx := tr_CBSP_KILL_COMPL(msg_id, ser_no, compl_list:=*, cell_list:=success_list);
+ rx := tr_CBSP_KILL_COMPL(msg_id, ser_no, compl_list:=*, cell_list:=success_list,
+ channel_ind:=channel_ind);
} else {
- rx := tr_CBSP_KILL_FAIL(msg_id, ser_no, fail_list, compl_list:=*, cell_list:=success_list);
+ rx := tr_CBSP_KILL_FAIL(msg_id, ser_no, fail_list, compl_list:=*, cell_list:=success_list,
+ channel_ind:=channel_ind);
}
alt {
[] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {
@@ -197,7 +243,7 @@ testcase TC_cbsp_write() runs on cbsp_test_CT {
f_cbsp_init_server();
tx := ts_CBSP_WRITE_CBS(msg_id:=23, new_ser_nr:=42, cell_list:=ts_BSSMAP_CIL_BSS,
- category:=CBSP_CATEG_NORMAL,
+ channel_ind:=0, category:=CBSP_CATEG_NORMAL,
rep_period:=10, num_bcast_req:=1, dcs := 0,
content:=pages);
@@ -251,7 +297,7 @@ testcase TC_cbsp_write_lac_ci() runs on cbsp_test_CT {
var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
f_cbsp_init_server();
- f_cbsp_write(24, 1024, cell_list, content:=pages,
+ f_cbsp_write(5, 1005, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
}
@@ -261,7 +307,7 @@ testcase TC_cbsp_write_ci() runs on cbsp_test_CT {
var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
cell_list := ts_BSSMAP_CIL_CI({bssmap_ci(mp_cgi_bts0)});
f_cbsp_init_server();
- f_cbsp_write(24, 1024, cell_list, content:=pages,
+ f_cbsp_write(6, 1006, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
}
@@ -271,7 +317,7 @@ testcase TC_cbsp_write_lai() runs on cbsp_test_CT {
var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
cell_list := ts_BSSMAP_CIL_LAI({bssmap_lai(mp_cgi_bts0)});
f_cbsp_init_server();
- f_cbsp_write(24, 1024, cell_list, content:=pages,
+ f_cbsp_write(7, 1007, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
}
@@ -281,17 +327,70 @@ testcase TC_cbsp_write_lac() runs on cbsp_test_CT {
var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
cell_list := ts_BSSMAP_CIL_LAC({bssmap_lac(mp_cgi_bts0)});
f_cbsp_init_server();
- f_cbsp_write(24, 1024, cell_list, content:=pages,
+ f_cbsp_write(8, 1008, cell_list, content:=pages,
success_list:=?, fail_list:=omit);
}
/* Write a message, then replace it */
+testcase TC_cbsp_write_then_replace() runs on cbsp_test_CT {
+ var CBSP_IEs pages := {f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_write(9, 1009, cell_list, content:=pages,
+ success_list:=?, fail_list:=omit);
+ f_cbsp_replace(9, 2009, 1009, cell_list, content:=pages,
+ success_list:=?, fail_list:=omit);
+}
/* Replace a message that doesn't exist: failure */
+testcase TC_cbsp_replace_nonexist() runs on cbsp_test_CT {
+ var CBSP_IEs pages := {f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_replace(10, 2010, 1010, cell_list, content:=pages,
+ success_list:=omit, fail_list:=?);
+}
+
/* Write more messages than can be scheduled */
+testcase TC_cbsp_write_too_many() runs on cbsp_test_CT {
+ /* repeating three pages at an interval of 1 is impossible */
+ var CBSP_IEs pages := {f_gen_page(), f_gen_page(), f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_write(11, 1011, cell_list, rep_period:=1, content:=pages,
+ success_list:=omit, fail_list:=?);
+}
+
/* Kill message that doesn't exist: failure */
+testcase TC_cbsp_kill_nonexist() runs on cbsp_test_CT {
+ var CBSP_IEs pages := {f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_kill(12, 1012, 0, cell_list, success_list:=omit, fail_list:=?);
+}
/* Write a message, then kill it */
+testcase TC_cbsp_write_then_kill() runs on cbsp_test_CT {
+ var CBSP_IEs pages := {f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_write(13, 1013, cell_list, content:=pages, success_list:=?, fail_list:=omit);
+ f_cbsp_kill(13, 1013, 0, cell_list, success_list:=?, fail_list:=omit);
+}
+
/* Write a message, then reset all messages */
+testcase TC_cbsp_write_then_reset() runs on cbsp_test_CT {
+ var CBSP_IEs pages := {f_gen_page()};
+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;
+ cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});
+ f_cbsp_init_server();
+ f_cbsp_write(14, 1014, cell_list, content:=pages, success_list:=?, fail_list:=omit);
+ f_cbsp_reset_bss(0);
+}
control {
execute( TC_cbsp_bsc_server() );
@@ -307,6 +406,13 @@ control {
execute( TC_cbsp_write_ci() );
execute( TC_cbsp_write_lai() );
execute( TC_cbsp_write_lac() );
+
+ execute( TC_cbsp_write_then_replace() );
+ execute( TC_cbsp_replace_nonexist() );
+ execute( TC_cbsp_write_too_many() );
+ execute( TC_cbsp_kill_nonexist() );
+ execute( TC_cbsp_write_then_kill() );
+ execute( TC_cbsp_write_then_reset() );
}
diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn
index dbba135..57706c9 100644
--- a/bsc/MSC_ConnectionHandler.ttcn
+++ b/bsc/MSC_ConnectionHandler.ttcn
@@ -15,6 +15,7 @@ import from Misc_Helpers all;
import from General_Types all;
import from Osmocom_Types all;
import from GSM_Types all;
+import from IPA_Emulation all;
import from SCCPasp_Types all;
import from BSSAP_Types all;
import from RAN_Emulation all;
@@ -23,6 +24,7 @@ import from BSSMAP_Templates all;
import from IPL4asp_Types all;
import from Native_Functions all;
+import from MGCP_CodecPort all;
import from MGCP_Types all;
import from MGCP_Templates all;
import from MGCP_Emulation all;
@@ -270,69 +272,127 @@ altstep as_Media_ipacc() runs on MSC_ConnHdlr {
}
+function f_rx_crcx(MgcpCommand mgcp_cmd)
+ runs on MSC_ConnHdlr return template MgcpResponse {
+ var MgcpOsmuxCID osmux_cid;
+ var SDP_Message sdp;
+ var integer cid := f_get_free_mgcp_conn();
+ if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard)) {
+ if (cid != 0) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "MGCP wildcard EP only works in first CRCX");
+ }
+ /* we keep the endpoint name allocated during MediaState_init */
+ } else {
+ /* Call Agent allocated endpoint, trust/use it always */
+ g_media.mgcp_ep := mgcp_cmd.line.ep;
+ }
+ if (isvalue(mgcp_cmd.sdp)) {
+ sdp := mgcp_cmd.sdp;
+ g_media.mgcp_conn[cid].peer.host := sdp.connection.conn_addr.addr;
+ g_media.mgcp_conn[cid].peer.port_nr := sdp.media_list[0].media_field.ports.port_number;
+ }
+ var MgcpConnState mgcp_conn := g_media.mgcp_conn[cid];
+ sdp := valueof(ts_SDP(mgcp_conn.mgw.host, mgcp_conn.mgw.host, "foo", "21",
+ mgcp_conn.mgw.port_nr, { int2str(mgcp_conn.rtp_pt) },
+ {valueof(ts_SDP_rtpmap(mgcp_conn.rtp_pt,
+ mgcp_conn.mime_type & "/" &
+ int2str(mgcp_conn.sample_rate))),
+ valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));
+ var template MgcpResponse mgcp_resp;
+ if (g_pars.use_osmux and f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {
+ osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);
+ mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, osmux_cid, sdp);
+ } else {
+ mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);
+ }
+ f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(g_media.mgcp_ep));
+ g_media.mgcp_conn[cid].crcx_seen := g_media.mgcp_conn[cid].crcx_seen + 1;
+ return mgcp_resp;
+}
+
+function f_rx_mdcx(MgcpCommand mgcp_cmd)
+ runs on MSC_ConnHdlr return template MgcpResponse {
+ var SDP_Message sdp;
+ var integer cid := f_get_mgcp_conn(f_MgcpCmd_extract_conn_id(mgcp_cmd));
+ if (isvalue(mgcp_cmd.sdp)) {
+ sdp := mgcp_cmd.sdp;
+ g_media.mgcp_conn[cid].peer.host := sdp.connection.conn_addr.addr;
+ g_media.mgcp_conn[cid].peer.port_nr := sdp.media_list[0].media_field.ports.port_number;
+ } else {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "MDCX has no [recognizable] SDP");
+ }
+ var MgcpConnState mgcp_conn := g_media.mgcp_conn[cid];
+ sdp := valueof(ts_SDP(mgcp_conn.peer.host, mgcp_conn.peer.host, "foo", "21",
+ mgcp_conn.peer.port_nr, { int2str(mgcp_conn.rtp_pt) },
+ {valueof(ts_SDP_rtpmap(mgcp_conn.rtp_pt,
+ mgcp_conn.mime_type & "/" &
+ int2str(mgcp_conn.sample_rate))),
+ valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));
+ g_media.mgcp_conn[cid].mdcx_seen := g_media.mgcp_conn[cid].mdcx_seen + 1;
+ return ts_MDCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);
+}
+
+function tr_MGCP_RecvFrom_any(template MgcpMessage msg)
+runs on MSC_ConnHdlr return template MGCP_RecvFrom {
+ var template MGCP_RecvFrom mrf := {
+ connId := ?,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := msg
+ }
+ return mrf;
+}
+
/* altstep for handling of MGCP media related commands. Activated by as_Media() to test
* MGW level media handling */
+
altstep as_Media_mgw(boolean norepeat := false) runs on MSC_ConnHdlr {
var MgcpCommand mgcp_cmd;
- var MgcpOsmuxCID osmux_cid;
+ var template MgcpResponse mgcp_resp;
+ var MGCP_RecvFrom mrf;
+ var template MgcpMessage msg_crcx := {
+ command := tr_CRCX
+ }
+ var template MgcpMessage msg_mdcx := {
+ command := tr_MDCX
+ }
+ var template MgcpMessage msg_resp;
- [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {
- var SDP_Message sdp;
- var integer cid := f_get_free_mgcp_conn();
- if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard)) {
- if (cid != 0) {
- Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "MGCP wildcard EP only works in first CRCX");
- }
- /* we keep the endpoint name allocated during MediaState_init */
- } else {
- /* Call Agent allocated endpoint, trust/use it always */
- g_media.mgcp_ep := mgcp_cmd.line.ep;
+ [g_pars.aoip] MGCP.receive(tr_CRCX) -> value mgcp_cmd {
+ mgcp_resp := f_rx_crcx(mgcp_cmd);
+ MGCP.send(mgcp_resp);
+ if(norepeat == false) {
+ repeat;
}
- if (isvalue(mgcp_cmd.sdp)) {
- sdp := mgcp_cmd.sdp;
- g_media.mgcp_conn[cid].peer.host := sdp.connection.conn_addr.addr;
- g_media.mgcp_conn[cid].peer.port_nr := sdp.media_list[0].media_field.ports.port_number;
+ }
+
+ [not g_pars.aoip] MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_crcx)) -> value mrf {
+ mgcp_resp := f_rx_crcx(mrf.msg.command);
+ msg_resp := {
+ response := mgcp_resp
}
- var MgcpConnState mgcp_conn := g_media.mgcp_conn[cid];
- sdp := valueof(ts_SDP(mgcp_conn.mgw.host, mgcp_conn.mgw.host, "foo", "21",
- mgcp_conn.mgw.port_nr, { int2str(mgcp_conn.rtp_pt) },
- {valueof(ts_SDP_rtpmap(mgcp_conn.rtp_pt,
- mgcp_conn.mime_type & "/" &
- int2str(mgcp_conn.sample_rate))),
- valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));
- var template MgcpResponse mgcp_resp;
- if (g_pars.use_osmux and f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {
- osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);
- mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, osmux_cid, sdp);
- } else {
- mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);
+ MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));
+ if(norepeat == false) {
+ repeat;
}
- f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(g_media.mgcp_ep));
+ }
+
+ [g_pars.aoip] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
+ mgcp_resp := f_rx_mdcx(mgcp_cmd);
MGCP.send(mgcp_resp);
- g_media.mgcp_conn[cid].crcx_seen := g_media.mgcp_conn[cid].crcx_seen + 1;
if(norepeat == false) {
repeat;
}
+ }
+
+ [not g_pars.aoip] MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_mdcx)) -> value mrf {
+ mgcp_resp := f_rx_mdcx(mrf.msg.command);
+ msg_resp := {
+ response := mgcp_resp
}
- [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
- var SDP_Message sdp;
- var integer cid := f_get_mgcp_conn(f_MgcpCmd_extract_conn_id(mgcp_cmd));
- if (isvalue(mgcp_cmd.sdp)) {
- sdp := mgcp_cmd.sdp;
- g_media.mgcp_conn[cid].peer.host := sdp.connection.conn_addr.addr;
- g_media.mgcp_conn[cid].peer.port_nr := sdp.media_list[0].media_field.ports.port_number;
- } else {
- Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "MDCX has no [recognizable] SDP");
- }
- var MgcpConnState mgcp_conn := g_media.mgcp_conn[cid];
- sdp := valueof(ts_SDP(mgcp_conn.peer.host, mgcp_conn.peer.host, "foo", "21",
- mgcp_conn.peer.port_nr, { int2str(mgcp_conn.rtp_pt) },
- {valueof(ts_SDP_rtpmap(mgcp_conn.rtp_pt,
- mgcp_conn.mime_type & "/" &
- int2str(mgcp_conn.sample_rate))),
- valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));
- MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp));
- g_media.mgcp_conn[cid].mdcx_seen := g_media.mgcp_conn[cid].mdcx_seen + 1;
+ MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));
if(norepeat == false) {
repeat;
}
@@ -357,9 +417,17 @@ type component MSC_ConnHdlr extends RAN_ConnHdlr, RSL_DchanHdlr, MGCP_ConnHdlr {
port RAN_PROC_PT RAN;
port TELNETasp_PT BSCVTY;
+ /* Proxy MGCP-over-IPA and MGCP-over-UDP */
+ port IPA_MGCP_PT MGCP_MSC_CLIENT;
+ var integer g_trans_id := 0;
+
var MediaState g_media;
var TestHdlrParams g_pars;
+ var charstring host_bts := "127.0.0.2";
+ var charstring host_mgw := "127.0.0.3";
+ var charstring host_msc := "127.0.0.4";
+
var boolean g_vty_initialized := false;
}
@@ -374,15 +442,23 @@ function f_MscConnHdlr_init(integer i, HostName bts, HostName mgw, BSSMAP_FIELD_
}
}
+private function get_next_trans_id() runs on MSC_ConnHdlr return MgcpTransId {
+ var MgcpTransId tid := int2str(g_trans_id);
+ g_trans_id := g_trans_id + 1;
+ return tid;
+}
+
/* Callback function from general RAN_Emulation whenever a connectionless
* BSSMAP message arrives. Can retunr a PDU_BSSAP that should be sent in return */
private function UnitdataCallback(PDU_BSSAP bssap)
runs on RAN_Emulation_CT return template PDU_BSSAP {
var template PDU_BSSAP resp := omit;
+ var boolean append_osmux_support := g_ran_ops.use_osmux and
+ (g_ran_ops.transport == BSSAP_TRANSPORT_AoIP);
/* answer all RESET with a RESET ACK */
- if (match(bssap, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) {
- resp := ts_BSSMAP_ResetAck(g_ran_ops.use_osmux);
+ if (match(bssap, tr_BSSMAP_Reset(append_osmux_support))) {
+ resp := ts_BSSMAP_ResetAck(append_osmux_support);
}
return resp;
@@ -394,6 +470,7 @@ const RanOps MSC_RanOps := {
decode_dtap := false,
role_ms := false,
protocol := RAN_PROTOCOL_BSSAP,
+ transport := BSSAP_TRANSPORT_AoIP,
use_osmux := false,
sccp_addr_local := omit,
sccp_addr_peer := omit
@@ -843,6 +920,31 @@ function f_ass_patch_lcls(inout template (omit) PDU_BSSAP ass_tpl,
}
}
+/* Send a MGCP request through MGCP-over-IPA from MSC side and receive a (matching!) response */
+function mgcp_transceive_mgw(template MgcpCommand cmd, template MgcpResponse resp := ?) runs on MSC_ConnHdlr {
+ template MgcpResponse resp_any := ?
+ var MgcpResponse resp_val;
+ resp.line.trans_id := cmd.line.trans_id;
+ timer T := 5.0;
+
+ BSSAP.send(cmd);
+ T.start;
+ alt {
+ [] as_Media_mgw();
+ [] BSSAP.receive(resp) -> value resp_val { }
+ [] BSSAP.receive(resp_any) {
+ setverdict(fail, "Response didn't match template");
+ mtc.stop;
+ }
+ [] BSSAP.receive { repeat; }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for response to ", cmd);
+ mtc.stop;
+ }
+ }
+ T.stop;
+}
+
/* Helper function to check if the activity on the MGCP matches what we
* expected */
function f_check_mgcp_expectations() runs on MSC_ConnHdlr {
@@ -875,7 +977,7 @@ runs on MSC_ConnHdlr {
codecType := FR_AMR;
}
- f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", codecType);
+ f_MscConnHdlr_init(g_pars.media_nr, host_bts, host_mgw, codecType);
/* patch in the LCLS related items, as needed */
f_ass_patch_lcls(ass_tpl, exp_ass_cpl);
@@ -956,17 +1058,10 @@ runs on MSC_ConnHdlr {
g_media.mgcp_conn[1].mdcx_seen_exp := 0;
} else if (st.voice_call) {
/* For voice calls we expect the following MGCP activity */
- if (g_pars.aoip == false) {
- g_media.mgcp_conn[0].crcx_seen_exp := 1;
- g_media.mgcp_conn[0].mdcx_seen_exp := 1;
- g_media.mgcp_conn[1].crcx_seen_exp := 0;
- g_media.mgcp_conn[1].mdcx_seen_exp := 0;
- } else {
- g_media.mgcp_conn[0].crcx_seen_exp := 1;
- g_media.mgcp_conn[0].mdcx_seen_exp := 1;
- g_media.mgcp_conn[1].crcx_seen_exp := 1;
- g_media.mgcp_conn[1].mdcx_seen_exp := 0;
- }
+ g_media.mgcp_conn[0].crcx_seen_exp := 1;
+ g_media.mgcp_conn[0].mdcx_seen_exp := 1;
+ g_media.mgcp_conn[1].crcx_seen_exp := 1;
+ g_media.mgcp_conn[1].mdcx_seen_exp := 0;
}
f_create_mgcp_expect(mgcpcrit);
@@ -1025,6 +1120,29 @@ runs on MSC_ConnHdlr {
}
}
+ if (not exp_fail and st.voice_call and not g_pars.aoip) {
+ /* With SCCPLite, connect to BSC-located MGW using a CRCX + SDP.
+ It is sent in MGCP over IPA in the BSC<->MSC (BSC-NAT)
+ connection. BSC will forward it to its MGW. */
+ var template MgcpCommand cmd;
+ var template MgcpResponse resp;
+ var integer cic := f_bssmap_ie_cic_2_int(ass_cmd.pdu.bssmap.assignmentRequest.circuitIdentityCode);
+ var MgcpEndpoint ep := int2str(cic) & "@mgw"; /* 1: matches value configured in BSC_Tests.ttcn pass in AssignReq */
+ var MgcpCallId call_id := '51234'H;
+ var SDP_attribute_list attributes := { valueof(ts_SDP_ptime(20)) };
+ if (g_pars.use_osmux) {
+ cmd := ts_CRCX_osmux(get_next_trans_id(), ep, "sendrecv", call_id, cic);
+ resp := tr_CRCX_ACK_osmux;
+ } else {
+ cmd := ts_CRCX(get_next_trans_id(), ep, "sendrecv", call_id);
+ resp := tr_CRCX_ACK;
+ }
+ cmd.sdp := ts_SDP(host_msc, host_mgw, "23", "42",
+ 14000, { int2str(g_media.mgcp_conn[1].rtp_pt) },
+ { valueof(ts_SDP_ptime(20)) });
+ mgcp_transceive_mgw(cmd, resp);
+ }
+
f_check_mgcp_expectations();
if (st.is_assignment and st.assignment_done) {
@@ -1088,7 +1206,7 @@ altstep as_handover(inout HandoverState st) runs on MSC_ConnHdlr {
}
}
[st.rr_ho_cmpl_seen] as_Media_ipacc();
- [st.rr_ho_cmpl_seen] as_Media_mgw(true);
+ [st.rr_ho_cmpl_seen] as_Media_mgw(true);
[st.rr_ho_cmpl_seen] RSL.receive(tr_RSL_DEACT_SACCH(st.old_chan_nr)) {
repeat;
}
diff --git a/bsc/expected-results.xml b/bsc/expected-results.xml
index ff3cce0..3ea202c 100644
--- a/bsc/expected-results.xml
+++ b/bsc/expected-results.xml
@@ -1,8 +1,9 @@
<?xml version="1.0"?>
-<testsuite name='BSC_Tests' tests='106' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='BSC_Tests' tests='107' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='BSC_Tests' name='TC_ctrl_msc_connection_status' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ctrl_msc0_connection_status' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ctrl' time='MASKED'/>
+ <testcase classname='BSC_Tests' name='TC_ctrl_location' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_chan_act_noreply' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_chan_act_counter' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_chan_act_ack_noest' time='MASKED'/>
@@ -86,7 +87,7 @@
<testcase classname='BSC_Tests' name='TC_ho_out_of_this_bsc' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ho_out_fail_no_msc_response' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ho_out_fail_rr_ho_failure' time='MASKED'/>
- <testcase classname='BSC_Tests' name='TC_ho_out_fail_no_ho_detect' time='MASKED'/>
+ <testcase classname='BSC_Tests' name='TC_ho_out_fail_no_result_after_ho_cmd' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ho_into_this_bsc' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ho_in_fail_msc_clears' time='MASKED'/>
<testcase classname='BSC_Tests' name='TC_ho_in_fail_msc_clears_after_ho_detect' time='MASKED'/>
diff --git a/bsc/osmo-bsc.cfg b/bsc/osmo-bsc.cfg
index bca5b20..74fe255 100644
--- a/bsc/osmo-bsc.cfg
+++ b/bsc/osmo-bsc.cfg
@@ -57,7 +57,7 @@ network
encryption a5 0 1 3
neci 1
paging any use tch 0
- handover 0
+ handover 1
handover window rxlev averaging 10
handover window rxqual averaging 1
handover window rxlev neighbor averaging 10
@@ -88,8 +88,6 @@ network
early-classmark-sending forbidden
ip.access unit_id 1234 0
oml ip.access stream_id 255 line 0
- # remote-BSS neighbor:
- neighbor lac 99 arfcn 123 bsic any
neighbor-list mode manual-si5
neighbor-list add arfcn 100
neighbor-list add arfcn 200
@@ -339,6 +337,35 @@ network
timeslot 7
phys_chan_config PDCH
hopping enabled 0
+ bts 3
+ type sysmobts
+ band DCS1800
+ cell_identity 3
+ location_area_code 3
+ # re-use bts 2's ARFCN 871 and BSIC 12 (to test handover config)
+ base_station_id_code 12
+ trx 0
+ rf_locked 0
+ arfcn 871
+ nominal power 23
+ max_power_red 20
+ rsl e1 tei 0
+ timeslot 0
+ phys_chan_config CCCH+SDCCH4
+ timeslot 1
+ phys_chan_config TCH/F
+ timeslot 2
+ phys_chan_config TCH/F
+ timeslot 3
+ phys_chan_config TCH/F
+ timeslot 4
+ phys_chan_config TCH/F
+ timeslot 5
+ phys_chan_config TCH/H
+ timeslot 6
+ phys_chan_config PDCH
+ timeslot 7
+ phys_chan_config PDCH
msc 0
ip.access rtp-base 4000
no bsc-welcome-text
diff --git a/bsc/regen_makefile.sh b/bsc/regen_makefile.sh
index 634c9d9..def4a3f 100755
--- a/bsc/regen_makefile.sh
+++ b/bsc/regen_makefile.sh
@@ -4,6 +4,6 @@ MAIN=BSC_Tests.ttcn
FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc CBSP_CodecPort_CtrlFunctdef.cc *.c"
-export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR"
+export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_CTRL -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_CTRL -DUSE_MTP3_DISTRIBUTOR"
../regen-makefile.sh $MAIN $FILES
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index e10d967..d3fb958 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -193,7 +193,8 @@ type record ConnHdlrPars {
float t_guard,
ConnL1Pars l1_pars,
TestSpecUnion spec optional,
- RSL_IE_EncryptionInfo encr optional
+ RSL_IE_EncryptionInfo encr optional,
+ BtsBand bts0_band optional
}
/* Test-specific parameters */
@@ -421,6 +422,8 @@ function f_init() runs on test_CT {
/* Start with a default moderate timing offset equalling TA=2, and RSSI=-60 */
ret := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id, valueof(ts_TRXC_FAKE_TIMING(2*256)));
ret := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id, valueof(ts_TRXC_FAKE_RSSI(-60)));
+ /* OsmoBTS may have different AB / NB threshold (see MIN_QUAL_NORM, MIN_QUAL_RACH) */
+ ret := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id, valueof(ts_TRXC_FAKE_CI(60)));
}
/* Wait some extra time to make sure the BTS emits a stable carrier.
@@ -505,7 +508,7 @@ runs on ConnHdlr {
map(self:L1CTL, system:L1CTL);
f_connect_reset(L1CTL);
- if (mp_bts_trxc_port != -1) {
+ if (mp_bts_trxc_port != -1 and BTS_TRXC.checkstate("Mapped")) {
f_init_trxc(BTS_TRXC, id, g_bts_trxc_conn_id);
}
@@ -594,7 +597,8 @@ friend template ConnHdlrPars t_Pars(template RslChannelNr chan_nr,
ms_actual_ta := mp_ms_actual_ta_exp
},
spec := omit,
- encr := omit
+ encr := omit,
+ bts0_band := omit
}
/***********************************************************************
@@ -1890,6 +1894,560 @@ function f_TC_meas_res_periodic(charstring id) runs on ConnHdlr {
f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
}
+function f_check_meas_bs_power_level(integer level) runs on ConnHdlr {
+ timer T := 8.0;
+ T.start;
+ var RSL_Message rsl;
+ alt {
+ [] as_l1_sacch();
+ [] L1CTL.receive { repeat; }
+ [] RSL.receive(tr_RSL_MEAS_RES(g_chan_nr, ?, ?, ?)) -> value rsl {
+ if (rsl.ies[3].body.bs_power.power_level == level) {
+ setverdict(pass)
+ } else {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Received wrong BS power level in MEAS RES ", rsl));
+ }
+ }
+ [] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "No MEAS RES received at all");
+ }
+ }
+}
+
+/* see if the rsl meas res contains our expeced bs power level
+bs power set during assignment */
+function f_TC_rsl_bs_pwr_static_ass(charstring id) runs on ConnHdlr {
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ if (mp_bts_trxc_port != -1) {
+ f_trxc_fake_rssi(rxlev2dbm(mp_ul_rxlev_exp));
+ f_trxc_fake_toffs256(g_pars.l1_pars.timing_offset_256syms);
+ }
+
+ var uint5_t pwr_var := 1;
+ var template (value) RSL_IE_BS_Power bs_power := ts_RSL_IE_BS_Power(pwr_var);
+ var template (value) RSL_IE pwr := t_RSL_IE(RSL_IE_BS_POWER, RSL_IE_Body:{bs_power := bs_power});
+
+ f_est_dchan(more_ies :={valueof(pwr)});
+
+ f_check_meas_bs_power_level(pwr_var);
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+}
+
+/* see if the rsl meas res contains our expeced bs power level
+bs power set after assignment */
+function f_TC_rsl_bs_pwr_static_power_control(charstring id) runs on ConnHdlr {
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ if (mp_bts_trxc_port != -1) {
+ f_trxc_fake_rssi(rxlev2dbm(mp_ul_rxlev_exp));
+ f_trxc_fake_toffs256(g_pars.l1_pars.timing_offset_256syms);
+ }
+
+ var uint5_t pwr_var := 1;
+ var template (value) RSL_IE_BS_Power bs_power := ts_RSL_IE_BS_Power(pwr_var);
+
+ f_est_dchan();
+
+ RSL.send(ts_RSL_BS_PWR_CTRL(g_chan_nr, bs_power));
+
+ f_check_meas_bs_power_level(pwr_var);
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+}
+
+testcase TC_rsl_bs_pwr_static_ass() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ for (var integer tn := 1; tn <= 4; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ vc_conn := f_start_handler(refers(f_TC_rsl_bs_pwr_static_ass), pars,
+ pcu_comp := false, trxc_comp := true);
+ vc_conn.done;
+ }
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_bs_pwr_static_power_control() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ for (var integer tn := 1; tn <= 4; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ vc_conn := f_start_handler(refers(f_TC_rsl_bs_pwr_static_power_control), pars,
+ pcu_comp := false, trxc_comp := true);
+ vc_conn.done;
+ }
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+/* target level -100, first rssi -90, ms power 7, expected increase to 7+6 within 6 seconds,
+second rssi -110, ms power 7+6, expected decrease to 7 within 6 seconds,
+These power levels are valid for all bands and require no special handling */
+function f_TC_rsl_ms_pwr_dyn_ass_updown(charstring id) runs on ConnHdlr {
+ var uint5_t pwr_var := 7;
+ var L1ctlDlMessage l1_dl;
+
+ f_trxc_fake_rssi(rxlev2dbm(10));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var RSL_IE_List addl_ies;
+ var template (value) RSL_IE_MS_Power_Parameters pp := (ts_RSL_IE_MS_Power_Parameters(''O));
+
+ addl_ies := {
+ valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_var)})),
+ valueof(t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params := pp}))
+ };
+
+ /* establish with power parameters */
+ f_est_dchan(more_ies := addl_ies);
+
+ /* set a high value to ensure L1 power control level increases */
+ f_trxc_fake_rssi(rxlev2dbm(20));
+
+ timer T2 := 6.0;
+ T2.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {
+ if( not(oct2int(l1_dl.payload.data_ind.payload[0]) > (pwr_var+6))){
+ repeat;
+ }
+ T2.stop;
+ }
+ [] L1CTL.receive { repeat; }
+ [] T2.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Power Level in L1 header has not increased sufficiently");
+ }
+ }
+
+ /* set a low value to ensure L1 power control level decreases */
+ f_trxc_fake_rssi(rxlev2dbm(0));
+
+ timer T4 := 6.0;
+ T4.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {
+ if( not(oct2int(l1_dl.payload.data_ind.payload[0]) <= (pwr_var))){
+ repeat;
+ }
+ T4.stop;
+ setverdict(pass, "Power level in L1 decreased/increased as expected");
+ }
+ [] L1CTL.receive { repeat; }
+ [] T4.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Power Level in L1 header has not decreased sufficiently");
+ }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+/* check that we do not exceed the max power */
+function f_TC_rsl_ms_pwr_dyn_max(charstring id) runs on ConnHdlr {
+ var uint5_t pwr_var := 7;
+ var L1ctlDlMessage l1_dl;
+
+ /* set a low value to ensure power increases */
+ f_trxc_fake_rssi(rxlev2dbm(10));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var RSL_IE_List addl_ies;
+ var template (value) RSL_IE_MS_Power_Parameters pp := (ts_RSL_IE_MS_Power_Parameters(''O));
+
+ addl_ies := {
+ valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_var)})),
+ valueof(t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params := pp}))
+ };
+
+ /* establish with power parameters */
+ f_est_dchan(more_ies := addl_ies);
+
+ timer T1 := 10.0;
+ T1.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }
+ [] L1CTL.receive { repeat; }
+ [] T1.timeout {
+ if( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var){
+ setverdict(fail, "Power level in L1 header should not have changed");
+ }
+ }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+/* see if we reach the band max power */
+function f_TC_rsl_ms_pwr_dyn_up(charstring id) runs on ConnHdlr {
+ var L1ctlDlMessage l1_dl;
+ var uint5_t pwr_var := 15;
+ var uint5_t pwr_max_var := f_get_max_power_from_band();
+
+ /* set a low value to ensure power increases */
+ f_trxc_fake_rssi(rxlev2dbm(10));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var template (value) RSL_IE_MS_Power ms_power := ts_RSL_IE_MS_Power(pwr_var);
+ var template (value) RSL_IE pwr := t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power});
+
+ /* establish with fixed power level */
+ f_est_dchan(more_ies :={valueof(pwr)});
+
+ /* check our initial power level */
+ f_wait_for_l1_power_level(pwr_var);
+
+ /* update power param to enable power loop
+ 48.058 The maximum power to be used is indicated in the BS and MS Power elements respectively. */
+ RSL.send(ts_RSL_MS_PWR_CTRL_with_pp(g_chan_nr, pwr_max_var));
+
+ /* wait, then check that our power level was reduced */
+ timer T1 := 10.0;
+ T1.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }
+ [] L1CTL.receive { repeat; }
+ [] T1.timeout {
+ var int8_t rcv := oct2int(l1_dl.payload.data_ind.payload[0]);
+ if( f_power_level_is_highest_dbm(rcv) ){
+ setverdict(pass, "Power level in L1 header reduced as expected");
+ } else {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Power Level in L1 header did not reach the expected value, e:",pwr_max_var," r:",rcv));
+ }
+ }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+/* see if we reach the band min power */
+function f_TC_rsl_ms_pwr_dyn_down(charstring id) runs on ConnHdlr {
+ var L1ctlDlMessage l1_dl;
+
+ /* set a high value to ensure power decreases */
+ f_trxc_fake_rssi(rxlev2dbm(50));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var uint5_t pwr_var := 5;
+ var uint5_t pwr_target_val := 15;
+
+ var template (value) RSL_IE_MS_Power ms_power := ts_RSL_IE_MS_Power(pwr_var);
+ var template (value) RSL_IE pwr := t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power});
+
+ /* establish with fixed power level */
+ f_est_dchan(more_ies :={valueof(pwr)});
+
+ /* check our initial power level */
+ f_wait_for_l1_power_level(pwr_var);
+
+ /* update power param to enable power loop
+ as per spec the supplied ms power IE should set the max allowed power...*/
+ RSL.send(ts_RSL_MS_PWR_CTRL_with_pp(g_chan_nr, pwr_var));
+
+ /* wait, then check that our power level was increased */
+ timer T1 := 10.0;
+ T1.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }
+ [] L1CTL.receive { repeat; }
+ [] T1.timeout {
+ if( f_power_level_is_lowest_dbm(oct2int(l1_dl.payload.data_ind.payload[0])) ){
+ setverdict(pass, "Power level in L1 header increased to lowest power value");
+ } else {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Power level in L1 header NOT increased to lowest power value");
+ }
+ }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+/* see if we change the power level without receiving power parameters, which should not happen
+rsl chan act WITHOUT power parameters */
+function f_TC_rsl_ms_pwr_dyn_active(charstring id) runs on ConnHdlr {
+ var L1ctlDlMessage l1_dl;
+
+ /* set a high value to ensure power decreases */
+ f_trxc_fake_rssi(rxlev2dbm(50));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var uint5_t pwr_var := 5;
+
+ var template (value) RSL_IE_MS_Power ms_power := ts_RSL_IE_MS_Power(pwr_var);
+ var template (value) RSL_IE pwr := t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power});
+
+ /* establish with fixed power level */
+ f_est_dchan(more_ies :={valueof(pwr)});
+
+ /* check our initial power level */
+ f_wait_for_l1_power_level(pwr_var);
+
+ /* wait, then check that our power level did not change */
+ timer T1 := 10.0;
+ T1.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {
+ if ( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "BS power control should not be active unless we receive a power parameters IE!");
+ }
+ repeat;
+ }
+ [] L1CTL.receive { repeat; }
+ [] T1.timeout { setverdict(pass); }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+/* see if we change the power level without receiving power parameters, which should not happen
+ms power control WITHOUT power parameters */
+function f_TC_rsl_ms_pwr_dyn_active2(charstring id) runs on ConnHdlr {
+ var L1ctlDlMessage l1_dl;
+
+ /* set a high value to ensure power decreases */
+ f_trxc_fake_rssi(rxlev2dbm(50));
+ f_l1_tune(L1CTL);
+ RSL.clear;
+
+ var uint5_t pwr_var := 5;
+
+ var template (value) RSL_IE_MS_Power ms_power := ts_RSL_IE_MS_Power(pwr_var);
+ var template (value) RSL_IE pwr := t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power});
+
+ /* establish with fixed power level */
+ f_est_dchan(more_ies :={valueof(pwr)});
+
+ /* check our initial power level */
+ f_wait_for_l1_power_level(pwr_var);
+
+ /* pwr control without power params IE, should NOT activate MS power control*/
+ RSL.send(ts_RSL_MS_PWR_CTRL(g_chan_nr, ms_power));
+
+ /* wait, then check that our power level did not change */
+ timer T1 := 10.0;
+ T1.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {
+ if ( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "BS power control should not be active unless we receive a power parameters IE!");
+ }
+ repeat;
+ }
+ [] L1CTL.receive { repeat; }
+ [] T1.timeout { setverdict(pass); }
+ }
+
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+
+}
+
+function f_wait_for_l1_power_level(integer level) runs on ConnHdlr {
+ var L1ctlDlMessage l1_dl;
+ timer T0 := 10.0;
+ T0.start;
+ alt {
+ [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {
+ if (not (l1_dl.payload.data_ind.payload[0] == int2oct(level, 1))) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Power level in L1 header != signaled (RSL) power level.");
+ }
+ }
+ [] L1CTL.receive { repeat; }
+ [] T0.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Timeout waiting for initial power level");
+ }
+ }
+ T0.stop;
+}
+
+private function f_power_level_is_lowest_dbm(integer level) runs on ConnHdlr return boolean {
+ var IntegerRecord min_dbm_level;
+ var IntegerRecord max_dbm_level;
+ var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);
+
+ for (var integer i := 0; i < sizeof(min_dbm_level); i := i+1) {
+ if (min_dbm_level[i] == level) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_power_level_is_highest_dbm(integer level) runs on ConnHdlr return boolean {
+ var IntegerRecord min_dbm_level;
+ var IntegerRecord max_dbm_level;
+ var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);
+
+ for (var integer i := 0; i < sizeof(max_dbm_level); i := i+1) {
+ if (max_dbm_level[i] == level) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_get_max_power_from_band() runs on ConnHdlr return integer {
+ var IntegerRecord min_dbm_level;
+ var IntegerRecord max_dbm_level;
+ var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);
+ return max_dbm_level[0];
+}
+
+type charstring BtsBand ("GSM450","GSM480","GSM750","GSM810","GSM850","GSM900","DCS1800","PCS1900");
+template charstring BtsBand_allGSM:= pattern "GSM???";
+private function f_power_from_band(in BtsBand band, out IntegerRecord min_dbm_level, out IntegerRecord max_dbm_level) return IntegerRecord {
+ // 45.005 4.1.1
+ var IntegerRecord gsm_power :={31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19,
+ 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
+ 2, 1, 0};
+ var IntegerRecord dcs_power :={28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
+ 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31, 30, 29};
+ var IntegerRecord pcs_power :={15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31, 30};
+ var IntegerRecord rv;
+
+ select(band){
+ case (BtsBand_allGSM){
+ rv := gsm_power;
+ min_dbm_level := {31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19} ;
+ max_dbm_level := {2, 1, 0};
+ }
+ case("DCS1800"){
+ rv := dcs_power;
+ min_dbm_level := {28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15};
+ max_dbm_level := {0, 29}; // let's cheat here, assume MS_TXPWR_MAX_CCH might be being broadcast, so maybe no 29,30,31
+ }
+ case("PCS1900"){
+ rv := pcs_power;
+ min_dbm_level := {15};
+ max_dbm_level := {30};
+ }
+ }
+
+ return rv;
+}
+
+private function f_vty_get_bts0_band() runs on test_CT return BtsBand {
+ return f_vty_transceive_match_regex(BTSVTY, "show bts 0", "BTS 0 is of \w+ type in band (\w+),*", 0);
+}
+
+testcase TC_rsl_ms_pwr_dyn_ass_updown() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_ass_updown), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_ms_pwr_dyn_up() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -10");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_up), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_ms_pwr_dyn_max() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -10");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_max), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_ms_pwr_dyn_down() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_down), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_ms_pwr_dyn_active() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_active), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_rsl_ms_pwr_dyn_active2() runs on test_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars;
+ f_init();
+ f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");
+ for (var integer tn := 1; tn <= 1; tn := tn+1) {
+ pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));
+ pars.bts0_band := f_vty_get_bts0_band();
+ vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_active2), pars, trxc_comp := true);
+ vc_conn.done;
+ }
+ f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
testcase TC_meas_res_sign_tchf() runs on test_CT {
var ConnHdlr vc_conn;
var ConnHdlrPars pars;
@@ -1908,7 +2466,8 @@ testcase TC_meas_res_sign_tchh() runs on test_CT {
f_init();
for (var integer ss := 0; ss <= 1; ss := ss+1) {
pars := valueof(t_Pars(t_RslChanNr_Lm(5, ss), ts_RSL_ChanMode_SIGN));
- vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars);
+ vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars,
+ pcu_comp := false, trxc_comp := true);
vc_conn.done;
}
Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
@@ -1919,7 +2478,8 @@ testcase TC_meas_res_sign_sdcch4() runs on test_CT {
f_init();
for (var integer ss := 0; ss <= 3; ss := ss+1) {
pars := valueof(t_Pars(t_RslChanNr_SDCCH4(0, ss), ts_RSL_ChanMode_SIGN));
- vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars);
+ vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars,
+ pcu_comp := false, trxc_comp := true);
vc_conn.done;
}
Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
@@ -1930,7 +2490,8 @@ testcase TC_meas_res_sign_sdcch8() runs on test_CT {
f_init();
for (var integer ss := 0; ss <= 7; ss := ss+1) {
pars := valueof(t_Pars(t_RslChanNr_SDCCH8(6, ss), ts_RSL_ChanMode_SIGN));
- vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars);
+ vc_conn := f_start_handler(refers(f_TC_meas_res_periodic), pars,
+ pcu_comp := false, trxc_comp := true);
vc_conn.done;
}
Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
@@ -3756,6 +4317,80 @@ testcase TC_pcu_ext_rach_content() runs on test_CT {
setverdict(pass);
}
+private function f_TC_pcu_data_ind_lqual_cb(int16_t lqual_cb_exp, int16_t thresh)
+runs on test_CT {
+ var template PCUIF_send_data sdt;
+ var PCUIF_send_data sd;
+ var int16_t lqual_cb;
+ timer T := 1.0;
+
+ /* PCUIF_DATA.ind is encapsulated into a supplementary record */
+ sdt := t_SD_PCUIF_MSGT(g_pcu_conn_id, PCU_IF_MSG_DATA_IND);
+
+ /* Send a random PDTCH frame over Um */
+ L1CTL.send(ts_L1CTL_TRAFFIC_REQ(ts_RslChanNr_PDCH(7), ts_RslLinkID_DCCH(0),
+ '0000'O & f_rnd_octstring(21)));
+
+ T.start;
+ alt {
+ /* If expected link quality is above the threshold */
+ [lqual_cb_exp >= thresh] PCU.receive(sdt) -> value sd {
+ lqual_cb := sd.data.u.data_ind.lqual_cb;
+ log("Rx PCUIF_DATA.ind (lqual_cb=", lqual_cb, ")");
+
+ /* Make sure the actual link quality matches the expected value */
+ if (not match(lqual_cb, lqual_cb_exp)) {
+ setverdict(fail, log2str("Link quality ", lqual_cb, " does not match ",
+ "expected value ", lqual_cb_exp));
+ } else {
+ setverdict(pass);
+ }
+ }
+ /* If expected link quality is below the threshold */
+ [lqual_cb_exp < thresh] PCU.receive(sdt) -> value sd {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Rx unexpected PCUIF_DATA.ind: ", sd.data));
+ }
+ /* Ignore PCUIF_RTS.req and PCUIF_TIME.ind */
+ [] PCU.receive { repeat; }
+ [lqual_cb_exp < thresh] T.timeout {
+ log("Rx nothing, as expected");
+ setverdict(pass);
+ }
+ [lqual_cb_exp >= thresh] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Timeout waiting for PCUIF_DATA.ind");
+ }
+ }
+}
+
+/* Verify C/I (Carrier-to-Interference ratio) processing of PDTCH frames */
+testcase TC_pcu_data_ind_lqual_cb() runs on test_CT {
+ f_init_pcu_test();
+ PCU.clear;
+
+ f_init_l1ctl();
+ f_l1_tune(L1CTL);
+
+ /* Activate a PDCH channel on TS7 */
+ f_TC_pcu_act_req(0, 0, 7, true);
+
+ /* Tune trxcon to that PDCH channel on TS7 */
+ f_L1CTL_DM_EST_REQ(L1CTL, { false, mp_trx0_arfcn },
+ valueof(ts_RslChanNr_PDCH(7)), 7);
+
+ /* C/I in centiBels, test range: -256 .. +1280, step 128 */
+ for (var int16_t i := -256; i <= 1280; i := i + 128) {
+ var TrxcMessage ret;
+
+ ret := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id,
+ valueof(ts_TRXC_FAKE_CI(i)));
+
+ /* FIXME: OsmoBTS may have different threshold (see MIN_QUAL_NORM) */
+ f_TC_pcu_data_ind_lqual_cb(i, thresh := 0);
+ }
+}
+
/* Send PAGING via RSL, expect it to shw up on PCU socket */
testcase TC_pcu_paging_from_rsl() runs on test_CT {
f_init_pcu_test();
@@ -3999,6 +4634,11 @@ private function f_TC_rr_suspend_req(charstring id) runs on ConnHdlr {
setverdict(fail, "Timeout waiting for SUSP REQ on PCUIF");
}
}
+
+ /* release the channel */
+ f_rsl_chan_deact();
+ f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+ f_rslem_unregister(0, g_chan_nr);
}
testcase TC_pcu_rr_suspend() runs on test_CT {
var ConnHdlrPars pars;
@@ -5544,7 +6184,15 @@ control {
execute( TC_meas_res_sign_sdcch4() );
execute( TC_meas_res_sign_sdcch8() );
execute( TC_meas_res_sign_tchh_toa256() );
+ execute( TC_rsl_bs_pwr_static_ass() );
+ execute( TC_rsl_bs_pwr_static_power_control() );
execute( TC_rsl_ms_pwr_ctrl() );
+ execute( TC_rsl_ms_pwr_dyn_active() );
+ execute( TC_rsl_ms_pwr_dyn_active2() );
+ execute( TC_rsl_ms_pwr_dyn_up() );
+ execute( TC_rsl_ms_pwr_dyn_down() );
+ execute( TC_rsl_ms_pwr_dyn_ass_updown() );
+ execute( TC_rsl_ms_pwr_dyn_max() );
execute( TC_rsl_chan_initial_ms_pwr() );
execute( TC_rsl_chan_initial_ta() );
execute( TC_rsl_modify_encr() );
@@ -5591,6 +6239,7 @@ control {
execute( TC_pcu_data_req_imm_ass_pch() );
execute( TC_pcu_rach_content() );
execute( TC_pcu_ext_rach_content() );
+ execute( TC_pcu_data_ind_lqual_cb() );
execute( TC_pcu_paging_from_rsl() );
execute( TC_pcu_time_ind() );
execute( TC_pcu_rts_req() );
diff --git a/bts/BTS_Tests_LAPDm.ttcn b/bts/BTS_Tests_LAPDm.ttcn
index edbd37b..da78ccb 100644
--- a/bts/BTS_Tests_LAPDm.ttcn
+++ b/bts/BTS_Tests_LAPDm.ttcn
@@ -71,201 +71,152 @@ template LAPDm_ph_data t_PH_DATA(template GsmSapi sapi, template boolean sacch,
sapi := sapi,
lapdm := frame
}
-/* template for a valid SABM frame */
-template LapdmFrame LAPDm_B_SABM(template GsmSapi sapi, octetstring payload) := {
- ab := {
- addr := tr_LapdmAddr(sapi, false),
- ctrl := tr_LapdmCtrlSABM(true),
- len := lengthof(payload),
- m := false,
- el := 1,
- payload := payload
- }
-}
-
-/* template for a valid UA frame */
-template LapdmFrame tr_LAPDm_B_UA(template GsmSapi sapi, template octetstring payload) := {
- ab := {
- addr := tr_LapdmAddr(sapi, false),
- ctrl := tr_LapdmCtrlUA(true),
- len := ?,
- m := false,
- el := 1,
- payload := payload
- }
-}
-
-/* template for a valid UA frame */
-template LapdmFrame LAPDm_B_UA(template GsmSapi sapi, octetstring payload) := {
- ab := {
- addr := tr_LapdmAddr(sapi, false),
- ctrl := tr_LapdmCtrlUA(true),
- len := lengthof(payload),
- m := false,
- el := 1,
- payload := payload
- }
-}
-
-/* template for a valid UI frame */
-template LapdmFrame LAPDm_B_UI(template GsmSapi sapi, octetstring payload) := {
- ab := {
- addr := tr_LapdmAddr(sapi, true),
- ctrl := tr_LapdmCtrlUI(false),
- len := lengthof(payload),
- m := false,
- el := 1,
- payload := payload
- }
-}
-
-template LapdmFrame t_nopayload(template GsmSapi sapi) := {
- ab := {
- addr := tr_LapdmAddr(sapi, true),
- ctrl := ?,
- len := 0,
- m := false,
- el := 1,
- payload := ''O
- }
-}
-template LapdmFrame LAPDm_B_DISC(template GsmSapi sapi) modifies t_nopayload := {
- ab := {
- ctrl := tr_LapdmCtrlDISC(true)
- }
-}
-
-template LapdmFrame LAPDm_B_RR(template GsmSapi sapi, template uint3_t nr) modifies t_nopayload := {
- ab := {
- ctrl := tr_LapdmCtrlRR(nr, false)
- }
-}
-
-
-function f_test_sabm_results_in_ua(uint8_t sapi, boolean use_sacch, octetstring payload) runs on lapdm_test_CT return boolean {
+function f_test_sabm_results_in_ua(uint8_t sapi, boolean use_sacch, octetstring payload) runs on ConnHdlr return boolean {
var LAPDm_ph_data phd;
var boolean result := false;
timer T := 5.0;
- f_establish_dcch();
- LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));
- log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));
+ LAPDM.send(t_PH_DATA(sapi, use_sacch, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=false, l3:=payload)));
T.start
alt {
- [] LAPDM.receive(t_PH_DATA(?, use_sacch, LAPDm_B_UA(sapi, payload))) { result := true; }
- [] LAPDM.receive(t_PH_DATA(?, use_sacch, ?)) -> value phd { log("Other msg on DCH: ", phd); repeat; }
- [] LAPDM.receive(t_PH_DATA(?, ?, ?)) -> value phd { log("Other PH-DATA: ", phd); repeat; }
+ [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=false, l3:=payload))) { result := true; }
+ [] RSL.receive {repeat;}
+ [] LAPDM.receive { repeat; }
[] T.timeout { }
}
- LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_RR(sapi, 0)));
- f_release_dcch();
+ LAPDM.send(t_PH_DATA(sapi, use_sacch, ts_LAPDm_RR(sapi, c_r:=cr_MT_CMD, p:=false, nr:=0)));
return result;
}
-testcase TC_sabm_ua_dcch_sapi0() runs on lapdm_test_CT {
- f_lapdm_init();
+function f_TC_sabm_ua_dcch_sapi0(charstring id) runs on ConnHdlr {
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
+ var default d := activate(as_ignore_background());
if (not f_test_sabm_results_in_ua(0, false, 'FEFE'O)) {
setverdict(fail);
}
setverdict(pass);
+ deactivate(d);
+ fp_common_fini();
}
-testcase TC_sabm_ua_dcch_sapi0_nopayload() runs on lapdm_test_CT {
- f_lapdm_init();
+function f_TC_sabm_ua_dcch_sapi0_nopayload(charstring id) runs on ConnHdlr {
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
+ var default d := activate(as_ignore_background());
if (f_test_sabm_results_in_ua(0, false, ''O)) {
setverdict(fail, "Initial SABM/UA must contain L3 payload but BTS accepts without");
}
setverdict(pass);
+ deactivate(d);
+ fp_common_fini();
}
-testcase TC_sabm_ua_dcch_sapi3() runs on lapdm_test_CT {
- f_lapdm_init();
+function f_TC_sabm_ua_dcch_sapi3(charstring id) runs on ConnHdlr {
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
+ var default d := activate(as_ignore_background());
if (f_test_sabm_results_in_ua(3, false, 'FEFE'O)) {
setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=3");
}
setverdict(pass);
+ deactivate(d);
+ fp_common_fini();
}
-testcase TC_sabm_ua_dcch_sapi4() runs on lapdm_test_CT {
- f_lapdm_init();
+function f_TC_sabm_ua_dcch_sapi4(charstring id) runs on ConnHdlr {
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
+ var default d := activate(as_ignore_background());
if (f_test_sabm_results_in_ua(4, false, 'FEFE'O)) {
setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=4");
}
setverdict(pass);
+ deactivate(d);
+ fp_common_fini();
+}
+
+testcase TC_sabm_ua_dcch_sapi0() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_ua_dcch_sapi0));
+}
+
+testcase TC_sabm_ua_dcch_sapi0_nopayload() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_ua_dcch_sapi0_nopayload));
+}
+
+testcase TC_sabm_ua_dcch_sapi3() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_ua_dcch_sapi3));
+}
+
+testcase TC_sabm_ua_dcch_sapi4() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_ua_dcch_sapi4));
}
-testcase TC_sabm_contention() runs on lapdm_test_CT {
+function f_TC_sabm_contention(charstring id) runs on ConnHdlr {
var LAPDm_ph_data phd;
const octetstring payload := '0102030405'O;
const GsmSapi sapi := 0;
const boolean use_sacch := false;
timer T := 5.0;
- f_lapdm_init();
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
- f_establish_dcch();
/* first frame is our real SABM */
- LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));
+ LAPDM.send(t_PH_DATA(sapi, use_sacch, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=false, l3:=payload)));
/* second frame is a SABM with different payload, which BTS has to ignore according to 8.4.1.4 */
- LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, 'ABCDEF'O)));
- log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));
+ LAPDM.send(t_PH_DATA(sapi, use_sacch, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=false, l3:='ABCDEF'O)));
T.start
alt {
- [] LAPDM.receive(t_PH_DATA(?, use_sacch, LAPDm_B_UA(sapi, payload))) { setverdict(pass); repeat; }
- [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_B_UA(sapi, ?))) {
+ [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=false, l3:=payload))) { setverdict(pass); repeat; }
+ [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=false, l3:=?))) {
setverdict(fail, "Second SABM was responded to during contention resolution");
- }
+ }
+ [] RSL.receive {repeat;}
[] LAPDM.receive { repeat };
[] T.timeout { }
}
- f_release_dcch();
+
+ fp_common_fini();
+}
+
+testcase TC_sabm_contention() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_contention));
}
/* we test that a re-transmitted SABM with identical payload will result in the retransmission of a
* UA. This is required during the contention resolution procedure as specified in 8.4.1.4 */
-testcase TC_sabm_retransmit() runs on lapdm_test_CT {
+function f_TC_sabm_retransmit(charstring id) runs on ConnHdlr {
const octetstring payload := '00FEFEDEADBEEF'O;
- f_lapdm_init();
+ fp_common_init();
+ RSL.clear;
+ LAPDM.clear;
+ var default d := activate(as_ignore_background());
if (not f_test_sabm_results_in_ua(0, false, payload)) {
- setverdict(fail, "UA not received for first SABM");
+ setverdict(fail);
}
if (not f_test_sabm_results_in_ua(0, false, payload)) {
- setverdict(fail, "UA not received for second SABM");
+ setverdict(fail);
}
setverdict(pass);
+ deactivate(d);
+ fp_common_fini();
}
-testcase TC_foo() runs on lapdm_test_CT {
- var LapdmFrame lf;
-/*
- var LapdmFrame lf := valueof(LAPDm_B_UA(0, ''O));
- log("ENC UA: ", enc_LapdmFrame(lf));
- lf := valueof(LAPDm_B_UI(0, ''O));
- log("ENC UI B: ", enc_LapdmFrame(lf));
- log("ENC UI B: ", enc_LapdmFrameB(lf.b));
-
- log("DEC UI AF: ", dec_LapdmAddressField('03'O));
-*/
-
- lf := valueof(LAPDm_B_RR(0, 0));
- log("ENC RR: ", enc_LapdmFrame(lf));
-
- lf := valueof(LAPDm_B_UA(0, ''O));
- log("ENC UA: ", enc_LapdmFrame(lf));
-
- lf := valueof(LAPDm_B_UI(0, ''O));
- log("ENC UI: ", enc_LapdmFrame(lf));
-
- log("DEC UI CU: ", dec_LapdmCtrlU('03'O));
- log("DEC UI CT: ", dec_LapdmCtrl('03'O));
-
- log("DEC UA: ", dec_LapdmFrameAB('017301'O));
- log("DEC UI: ", dec_LapdmFrameAB('030301'O));
- log("DEC I: ", dec_LapdmFrameAB('030001'O));
- log("DEC S: ", dec_LapdmFrameAB('030101'O));
- log("DEC: ", dec_LapdmFrameAB('030301'O));
- log("DEC: ", dec_LapdmFrameAB('0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O));
+testcase TC_sabm_retransmit() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_sabm_retransmit));
}
/*********************************************************************************
@@ -548,12 +499,13 @@ private altstep as_rsl_fail_err() runs on ConnHdlr {
}
}
/* all of the above */
-private altstep as_ignore_background(boolean want_dcch := true) runs on ConnHdlr {
+private altstep as_ignore_background(boolean want_dcch := true, boolean ignore_rsl_errors := false) runs on ConnHdlr {
[want_dcch] as_lapdm_acch();
[not want_dcch] as_lapdm_dcch();
[] as_lapdm_idle();
[] as_rsl_meas_rep();
- [] as_rsl_fail_err();
+ [not ignore_rsl_errors] as_rsl_fail_err();
+ [ignore_rsl_errors] RSL.receive(tr_RSL_ERROR_IND(g_chan_nr, ?, ?)) { repeat;}
}
/* Test the operation of Layer 2 sequence numbering.
@@ -720,6 +672,266 @@ testcase TC_iframe_timer_recovery() runs on test_CT {
f_testmatrix_each_chan(pars, refers(f_TC_iframe_timer_recovery));
}
+/* 25.2.6.1 ns sequence error
+sends wrong N(S), expects REJ, sends wrong N(S) with P=1, expects REJ with F=1 */
+private function f_TC_ns_seq_error(charstring id) runs on ConnHdlr {
+ const integer sapi := 0;
+ var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));
+ var default d;
+ timer T := 3.0;
+
+ fp_common_init();
+
+ /* some common altstep for meas res and other background noise */
+ d := activate(as_ignore_background(ignore_rsl_errors := true));
+ RSL.clear;
+ LAPDM.clear;
+
+ var octetstring l3_mo := f_rnd_octstring(12);
+ var octetstring l3_mt := f_rnd_octstring(12);
+
+ /* 1) The BTS is brought into the multiple frame established state */
+
+ /* MO Establish Request via LADPm: SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201.. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3_mo)));
+ RSL.receive(tr_RSL_EST_IND(g_chan_nr, link_id, l3_mo));
+ /* UA: SAPI = 0, R = 0, F = 1, M = 0, L = L of SABM. */
+ LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=true, l3:=l3_mo)));
+
+ /* 2) The MS sends an L3 Request to the BTS */
+ l3_mo := f_rnd_octstring(18);
+ /* SAPI = 0, C = 1, P = 0, M = 0, 0 ≤ L ≤ N201, N(S) = 0, N(R) = 0. * */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,
+ nr:=0, ns:=0, l3:=l3_mo)));
+ RSL.receive(tr_RSL_DATA_IND(g_chan_nr, link_id, l3_mo));
+ /* 3) The BTS shall respond with a RR frame though this may be incorporated with
+ the L3 Response I frame. */
+ RSL.send(ts_RSL_DATA_REQ(g_chan_nr, link_id, l3_mt));
+ alt {
+ /* SAPI = 0, R = 1, F = 0, M = 0, L = 0, N(R) = 1. */
+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_RR(sapi, c_r:=cr_MT_RSP, p:=false, nr:=1))) {
+ repeat;
+ }
+ /* SAPI = 0, C = 0, P = 0, M = 0, 0 ≤ L ≤ N201, N(R) = 1, N(S) = 0 */
+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=false,
+ nr:=1, ns:=0, l3:=l3_mt)));
+ }
+
+ /* 4) The MS shall then send an I frame containing Identity Request with incorrect N(S)
+ but correctly acknowledging the MS's I frame; P bit set to zero. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,
+ nr:=1, ns:=0, l3:=l3_mo)));
+
+ /* no rsl data ind due to wrong ns */
+
+ /* The BTS shall send a REJ frame. */
+ timer T1 := 2.0;
+ T1.start;
+ alt{
+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_REJ(sapi, c_r:=cr_MT_RSP, p:=false, nr:=1)));
+ [] T1.timeout{ setverdict(fail, "Missing first REJ")}
+ }
+
+ f_sleep(2.0); // T200
+
+ /* The MS shall, after T200, send another I frame with incorrect N(S), P bit set to 1 this time. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=true,
+ nr:=1, ns:=0, l3:=l3_mo)));
+
+ /* The BTS shall respond with a REJ, F bit set to 1. */
+ T1.start;
+ alt{
+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_REJ(sapi, c_r:=cr_MT_RSP, p:=true, nr:=1)));
+ [] T1.timeout{ setverdict(fail, "Missing second REJ")}
+ }
+
+ deactivate(d);
+ fp_common_fini();
+ setverdict(pass);
+}
+
+testcase TC_ns_seq_error() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_ns_seq_error));
+}
+
+/* 25.2.6.2 nr sequence error */
+private function f_TC_nr_seq_error(charstring id) runs on ConnHdlr {
+ const integer sapi := 0;
+ var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));
+ var default d;
+ var integer n201 := 20;
+ if (link_id.c == SACCH) {
+ n201 := 18;
+ }
+
+ fp_common_init();
+
+ /* some common altstep for meas res and other background noise */
+ d := activate(as_ignore_background(ignore_rsl_errors := true));
+ RSL.clear;
+ LAPDM.clear;
+
+ var octetstring l3_mo := f_rnd_octstring(12);
+ var octetstring l3_mt := f_rnd_octstring(12);
+
+ /* 1) The BTS is brought into the multiple frame established state */
+
+ /* MO Establish Request via LADPm: SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201.. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3_mo)));
+ RSL.receive(tr_RSL_EST_IND(g_chan_nr, link_id, l3_mo));
+ /* UA: SAPI = 0, R = 0, F = 1, M = 0, L = L of SABM. */
+ LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=true, l3:=l3_mo)));
+
+ /* 2) The MS shall send an I frame containing an information field of length N201 and an
+ incorrect receive sequence number. */
+ l3_mo := f_rnd_octstring(n201);
+ /* SAPI = 0, C = 1, P = 0, M = 0, L = N201, N(S) = 0, N(R) = 1. * */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,
+ nr:=1, ns:=0, l3:=l3_mo)));
+
+ /* The BTS may: a) send a DISC frame within N200×T200; */
+ /* DISC SAPI = 0, C = 0, P = 1, M = 0, L = 0. */
+ timer T1 := 2.0;
+ T1.start;
+ alt{
+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_DISC(sapi, c_r:=cr_MT_CMD, p:=true)));
+ [] T1.timeout{ setverdict(fail, "Missing DISC from BTS")}
+ }
+
+ /* a) the MS shall respond with a UA frame.
+ SAPI = 0, R = 0, F = 1, M = 0, L = 0. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_UA(sapi, c_r:=cr_MO_CMD, f:=true, l3:=l3_mo)));
+
+ deactivate(d);
+ fp_common_fini();
+ setverdict(pass);
+}
+
+testcase TC_nr_seq_error() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ f_testmatrix_each_chan(pars, refers(f_TC_nr_seq_error));
+}
+
+private function f_TC_rec_invalid_frame_txrx(integer sapi, LapdmFrame x) runs on ConnHdlr {
+ LAPDM.send(t_PH_DATA(0, false, x));
+ f_sleep(2.0); // T200
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=true, nr:=0)));
+ LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_RR(sapi, c_r:=cr_MT_RSP, p:=true , nr := 0)));
+}
+
+/* 25.2.7 Test on receipt of invalid frames
+sends a bunch of different invalid frames, expects the BTS to ignore all of them */
+private function f_TC_rec_invalid_frame(charstring id) runs on ConnHdlr {
+ const integer sapi := 0;
+ var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));
+ var default d;
+ timer T := 3.0;
+
+ fp_common_init();
+
+ /* some common altstep for meas res and other background noise */
+ d := activate(as_ignore_background(ignore_rsl_errors := true));
+ RSL.clear;
+ LAPDM.clear;
+
+ var octetstring l3_mo := f_rnd_octstring(12);
+ var octetstring l3_mt := f_rnd_octstring(12);
+
+ /* 1) The BTS is brought into the multiple frame established state */
+
+ /* MO Establish Request via LADPm: SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201.. */
+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3_mo)));
+ RSL.receive(tr_RSL_EST_IND(g_chan_nr, link_id, l3_mo));
+ /* UA: SAPI = 0, R = 0, F = 1, M = 0, L = L of SABM. */
+ LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=true, l3:=l3_mo)));
+
+
+ /* 1: One RR frame: SAPI = 0, R = 0, F = 0, M = 0, L > 0, N(R) = 1.
+ RR frame with the Length indicator greater than zero and a faulty N(R); */
+ var LapdmFrame x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.payload := f_rnd_octstring(5);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 3: One REJ frame: SAPI = 0, R = 0, F = 0, M = 0, L = 0, N(R) = 1, EA = 0.
+ EJ frame with the EA bit set to zero and a faulty N(R); */
+ x:= valueof(ts_LAPDm_REJ(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.addr.ea := false;
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 4: One SABM frame: SAPI = 0, C = 1, P = 1, M = 0, L = 0, EL = 0.
+ SABM frame with the EL bit set to zero; */
+ l3_mo := ''O;
+ x:= valueof(ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3_mo));
+ x.ab.el := 0;
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 5: One DM frame: SAPI = 0, R = 0, F = 1, M = 0, L > 0.
+ DM frame with the Length indicator greater than zero;*/
+ x:= valueof(ts_LAPDm_DM(sapi, c_r:=cr_MO_CMD, f:=true));
+ x.ab.payload := f_rnd_octstring(5);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 6: One DISC frame: SAPI = 0, C = 1, P = 1, M = 1, L = 0.
+ DISC frame with the M bit set to 1; */
+ x:= valueof(ts_LAPDm_DISC(sapi, c_r:=cr_MO_CMD, p:=true));
+ x.ab.m := true;
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 7: One UA frame: SAPI = 0, R = 0, F = 0, M = 0, L = 0, EA = 0.
+ UA frame with the EA bit set to zero*/
+ x:= valueof(ts_LAPDm_UA(sapi, c_r:=cr_MO_CMD, f:=false, l3:=''O));
+ x.ab.addr.ea := false;
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 8: One I frame: SAPI = 0, C = 1, P = 0, M = 0, L > N201, N(R) = 0, N(S) = 6.
+ I frame with the Length indicator greater than N201;*/
+ x:= valueof(ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=true, nr := 0, ns := 6, l3 := f_rnd_octstring(25)))
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 9: One I frame: SAPI = 0, C = 1, P = 0, M = 1, L < N201, N(R) = 0, N(S) = 7.
+ I frame with the M bit set to 1 and the Length indicator less than N201;*/
+ x:= valueof(ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=true, nr := 0, ns := 7, l3 := f_rnd_octstring(5)))
+ x.ab.m := true;
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 10: One RR frame: SAPI = 0, C = 1, P = 1, M = 0, L = 0, N(R) = 0. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=true, nr:=0));
+ f_TC_rec_invalid_frame_txrx(0, x);
+
+ /* command frames with correct Address and Length indicator field and a non-implemented control field */
+ /* 12: One command frame with Control Field = xxx1 1101. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('00011101'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 13: One command frame with Control field = xxx1 1011. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('00011011'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 14: One command frame with Control field = xxx1 0111. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('00010001'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 15: One command frame with Control field = 01x1 1111. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('01011111'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 16: One command frame with Control field = 1xx1 1111. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('10011111'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 17: One command frame with Control field = 0011 0011. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('00110011'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+ /* 18: One command frame with Control field = 1xx1 0011. */
+ x:= valueof(ts_LAPDm_RR(sapi, c_r:=cr_MO_CMD, p:=false, nr:=1));
+ x.ab.ctrl.other := bit2int('10010011'B);
+ f_TC_rec_invalid_frame_txrx(0, x);
+
+ deactivate(d);
+ fp_common_fini();
+ setverdict(pass);
+}
+
+testcase TC_rec_invalid_frame() runs on test_CT {
+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));
+ pars.t_guard := 60.0;
+ f_testmatrix_each_chan(pars, refers(f_TC_rec_invalid_frame));
+}
+
type record LapdmDlConfig {
integer n201,
integer t200
@@ -1102,7 +1314,6 @@ testcase TC_sabm_incorrect_c() runs on test_CT {
}
control {
- execute(TC_foo());
execute(TC_sabm_ua_dcch_sapi0());
execute(TC_sabm_ua_dcch_sapi0_nopayload());
execute(TC_sabm_ua_dcch_sapi3());
@@ -1115,6 +1326,9 @@ control {
execute(TC_establish_ign_first_sabm());
execute(TC_iframe_seq_and_ack());
execute(TC_iframe_timer_recovery());
+ execute(TC_ns_seq_error());
+ execute(TC_nr_seq_error());
+ execute(TC_rec_invalid_frame());
execute(TC_segm_concat_dcch());
execute(TC_segm_concat_sacch());
execute(TC_t200_n200());
diff --git a/bts/regen_makefile.sh b/bts/regen_makefile.sh
index c912da8..9f1bf1d 100755
--- a/bts/regen_makefile.sh
+++ b/bts/regen_makefile.sh
@@ -2,6 +2,6 @@
FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc UD_PT.cc RLCMAC_EncDec.cc Native_FunctionDefs.cc TRXC_CodecPort_CtrlFunctDef.cc L1CTL_PortType_CtrlFunctDef.cc TELNETasp_PT.cc"
-export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_OML"
+export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_OML -DIPA_EMULATION_CTRL"
../regen-makefile.sh BTS_Tests.ttcn $FILES
diff --git a/cbc/gen_links.sh b/cbc/gen_links.sh
index 8dea495..010d24c 100755
--- a/cbc/gen_links.sh
+++ b/cbc/gen_links.sh
@@ -29,6 +29,11 @@ DIR=$BASEDIR/titan.ProtocolModules.BSSMAP_v11.2.0/src
FILES="BSSAP_Types.ttcn"
gen_links $DIR $FILES
+DIR=../library/sabp
+FILES="SABP_CommonDataTypes.asn SABP_Constants.asn SABP_Containers.asn SABP_IEs.asn SABP_PDU_Contents.asn
+SABP_PDU_Descriptions.asn SABP_Types.ttcn "
+gen_links $DIR $FILES
+
DIR=../library
FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
FILES+="CBSP_Types.ttcn CBSP_Templates.ttcn "
diff --git a/cbc/regen_makefile.sh b/cbc/regen_makefile.sh
index fcacb17..c1e8590 100755
--- a/cbc/regen_makefile.sh
+++ b/cbc/regen_makefile.sh
@@ -1,7 +1,8 @@
#!/bin/sh
FILES="*.ttcn TCCConversion.cc TCCInterface.cc TCCEncoding.cc IPL4asp_PT.cc IPL4asp_discovery.cc TELNETasp_PT.cc Native_FunctionDefs.cc SCTPasp_PT.cc CBSP_CodecPort_CtrlFunctdef.cc "
-#FILES+="*.ttcnpp *.c *.asn"
+#FILES+="*.ttcnpp "
+FILES+="*.asn"
export CPPFLAGS_TTCN3=""
diff --git a/deps/Makefile b/deps/Makefile
index cdca8f1..61afb37 100644
--- a/deps/Makefile
+++ b/deps/Makefile
@@ -51,6 +51,7 @@ ECLIPSEGIT2_REPOS= titan.ProtocolModules.GRE \
titan.ProtocolModules.GTPv2_v13.7.0 \
titan.ProtocolModules.ISUP_Q.762 \
titan.ProtocolModules.MobileL3_v13.4.0 \
+ titan.ProtocolModules.NAS_EPS_15.2.0.1 \
titan.ProtocolModules.NS_v7.3.0 \
titan.ProtocolModules.SNDCP_v7.0.0 \
titan.ProtocolEmulations.SCCP
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index dc9d07c..31c1056 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -22,6 +22,7 @@ module GGSN_Tests {
import from GTPC_Types all;
import from GTPU_Types all;
import from IPCP_Types all;
+ import from PAP_Types all;
import from IP_Types all;
import from ICMP_Types all;
import from ICMPv6_Types all;
@@ -932,6 +933,39 @@ module GGSN_Tests {
f_pdp_ctx_del(ctx, '1'B);
}
+ /* Test PDP context activation for dynamic IPv4 EUA with IPv4 DNS in IPCP + PAP authentication (broken) */
+ testcase TC_pdp4_act_deact_ipcp_pap_broken() runs on GT_CT {
+ f_init();
+ var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);
+ var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2);
+ var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));
+ ctx.pco_req := valueof(ts_PCO_PAP_IPv4_DNS);
+ f_pdp_ctx_act(ctx);
+ f_PCO_ensure_no_duplicates(ctx.pco_neg);
+ /* verify IPCP is at all contained */
+ if (not match(ctx.pco_neg, tr_PCO_Contains('8021'O))) {
+ setverdict(fail, "IPCP not found in PCO");
+ }
+ /* verify IPCP contains both primary and secondary DNS */
+ var IpcpPacket ipcp := dec_IpcpPacket(f_PCO_extract_proto(ctx.pco_neg, '8021'O));
+ if (not match(ipcp, tr_IPCP_Ack_DNS(0, ggsn_ip4_dns1, ggsn_ip4_dns2))) {
+ if (not match(ipcp, tr_IPCP_Ack_DNS(0))) {
+ setverdict(fail, "Primary/Secondary DNS PCO IPCP option not found");
+ } else {
+ setverdict(fail, "Primary/Secondary DNS PCO IPCP option found but not matching expected values");
+ }
+ }
+ /* verify that PAP is contained */
+ if (not match(ctx.pco_neg, tr_PCO_Contains('C023'O))) {
+ setverdict(fail, "PAP not found in PCO");
+ }
+ var PapPacket pap := dec_PapPacket(f_PCO_extract_proto(ctx.pco_neg, 'C023'O));
+ if (not match(pap, tr_PAP_AuthAck)) {
+ setverdict(fail, "PAP isn't an AuthenticateAck: ", pap);
+ }
+ f_pdp_ctx_del(ctx, '1'B);
+ }
+
/* Test PDP context activation for dynamic IPv4 EUA with IPv4 DNS in PCO */
testcase TC_pdp4_act_deact_pcodns() runs on GT_CT {
f_init();
@@ -1277,6 +1311,7 @@ module GGSN_Tests {
control {
execute(TC_pdp4_act_deact());
execute(TC_pdp4_act_deact_ipcp());
+ execute(TC_pdp4_act_deact_ipcp_pap_broken());
execute(TC_pdp4_act_deact_pcodns());
execute(TC_pdp4_act_deact_gtpu_access());
execute(TC_pdp4_clients_interact_with_txseq());
diff --git a/ggsn_tests/expected-results.xml b/ggsn_tests/expected-results.xml
index c2defea..c60a804 100644
--- a/ggsn_tests/expected-results.xml
+++ b/ggsn_tests/expected-results.xml
@@ -1,7 +1,8 @@
<?xml version="1.0"?>
-<testsuite name='GGSN_Tests' tests='14' failures='1' errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='GGSN_Tests' tests='15' failures='1' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_ipcp' time='MASKED'/>
+ <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_ipcp_pap_broken' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_pcodns' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_gtpu_access' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp4_clients_interact_with_txseq' time='MASKED'/>
diff --git a/ggsn_tests/gen_links.sh b/ggsn_tests/gen_links.sh
index 82e35d4..1b54e9d 100755
--- a/ggsn_tests/gen_links.sh
+++ b/ggsn_tests/gen_links.sh
@@ -45,7 +45,7 @@ FILES="TELNETasp_PT.cc TELNETasp_PT.hh TELNETasp_PortType.ttcn"
gen_links $DIR $FILES
DIR=../library
-FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn "
+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn PAP_Types.ttcn "
FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Templates.ttcn "
FILES+="Osmocom_VTY_Functions.ttcn "
gen_links $DIR $FILES
diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index b6bd1ad..f309575 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -302,6 +302,14 @@ function f_vty_transceive_match(TELNETasp_PT pt, charstring cmd, template charst
}
}
+function f_vty_transceive_nomatch(TELNETasp_PT pt, charstring cmd, template charstring exp_ret) {
+ var charstring ret := f_vty_transceive_ret(pt, cmd);
+ if (match(ret, exp_ret)) {
+ setverdict(fail, "Matching VTY response: ", ret, ", should *not* have matched: ", exp_ret);
+ mtc.stop;
+ }
+}
+
private template (value) charstring t_subscr_prefix(hexstring imsi) :=
"subscriber imsi " & hex2str(imsi) & " ";
@@ -351,6 +359,11 @@ function f_vty_subscr_show(TELNETasp_PT VTY, HlrSubscriber sub, template charstr
f_vty_transceive_match(VTY, prefix & "show", exp);
}
+/* perform 'show' on subscriber; result must not match with pattern 'exp' */
+function f_vty_subscr_show_nomatch(TELNETasp_PT VTY, HlrSubscriber sub, template charstring exp) {
+ var charstring prefix := valueof(t_subscr_prefix(sub.imsi));
+ f_vty_transceive_nomatch(VTY, prefix & "show", exp);
+}
/***********************************************************************
* Helper functions for ConnHdlr
@@ -561,6 +574,47 @@ runs on HLR_ConnHdlr return GSUP_PDU {
return ret;
}
+function f_perform_CHECK_IMEI(hexstring imsi, hexstring imei,
+ template (omit) integer exp_err_cause := omit,
+ template (omit) GSUP_IMEIResult result := omit)
+runs on HLR_ConnHdlr {
+ var GSUP_PDU pdu;
+ timer T := 3.0;
+ var boolean exp_fail := false;
+ if (not istemplatekind(exp_err_cause, "omit")) {
+ exp_fail := true;
+ }
+
+ GSUP.send(valueof(ts_GSUP_CHECK_IMEI_REQ(imsi, imei)));
+ T.start;
+ alt {
+ [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, exp_err_cause)) -> value pdu {
+ setverdict(pass);
+ }
+ [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {
+ setverdict(fail, "Unexpected CHECK IMEI ERROR Cause: ", pdu);
+ }
+ [exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {
+ setverdict(fail, "Unexpected CHECK IMEI RES instead of ERR");
+ }
+ [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_ERR(imsi, ?)) -> value pdu {
+ setverdict(fail, "Unexpected CHECK IMEI ERROR");
+ }
+ [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, result)) -> value pdu {
+ setverdict(pass);
+ }
+ [not exp_fail] GSUP.receive(tr_GSUP_CHECK_IMEI_RES(imsi, ?)) -> value pdu {
+ setverdict(fail, "Unexpected CHECK IMEI RES");
+ }
+ [] GSUP.receive { repeat; }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for CHECK IMEI response");
+ mtc.stop;
+ }
+ }
+}
+
+
/***********************************************************************
@@ -1077,6 +1131,241 @@ testcase TC_mo_sss_reject() runs on test_CT {
* timeout cases
*/
+
+/* Test Check IMEI */
+private function f_TC_gsup_check_imei() runs on HLR_ConnHdlr {
+ /* store-imei disabled */
+ f_vty_config(VTY, "hlr", "no store-imei");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");
+
+ /* store-imei enabled */
+ f_vty_config(VTY, "hlr", "store-imei");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*IMEI: *12345678901234*");
+}
+testcase TC_gsup_check_imei() runs on test_CT {
+ var HlrSubscriberList sl;
+
+ f_init(false);
+ sl := f_gen_subs();
+ f_start_handler_per_sub(refers(f_TC_gsup_check_imei), sl);
+
+ setverdict(pass);
+}
+
+/* Test Check IMEI with invalid IMEI length */
+private function f_TC_gsup_check_imei_invalid_len() runs on HLR_ConnHdlr {
+ /* IMEI too long */
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '111456789012345F'H, 96 /* Invalid Mandatory Information */);
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '2224567890123456'H, 96 /* Invalid Mandatory Information */);
+
+ /* IMEI too short */
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '3334567890123F'H, 96 /* Invalid Mandatory Information */);
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '444456789012'H, 96 /* Invalid Mandatory Information */);
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, ''H, 96 /* Invalid Mandatory Information */);
+}
+testcase TC_gsup_check_imei_invalid_len() runs on test_CT {
+ var HlrSubscriberList sl;
+
+ f_init(false);
+ sl := f_gen_subs();
+ f_start_handler_per_sub(refers(f_TC_gsup_check_imei_invalid_len), sl);
+
+ setverdict(pass);
+}
+
+/* Test Check IMEI with unknown IMSI */
+private function f_TC_gsup_check_imei_unknown_imsi() runs on HLR_ConnHdlr {
+ f_vty_config(VTY, "hlr", "no store-imei");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '22245678901234'H, 96 /* Invalid Mandatory Information */);
+
+ /* Check again with store-imei set (different code path) */
+ f_vty_config(VTY, "hlr", "store-imei");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '22245678901234'H, 96 /* Invalid Mandatory Information */);
+
+ setverdict(pass);
+}
+testcase TC_gsup_check_imei_unknown_imsi() runs on test_CT {
+ var hexstring imsi := f_rnd_imsi('26242'H);
+ var HLR_ConnHdlrPars pars := valueof(t_Pars(imsi));
+ var HLR_ConnHdlr vc_conn;
+
+ f_init(false);
+ vc_conn := f_start_handler(refers(f_TC_gsup_check_imei_unknown_imsi), pars);
+ vc_conn.done;
+}
+
+/* Test create-subscriber-on-demand during Check IMEI (OsmoMSC would be set to "check-imei-rqd early") */
+private function f_TC_subscr_create_on_demand_check_imei_early() runs on HLR_ConnHdlr {
+ var GSUP_PDU res; /* save various return values to prevent ttcn3 compiler warnings */
+ var charstring imsi_pattern := "*IMSI: " & hex2str(g_pars.sub.imsi) & "*";
+
+ /* Random MSISDN and CS+PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 cs+ps");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d*"); /* last line, hence not matching "\d\d\d\n" */
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*[CP]S disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, ?);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 ps");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*PS disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, ?);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and CS NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 cs");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*PS disabled*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*CS disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and no NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 none");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*PS disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* No MSISDN and no NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand no-msisdn none");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: none*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*PS disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* No MSISDN and CS+PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand no-msisdn cs+ps");
+ f_perform_CHECK_IMEI(g_pars.sub.imsi, '12345678901234'H, result := OSMO_GSUP_IMEI_RESULT_ACK);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: none*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*[CP]S disabled*");
+ res := f_perform_UL(g_pars.sub.imsi, omit);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ setverdict(pass);
+}
+testcase TC_subscr_create_on_demand_check_imei_early() runs on test_CT {
+ var hexstring imsi := f_rnd_imsi('26242'H);
+ var HLR_ConnHdlrPars pars := valueof(t_Pars(imsi));
+ var HLR_ConnHdlr vc_conn;
+
+ f_init(false);
+ vc_conn := f_start_handler(refers(f_TC_subscr_create_on_demand_check_imei_early), pars);
+ vc_conn.done;
+}
+
+/* Test create-subscriber-on-demand during LU (Location Update) */
+private function f_TC_subscr_create_on_demand_ul() runs on HLR_ConnHdlr {
+ var GSUP_PDU res;
+ var charstring imsi_pattern := "*IMSI: " & hex2str(g_pars.sub.imsi) & "*";
+
+ /* Random MSISDN and CS+PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 cs+ps");
+ res := f_perform_UL(g_pars.sub.imsi, ?);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d\n*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*[CP]S disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 ps");
+ res := f_perform_UL(g_pars.sub.imsi, ?);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d\n*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*PS disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and CS NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 cs");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d\n*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*PS disabled*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*CS disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* Random MSISDN and no NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 none");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d\n*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*PS disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* No MSISDN and no NAM (LU must fail) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand no-msisdn none");
+ res := f_perform_UL(g_pars.sub.imsi, ?, 7 /* GPRS services not allowed */);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: none*");
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*CS disabled*PS disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ /* No MSISDN and CS+PS NAM (LU must pass) */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand no-msisdn cs+ps");
+ res := f_perform_UL(g_pars.sub.imsi, omit);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: none*");
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*[CP]S disabled*");
+ f_vty_subscr_delete(VTY, g_pars.sub);
+
+ setverdict(pass);
+}
+testcase TC_subscr_create_on_demand_ul() runs on test_CT {
+ var hexstring imsi := f_rnd_imsi('26242'H);
+ var HLR_ConnHdlrPars pars := valueof(t_Pars(imsi));
+ var HLR_ConnHdlr vc_conn;
+
+ f_init(false);
+ vc_conn := f_start_handler(refers(f_TC_subscr_create_on_demand_ul), pars);
+ vc_conn.done;
+}
+
+/* Test create-subscriber-on-demand during SAI (SendAuthInfo) */
+private function f_TC_subscr_create_on_demand_sai() runs on HLR_ConnHdlr {
+ var GSUP_PDU res;
+ var charstring imsi_pattern := "*IMSI: " & hex2str(g_pars.sub.imsi) & "*";
+
+ /* HLR creates the subscriber on demand. Then the IMSI is known, but there is no auth data, so the HLR returns
+ * the "slightly inaccurate cause 'IMSI Unknown' via GSUP". The MS is able to do a LU afterwards. */
+ f_vty_config(VTY, "hlr", "subscriber-create-on-demand 3 cs+ps");
+ res := f_perform_SAI(g_pars.sub.imsi, 2 /* IMSI Unknown */ );
+
+ /* Verify that it was created before the LU */
+ f_vty_subscr_show(VTY, g_pars.sub, pattern imsi_pattern);
+ f_vty_subscr_show(VTY, g_pars.sub, pattern "*MSISDN: \d\d\d*"); /* last line, hence not matching "\d\d\d\n" */
+ f_vty_subscr_show_nomatch(VTY, g_pars.sub, pattern "*[CP]S disabled*");
+
+ /* Location update */
+ res := f_perform_UL(g_pars.sub.imsi, ?);
+ f_vty_subscr_delete(VTY, g_pars.sub);
+ setverdict(pass);
+}
+testcase TC_subscr_create_on_demand_sai() runs on test_CT {
+ var hexstring imsi := f_rnd_imsi('26242'H);
+ var HLR_ConnHdlrPars pars := valueof(t_Pars(imsi));
+ var HLR_ConnHdlr vc_conn;
+
+ f_init(false);
+ vc_conn := f_start_handler(refers(f_TC_subscr_create_on_demand_sai), pars);
+ vc_conn.done;
+}
+
/* TODO:
* UL with ISD error
* UL with ISD timeout
@@ -1113,6 +1402,13 @@ control {
/* "Structured" Supplementary Services */
execute( TC_mo_sss_reject() );
+
+ execute( TC_gsup_check_imei() );
+ execute( TC_gsup_check_imei_invalid_len() );
+ execute( TC_gsup_check_imei_unknown_imsi() );
+ execute( TC_subscr_create_on_demand_check_imei_early() );
+ execute( TC_subscr_create_on_demand_ul() );
+ execute( TC_subscr_create_on_demand_sai() );
};
};
diff --git a/hlr/expected-results.xml b/hlr/expected-results.xml
index 8329632..b7d2773 100644
--- a/hlr/expected-results.xml
+++ b/hlr/expected-results.xml
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
-<testsuite name='Titan' tests='18' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='Titan' tests='24' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='HLR_Tests' name='TC_gsup_sai_err_invalid_imsi' time='MASKED'/>
<testcase classname='HLR_Tests' name='TC_gsup_sai' time='MASKED'/>
<testcase classname='HLR_Tests' name='TC_gsup_ul_unknown_imsi' time='MASKED'/>
@@ -18,4 +18,10 @@
<testcase classname='HLR_Tests' name='TC_mo_ussd_euse_continue' time='MASKED'/>
<testcase classname='HLR_Tests' name='TC_mo_ussd_euse_defaultroute' time='MASKED'/>
<testcase classname='HLR_Tests' name='TC_mo_sss_reject' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_gsup_check_imei' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_gsup_check_imei_invalid_len' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_gsup_check_imei_unknown_imsi' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_subscr_create_on_demand_check_imei_early' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_subscr_create_on_demand_ul' time='MASKED'/>
+ <testcase classname='HLR_Tests' name='TC_subscr_create_on_demand_sai' time='MASKED'/>
</testsuite>
diff --git a/hlr/osmo-hlr.cfg b/hlr/osmo-hlr.cfg
new file mode 100644
index 0000000..a17881e
--- /dev/null
+++ b/hlr/osmo-hlr.cfg
@@ -0,0 +1,23 @@
+!
+! OsmoHLR example configuration
+!
+log stderr
+ logging filter all 1
+ logging color 1
+ logging print category 1
+ logging timestamp 1
+ logging print extended-timestamp 1
+ logging level all debug
+ logging level linp error
+!
+line vty
+ bind 127.0.0.1
+ctrl
+ bind 127.0.0.1
+hlr
+ gsup
+ bind ip 127.0.0.1
+ euse foobar
+ ussd route prefix *#100 internal own-msisdn
+ ussd route prefix *#101 internal own-imsi
+ ussd route prefix *100 external foobar
diff --git a/library/BSSGP_Emulation.ttcn b/library/BSSGP_Emulation.ttcn
index 5b5628e..f8b9f06 100644
--- a/library/BSSGP_Emulation.ttcn
+++ b/library/BSSGP_Emulation.ttcn
@@ -53,7 +53,9 @@ type port BSSGP_SP_PT message {
PDU_LLC,
PDU_L3_MS_SGSN,
PDU_L3_SGSN_MS;
- out BssgpDecoded,
+ out PDU_BSSGP,
+ PDU_LLC,
+ PDU_SN,
NsStatusIndication,
BssgpStatusIndication,
ASP_Event,
@@ -66,7 +68,9 @@ type port BSSGP_PT message {
in ASP_Event,
NsStatusIndication,
BssgpStatusIndication,
- BssgpDecoded,
+ PDU_BSSGP,
+ PDU_LLC,
+ PDU_SN,
PDU_L3_MS_SGSN,
PDU_L3_SGSN_MS;
out PDU_BSSGP,
@@ -492,6 +496,21 @@ altstep as_blocked() runs on BSSGP_CT {
}
}
+private function f_send_bssgp_dec(BssgpDecoded dec, BSSGP_Client_CT vc_conn, BSSGP_SP_PT pt := BSSGP_SP) runs on BSSGP_CT {
+ if (ispresent(dec.l3_mt)) {
+ pt.send(dec.l3_mt) to vc_conn;
+ } else if (ispresent(dec.l3_mo)) {
+ pt.send(dec.l3_mo) to vc_conn;
+ } else if (ispresent(dec.sndcp)) {
+ pt.send(dec.sndcp) to vc_conn;
+ } else if (ispresent(dec.llc)) {
+ pt.send(dec.llc) to vc_conn;
+ } else {
+ pt.send(dec.bssgp) to vc_conn;
+ }
+}
+
+
altstep as_unblocked() runs on BSSGP_CT {
var BSSGP_Client_CT vc_conn;
var NsUnitdataIndication udi;
@@ -539,7 +558,7 @@ altstep as_unblocked() runs on BSSGP_CT {
[] BSCP.receive(f_BnsUdInd(tr_BSSGP_PS_PAGING(g_cfg.bvci), g_cfg.bvci)) -> value udi {
var hexstring imsi := udi.bssgp.pDU_BSSGP_PAGING_PS.iMSI.digits
vc_conn := f_tbl_comp_by_imsi(imsi);
- BSSGP_SP.send(f_dec_bssgp(udi.bssgp)) to vc_conn;
+ f_send_bssgp_dec(f_dec_bssgp(udi.bssgp), vc_conn);
}
/* Any other PTP BSSGP message: If it has TLLi, route to component; otherwise broadcast */
@@ -548,14 +567,14 @@ altstep as_unblocked() runs on BSSGP_CT {
var template OCT4 tlli := f_bssgp_get_tlli(udi.bssgp);
if (isvalue(tlli)) {
vc_conn := f_tbl_comp_by_tlli(valueof(tlli));
- BSSGP_SP.send(dec) to vc_conn;
+ f_send_bssgp_dec(dec, vc_conn);
} else {
log("No TLLI: Broadcasting ", dec);
/* broadcast this message to all components */
// TITAN DOESN'T DO THIS, *SIGH*: "BSSGP_SP.send(dec) to all component;"
for (var integer i := 0; i < sizeof(ClientTable); i := i+1) {
if (isbound(ClientTable[i].comp_ref)) {
- BSSGP_SP.send(dec) to ClientTable[i].comp_ref;
+ f_send_bssgp_dec(dec, ClientTable[i].comp_ref);
}
}
}
@@ -567,14 +586,14 @@ altstep as_unblocked() runs on BSSGP_CT {
var template OCT4 tlli := f_bssgp_get_tlli(udi.bssgp);
if (isvalue(tlli)) {
vc_conn := f_tbl_comp_by_tlli(valueof(tlli));
- BSSGP_SP_SIG.send(dec) to vc_conn;
+ f_send_bssgp_dec(dec, vc_conn, BSSGP_SP_SIG);
} else {
log("No TLLI: Broadcasting ", dec);
/* broadcast this message to all components */
// TITAN DOESN'T DO THIS, *SIGH*: "BSSGP_SP.send(dec) to all component;"
for (var integer i := 0; i < sizeof(ClientTable); i := i+1) {
if (isbound(ClientTable[i].comp_ref)) {
- BSSGP_SP_SIG.send(dec) to ClientTable[i].comp_ref;
+ f_send_bssgp_dec(dec, vc_conn, BSSGP_SP_SIG);
}
}
}
@@ -731,47 +750,5 @@ runs on BSSGP_Client_CT {
}
}
-template BssgpDecoded tr_BD_BSSGP(template PDU_BSSGP bg) := {
- bssgp := bg,
- llc := *,
- l3_mo := *,
- l3_mt := *,
- sndcp := *
-}
-
-template BssgpDecoded tr_BD_LLC(template PDU_LLC llc) := {
- bssgp := ?,
- llc := llc,
- l3_mo := *,
- l3_mt := *,
- sndcp := *
-}
-
-template BssgpDecoded tr_BD_L3_MT(template PDU_L3_SGSN_MS mt) := {
- bssgp := ?,
- llc := ?,
- l3_mo := omit,
- l3_mt := mt,
- sndcp := omit
-}
-
-template BssgpDecoded tr_BD_L3_MO(template PDU_L3_MS_SGSN mo) := {
- bssgp := ?,
- llc := ?,
- l3_mo := mo,
- l3_mt := omit,
- sndcp := omit
-}
-
-template BssgpDecoded tr_BD_SNDCP(template BIT4 sapi, template PDU_SN sn) := {
- bssgp := ?,
- llc := tr_LLC_UI(?, sapi),
- l3_mo := omit,
- l3_mt := omit,
- sndcp := sn
-}
-
-
-
}
diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
index 4fa6100..41755db 100644
--- a/library/BSSMAP_Templates.ttcn
+++ b/library/BSSMAP_Templates.ttcn
@@ -402,6 +402,11 @@ template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, u
cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
}
+function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
+ var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
+ return cic;
+}
+
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
uint16_t udp_port,
integer len) := {
diff --git a/library/CBSP_Templates.ttcn b/library/CBSP_Templates.ttcn
index 844c47d..3c60f14 100644
--- a/library/CBSP_Templates.ttcn
+++ b/library/CBSP_Templates.ttcn
@@ -40,10 +40,26 @@ template (value) CBSP_IE ts_CbspKARepPeriod(template (value) uint8_t rep_per) :=
template CBSP_IE tr_CbspKARepPeriod(template uint8_t rep_per := ?) :=
tr_CBSP_IE({keep_alive_rep_period := rep_per});
-template (value) CBSP_IE ts_ChannelInd(template (value) uint8_t val) :=
- ts_CBSP_IE(CBSP_IEI_CHANNEL_IND, {channel_ind := val});
-template CBSP_IE tr_ChannelInd(template uint8_t val := ?) :=
- tr_CBSP_IE({channel_ind := val});
+function ts_CbspChannelInd(template (omit) uint8_t val) return template (omit) CBSP_IE {
+ var template (omit) CBSP_IE ie;
+ if (istemplatekind(val, "omit")) {
+ ie := omit;
+ } else {
+ ie := ts_CBSP_IE(CBSP_IEI_CHANNEL_IND, {channel_ind := val});
+ }
+ return ie;
+}
+function tr_CbspChannelInd(template uint8_t val := ?) return template CBSP_IE {
+ var template CBSP_IE ie;
+ if (istemplatekind(val, "omit")) {
+ ie := omit;
+ } else if (istemplatekind(val, "*")) {
+ ie := tr_CBSP_IE({channel_ind := ?}) ifpresent;
+ } else {
+ ie := tr_CBSP_IE({channel_ind := val});
+ }
+ return ie;
+}
template (value) CBSP_IE ts_CbspCause(template (value) CBSP_Cause c) :=
ts_CBSP_IE(CBSP_IEI_CAUSE, {cause := c});
@@ -179,6 +195,7 @@ template CBSP_PDU tr_CBSP(template CBSP_MessageType msg_type := ?, template CBSP
function ts_CBSP_WRITE_CBS(template (value) uint16_t msg_id,
template (value) uint16_t new_ser_nr,
template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind,
template (value) CBSP_Category category,
template (value) uint16_t rep_period,
template (value) uint16_t num_bcast_req,
@@ -188,7 +205,7 @@ function ts_CBSP_WRITE_CBS(template (value) uint16_t msg_id,
ts_CbspMsgId(msg_id),
ts_NewSerNo(new_ser_nr),
ts_CbspCellList(cell_list),
- ts_ChannelInd(0),
+ ts_CbspChannelInd(channel_ind),
ts_CbspCategory(category),
ts_CbspRepetitionPeriod(rep_period),
ts_CbspNumBcastReq(num_bcast_req),
@@ -199,6 +216,7 @@ function ts_CBSP_WRITE_CBS(template (value) uint16_t msg_id,
}
template CBSP_PDU tr_CBSP_WRITE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+ template uint8_t channel_ind := ?,
template CBSP_Category category := ?,
template uint16_t rep_period := ?,
template uint16_t num_bcast_req := ?,
@@ -209,7 +227,7 @@ template CBSP_PDU tr_CBSP_WRITE_CBS(template uint16_t msg_id := ?, template uint
tr_CbspMsgId(msg_id),
tr_NewSerNo(new_ser_nr),
tr_CbspCellList(cell_list),
- tr_ChannelInd(?),
+ tr_CbspChannelInd(channel_ind),
tr_CbspCategory(category),
tr_CbspRepetitionPeriod(rep_period),
tr_CbspNumBcastReq(num_bcast_req),
@@ -219,19 +237,22 @@ template CBSP_PDU tr_CBSP_WRITE_CBS(template uint16_t msg_id := ?, template uint
function ts_CBSP_REPLACE_CBS(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind,
template (value) CBSP_Category category,
template (value) uint16_t rep_period,
template (value) uint16_t num_bcast_req,
+ template (value) uint8_t dcs,
template (value) CBSP_IEs content) return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
ts_NewSerNo(new_ser_nr),
ts_OldSerNo(old_ser_nr),
ts_CbspCellList(cell_list),
- ts_ChannelInd(0),
+ ts_CbspChannelInd(channel_ind),
ts_CbspCategory(category),
ts_CbspRepetitionPeriod(rep_period),
ts_CbspNumBcastReq(num_bcast_req),
+ ts_CbspDCS(dcs),
ts_CbspNumPages(lengthof(content))
};
return ts_CBSP(CBSP_MSGT_WRITE_REPLACE, valueof(ies) & valueof(content));
@@ -239,9 +260,11 @@ function ts_CBSP_REPLACE_CBS(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_
template CBSP_PDU tr_CBSP_REPLACE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
template uint16_t old_ser_nr := ?,
template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+ template uint8_t channel_ind := ?,
template CBSP_Category category := ?,
template uint16_t rep_period := ?,
template uint16_t num_bcast_req := ?,
+ template uint8_t dcs := ?,
template CBSP_IEs content := ?
) :=
tr_CBSP(CBSP_MSGT_WRITE_REPLACE, ({
@@ -249,10 +272,11 @@ template CBSP_PDU tr_CBSP_REPLACE_CBS(template uint16_t msg_id := ?, template ui
tr_NewSerNo(new_ser_nr),
tr_OldSerNo(old_ser_nr),
tr_CbspCellList(cell_list),
- tr_ChannelInd(?),
+ tr_CbspChannelInd(channel_ind),
tr_CbspCategory(category),
tr_CbspRepetitionPeriod(rep_period),
tr_CbspNumBcastReq(num_bcast_req),
+ tr_CbspDCS(dcs),
tr_CbspNumPages(lengthof(content)), all from content }));
template (value) CBSP_PDU ts_CBSP_WRITE_EMERG(uint16_t msg_id, uint16_t new_ser_nr,
@@ -323,7 +347,8 @@ template CBSP_PDU tr_CBSP_REPLACE_EMERG(template uint16_t msg_id := ?, template
/* 8.1.3.2 WRITE-REPLACE COMPLETE */
function ts_CBSP_WRITE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -332,27 +357,33 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
function tr_CBSP_WRITE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
- template BSSMAP_FIELD_CellIdentificationList cell_list)
+ template BSSMAP_FIELD_CellIdentificationList cell_list,
+ template uint8_t channel_ind)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
tr_NewSerNo(new_ser_nr)
};
if (istemplatekind(cell_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (istemplatekind(cell_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspCellList(?);
} else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
function ts_CBSP_REPLACE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
template (value) CBSP_IE_NumBcastComplList compl_list,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -363,12 +394,14 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
function tr_CBSP_REPLACE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
template uint16_t old_ser_nr,
template CBSP_IE_NumBcastComplList compl_list,
- template BSSMAP_FIELD_CellIdentificationList cell_list)
+ template BSSMAP_FIELD_CellIdentificationList cell_list,
+ template uint8_t channel_ind)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
@@ -377,10 +410,13 @@ return template CBSP_PDU {
tr_CbspNumComplList(compl_list)
};
if (istemplatekind(cell_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (istemplatekind(cell_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspCellList(?);
} else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
}
@@ -389,7 +425,8 @@ return template CBSP_PDU {
function ts_CBSP_WRITE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr,
template (value) CBSP_FailureListItems fail_list,
template (omit) CBSP_IE_NumBcastComplList compl_list,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -402,12 +439,14 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}
function tr_CBSP_WRITE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr,
template CBSP_FailureListItems fail_list,
template CBSP_IE_NumBcastComplList compl_list,
- template BSSMAP_FIELD_CellIdentificationList cell_list)
+ template BSSMAP_FIELD_CellIdentificationList cell_list,
+ template uint8_t channel_ind)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
@@ -415,15 +454,20 @@ return template CBSP_PDU {
tr_CbspFailList(fail_list)
};
if (istemplatekind(compl_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspNumComplList ifpresent;
+ } else if (istemplatekind(compl_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspNumComplList(?);
} else if (not istemplatekind(compl_list, "omit")) {
ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
}
if (istemplatekind(cell_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (istemplatekind(cell_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspCellList(?);
} else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}
@@ -431,7 +475,8 @@ return template CBSP_PDU {
function ts_CBSP_REPLACE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
template (value) CBSP_FailureListItems fail_list,
template (omit) CBSP_IE_NumBcastComplList compl_list,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (value) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -445,13 +490,15 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}
function tr_CBSP_REPLACE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr,
template uint16_t old_ser_nr,
template CBSP_FailureListItems fail_list,
template CBSP_IE_NumBcastComplList compl_list,
- template BSSMAP_FIELD_CellIdentificationList cell_list)
+ template BSSMAP_FIELD_CellIdentificationList cell_list,
+ template uint8_t channel_ind)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
@@ -460,37 +507,47 @@ return template CBSP_PDU {
tr_CbspFailList(fail_list)
};
if (istemplatekind(compl_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (istemplatekind(compl_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspNumComplList(?);
} else if (not istemplatekind(compl_list, "omit")) {
ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
}
if (istemplatekind(cell_list, "*")) {
- ies[lengthof(ies)] := *;
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (istemplatekind(cell_list, "?")) {
+ ies[lengthof(ies)] := tr_CbspCellList(?);
} else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
}
/* 8.1.3.4 KILL */
template (value) CBSP_PDU ts_CBSP_KILL(template (value) uint16_t msg_id,
template (value) uint16_t old_ser_nr,
- template (value) BSSMAP_FIELD_CellIdentificationList cell_list) :=
+ template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (omit) uint8_t channel_ind) :=
ts_CBSP(CBSP_MSGT_KILL, {
ts_CbspMsgId(msg_id),
ts_OldSerNo(old_ser_nr),
- ts_CbspCellList(cell_list) });
+ ts_CbspCellList(cell_list),
+ ts_CbspChannelInd(channel_ind)});
template CBSP_PDU tr_CBSP_KILL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
- template BSSMAP_FIELD_CellIdentificationList cell_list := ?) :=
+ template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+ template uint8_t channel_ind := ?) :=
tr_CBSP(CBSP_MSGT_KILL, {
tr_CbspMsgId(msg_id),
tr_OldSerNo(old_ser_nr),
- tr_CbspCellList(cell_list) });
+ tr_CbspCellList(cell_list),
+ tr_CbspChannelInd(channel_ind) });
/* 8.1.3.5 KILL COMPLETE */
function ts_CBSP_KILL_COMPL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
template (omit) CBSP_IE_NumBcastComplList compl_list,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (omit) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -502,11 +559,15 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ if (not istemplatekind(channel_ind, "omit")) {
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+ }
return ts_CBSP(CBSP_MSGT_KILL_COMPL, ies);
}
function tr_CBSP_KILL_COMPL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
template CBSP_IE_NumBcastComplList compl_list := ?,
- template BSSMAP_FIELD_CellIdentificationList cell_list := ?)
+ template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+ template uint8_t channel_ind)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
@@ -522,6 +583,11 @@ return template CBSP_PDU {
} else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ if (istemplatekind(channel_ind, "*")) {
+ ies[lengthof(ies)] := *;
+ } else if (not istemplatekind(channel_ind, "omit")) {
+ ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+ }
return tr_CBSP(CBSP_MSGT_KILL_COMPL, ies);
}
@@ -529,7 +595,8 @@ return template CBSP_PDU {
function ts_CBSP_KILL_FAIL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
template (value) CBSP_FailureListItems fail_list,
template (omit) CBSP_IE_NumBcastComplList compl_list,
- template (omit) BSSMAP_FIELD_CellIdentificationList cell_list)
+ template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+ template (omit) uint8_t channel_ind)
return template (value) CBSP_PDU {
var template (value) CBSP_IEs ies := {
ts_CbspMsgId(msg_id),
@@ -542,24 +609,37 @@ return template (value) CBSP_PDU {
if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := ts_CbspCellList(cell_list);
}
+ if (not istemplatekind(channel_ind, "omit")) {
+ ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+ }
return ts_CBSP(CBSP_MSGT_KILL_FAIL, ies);
}
function tr_CBSP_KILL_FAIL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
template CBSP_FailureListItems fail_list := ?,
template CBSP_IE_NumBcastComplList compl_list := *,
- template BSSMAP_FIELD_CellIdentificationList cell_list := *)
+ template BSSMAP_FIELD_CellIdentificationList cell_list := *,
+ template uint8_t channel_ind := *)
return template CBSP_PDU {
var template CBSP_IEs ies := {
tr_CbspMsgId(msg_id),
tr_OldSerNo(old_ser_nr),
tr_CbspFailList(fail_list)
};
- if (not istemplatekind(compl_list, "*")) {
+ if (istemplatekind(compl_list, "*")) {
+ ies[lengthof(ies)] := tr_CbspNumComplList ifpresent;
+ } else if (not istemplatekind(compl_list, "omit")) {
ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
}
- if (not istemplatekind(cell_list, "*")) {
+ if (istemplatekind(compl_list, "*")) {
+ ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+ } else if (not istemplatekind(cell_list, "omit")) {
ies[lengthof(ies)] := tr_CbspCellList(cell_list);
}
+ if (istemplatekind(channel_ind, "*")) {
+ ies[lengthof(ies)] := tr_CbspChannelInd(?) ifpresent;
+ } else if (not istemplatekind(channel_ind, "omit")) {
+ ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+ }
return tr_CBSP(CBSP_MSGT_KILL_FAIL, ies);
}
diff --git a/library/DIAMETER_CodecPort.ttcn b/library/DIAMETER_CodecPort.ttcn
new file mode 100644
index 0000000..65ae42b
--- /dev/null
+++ b/library/DIAMETER_CodecPort.ttcn
@@ -0,0 +1,81 @@
+module DIAMETER_CodecPort {
+
+/* Simple DIAMETER Codec Port, translating between raw SCTP primitives with
+ * octetstring payload towards the IPL4asp provider, and DIAMETER primitives
+ * which carry the decoded DIAMETER data types as payload.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+ import from IPL4asp_PortType all;
+ import from IPL4asp_Types all;
+ import from DIAMETER_Types all;
+
+ type record DIAMETER_RecvFrom {
+ ConnectionId connId,
+ HostName remName,
+ PortNumber remPort,
+ HostName locName,
+ PortNumber locPort,
+ PDU_DIAMETER msg
+ };
+
+ template DIAMETER_RecvFrom t_DIAMETER_RecvFrom(template PDU_DIAMETER msg) := {
+ connId := ?,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := msg
+ }
+
+ type record DIAMETER_Send {
+ ConnectionId connId,
+ PDU_DIAMETER msg
+ }
+
+ template DIAMETER_Send t_DIAMETER_Send(template ConnectionId connId, template PDU_DIAMETER msg) := {
+ connId := connId,
+ msg := msg
+ }
+
+ private function IPL4_to_DIAMETER_RecvFrom(in ASP_RecvFrom pin, out DIAMETER_RecvFrom pout) {
+ pout.connId := pin.connId;
+ pout.remName := pin.remName;
+ pout.remPort := pin.remPort;
+ pout.locName := pin.locName;
+ pout.locPort := pin.locPort;
+ pout.msg := f_DIAMETER_Dec(pin.msg);
+ } with { extension "prototype(fast)" };
+
+ private function DIAMETER_to_IPL4_Send(in DIAMETER_Send pin, out ASP_Send pout) {
+ pout.connId := pin.connId;
+ pout.proto := {
+ sctp := {
+ sinfo_stream := omit,
+ sinfo_ppid := 46, /* plain text Diameter in SCTP DATA */
+ remSocks := omit,
+ assocId := omit
+ }
+ };
+ pout.msg := f_DIAMETER_Enc(pin.msg);
+ } with { extension "prototype(fast)" };
+
+ type port DIAMETER_CODEC_PT message {
+ out DIAMETER_Send;
+ in DIAMETER_RecvFrom,
+ ASP_ConnId_ReadyToRelease,
+ ASP_Event;
+ } with { extension "user IPL4asp_PT
+ out(DIAMETER_Send -> ASP_Send:function(DIAMETER_to_IPL4_Send))
+ in(ASP_RecvFrom -> DIAMETER_RecvFrom: function(IPL4_to_DIAMETER_RecvFrom);
+ ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
+ ASP_Event -> ASP_Event: simple)"
+ }
+}
diff --git a/library/DIAMETER_CodecPort_CtrlFunct.ttcn b/library/DIAMETER_CodecPort_CtrlFunct.ttcn
new file mode 100644
index 0000000..3b2230d
--- /dev/null
+++ b/library/DIAMETER_CodecPort_CtrlFunct.ttcn
@@ -0,0 +1,44 @@
+module DIAMETER_CodecPort_CtrlFunct {
+
+ import from DIAMETER_CodecPort all;
+ import from IPL4asp_Types all;
+
+ external function f_IPL4_listen(
+ inout DIAMETER_CODEC_PT portRef,
+ in HostName locName,
+ in PortNumber locPort,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_connect(
+ inout DIAMETER_CODEC_PT portRef,
+ in HostName remName,
+ in PortNumber remPort,
+ in HostName locName,
+ in PortNumber locPort,
+ in ConnectionId connId,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_close(
+ inout DIAMETER_CODEC_PT portRef,
+ in ConnectionId id,
+ in ProtoTuple proto := { unspecified := {} }
+ ) return Result;
+
+ external function f_IPL4_setUserData(
+ inout DIAMETER_CODEC_PT portRef,
+ in ConnectionId id,
+ in UserData userData
+ ) return Result;
+
+ external function f_IPL4_getUserData(
+ inout DIAMETER_CODEC_PT portRef,
+ in ConnectionId id,
+ out UserData userData
+ ) return Result;
+
+}
+
diff --git a/library/DIAMETER_CodecPort_CtrlFunctDef.cc b/library/DIAMETER_CodecPort_CtrlFunctDef.cc
new file mode 100644
index 0000000..782d176
--- /dev/null
+++ b/library/DIAMETER_CodecPort_CtrlFunctDef.cc
@@ -0,0 +1,56 @@
+#include "IPL4asp_PortType.hh"
+#include "DIAMETER_CodecPort.hh"
+#include "IPL4asp_PT.hh"
+
+namespace DIAMETER__CodecPort__CtrlFunct {
+
+ IPL4asp__Types::Result f__IPL4__listen(
+ DIAMETER__CodecPort::DIAMETER__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__connect(
+ DIAMETER__CodecPort::DIAMETER__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& remName,
+ const IPL4asp__Types::PortNumber& remPort,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__connect(portRef, remName, remPort,
+ locName, locPort, connId, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__close(
+ DIAMETER__CodecPort::DIAMETER__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto)
+ {
+ return f__IPL4__PROVIDER__close(portRef, connId, proto);
+ }
+
+ IPL4asp__Types::Result f__IPL4__setUserData(
+ DIAMETER__CodecPort::DIAMETER__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);
+ }
+
+ IPL4asp__Types::Result f__IPL4__getUserData(
+ DIAMETER__CodecPort::DIAMETER__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);
+ }
+
+}
+
diff --git a/library/DIAMETER_Emulation.ttcn b/library/DIAMETER_Emulation.ttcn
new file mode 100644
index 0000000..dc7bc94
--- /dev/null
+++ b/library/DIAMETER_Emulation.ttcn
@@ -0,0 +1,427 @@
+module DIAMETER_Emulation {
+
+/* DIAMETER Emulation, runs on top of DIAMETER_CodecPort. It multiplexes/demultiplexes
+ * the individual IMSIs/subscribers, so there can be separate TTCN-3 components handling
+ * each of them.
+ *
+ * The DIAMETER_Emulation.main() function processes DIAMETER primitives from the DIAMETER
+ * socket via the DIAMETER_CodecPort, and dispatches them to the per-IMSI components.
+ *
+ * For each new IMSI, the DiameterOps.create_cb() is called. It can create
+ * or resolve a TTCN-3 component, and returns a component reference to which that IMSI
+ * is routed/dispatched.
+ *
+ * If a pre-existing component wants to register to handle a future inbound IMSI, it can
+ * do so by registering an "expect" with the expected IMSI.
+ *
+ * Inbound DIAMETER messages without IMSI (such as RESET-IND/ACK) are dispatched to
+ * the DiameterOps.unitdata_cb() callback, which is registered with an argument to the
+ * main() function below.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from DIAMETER_CodecPort all;
+import from DIAMETER_CodecPort_CtrlFunct all;
+import from DIAMETER_Types all;
+import from DIAMETER_Templates all;
+import from Osmocom_Types all;
+import from IPL4asp_Types all;
+import from DNS_Helpers all;
+import from MobileL3_Types all;
+
+type hexstring IMSI;
+
+type component DIAMETER_ConnHdlr {
+ port DIAMETER_Conn_PT DIAMETER;
+ /* procedure based port to register for incoming connections */
+ port DIAMETEREM_PROC_PT DIAMETER_PROC;
+}
+
+/* port between individual per-connection components and this dispatcher */
+type port DIAMETER_Conn_PT message {
+ inout PDU_DIAMETER, PDU_ML3_MS_NW, PDU_ML3_NW_MS;
+} with { extension "internal" };
+
+/* global test port e.g. for non-imsi/conn specific messages */
+type port DIAMETER_PT message {
+ inout PDU_DIAMETER;
+} with { extension "internal" };
+
+
+/* represents a single DIAMETER Association */
+type record AssociationData {
+ DIAMETER_ConnHdlr comp_ref,
+ hexstring imsi optional
+};
+
+type component DIAMETER_Emulation_CT {
+ /* Port facing to the UDP SUT */
+ port DIAMETER_CODEC_PT DIAMETER;
+ /* All DIAMETER_ConnHdlr DIAMETER ports connect here
+ * DIAMETER_Emulation_CT.main needs to figure out what messages
+ * to send where with CLIENT.send() to vc_conn */
+ port DIAMETER_Conn_PT DIAMETER_CLIENT;
+ /* currently tracked connections */
+ var AssociationData SgsapAssociationTable[16];
+ /* pending expected CRCX */
+ var ExpectData DiameterExpectTable[8];
+ /* procedure based port to register for incoming connections */
+ port DIAMETEREM_PROC_PT DIAMETER_PROC;
+ /* test port for unit data messages */
+ port DIAMETER_PT DIAMETER_UNIT;
+
+ var charstring g_diameter_id;
+ var integer g_diameter_conn_id := -1;
+}
+
+type function DIAMETERCreateCallback(PDU_DIAMETER msg, hexstring imsi, charstring id)
+runs on DIAMETER_Emulation_CT return DIAMETER_ConnHdlr;
+
+type function DIAMETERUnitdataCallback(PDU_DIAMETER msg)
+runs on DIAMETER_Emulation_CT return template PDU_DIAMETER;
+
+type record DIAMETEROps {
+ DIAMETERCreateCallback create_cb,
+ DIAMETERUnitdataCallback unitdata_cb
+}
+
+type record DIAMETER_conn_parameters {
+ HostName remote_ip,
+ PortNumber remote_sctp_port,
+ HostName local_ip,
+ PortNumber local_sctp_port
+}
+
+function tr_DIAMETER_RecvFrom_R(template PDU_DIAMETER msg)
+runs on DIAMETER_Emulation_CT return template DIAMETER_RecvFrom {
+ var template DIAMETER_RecvFrom mrf := {
+ connId := g_diameter_conn_id,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := msg
+ }
+ return mrf;
+}
+
+private function f_imsi_known(hexstring imsi)
+runs on DIAMETER_Emulation_CT return boolean {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (SgsapAssociationTable[i].imsi == imsi) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_comp_known(DIAMETER_ConnHdlr client)
+runs on DIAMETER_Emulation_CT return boolean {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (SgsapAssociationTable[i].comp_ref == client) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_comp_by_imsi(hexstring imsi)
+runs on DIAMETER_Emulation_CT return DIAMETER_ConnHdlr {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (SgsapAssociationTable[i].imsi == imsi) {
+ return SgsapAssociationTable[i].comp_ref;
+ }
+ }
+ setverdict(fail, "DIAMETER Association Table not found by IMSI", imsi);
+ mtc.stop;
+}
+
+private function f_imsi_by_comp(DIAMETER_ConnHdlr client)
+runs on DIAMETER_Emulation_CT return hexstring {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (SgsapAssociationTable[i].comp_ref == client) {
+ return SgsapAssociationTable[i].imsi;
+ }
+ }
+ setverdict(fail, "DIAMETER Association Table not found by component ", client);
+ mtc.stop;
+}
+
+private function f_imsi_table_add(DIAMETER_ConnHdlr comp_ref, hexstring imsi)
+runs on DIAMETER_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (not isvalue(SgsapAssociationTable[i].imsi)) {
+ SgsapAssociationTable[i].imsi := imsi;
+ SgsapAssociationTable[i].comp_ref := comp_ref;
+ return;
+ }
+ }
+ testcase.stop("DIAMETER Association Table full!");
+}
+
+private function f_imsi_table_del(DIAMETER_ConnHdlr comp_ref, hexstring imsi)
+runs on DIAMETER_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ if (SgsapAssociationTable[i].comp_ref == comp_ref and
+ SgsapAssociationTable[i].imsi == imsi) {
+ SgsapAssociationTable[i].imsi := omit;
+ SgsapAssociationTable[i].comp_ref := null;
+ return;
+ }
+ }
+ setverdict(fail, "DIAMETER Association Table: Couldn't find to-be-deleted entry!");
+ mtc.stop;
+}
+
+
+private function f_imsi_table_init()
+runs on DIAMETER_Emulation_CT {
+ for (var integer i := 0; i < sizeof(SgsapAssociationTable); i := i+1) {
+ SgsapAssociationTable[i].comp_ref := null;
+ SgsapAssociationTable[i].imsi := omit;
+ }
+}
+
+function f_DIAMETER_get_avp(PDU_DIAMETER pdu, template (present) AVP_Code avp_code)
+return template (omit) AVP
+{
+ var integer i;
+
+ for (i := 0; i < lengthof(pdu.avps); i := i+1) {
+ if (not ispresent(pdu.avps[i].avp)) {
+ continue;
+ }
+ var AVP_Header hdr := pdu.avps[i].avp.avp_header;
+ if (match(hdr.avp_code, avp_code)) {
+ return pdu.avps[i].avp;
+ }
+ }
+ return omit;
+}
+
+function f_DIAMETER_get_imsi(PDU_DIAMETER pdu) return template (omit) IMSI
+{
+ var template (omit) AVP imsi_avp;
+
+ imsi_avp := f_DIAMETER_get_avp(pdu, c_AVP_Code_BASE_NONE_User_Name);
+ if (istemplatekind(imsi_avp, "omit")) {
+ return omit;
+ } else {
+ var octetstring imsi_oct := valueof(imsi_avp.avp_data.avp_BASE_NONE_User_Name);
+ return str2hex(oct2char(imsi_oct));
+ }
+}
+
+private template (value) SctpTuple ts_SCTP(template (omit) integer ppid := omit) := {
+ sinfo_stream := omit,
+ sinfo_ppid := ppid,
+ remSocks := omit,
+ assocId := omit
+};
+
+private template PortEvent tr_SctpAssocChange := {
+ sctpEvent := {
+ sctpAssocChange := ?
+ }
+}
+private template PortEvent tr_SctpPeerAddrChange := {
+ sctpEvent := {
+ sctpPeerAddrChange := ?
+ }
+}
+
+private function f_diameter_xceive(template (value) PDU_DIAMETER tx,
+ template PDU_DIAMETER rx_t := ?)
+runs on DIAMETER_Emulation_CT return PDU_DIAMETER {
+ timer T := 10.0;
+ var DIAMETER_RecvFrom mrf;
+
+ DIAMETER.send(t_DIAMETER_Send(g_diameter_conn_id, tx));
+ alt {
+ [] DIAMETER.receive(tr_DIAMETER_RecvFrom_R(rx_t)) -> value mrf { }
+ [] DIAMETER.receive(tr_SctpAssocChange) { repeat; }
+ [] DIAMETER.receive(tr_SctpPeerAddrChange) { repeat; }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for ", rx_t);
+ mtc.stop;
+ }
+ }
+ return mrf.msg;
+}
+
+function main(DIAMETEROps ops, DIAMETER_conn_parameters p, charstring id) runs on DIAMETER_Emulation_CT {
+ var Result res;
+ g_diameter_id := id;
+ f_imsi_table_init();
+ f_expect_table_init();
+
+ map(self:DIAMETER, system:DIAMETER_CODEC_PT);
+ if (p.remote_sctp_port == -1) {
+ res := DIAMETER_CodecPort_CtrlFunct.f_IPL4_listen(DIAMETER, p.local_ip, p.local_sctp_port, { sctp := valueof(ts_SCTP) });
+ } else {
+ res := DIAMETER_CodecPort_CtrlFunct.f_IPL4_connect(DIAMETER, p.remote_ip, p.remote_sctp_port,
+ p.local_ip, p.local_sctp_port, -1, { sctp := valueof(ts_SCTP) });
+ }
+ if (not ispresent(res.connId)) {
+ setverdict(fail, "Could not connect DIAMETER socket, check your configuration");
+ mtc.stop;
+ }
+ g_diameter_conn_id := res.connId;
+
+ while (true) {
+ var DIAMETER_ConnHdlr vc_conn;
+ var PDU_ML3_MS_NW l3_mo;
+ var PDU_ML3_NW_MS l3_mt;
+ var template IMSI imsi_t;
+ var hexstring imsi;
+ var DIAMETER_RecvFrom mrf;
+ var PDU_DIAMETER msg;
+ var charstring vlr_name, mme_name;
+ var PortEvent port_evt;
+
+ alt {
+ [] DIAMETER.receive(PortEvent:{connOpened := ?}) -> value port_evt {
+ g_diameter_conn_id := port_evt.connOpened.connId;
+ }
+ [] DIAMETER.receive(PortEvent:?) { }
+ /* DIAMETER from client */
+ [] DIAMETER_CLIENT.receive(PDU_DIAMETER:?) -> value msg sender vc_conn {
+ /* Pass message through */
+ /* TODO: check which ConnectionID client has allocated + store in table? */
+ DIAMETER.send(t_DIAMETER_Send(g_diameter_conn_id, msg));
+ }
+
+ /* handle CER/CEA handshake */
+ [] DIAMETER.receive(tr_DIAMETER_RecvFrom_R(tr_DIAMETER_R(cmd_code := Capabilities_Exchange))) -> value mrf {
+ var template (value) PDU_DIAMETER resp;
+ resp := ts_DIA_CEA(mrf.msg.hop_by_hop_id, mrf.msg.end_to_end_id);
+ DIAMETER.send(t_DIAMETER_Send(g_diameter_conn_id, resp));
+ }
+
+ /* DIAMETER from remote peer */
+ [] DIAMETER.receive(tr_DIAMETER_RecvFrom_R(?)) -> value mrf {
+ imsi_t := f_DIAMETER_get_imsi(mrf.msg);
+ if (isvalue(imsi_t)) {
+ imsi := valueof(imsi_t);
+ if (f_imsi_known(imsi)) {
+ vc_conn := f_comp_by_imsi(imsi);
+ DIAMETER_CLIENT.send(mrf.msg) to vc_conn;
+ } else {
+ vc_conn := ops.create_cb.apply(mrf.msg, imsi, id);
+ f_imsi_table_add(vc_conn, imsi);
+ DIAMETER_CLIENT.send(mrf.msg) to vc_conn;
+ }
+ } else {
+ /* message contained no IMSI; is not IMSI-oriented */
+ var template PDU_DIAMETER resp := ops.unitdata_cb.apply(mrf.msg);
+ if (isvalue(resp)) {
+ DIAMETER.send(t_DIAMETER_Send(g_diameter_conn_id, valueof(resp)));
+ }
+ }
+ }
+ [] DIAMETER.receive(tr_SctpAssocChange) { }
+ [] DIAMETER.receive(tr_SctpPeerAddrChange) { }
+ [] DIAMETER_PROC.getcall(DIAMETEREM_register:{?,?}) -> param(imsi, vc_conn) {
+ f_create_expect(imsi, vc_conn);
+ DIAMETER_PROC.reply(DIAMETEREM_register:{imsi, vc_conn}) to vc_conn;
+ }
+
+ }
+
+ }
+}
+
+/* "Expect" Handling */
+
+type record ExpectData {
+ hexstring imsi optional,
+ DIAMETER_ConnHdlr vc_conn
+}
+
+signature DIAMETEREM_register(in hexstring imsi, in DIAMETER_ConnHdlr hdlr);
+
+type port DIAMETEREM_PROC_PT procedure {
+ inout DIAMETEREM_register;
+} with { extension "internal" };
+
+/* Function that can be used as create_cb and will usse the expect table */
+function ExpectedCreateCallback(PDU_DIAMETER msg, hexstring imsi, charstring id)
+runs on DIAMETER_Emulation_CT return DIAMETER_ConnHdlr {
+ var DIAMETER_ConnHdlr ret := null;
+ var integer i;
+
+ for (i := 0; i < sizeof(DiameterExpectTable); i := i+1) {
+ if (not ispresent(DiameterExpectTable[i].imsi)) {
+ continue;
+ }
+ if (imsi == DiameterExpectTable[i].imsi) {
+ ret := DiameterExpectTable[i].vc_conn;
+ /* Release this entry */
+ DiameterExpectTable[i].imsi := omit;
+ DiameterExpectTable[i].vc_conn := null;
+ log("Found Expect[", i, "] for ", msg, " handled at ", ret);
+ return ret;
+ }
+ }
+ setverdict(fail, "Couldn't find Expect for ", msg);
+ mtc.stop;
+}
+
+private function f_create_expect(hexstring imsi, DIAMETER_ConnHdlr hdlr)
+runs on DIAMETER_Emulation_CT {
+ var integer i;
+
+ /* Check an entry like this is not already presnt */
+ for (i := 0; i < sizeof(DiameterExpectTable); i := i+1) {
+ if (imsi == DiameterExpectTable[i].imsi) {
+ setverdict(fail, "IMSI already present", imsi);
+ mtc.stop;
+ }
+ }
+ for (i := 0; i < sizeof(DiameterExpectTable); i := i+1) {
+ if (not ispresent(DiameterExpectTable[i].imsi)) {
+ DiameterExpectTable[i].imsi := imsi;
+ DiameterExpectTable[i].vc_conn := hdlr;
+ log("Created Expect[", i, "] for ", imsi, " to be handled at ", hdlr);
+ return;
+ }
+ }
+ testcase.stop("No space left in DiameterExpectTable")
+}
+
+/* client/conn_hdlr side function to use procedure port to create expect in emulation */
+function f_diameter_expect(hexstring imsi) runs on DIAMETER_ConnHdlr {
+ DIAMETER_PROC.call(DIAMETEREM_register:{imsi, self}) {
+ [] DIAMETER_PROC.getreply(DIAMETEREM_register:{?,?}) {};
+ }
+}
+
+private function f_expect_table_init()
+runs on DIAMETER_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(DiameterExpectTable); i := i + 1) {
+ DiameterExpectTable[i].imsi := omit;
+ }
+}
+
+function DummyUnitdataCallback(PDU_DIAMETER msg)
+runs on DIAMETER_Emulation_CT return template PDU_DIAMETER {
+ log("Ignoring DIAMETER ", msg);
+ return omit;
+}
+
+
+}
diff --git a/library/DIAMETER_Templates.ttcn b/library/DIAMETER_Templates.ttcn
new file mode 100644
index 0000000..2779536
--- /dev/null
+++ b/library/DIAMETER_Templates.ttcn
@@ -0,0 +1,821 @@
+module DIAMETER_Templates {
+
+/* (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from DIAMETER_Types all;
+import from Osmocom_Types all;
+
+/* https://www.iana.org/assignments/aaa-parameters/aaa-parameters.xhtml#aaa-parameters-4 */
+type enumerated DIAMETER_Resultcode {
+ /* Informational */
+ DIAMETER_MULTI_ROUND_AUTH (1001),
+
+ /* Success */
+ DIAMETER_SUCCESS (2001),
+ DIAMETER_LIMITED_SUCCESS (2002),
+ DIAMETER_FIRST_REGISTRATION (2003),
+ DIAMETER_SUBSEQUENT_REGISTRATION (2004),
+ DIAMETER_UNREGISTERED_SERVICE (2005),
+ DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED (2006),
+ DIAMETER_SERVER_SELECTION (2007),
+ DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED (2008),
+ DIAMETER_SUCCESS_RELOCATE_HA (2009),
+
+ /* Protocol Errors */
+ DIAMETER_COMMAND_UNSUPPORTED (3001),
+ DIAMETER_UNABLE_TO_DELIVER (3002),
+ DIAMETER_REALM_NOT_SERVED (3003),
+ DIAMETER_TOO_BUSY (3004),
+ DIAMETER_LOOP_DETECTED (3005),
+ DIAMETER_REDIRECT_INDICATION (3006),
+ DIAMETER_APPLICATION_UNSUPPORTED (3007),
+ DIAMETER_INVALID_HDR_BITS (3008),
+ DIAMETER_INVALID_AVP_BITS (3009),
+ DIAMETER_UNKNOWN_PEER (3010),
+ DIAMETER_REALM_REDIRECT_INDICATION (3011),
+
+ /* Transient Failures */
+ DIAMETER_AUTHENTICATION_REJECTED (4001),
+ DIAMETER_OUT_OF_SPACE (4002),
+ ELECTION_LOST (4003),
+ DIAMETER_ERROR_MIP_REPLY_FAILURE (4005),
+ DIAMETER_ERROR_HA_NOT_AVAILABLE (4006),
+ DIAMETER_ERROR_BAD_KEY (4007),
+ DIAMETER_ERROR_MIP_FILTER_NOT_SUPPORTED (4008),
+ DIAMETER_END_USER_SERVICE_DENIED (4010),
+ DIAMETER_CREDIT_CONTROL_NOT_APPLICABLE (4011),
+ DIAMETER_CREDIT_LIMIT_REACHED (4012),
+ DIAMETER_USER_NAME_REQUIRED (4013),
+ RESOURCE_FAILURE (4014),
+
+ DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181),
+ DIAMETER_ERROR_CAMEL_SUBSCRIPTION_PRESENT (4882),
+
+ /* Permanent Failure */
+ DIAMETER_AVP_UNSUPPORTED (5001),
+ DIAMETER_UNKNOWN_SESSION_ID (5002),
+ DIAMETER_AUTHORIZATION_REJECTED (5003),
+ DIAMETER_INVALID_AVP_VALUE (5004),
+ DIAMETER_MISSING_AVP (5005),
+ DIAMETER_RESOURCES_EXCEEDED (5006),
+ DIAMETER_CONTRADICTING_AVPS (5007),
+ DIAMETER_AVP_NOT_ALLOWED (5008),
+ DIAMETER_AVP_OCCURS_TOO_MANY_TIMES (5009),
+ DIAMETER_NO_COMMON_APPLICATION (5010),
+ DIAMETER_UNSUPPORTED_VERSION (5011),
+ DIAMETER_UNABLE_TO_COMPLY (5012),
+ DIAMETER_INVALID_BIT_IN_HEADER (5013),
+ DIAMETER_INVALID_AVP_LENGTH (5014),
+ DIAMETER_INVALID_MESSAGE_LENGTH (5015),
+ DIAMETER_INVALID_AVP_BIT_COMBO (5016),
+ DIAMETER_NO_COMMON_SECURITY (5017),
+ DIAMETER_RADIUS_AVP_UNTRANSLATABLE (5018),
+ DIAMETER_ERROR_NO_FOREIGN_HA_SERVICE (5024),
+ DIAMETER_ERROR_END_TO_END_MIP_KEY_ENCRYPTION (5025),
+ DIAMETER_USER_UNKNOWN (5030),
+ DIAMETER_RATING_FAILED (5031),
+ DIAMETER_ERROR_USER_UNKNOWN (5032),
+ DIAMETER_ERROR_IDENTITIES_DONT_MATCH (5033),
+ DIAMETER_ERROR_IDENTITY_NOT_REGISTERED (5034),
+ DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5035),
+ DIAMETER_ERROR_IDENTITY_ALREADY_REGISTERED (5036),
+ DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED (5037),
+ DIAMETER_ERROR_IN_ASSIGNMENT_TYPE (5038),
+ DIAMETER_ERROR_TOO_MUCH_DATA (5039),
+ DIAMETER_ERROR_NOT_SUPPORTED_USER_DATA (5040),
+ DIAMETER_ERROR_MIP6_AUTH_MODE (5041),
+ UNKNOWN_BINDING_TEMPLATE_NAME (5042),
+ BINDING_FAILURE (5043),
+ MAX_BINDINGS_SET_FAILURE (5044),
+ MAXIMUM_BINDINGS_REACHED_FOR_ENDPOINT (5045),
+ SESSION_EXISTS (5046),
+ INSUFFICIENT_CLASSIFIERS (5047),
+ DIAMETER_ERROR_EAP_CODE_UNKNOWN (5048)
+};
+
+/* 3GPP TS 29.272 Section 7.1.8 */
+const uint32_t c_DIAMETER_3GPP_S6_AID := 16777251;
+const uint32_t c_DIAMETER_3GPP_S13_AID := 16777252;
+const uint32_t c_DIAMETER_3GPP_S7_AID := 16777308;
+
+template (value) PDU_DIAMETER
+ts_DIAMETER(template (value) BIT8 flags,
+ template (value) Command_Code cmd_code,
+ template (value) OCTET4 app_id := '00000000'O,
+ template (value) UINT32 hbh_id,
+ template (value) UINT32 ete_id,
+ template (value) AVP_list avps := {}
+) := {
+ version := 1,
+ message_length := 0, /* overwritten */
+ RPETxxxx := flags,
+ command_code := cmd_code,
+ application_id := app_id,
+ hop_by_hop_id := hbh_id,
+ end_to_end_id := ete_id,
+ avps := avps
+}
+template (present) PDU_DIAMETER
+tr_DIAMETER(template (present) BIT8 flags := ?,
+ template (present) Command_Code cmd_code := ?,
+ template (present) OCTET4 app_id := ?,
+ template (present) UINT32 hbh_id := ?,
+ template (present) UINT32 ete_id := ?,
+ template (present) AVP_list avps := ?) := {
+ version := 1,
+ message_length := ?,
+ RPETxxxx := flags,
+ command_code := cmd_code,
+ application_id := app_id,
+ hop_by_hop_id := hbh_id,
+ end_to_end_id := ete_id,
+ avps := avps
+}
+template (present) PDU_DIAMETER
+tr_DIAMETER_A(
+ template (present) Command_Code cmd_code := ?,
+ template (present) OCTET4 app_id := ?,
+ template (present) UINT32 hbh_id := ?,
+ template (present) UINT32 ete_id := ?,
+ template (present) AVP_list avps := ?) :=
+ tr_DIAMETER('0???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
+template (present) PDU_DIAMETER
+tr_DIAMETER_R(
+ template (present) Command_Code cmd_code := ?,
+ template (present) OCTET4 app_id := ?,
+ template (present) UINT32 hbh_id := ?,
+ template (present) UINT32 ete_id := ?,
+ template (present) AVP_list avps := ?) :=
+ tr_DIAMETER('1???????'B, cmd_code, app_id, hbh_id, ete_id, avps);
+
+
+template (value) AVP_Header
+ts_DIA_Hdr(template (value) AVP_Code avp_code,
+ template (value) BIT8 flags := '01000000'B) := {
+ avp_code := avp_code,
+ VMPxxxxx := flags,
+ avp_length := 0, /* overwritten */
+ vendor_id := omit
+}
+template (present) AVP_Header
+tr_DIA_Hdr(template (present) AVP_Code avp_code,
+ template (present) BIT8 flags := '0???????'B) := {
+ avp_code := avp_code,
+ VMPxxxxx := flags,
+ avp_length := ?, /* overwritten */
+ vendor_id := omit
+}
+
+template (value) AVP_Header
+ts_DIA_Hdr_3GPP(template (value) AVP_Code avp_code,
+ template (value) BIT8 flags := '11000000'B) := {
+ avp_code := avp_code,
+ VMPxxxxx := flags,
+ avp_length := 0, /* overwritten */
+ vendor_id := vendor_id_3GPP
+}
+template (present) AVP_Header
+tr_DIA_Hdr_3GPP(template (present) AVP_Code avp_code,
+ template (present) BIT8 flags := '1???????'B) := {
+ avp_code := avp_code,
+ VMPxxxxx := flags,
+ avp_length := ?, /* overwritten */
+ vendor_id := vendor_id_3GPP
+}
+
+
+template (value) GenericAVP ts_AVP_OriginHost(template (value) charstring host) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
+ avp_data := {
+ avp_BASE_NONE_Origin_Host := host
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_OriginHost(template (present) charstring host := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Host),
+ avp_data := {
+ avp_BASE_NONE_Origin_Host := host
+ }
+ }
+}
+
+
+template (value) GenericAVP ts_AVP_OriginRealm(template (value) charstring realm) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
+ avp_data := {
+ avp_BASE_NONE_Origin_Realm := realm
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_OriginRealm(template (present) charstring realm := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_Realm),
+ avp_data := {
+ avp_BASE_NONE_Origin_Realm := realm
+ }
+ }
+}
+
+
+template (value) GenericAVP ts_AVP_OriginStateId(template (value) OCTET4 state_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Origin_State_Id),
+ avp_data := {
+ avp_BASE_NONE_Origin_State_Id := state_id
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_HostIpAddr(template (value) OCTET4 ipv4_addr) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Host_IP_Address),
+ avp_data := {
+ avp_BASE_NONE_Host_IP_Address := {
+ address_type := IP,
+ address_data := ipv4_addr
+ }
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_VendorId(Vendor_Id vendor_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id, '00000000'B),
+ avp_data := {
+ avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_ProductName(charstring name) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Product_Name, '00000000'B),
+ avp_data := {
+ avp_BASE_NONE_Product_Name := char2oct(name)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_FwRevision(octetstring fw_version) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Firmware_Revision, '00000000'B),
+ avp_data := {
+ avp_BASE_NONE_Firmware_Revision := fw_version
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_InbSecId(template (value) OCTET4 inb_sec_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Inband_Security_Id),
+ avp_data := {
+ avp_BASE_NONE_Inband_Security_Id := inb_sec_id
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_VendorSpecAppId(Vendor_Id vendor_id, uint32_t auth_app_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Specific_Application_Id),
+ avp_data := {
+ avp_BASE_NONE_Vendor_Specific_Application_Id := {
+ {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Vendor_Id),
+ avp_data := {
+ avp_BASE_NONE_Vendor_Id := int2oct(enum2int(vendor_id), 4)
+ }
+ }
+ }, {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
+ avp_data := {
+ avp_BASE_NONE_Auth_Application_Id := int2oct(auth_app_id, 4)
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_AuthAppId(template (value) OCTET4 auth_app_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Application_Id),
+ avp_data := {
+ avp_BASE_NONE_Auth_Application_Id := auth_app_id
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_SuppVendorIdRaw(uint32_t vendor_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Supported_Vendor_Id),
+ avp_data := {
+ avp_BASE_NONE_Supported_Vendor_Id := int2oct(vendor_id, 4)
+ }
+ }
+}
+template (value) GenericAVP ts_AVP_SuppVendorId(Vendor_Id vendor_id) :=
+ ts_AVP_SuppVendorIdRaw(enum2int(vendor_id));
+
+template (value) GenericAVP ts_AVP_ResultCode(DIAMETER_Resultcode res_code) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Result_Code),
+ avp_data := {
+ avp_BASE_NONE_Result_Code := int2oct(enum2int(res_code), 4)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_AuthSessionState(template (value) BASE_NONE_Auth_Session_State ass := NO_STATE_MAINTAINED) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
+ avp_data := {
+ avp_BASE_NONE_Auth_Session_State := ass
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_AuthSessionState(template (present) BASE_NONE_Auth_Session_State ass := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Auth_Session_State),
+ avp_data := {
+ avp_BASE_NONE_Auth_Session_State := ass
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_SessionId(template (value) octetstring session_id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
+ avp_data := {
+ avp_BASE_NONE_Session_Id := session_id
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_SessionId(template (present) octetstring session_id := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Session_Id),
+ avp_data := {
+ avp_BASE_NONE_Session_Id := session_id
+ }
+ }
+}
+
+/* 3.3 Destination Realm */
+template (value) GenericAVP ts_AVP_DestinationRealm(template (value) charstring dest_realm) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
+ avp_data := {
+ avp_BASE_NONE_Destination_Realm := dest_realm
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_DestinationRealm(template (present) charstring dest_realm := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_Destination_Realm),
+ avp_data := {
+ avp_BASE_NONE_Destination_Realm := dest_realm
+ }
+ }
+}
+
+/* 8.14 User-Name */
+template (value) GenericAVP ts_AVP_UserName(template (value) octetstring uid) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
+ avp_data := {
+ avp_BASE_NONE_User_Name := uid
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_UserName(template (present) octetstring uid := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr(c_AVP_Code_BASE_NONE_User_Name),
+ avp_data := {
+ avp_BASE_NONE_User_Name := uid
+ }
+ }
+}
+template (value) GenericAVP ts_AVP_UserNameImsi(hexstring imsi) := ts_AVP_UserName(char2oct(hex2str(imsi)));
+template (present) GenericAVP tr_AVP_UserNameImsi(hexstring imsi) := tr_AVP_UserName(char2oct(hex2str(imsi)));
+
+
+
+/* TS 29.262 7.3.53 RAND */
+template (value) GenericAVP ts_AVP_RAND(template (value) octetstring rand) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_RAND),
+ avp_data := {
+ avp_AAA_3GPP_RAND := rand
+ }
+ }
+}
+
+/* TS 29.262 7.3.54 XRES */
+template (value) GenericAVP ts_AVP_XRES(template (value) octetstring xres) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_XRES),
+ avp_data := {
+ avp_AAA_3GPP_XRES := xres
+ }
+ }
+}
+
+/* TS 29.262 7.3.55 XRES */
+template (value) GenericAVP ts_AVP_AUTN(template (value) octetstring autn) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AUTN),
+ avp_data := {
+ avp_AAA_3GPP_AUTN := autn
+ }
+ }
+}
+
+/* TS 29.262 7.3.56 KASME */
+template (value) GenericAVP ts_AVP_KASME(template (value) octetstring kasme) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
+ avp_data := {
+ avp_AAA_3GPP_KASME := kasme
+ }
+ }
+}
+
+/* TS 29.262 7.3.23 Item-Number */
+template (value) GenericAVP ts_AVP_ItemNumber(uint32_t num) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_KASME),
+ avp_data := {
+ avp_AAA_3GPP_Item_Number := int2oct(num, 4)
+ }
+ }
+}
+
+/* TS 29.262 7.3.18 E-UTRAN Vector */
+template (value) GenericAVP ts_AVP_EutranVec(uint32_t item_num, octetstring rand, octetstring xres,
+ octetstring autn, octetstring kasme) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_E_UTRAN_Vector),
+ avp_data := {
+ avp_AAA_3GPP_E_UTRAN_Vector := {
+ ts_AVP_ItemNumber(item_num),
+ ts_AVP_RAND(rand),
+ ts_AVP_XRES(xres),
+ ts_AVP_AUTN(autn),
+ ts_AVP_KASME(kasme)
+ }
+ }
+ }
+}
+
+/* TS 29.262 7.3.2 Subscription-Data */
+template (value) GenericAVP ts_AVP_3GPP_SubscriptionData(template (value) AVP_list content) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscription_Data),
+ avp_data := {
+ avp_AAA_3GPP_Subscription_Data := content
+ }
+ }
+}
+
+
+/* TS 29.262 7.3.17 Authentication-Info */
+template (value) GenericAVP ts_AVP_3GPP_AuthInfo(template (value) AVP_list content) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Authentication_Info),
+ avp_data := {
+ avp_AAA_3GPP_Authentication_Info := content
+ }
+ }
+}
+
+/* TS 29.262 7.3.9 Visited-PLMN-Id */
+template (value) GenericAVP ts_AVP_3GPP_VisitedPlmnId(template (value) octetstring id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
+ avp_data := {
+ avp_AAA_3GPP_Visited_PLMN_Id := id
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_3GPP_VisitedPlmnId(template (present) octetstring id := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Visited_PLMN_Id),
+ avp_data := {
+ avp_AAA_3GPP_Visited_PLMN_Id := id
+ }
+ }
+}
+
+/* TS 29.262 7.3.13 RAT-Type */
+template (value) GenericAVP ts_AVP_3GPP_RatType(template (value) PCC_3GPP_RAT_Type rat_type) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
+ avp_data := {
+ avp_PCC_3GPP_RAT_Type := rat_type
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_3GPP_RatType(template (present) PCC_3GPP_RAT_Type rat_type := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_RAT_Type),
+ avp_data := {
+ avp_PCC_3GPP_RAT_Type := rat_type
+ }
+ }
+}
+
+/* TS 29.262 7.3.7 ULR-Flags */
+template (value) GenericAVP ts_AVP_3GPP_UlrFlags(template (value) UINT32 flags) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
+ avp_data := {
+ avp_AAA_3GPP_ULR_Flags := flags
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_3GPP_UlrFlags(template (present) UINT32 flags := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULR_Flags),
+ avp_data := {
+ avp_AAA_3GPP_ULR_Flags := flags
+ }
+ }
+}
+
+/* TS 29.262 7.3.8 ULA-Flags */
+template (value) GenericAVP ts_AVP_3GPP_UlaFlags(template (value) UINT32 flags) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
+ avp_data := {
+ avp_AAA_3GPP_ULA_Flags := flags
+ }
+ }
+}
+template (present) GenericAVP tr_AVP_3GPP_UlaFlags(template (present) UINT32 flags := ?) := {
+ avp := {
+ avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_ULA_Flags),
+ avp_data := {
+ avp_AAA_3GPP_ULA_Flags := flags
+ }
+ }
+}
+
+/* TS 29.262 7.3.27 Context-Identifier */
+template (value) GenericAVP ts_AVP_3GPP_ContextId(uint32_t ctx) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Context_Identifier),
+ avp_data := {
+ avp_AAA_3GPP_Context_Identifier := int2oct(ctx, 4)
+ }
+ }
+}
+
+/* Ts 29.262 7.3.29 Subscriber-Status */
+template (value) GenericAVP ts_AVP_3GPP_SubscriberStatus(template (value) AAA_3GPP_Subscriber_Status sts) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscriber_Status),
+ avp_data := {
+ avp_AAA_3GPP_Subscriber_Status := sts
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_SubscrRauTauTmr(uint32_t tmr) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer),
+ avp_data := {
+ avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := int2oct(tmr, 4)
+ }
+ }
+}
+
+/* TS 29.262 7.3.33 All-APN-Configurations-Included-Indicator */
+template (value) GenericAVP ts_AVP_3GPP_AllApnConfigsIncl(template (value) AAA_3GPP_All_APN_Configurations_Included_Indicator ind := All_APN_CONFIGURATIONS_INCLUDED) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator),
+ avp_data := {
+ avp_AAA_3GPP_All_APN_Configurations_Included_Indicator := ind
+ }
+ }
+}
+
+/* TS 29.262 7.3.34 APN-Configuration-Profile */
+template (value) GenericAVP ts_AVP_3GPP_ApnConfigProfile(template (value) AVP_list content) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
+ avp_data := {
+ avp_AAA_3GPP_APN_Configuration_Profile := content
+ }
+ }
+}
+
+/* TS 29.262 7.3.35 APN-Configuration */
+template (value) GenericAVP ts_AVP_3GPP_ApnConfig(uint32_t ctx, AAA_3GPP_PDN_Type pdn_type,
+ charstring apn) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_APN_Configuration_Profile),
+ avp_data := {
+ avp_AAA_3GPP_APN_Configuration := {
+ ts_AVP_3GPP_ContextId(ctx),
+ ts_AVP_3GPP_PdnType(pdn_type),
+ ts_AVP_3GPP_EpsSubscrQosProfile(1, 1),
+ ts_AVP_ServiceSelection(apn)
+ }
+ }
+ }
+}
+
+/* TS 29.262 7.3.36 Service-Selection (refers to RFC 5778) */
+template (value) GenericAVP ts_AVP_ServiceSelection(charstring apn) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_MIPv6_NONE_Service_Selection),
+ avp_data := {
+ avp_MIPv6_NONE_Service_Selection := char2oct(apn)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_QosClassId(uint32_t id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_QoS_Class_Identifier),
+ avp_data := {
+ avp_PCC_3GPP_QoS_Class_Identifier := int2oct(id, 4)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_PriorityLevel(uint32_t prio) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Priority_Level),
+ avp_data := {
+ avp_PCC_3GPP_Priority_Level := int2oct(prio, 4)
+ }
+ }
+}
+
+
+template (value) GenericAVP ts_AVP_3GPP_AllocRetenPrio(uint32_t prio) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority),
+ avp_data := {
+ avp_PCC_3GPP_Allocation_Retention_Priority := {
+ ts_AVP_3GPP_PriorityLevel(prio)
+ /* pre-emption capability */
+ /* pre-emption vulnerability */
+ }
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_EpsSubscrQosProfile(uint32_t qos_class, uint32_t prio) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile),
+ avp_data := {
+ avp_AAA_3GPP_EPS_Subscribed_QoS_Profile := {
+ ts_AVP_3GPP_QosClassId(qos_class),
+ ts_AVP_3GPP_AllocRetenPrio(prio)
+ }
+ }
+ }
+}
+
+
+/* TS 29.262 7.3.41 AMBR */
+template (value) GenericAVP ts_AVP_3GPP_AMBR(uint32_t ul, uint32_t dl) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_AMBR),
+ avp_data := {
+ avp_AAA_3GPP_AMBR := {
+ ts_AVP_3GPP_MaxReqBwUL(ul),
+ ts_AVP_3GPP_MaxReqBwDL(dl)
+ }
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_MaxReqBwUL(uint32_t bw) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL),
+ avp_data := {
+ avp_RX_3GPP_Max_Requested_Bandwidth_UL := int2oct(bw, 4)
+ }
+ }
+}
+
+template (value) GenericAVP ts_AVP_3GPP_MaxReqBwDL(uint32_t bw) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL),
+ avp_data := {
+ avp_RX_3GPP_Max_Requested_Bandwidth_DL := int2oct(bw, 4)
+ }
+ }
+}
+
+
+
+/* TS 29.262 7.3.62 PDN-Type */
+template (value) GenericAVP ts_AVP_3GPP_PdnType(template (value) AAA_3GPP_PDN_Type pdn_type) := {
+ avp := {
+ avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_AAA_3GPP_PDN_Type),
+ avp_data := {
+ avp_AAA_3GPP_PDN_Type := pdn_type
+ }
+ }
+}
+
+
+
+/* 5.3.2 Capabilities Exchange Answer */
+template (value) PDU_DIAMETER
+ts_DIA_CEA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id)
+:= ts_DIAMETER(flags:='00000000'B, cmd_code:=Capabilities_Exchange, hbh_id:=hbh_id, ete_id:=ete_id,
+ avps := {
+ ts_AVP_ResultCode(DIAMETER_SUCCESS),
+ ts_AVP_OriginHost("hss.localdomain"),
+ ts_AVP_OriginRealm("localdomain"),
+ ts_AVP_HostIpAddr('7E000004'O),
+ ts_AVP_VendorId(vendor_id_3GPP),
+ ts_AVP_ProductName("TTCN-3 Testsuite"),
+ ts_AVP_OriginStateId('00000001'O),
+ ts_AVP_SuppVendorIdRaw(5535), /* 3GPP2 */
+ ts_AVP_SuppVendorId(vendor_id_3GPP),
+ ts_AVP_SuppVendorIdRaw(13019), /* ETSI */
+ ts_AVP_AuthAppId('FFFFFFFF'O),
+ ts_AVP_InbSecId('00000000'O),
+ ts_AVP_VendorSpecAppId(vendor_id_3GPP, c_DIAMETER_3GPP_S6_AID)
+ });
+
+template (present) PDU_DIAMETER
+tr_DIA_AIR(hexstring imsi) := tr_DIAMETER(flags := '11000000'B, cmd_code:=Authentication_Information,
+ app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4),
+ avps := superset(
+ tr_AVP_SessionId,
+ tr_AVP_DestinationRealm,
+ tr_AVP_UserNameImsi(imsi),
+ tr_AVP_3GPP_VisitedPlmnId
+ ));
+
+/* TS 29.262 5.2.3.1 + 7.2.6 Authentication Information Answer */
+template (value) PDU_DIAMETER
+ts_DIA_AIA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
+ template (value) octetstring sess_id,
+ template (value) AVP_list auth_info_contents)
+:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Authentication_Information,
+ app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
+ avps := {
+ ts_AVP_SessionId(sess_id),
+ ts_AVP_ResultCode(DIAMETER_SUCCESS),
+ ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
+ ts_AVP_OriginHost("hss.localdomain"),
+ ts_AVP_OriginRealm("localdomain"),
+ ts_AVP_3GPP_AuthInfo(auth_info_contents)
+ });
+
+
+/* TS 29.262 7.2.3 Update Location Request */
+template (present) PDU_DIAMETER
+tr_DIA_ULR(hexstring imsi) := tr_DIAMETER(flags:='11000000'B, cmd_code:=Update_Location,
+ app_id:=int2oct(c_DIAMETER_3GPP_S6_AID, 4),
+ avps := superset(
+ tr_AVP_SessionId,
+ tr_AVP_AuthSessionState,
+ tr_AVP_OriginHost,
+ tr_AVP_OriginRealm,
+ tr_AVP_DestinationRealm,
+ tr_AVP_UserNameImsi(imsi),
+ tr_AVP_3GPP_RatType(EUTRAN),
+ tr_AVP_3GPP_UlrFlags,
+ tr_AVP_3GPP_VisitedPlmnId
+ ));
+
+template (value) PDU_DIAMETER
+ts_DIA_ULA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
+ template (value) octetstring sess_id,
+ template (value) AVP_list sub_data_content)
+:= ts_DIAMETER(flags:='01000000'B, cmd_code:=Update_Location,
+ app_id := int2oct(c_DIAMETER_3GPP_S6_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
+ avps := {
+ ts_AVP_SessionId(sess_id),
+ ts_AVP_ResultCode(DIAMETER_SUCCESS), /* optional */
+ ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
+ ts_AVP_OriginHost("hss.localdomain"),
+ ts_AVP_OriginRealm("localdomain"),
+ ts_AVP_3GPP_UlaFlags('00000002'O),
+ ts_AVP_3GPP_SubscriptionData(sub_data_content)
+ });
+
+
+
+}
diff --git a/library/DIAMETER_Types.ttcn b/library/DIAMETER_Types.ttcn
new file mode 100644
index 0000000..e0c34e4
--- /dev/null
+++ b/library/DIAMETER_Types.ttcn
@@ -0,0 +1,6652 @@
+///////////////////////////////////////////////////
+// //
+// !!!! Generated file, do not edit !!!! //
+// //
+///////////////////////////////////////////////////
+// Generated with command:
+// AVP.sh Base_IETF_RFC3588.ddf BaseTypes_IETF_RFC3588.ddf AAAInterface_3GPP_TS29272_f10.ddf GxInterface_PCC_3GPP_TS29212_f10.ddf S6Interfaces_3GPP_TS29336_f00.ddf MobileIPv6_HA_IETF_RFC5778.ddf RxInterface_PCC_3GPP_TS29214_f20.ddf
+module DIAMETER_Types {
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Roland Gecse - initial implementation and initial documentation
+* Akos Pernek
+* Antal Wuh.Hen.Chang
+* Attila Fulop
+* Balazs Barcsik
+* Bence Molnar
+* Csaba Koppany
+* David Juhasz
+* Eduard Czimbalmos
+* Elemer Lelik
+* Endre Kiss
+* Endre Kulcsar
+* Gabor Szalai
+* Gabor Tatarka
+* Gergely Futo
+* Istvan Sandor
+* Krisztian Pandi
+* Kulcsr Endre
+* Laszlo Tamas Zeke
+* Norbert Pinter
+* Roland Gecse
+* Tibor Bende
+* Tibor Szabo
+* Timea Moder
+* Zoltan Medve
+* Zsolt Nandor Torok
+* Zsolt Szalai
+******************************************************************************/
+//
+// File: Base_IETF_RFC3588.ddf
+// Description: DDF for the Diameter base AVPs
+// Rev: R55A
+// Prodnr: CNL 113 462
+///////////////////////////////////////////////
+
+// APPLICATION-NAME: BASE
+// APPLICATION-REVISION: RFC3588
+
+//
+// 4.5. Diameter Base Protocol AVPs
+//
+
+// RFC 3588 3.1
+
+
+
+
+// RFC 3588
+// AVP: Acct-Interim-Interval (85)
+// 9.8.2
+type AVP_Unsigned32 BASE_NONE_Acct_Interim_Interval
+
+// RFC 3588
+// AVP: Accounting-Realtime-Required (483)
+// 9.8.7
+type enumerated BASE_NONE_Accounting_Realtime_Required {
+ DELIVER_AND_GRANT (1),
+ GRANT_AND_STORE (2),
+ GRANT_AND_LOSE (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Acct-Multi-Session-Id (50)
+// 9.8.5
+type AVP_UTF8String BASE_NONE_Acct_Multi_Session_Id
+
+// RFC 3588
+// AVP: Accounting-Record-Number (485)
+// 9.8.3
+type AVP_Unsigned32 BASE_NONE_Accounting_Record_Number
+
+// RFC 3588
+// AVP: Accounting-Record-Type (480)
+// 9.8.1
+type enumerated BASE_NONE_Accounting_Record_Type {
+ EVENT_RECORD (1),
+ START_RECORD (2),
+ INTERIM_RECORD (3),
+ STOP_RECORD (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Accounting-Session-Id (44)
+// 9.8.4
+type AVP_OctetString BASE_NONE_Accounting_Session_Id
+
+// RFC 3588
+// AVP: Accounting-Sub-Session-Id (287)
+// 9.8.6
+type AVP_Unsigned64 BASE_NONE_Accounting_Sub_Session_Id
+
+// RFC 3588
+// AVP: Acct-Application-Id (259)
+// 6.9
+type AVP_Unsigned32 BASE_NONE_Acct_Application_Id
+
+// RFC 3588
+// AVP: Auth-Application-Id (258)
+// 6.8
+type AVP_Unsigned32 BASE_NONE_Auth_Application_Id
+
+// RFC 3588
+// AVP: Auth-Request-Type (274)
+// 8.7
+type enumerated BASE_NONE_Auth_Request_Type {
+ AUTHENTICATE_ONLY (1),
+ AUTHORIZE_ONLY (2),
+ AUTHORIZE_AUTHENTICATE (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Authorization-Lifetime (291)
+// 8.9
+type AVP_Unsigned32 BASE_NONE_Authorization_Lifetime
+
+// RFC 3588
+// AVP: Auth-Grace-Period (276)
+// 8.10
+type AVP_Unsigned32 BASE_NONE_Auth_Grace_Period
+
+// RFC 3588
+// AVP: Auth-Session-State (277)
+// 8.11
+type enumerated BASE_NONE_Auth_Session_State {
+ STATE_MAINTAINED (0),
+ NO_STATE_MAINTAINED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Re-Auth-Request-Type (285)
+// 8.12
+type enumerated BASE_NONE_Re_Auth_Request_Type {
+ AUTHORIZE_ONLY (0),
+ AUTHORIZE_AUTHENTICATE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Class (25)
+// 8.20
+type AVP_OctetString BASE_NONE_Class
+
+// RFC 3588
+// AVP: Destination-Host (293)
+// 6.5
+type AVP_DiameterIdentity BASE_NONE_Destination_Host
+
+// RFC 3588
+// AVP: Destination-Realm (283)
+// 6.6
+type AVP_DiameterIdentity BASE_NONE_Destination_Realm
+
+// RFC 3588
+// AVP: Disconnect-Cause (273)
+// 5.4.3
+type enumerated BASE_NONE_Disconnect_Cause {
+ REBOOTING (0),
+ BUSY (1),
+ DO_NOT_WANT_TO_TALK_TO_YOU (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: E2E-Sequence (300)
+// 6.15
+type AVP_Grouped BASE_NONE_E2E_Sequence
+
+// RFC 3588
+// AVP: Error-Message (281)
+// 7.3
+type AVP_UTF8String BASE_NONE_Error_Message
+
+// RFC 3588
+// AVP: Error-Reporting-Host (294)
+// 7.4
+type AVP_DiameterIdentity BASE_NONE_Error_Reporting_Host
+
+// RFC 3588
+// AVP: Event-Timestamp (55)
+// 8.21
+type AVP_Time BASE_NONE_Event_Timestamp
+
+// RFC 3588
+// AVP: Experimental-Result (297)
+// 7.6
+type AVP_Grouped BASE_NONE_Experimental_Result
+
+// RFC 3588
+// AVP: Experimental-Result-Code (298)
+// 7.7
+type AVP_Unsigned32 BASE_NONE_Experimental_Result_Code
+
+// RFC 3588
+// AVP: Failed-AVP (279)
+// 7.5
+type AVP_Grouped BASE_NONE_Failed_AVP
+
+// RFC 3588
+// AVP: Firmware-Revision (267)
+// 5.3.4
+type AVP_Unsigned32 BASE_NONE_Firmware_Revision
+
+// RFC 3588
+// AVP: Host-IP-Address (257)
+// 5.3.5
+type AVP_Address BASE_NONE_Host_IP_Address
+
+// RFC 3588
+// AVP: Inband-Security-Id (299)
+// 6.10
+type AVP_Unsigned32 BASE_NONE_Inband_Security_Id
+
+// RFC 3588
+// AVP: Multi-Round-Time-Out (272)
+// 8.19
+type AVP_Unsigned32 BASE_NONE_Multi_Round_Time_Out
+
+// RFC 3588
+// AVP: Origin-Host (264)
+// 6.3
+type AVP_DiameterIdentity BASE_NONE_Origin_Host
+
+// RFC 3588
+// AVP: Origin-Realm (296)
+// 6.4
+type AVP_DiameterIdentity BASE_NONE_Origin_Realm
+
+// RFC 3588
+// AVP: Origin-State-Id (278)
+// 8.16
+type AVP_Unsigned32 BASE_NONE_Origin_State_Id
+
+// RFC 3588
+// AVP: Product-Name (269)
+// 5.3.7
+type AVP_UTF8String BASE_NONE_Product_Name
+
+// RFC 3588
+// AVP: Proxy-Host (280)
+// 6.7.3
+type AVP_DiameterIdentity BASE_NONE_Proxy_Host
+
+// RFC 3588
+// AVP: Proxy-Info (284)
+// 6.7.2
+type AVP_Grouped BASE_NONE_Proxy_Info
+
+// RFC 3588
+// AVP: Proxy-State (33)
+// 6.7.4
+type AVP_OctetString BASE_NONE_Proxy_State
+
+// RFC 3588
+// AVP: Redirect-Host (292)
+// 6.12
+type AVP_DiameterURI BASE_NONE_Redirect_Host
+
+// RFC 3588
+// AVP: Redirect-Host-Usage (261)
+// 6.13
+type enumerated BASE_NONE_Redirect_Host_Usage {
+ DONT_CACHE (0),
+ ALL_SESSION (1),
+ ALL_REALM (2),
+ REALM_AND_APPLICATION (3),
+ ALL_APPLICATION (4),
+ ALL_HOST (5),
+ ALL_USER (6)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Redirect-Max-Cache-Time (262)
+// 6.14
+type AVP_Unsigned32 BASE_NONE_Redirect_Max_Cache_Time
+
+// RFC 3588
+// AVP: Result-Code (268)
+// 7.1
+type AVP_Unsigned32 BASE_NONE_Result_Code
+
+// RFC 3588
+// AVP: Route-Record (282)
+// 6.7.1
+type AVP_DiameterIdentity BASE_NONE_Route_Record
+
+// RFC 3588
+// AVP: Session-Id (263)
+// 8.8
+type AVP_UTF8String BASE_NONE_Session_Id
+
+// RFC 3588
+// AVP: Session-Timeout (27)
+// 8.13
+type AVP_Unsigned32 BASE_NONE_Session_Timeout
+
+// RFC 3588
+// AVP: Session-Binding (270)
+// 8.17
+type AVP_Unsigned32 BASE_NONE_Session_Binding
+
+// RFC 3588
+// AVP: Session-Server-Failover (271)
+// 8.18
+type enumerated BASE_NONE_Session_Server_Failover {
+ REFUSE_SERVICE (0),
+ TRY_AGAIN (1),
+ ALLOW_SERVICE (2),
+ TRY_AGAIN_ALLOW_SERVICE (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: Supported-Vendor-Id (265)
+// 5.3.6
+type AVP_Unsigned32 BASE_NONE_Supported_Vendor_Id
+
+// RFC 3588
+// AVP: Termination-Cause (295)
+// 8.15
+type enumerated BASE_NONE_Termination_Cause {
+ DIAMETER_LOGOUT (1),
+ DIAMETER_SERVICE_NOT_PROVIDED (2),
+ DIAMETER_BAD_ANSWER (3),
+ DIAMETER_ADMINISTRATIVE (4),
+ DIAMETER_LINK_BROKEN (5),
+ DIAMETER_AUTH_EXPIRED (6),
+ DIAMETER_USER_MOVED (7),
+ DIAMETER_SESSION_TIMEOUT (8)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 3588
+// AVP: User-Name (1)
+// 8.14
+type AVP_UTF8String BASE_NONE_User_Name
+
+// RFC 3588
+// AVP: Vendor-Id (266)
+// 5.3.3
+type AVP_Unsigned32 BASE_NONE_Vendor_Id
+
+// RFC 3588
+// AVP: Vendor-Specific-Application-Id (260)
+// 6.11
+type AVP_Grouped BASE_NONE_Vendor_Specific_Application_Id
+
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Roland Gecse - initial implementation and initial documentation
+* Akos Pernek
+* Antal Wuh.Hen.Chang
+* Attila Fulop
+* Balazs Barcsik
+* Bence Molnar
+* Csaba Koppany
+* David Juhasz
+* Eduard Czimbalmos
+* Elemer Lelik
+* Endre Kiss
+* Endre Kulcsar
+* Gabor Szalai
+* Gabor Tatarka
+* Gergely Futo
+* Istvan Sandor
+* Krisztian Pandi
+* Kulcsr Endre
+* Laszlo Tamas Zeke
+* Norbert Pinter
+* Roland Gecse
+* Tibor Bende
+* Tibor Szabo
+* Timea Moder
+* Zoltan Medve
+* Zsolt Nandor Torok
+* Zsolt Szalai
+******************************************************************************/
+//
+// File: BaseTypes_IETF_RFC3588.ddf
+// Description: DDF for the Diameter base types
+// Rev: R55A
+// Prodnr: CNL 113 462
+///////////////////////////////////////////////
+
+//
+// External functions for encoding and decoding
+//
+
+external function f_DIAMETER_Enc(in PDU_DIAMETER pl_pdu) return octetstring;
+external function f_DIAMETER_Dec(in octetstring pl_oct) return PDU_DIAMETER;
+external function f_DIAMETER_Enc_fast(in PDU_DIAMETER pl_pdu, out octetstring pl_oct );
+external function f_DIAMETER_Dec_fast(in octetstring pl_oct, out PDU_DIAMETER pl_pdu) return integer;
+
+external function f_DIAMETER_genHopByHop_oct() return UINT32;
+external function f_DIAMETER_genEndToEnd_oct() return UINT32;
+external function f_DIAMETER_GetAVPByListOfCodes(in octetstring pl_oct, in integerList pl_codeList) return octetstring;
+external function f_DIAMETER_GetAVPByListOfCodesCombined(in octetstring pl_oct, in integerList pl_codeList, in integerList pl_groupcodeList) return octetstring;
+external function f_DIAMETER_GetAVPByListOfCodesFromGroupedAVP(in octetstring pl_oct, in integerList pl_codeList) return octetstring;
+
+function f_get_R_bit(in PDU_DIAMETER pl_pdu) return boolean
+{
+ return pl_pdu.RPETxxxx[0]=='1'B;
+}
+
+function f_DIAMETER_genEndToEnd() return UINT32
+{
+ return f_DIAMETER_genEndToEnd_oct()
+}
+
+function f_DIAMETER_genHopByHop() return UINT32
+{
+ return f_DIAMETER_genHopByHop_oct()
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Type: IntegerList
+//
+// Purpose:
+// List of integer
+//
+// Elements:
+// record of *integer*
+//
+// Detailed Comments:
+// -
+//
+///////////////////////////////////////////////////////////////////////////////
+type record of integer integerList;
+
+//
+// Basic type definitions used in AVP type definitions
+//
+
+type integer UINT8 (0..255) with {
+variant "FIELDLENGTH(8)"
+variant "BYTEORDER(last)"
+}
+
+type integer UINT24 (0..16777215) with {
+variant "FIELDLENGTH(24)"
+variant "BYTEORDER(last)"
+}
+
+type octetstring UINT32 length(4) with {
+ variant "FIELDLENGTH(4)"
+}
+
+
+
+type integer INT32 with {
+variant "FIELDLENGTH(32)"
+variant "BYTEORDER(last)"
+variant "COMP(signbit)"
+}
+
+type octetstring INT64 length(8) with {
+ variant "FIELDLENGTH(8)"
+}
+
+
+
+type octetstring UINT64 length(8) with {
+ variant "FIELDLENGTH(8)"
+}
+
+
+type float FLOAT32 with {
+variant "FORMAT(IEEE754 float)"
+}
+
+type float FLOAT64 with {
+variant "FORMAT(IEEE754 double)"
+}
+
+type bitstring BIT8 length(8) with { variant "FIELDLENGTH(8)" }
+type octetstring OCTET4 length(4) with { variant "FIELDLENGTH(4)" }
+type octetstring OCTET8 length(8) with { variant "FIELDLENGTH(8)" }
+type charstring DiameterIdentity;
+type charstring DiameterURI;
+type OCTET4 Time;
+type octetstring UTF8;
+type charstring IPFilterRule;
+type charstring QoSFilterRule;
+
+//
+// 4.2. Basic AVP Data Formats
+//
+
+type octetstring AVP_OctetString with {variant ""};
+type INT32 AVP_Integer32 with {variant ""};
+type INT64 AVP_Integer64 with {variant ""};
+type UINT32 AVP_Unsigned32 with {variant ""};
+type UINT64 AVP_Unsigned64 with {variant ""};
+type FLOAT32 AVP_Float32 with {variant ""};
+type FLOAT64 AVP_Float64 with {variant ""};
+type AVP_list AVP_Grouped with {variant ""};
+
+//
+// 4.3. Derived AVP Data Formats
+//
+
+// http://www.iana.org/assignments/address-family-numbers (2002-05-14)
+type enumerated AddressType {
+Reserved_0 (0),
+IP (1),
+IP6 (2),
+NSAP (3),
+HDLC (4),
+BBN1822 (5),
+IEEE802 (6),
+E163 (7),
+E164 (8),
+F69 (9),
+X121 (10),
+IPX (11),
+Appletalk (12),
+Decnet_IV (13),
+Banyan_Vines (14),
+E164_NSAP (15),
+DNS (16),
+Distinguished_Name (17),
+AS_Number (18),
+XTP_IP (19),
+XTP_IP6 (20),
+XTP_native (21),
+Fibre_Channel_WW_Port (22),
+Fibre_Channel_WW_Node (23),
+GWID (24),
+Reserved_65535 (65535)
+} with {
+variant "FIELDLENGTH(16)"
+variant "BYTEORDER(last)"
+variant "COMP(nosign)"
+}
+
+type record AVP_Address {
+AddressType address_type,
+octetstring address_data
+}
+
+// Non-standard? AVP type for 4octet IPv4 addresses
+type OCTET4 AVP_IP_Address;
+
+type Time AVP_Time;
+
+// Supports only 1byte/char
+type UTF8 AVP_UTF8String;
+
+type DiameterIdentity AVP_DiameterIdentity;
+type DiameterURI AVP_DiameterURI;
+
+// Enumerated
+// Enumerations must be solved uniqly for each enumerated type AVP!
+
+type IPFilterRule AVP_IPFilterRule;
+type QoSFilterRule AVP_QoSFilterRule;
+
+// WARNING: Enumeration item with code (274) exists in type Command_Code
+// WARNING: Enumeration item with code (271) exists in type Command_Code
+// WARNING: Enumeration item with code (257) exists in type Command_Code
+// WARNING: Enumeration item with code (280) exists in type Command_Code
+// WARNING: Enumeration item with code (282) exists in type Command_Code
+// WARNING: Enumeration item with code (258) exists in type Command_Code
+// WARNING: Enumeration item with code (275) exists in type Command_Code
+
+
+type record PDU_DIAMETER
+{
+UINT8 version,
+UINT24 message_length,
+BIT8 RPETxxxx,
+Command_Code command_code,
+OCTET4 application_id,
+UINT32 hop_by_hop_id,
+UINT32 end_to_end_id,
+AVP_list avps
+} with {
+variant (message_length) "LENGTHTO(version, message_length,
+ RPETxxxx,
+command_code, application_id, hop_by_hop_id, end_to_end_id, avps)";
+}
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Timea Moder - initial implementation and initial documentation
+******************************************************************************/
+//
+// File: AAAInterface_3GPP_TS29272_f10.ddf
+// Description: DDF for S6a/S6d and S13 Interfaces according to 3GPP TS 29.272 V15.1.0
+// Rev: R55A
+// Prodnr: CNL 113 462
+
+
+// APPLICATION-NAME: AAA
+// APPLICATION-REVISION: V15_1_0
+
+// AVP implementations according to:
+// 3GPP TS 29.272 V15.1.0 - Evolved Packet System (EPS); Mobility Management Entity (MME) and Serving GPRS Support Node (SGSN) related interfaces based on Diameter protocol
+
+// 7.2.2
+
+
+// 7.3.2
+// AVP: Subscription-Data (1400) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Subscription_Data
+
+// 7.3.3
+// AVP: Terminal-Information (1401) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Terminal_Information
+
+// 7.3.4
+// AVP: IMEI (1402) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_IMEI
+
+// 7.3.5
+// AVP: Software-Version (1403) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_Software_Version
+
+// 7.3.77
+// AVP: QoS-Subscribed (1404) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_QoS_Subscribed
+
+// 7.3.7
+// AVP: ULR-Flags (1405) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_ULR_Flags
+
+// 7.3.8
+// AVP: ULA-Flags (1406) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_ULA_Flags
+
+// 7.3.9
+// AVP: Visited-PLMN-Id (1407) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Visited_PLMN_Id
+
+// 7.3.11
+// AVP: Requested-EUTRAN-Authentication-Info (1408) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Requested_EUTRAN_Authentication_Info
+
+// 7.3.12
+// AVP: Requested-UTRAN-GERAN-Authentication-Info (1409) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info
+
+// 7.3.14
+// AVP: Number-Of-Requested-Vectors (1410) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Number_Of_Requested_Vectors
+
+// 7.3.15
+// AVP: Re-Synchronization-Info (1411) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Re_Synchronization_Info
+
+// 7.3.16
+// AVP: Immediate-Response-Preferred (1412) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Immediate_Response_Preferred
+
+// 7.3.17
+// AVP: Authentication-Info (1413) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Authentication_Info
+
+// 7.3.18
+// AVP: E-UTRAN-Vector (1414) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_E_UTRAN_Vector
+
+// 7.3.19
+// AVP: UTRAN-Vector (1415) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_UTRAN_Vector
+
+// 7.3.20
+// AVP: GERAN-Vector (1416) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_GERAN_Vector
+
+// 7.3.21
+// AVP: Network-Access-Mode (1417) 3GPP (10415)
+type enumerated AAA_3GPP_Network_Access_Mode {
+ PACKET_AND_CIRCUIT (0),
+ Reserved (1),
+ ONLY_PACKET (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.22
+// AVP: HPLMN-ODB (1418) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_HPLMN_ODB
+
+// 7.3.23
+// AVP: Item-Number (1419) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Item_Number
+
+// 7.3.24
+// AVP: Cancellation-Type (1420) 3GPP (10415)
+type enumerated AAA_3GPP_Cancellation_Type {
+ MME_UPDATE_PROCEDURE (0),
+ SGSN_UPDATE_PROCEDURE (1),
+ SUBSCRIPTION_WITHDRAWAL (2),
+ UPDATE_PROCEDURE_IWF (3),
+ INITIAL_ATTACH_PROCEDURE (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.25
+// AVP: DSR-Flags (1421) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_DSR_Flags
+
+// 7.3.26
+// AVP: DSA-Flags (1422) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_DSA_Flags
+
+// 7.3.27
+// AVP: Context-Identifier (1423) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Context_Identifier
+
+// 7.3.29
+// AVP: Subscriber-Status (1424) 3GPP (10415)
+type enumerated AAA_3GPP_Subscriber_Status {
+ SERVICE_GRANTED (0),
+ OPERATOR_DETERMINED_BARRING (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.30
+// AVP: Operator-Determined-Barring (1425) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Operator_Determined_Barring
+
+// 7.3.31
+// AVP: Access-Restriction-Data (1426) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Access_Restriction_Data
+
+// 7.3.32
+// AVP: APN-OI-Replacement (1427) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_APN_OI_Replacement
+
+// 7.3.33
+// AVP: All-APN-Configurations-Included-Indicator (1428) 3GPP (10415)
+type enumerated AAA_3GPP_All_APN_Configurations_Included_Indicator {
+ All_APN_CONFIGURATIONS_INCLUDED (0),
+ MODIFIED_ADDED_APN_CONFIGURATIONS_INCLUDED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.34
+// AVP: APN-Configuration-Profile (1429) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_APN_Configuration_Profile
+
+// 7.3.35
+// AVP: APN-Configuration (1430) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_APN_Configuration
+
+// 7.3.37
+// AVP: EPS-Subscribed-QoS-Profile (1431) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_EPS_Subscribed_QoS_Profile
+
+// 7.3.38
+// AVP: VPLMN-Dynamic-Address-Allowed (1432) 3GPP (10415)
+type enumerated AAA_3GPP_VPLMN_Dynamic_Address_Allowed {
+ NOTALLOWED (0),
+ ALLOWED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.39
+// AVP: STN-SR (1433) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_STN_SR
+
+// 7.3.83
+// AVP: Alert-Reason (1434) 3GPP (10415)
+type enumerated AAA_3GPP_Alert_Reason {
+ UE_PRESENT (0),
+ UE_MEMORY_AVAILABLE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.41
+// AVP: AMBR (1435) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_AMBR
+
+// 7.3.78
+// AVP: CSG-Subscription-Data (1436) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_CSG_Subscription_Data
+
+// 7.3.79
+// AVP: CSG-Id (1437) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_CSG_Id
+
+// 7.3.44
+// AVP: PDN-GW-Allocation-Type (1438) 3GPP (10415)
+type enumerated AAA_3GPP_PDN_GW_Allocation_Type {
+ STATIC (0),
+ DYNAMIC (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.80
+// AVP: Expiration-Date (1439) 3GPP (10415)
+type AVP_Time AAA_3GPP_Expiration_Date
+
+// 7.3.46
+// AVP: RAT-Frequency-Selection-Priority-ID (1440) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_RAT_Frequency_Selection_Priority_ID
+
+// 7.3.47
+// AVP: IDA-Flags (1441) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_IDA_Flags
+
+// 7.3.48
+// AVP: PUA-Flags (1442) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_PUA_Flags
+
+// 7.3.49
+// AVP: NOR-Flags (1443) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_NOR_Flags
+
+// 7.3.50
+// AVP: User-Id (1444) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_User_Id
+
+// 7.3.51
+// AVP: Equipment-Status (1445) 3GPP (10415)
+type enumerated AAA_3GPP_Equipment_Status {
+ WHITELISTED (0),
+ BLACKLISTED (1),
+ GREYLISTED (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.52
+// AVP: Regional-Subscription-Zone-Code (1446) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Regional_Subscription_Zone_Code
+
+// 7.3.53
+// AVP: RAND (1447) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_RAND
+
+// 7.3.54
+// AVP: XRES (1448) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_XRES
+
+// 7.3.55
+// AVP: AUTN (1449) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_AUTN
+
+// 7.3.56
+// AVP: KASME (1450) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_KASME
+
+// 7.3.98
+// AVP: Trace-Collection-Entity (1452) 3GPP (10415)
+type AVP_Address AAA_3GPP_Trace_Collection_Entity
+
+// 7.3.59
+// AVP: Kc (1453) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Kc
+
+// 7.3.60
+// AVP: SRES (1454) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_SRES
+
+// 7.3.62
+// AVP: PDN-Type (1456) 3GPP (10415)
+type enumerated AAA_3GPP_PDN_Type {
+ IPv4 (0),
+ IPv6 (1),
+ IPv4v6 (2),
+ IPv4_OR_IPv6 (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.81
+// AVP: Roaming-Restricted-Due-To-Unsupported-Feature (1457) 3GPP (10415)
+type enumerated AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature {
+ Roaming_Restricted_Due_To_Unsupported_Feature (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.63
+// AVP: Trace-Data (1458) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Trace_Data
+
+// 7.3.64
+// AVP: Trace-Reference (1459) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Trace_Reference
+
+// 7.3.67
+// AVP: Trace-Depth (1462) 3GPP (10415)
+// FS 3.3.2.10
+type AVP_Unsigned32 AAA_3GPP_Trace_Depth
+
+// 7.3.68
+// AVP: Trace-NE-Type-List (1463) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Trace_NE_Type_List
+
+// 7.3.69
+// AVP: Trace-Interface-List (1464) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Trace_Interface_List
+
+// 7.3.70
+// AVP: Trace-Event-List (1465) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Trace_Event_List
+
+// 7.3.71
+// AVP: OMC-Id (1466) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_OMC_Id
+
+// 7.3.72
+// AVP: GPRS-Subscription-Data (1467) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_GPRS_Subscription_Data
+
+// 7.3.73
+// AVP: Complete-Data-List-Included-Indicator (1468) 3GPP (10415)
+type enumerated AAA_3GPP_Complete_Data_List_Included_Indicator {
+ All_PDP_CONTEXTS_INCLUDED (0),
+ MODIFIED_ADDED_PDP_CONTEXTS_INCLUDED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.74
+// AVP: PDP-Context (1469) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_PDP_Context
+
+// 7.3.75
+// AVP: PDP-Type (1470) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_PDP_Type
+
+// 7.3.6
+// AVP: 3GPP2-MEID (1471) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_3GPP2_MEID
+
+// 7.3.82
+// AVP: Specific-APN-Info (1472) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Specific_APN_Info
+
+// 7.3.84
+// AVP: LCS-Info (1473) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_LCS_Info
+
+// 7.3.85
+// AVP: GMLC-Number (1474) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_GMLC_Number
+
+// 7.3.86
+// AVP: LCS-PrivacyException (1475) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_LCS_PrivacyException
+
+// 7.3.87
+// AVP: SS-Code (1476) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_SS_Code
+
+// 7.3.88
+// AVP: SS-Status (1477) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_SS_Status
+
+// 7.3.89
+// AVP: Notification-To-UE-User (1478) 3GPP (10415)
+type enumerated AAA_3GPP_Notification_To_UE_User {
+ NOTIFY_LOCATION_ALLOWED (0),
+ NOTIFYANDVERIFY_LOCATION_ALLOWED_IF_NO_RESPONSE (1),
+ NOTIFYANDVERIFY_LOCATION_NOT_ALLOWED_IF_NO_RESPONSE (2),
+ LOCATION_NOT_ALLOWED (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.90
+// AVP: External-Client (1479) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_External_Client
+
+// 7.3.91
+// AVP: Client-Identity (1480) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Client_Identity
+
+// 7.3.92
+// AVP: GMLC-Restriction (1481) 3GPP (10415)
+type enumerated AAA_3GPP_GMLC_Restriction {
+ GMLC_LIST (0),
+ HOME_COUNTRY (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.93
+// AVP: PLMN-Client (1482) 3GPP (10415)
+type enumerated AAA_3GPP_PLMN_Client {
+ BROADCAST_SERVICE (0),
+ O_AND_M_HPLMN (1),
+ O_AND_M_VPLMN (2),
+ ANONYMOUS_LOCATION (3),
+ TARGET_UE_SUBSCRIBED_SERVICE (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.94
+// AVP: Service-Type (1483) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Service_Type
+
+// 7.3.95
+// AVP: ServiceTypeIdentity (1484) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_ServiceTypeIdentity
+
+// 7.3.96
+// AVP: MO-LR (1485) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_MO_LR
+
+// 7.3.99
+// AVP: Teleservice-List (1486) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Teleservice_List
+
+// 7.3.100
+// AVP: TS-Code (1487) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_TS_Code
+
+// 7.3.101
+// AVP: Call-Barring-Info (1488) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Call_Barring_Info
+
+// 7.3.102
+// AVP: SGSN-Number (1489) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_SGSN_Number
+
+// 7.3.103
+// AVP: IDR-Flags (1490) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_IDR_Flags
+
+// 7.3.104
+// AVP: ICS-Indicator (1491) 3GPP (10415)
+type enumerated AAA_3GPP_ICS_Indicator {
+ FALSE (0),
+ TRUE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.106
+// AVP: IMS-Voice-Over-PS-Sessions-Supported (1492) 3GPP (10415)
+type enumerated AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported {
+ NOT_SUPPORTED (0),
+ SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.107
+// AVP: Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions (1493) 3GPP (10415)
+type enumerated AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions {
+ NOT_SUPPORTED (0),
+ SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.108
+// AVP: Last-UE-Activity-Time (1494) 3GPP (10415)
+type AVP_Time AAA_3GPP_Last_UE_Activity_Time
+
+// 7.3.110
+// AVP: EPS-User-State (1495) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_EPS_User_State
+
+// 7.3.111
+// AVP: EPS-Location-Information (1496) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_EPS_Location_Information
+
+// 7.3.112
+// AVP: MME-User-State (1497) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_MME_User_State
+
+// 7.3.113
+// AVP: SGSN-User-State (1498) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_SGSN_User_State
+
+// 7.3.114
+// AVP: User-State (1499) 3GPP (10415)
+type enumerated AAA_3GPP_User_State {
+ DETACHED (0),
+ ATTACHED_NOT_REACHABLE_FOR_PAGING (1),
+ ATTACHED_REACHABLE_FOR_PAGING (2),
+ CONNECTED_NOT_REACHABLE_FOR_PAGING (3),
+ CONNECTED_REACHABLE_FOR_PAGING (4),
+ NETWORK_DETERMINED_NOT_REACHABLE (5)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.115
+// AVP: MME-Location-Information (1600) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_MME_Location_Information
+
+// 7.3.116
+// AVP: SGSN-Location-Information (1601) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_SGSN_Location_Information
+
+// 7.3.117
+// AVP: E-UTRAN-Cell-Global-Identity (1602) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_E_UTRAN_Cell_Global_Identity
+
+// 7.3.118
+// AVP: Tracking-Area-Identity (1603) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Tracking_Area_Identity
+
+// 7.3.119
+// AVP: Cell-Global-Identity (1604) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Cell_Global_Identity
+
+// 7.3.120
+// AVP: Routing-Area-Identity (1605) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Routing_Area_Identity
+
+// 7.3.121
+// AVP: Location-Area-Identity (1606) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Location_Area_Identity
+
+// 7.3.122
+// AVP: Service-Area-Identity (1607) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Service_Area_Identity
+
+// 7.3.123
+// AVP: Geographical-Information (1608) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Geographical_Information
+
+// 7.3.124
+// AVP: Geodetic-Information (1609) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Geodetic_Information
+
+// 7.3.125
+// AVP: Current-Location-Retrieved (1610) 3GPP (10415)
+type enumerated AAA_3GPP_Current_Location_Retrieved {
+ ACTIVE_LOCATION_RETRIEVAL (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.126
+// AVP: Age-Of-Location-Information (1611) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Age_Of_Location_Information
+
+// 7.3.127
+// AVP: Active-APN (1612) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Active_APN
+
+// 7.3.128
+// AVP: Error-Diagnostic (1614) 3GPP (10415)
+type enumerated AAA_3GPP_Error_Diagnostic {
+ GPRS_DATA_SUBSCRIBED (0),
+ NO_GPRS_DATA_SUBSCRIBED (1),
+ ODB_ALL_APN (2),
+ ODB_HPLMN_APN (3),
+ ODB_VPLMN_APN (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.129
+// AVP: Ext-PDP-Address (1621) 3GPP (10415)
+type AVP_Address AAA_3GPP_Ext_PDP_Address
+
+// 7.3.130
+// AVP: UE-SRVCC-Capability (1615) 3GPP (10415)
+type enumerated AAA_3GPP_UE_SRVCC_Capability {
+ UE_SRVCC_NOT_SUPPORTED (0),
+ UE_SRVCC_SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.131
+// AVP: MPS-Priority (1616) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_MPS_Priority
+
+// 7.3.132
+// AVP: VPLMN-LIPA-Allowed (1617) 3GPP (10415)
+type enumerated AAA_3GPP_VPLMN_LIPA_Allowed {
+ LIPA_NOTALLOWED (0),
+ LIPA_ALLOWED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.133
+// AVP: LIPA-Permission (1618) 3GPP (10415)
+type enumerated AAA_3GPP_LIPA_Permission {
+ LIPA_PROHIBITED (0),
+ LIPA_ONLY (1),
+ LIPA_CONDITIONAL (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.134
+// AVP: Subscribed-Periodic-RAU-TAU-Timer (1619) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer
+
+// 7.3.75A
+// AVP: Ext-PDP-Type (1620) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Ext_PDP_Type
+
+// 7.3.135
+// AVP: SIPTO-Permission (1613) 3GPP (10415)
+type enumerated AAA_3GPP_SIPTO_Permission {
+ SIPTO_ALLOWED (0),
+ SIPTO_NOTALLOWED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.136
+// AVP: MDT-Configuration (1622) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_MDT_Configuration
+
+// 7.3.137, TS 32.422 v15.0.0 - 5.9a
+// AVP: Job-Type (1623) 3GPP (10415)
+type enumerated AAA_3GPP_Job_Type {
+ IMMEDIATE_MDT_ONLY (0),
+ LOGGED_MDT_ONLY (1),
+ TRACE_ONLY (2),
+ IMMEDIATE_MDT_AND_TRACE (3),
+ RLF_REPORTS_ONLY (4),
+ RCEF_REPORTS_ONLY (5),
+ LOGGED_MBSFN_MDT (6)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.138
+// AVP: Area-Scope (1624) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Area_Scope
+
+// 7.3.139
+// AVP: List-Of-Measurements (1625) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_List_Of_Measurements
+
+// 7.3.140
+// AVP: Reporting-Trigger (1626) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Reporting_Trigger
+
+// 7.3.141, TS 32.422 v15.0.0 - 5.10.5
+// AVP: Report-Interval (1627) 3GPP (10415)
+type enumerated AAA_3GPP_Report_Interval {
+ RI_UMTS_250ms (0),
+ RI_UMTS_500ms (1),
+ RI_UMTS_1000ms (2),
+ RI_UMTS_2000ms (3),
+ RI_UMTS_3000ms (4),
+ RI_UMTS_4000ms (5),
+ RI_UMTS_6000ms (6),
+ RI_UMTS_8000ms (7),
+ RI_UMTS_12000ms (8),
+ RI_UMTS_16000ms (9),
+ RI_UMTS_20000ms (10),
+ RI_UMTS_24000ms (11),
+ RI_UMTS_28000ms (12),
+ RI_UMTS_32000ms (13),
+ RI_UMTS_64000ms (14),
+ RI_LTE_120ms (15),
+ RI_LTE_240ms (16),
+ RI_LTE_480ms (17),
+ RI_LTE_640ms (18),
+ RI_LTE_1024ms (19),
+ RI_LTE_2048ms (20),
+ RI_LTE_5120ms (21),
+ RI_LTE_10240ms (22),
+ RI_LTE_1min (23),
+ RI_LTE_6min (24),
+ RI_LTE_12min (25),
+ RI_LTE_30min (26),
+ RI_LTE_60min (27)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.142, TS 32.422 v15.0.0 - 5.10.6
+// AVP: Report-Amount (1628) 3GPP (10415)
+type enumerated AAA_3GPP_Report_Amount {
+ ONE (0),
+ TWO (1),
+ FOUR (2),
+ EIGHT (3),
+ SIXTEEN (4),
+ THIRTYTWO (5),
+ SIXTYFOUR (6),
+ INFINITY_AMOUNT (7)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.143
+// AVP: Event-Threshold-RSRP (1629) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Event_Threshold_RSRP
+
+// 7.3.144
+// AVP: Event-Threshold-RSRQ (1630) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Event_Threshold_RSRQ
+
+// 7.3.145, TS 32.422 v15.0.0 - 5.10.8
+// AVP: Logging-Interval (1631) 3GPP (10415)
+type enumerated AAA_3GPP_Logging_Interval {
+ LI_128 (0),
+ LI_256 (1),
+ LI_512 (2),
+ LI_1024 (3),
+ LI_2048 (4),
+ LI_3072 (5),
+ LI_4096 (6),
+ LI_6144 (7)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.146, TS 32.422 v15.0.0 - 5.10.9
+// AVP: Logging-Duration (1632) 3GPP (10415)
+type enumerated AAA_3GPP_Logging_Duration {
+ LD_600_SEC (0),
+ LD_1200_SEC (1),
+ LD_2400_SEC (2),
+ LD_3600_SEC (3),
+ LD_5400_SEC (4),
+ LD_7200_SEC (5)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.147
+// AVP: Relay-Node-Indicator (1633) 3GPP (10415)
+type enumerated AAA_3GPP_Relay_Node_Indicator {
+ NOT_RELAY_NODE (0),
+ RELAY_NODE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.148
+// AVP: MDT-User-Consent (1634) 3GPP (10415)
+type enumerated AAA_3GPP_MDT_User_Consent {
+ CONSENT_NOT_GIVEN (0),
+ CONSENT_GIVEN (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.149
+// AVP: PUR-Flags (1635) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_PUR_Flags
+
+// 7.3.150
+// AVP: Subscribed-VSRVCC (1636) 3GPP (10415)
+type enumerated AAA_3GPP_Subscribed_VSRVCC {
+ VSRVCC_SUBSCRIBED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.151
+// AVP: Equivalent-PLMN-List (1637) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Equivalent_PLMN_List
+
+
+// 7.3.152
+// AVP: CLR-Flags (1638) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_CLR_Flags
+
+// 7.3.153
+// AVP: UVR-Flags (1639) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_UVR_Flags
+
+// 7.3.154
+// AVP: UVA-Flags (1640) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_UVA_Flags
+
+// 7.3.155
+// AVP: VPLMN-CSG-Subscription-Data (1641) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_VPLMN_CSG_Subscription_Data
+
+// 7.3.156
+// AVP: Local-Time-Zone (1649) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Local_Time_Zone
+
+// 7.3.157
+// AVP: A-MSISDN (1643) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_A_MSISDN
+
+// 7.3.159
+// AVP: MME-Number-for-MT-SMS (1645) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_MME_Number_for_MT_SMS
+
+// 7.3.162
+// AVP: SMS-Register-Request (1648) 3GPP (10415)
+type enumerated AAA_3GPP_SMS_Register_Request {
+ SMS_REGISTRATION_REQUIRED (0),
+ SMS_REGISTRATION_NOT_PREFERRED (1),
+ NO_PREFERENCE (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.163
+// AVP: Time-Zone (1642) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_Time_Zone
+
+// 7.3.164
+// AVP: Daylight-Saving-Time (1650) 3GPP (10415)
+type enumerated AAA_3GPP_Daylight_Saving_Time {
+ NO_ADJUSTMENT (0),
+ PLUS_ONE_HOUR_ADJUSTMENT (1),
+ PLUS_TWO_HOURS_ADJUSTMENT (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.165
+// AVP: Subscription-Data-Flags (1654) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Subscription_Data_Flags
+
+// 7.3.166, TS 32.422 v15.0.0 - 5.10.23
+// AVP: Measurement-Period-LTE (1656) 3GPP (10415)
+type enumerated AAA_3GPP_Measurement_Period_LTE {
+ PERIOD_1024_ms (0),
+ PERIOD_1280_ms (1),
+ PERIOD_2048_ms (2),
+ PERIOD_2560_ms (3),
+ PERIOD_5120_ms (4),
+ PERIOD_10240_ms (5),
+ PERIOD_1_min (6)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.167, TS 32.422 v15.0.0 - 5.10.22
+// AVP: Measurement-Period-UMTS (1655) 3GPP (10415)
+type enumerated AAA_3GPP_Measurement_Period_UMTS {
+ PERIOD_250_ms (0),
+ PERIOD_500_ms (1),
+ PERIOD_1000_ms (2),
+ PERIOD_2000_ms (3),
+ PERIOD_3000_ms (4),
+ PERIOD_4000_ms (5),
+ PERIOD_6000_ms (6),
+ PERIOD_8000_ms (7),
+ PERIOD_12000_ms (8),
+ PERIOD_16000_ms (9),
+ PERIOD_20000_ms (10),
+ PERIOD_24000_ms (11),
+ PERIOD_28000_ms (12),
+ PERIOD_32000_ms (13),
+ PERIOD_64000_ms (14)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.168, TS 32.422 v15.0.0 - 5.10.20
+// AVP: Collection-Period-RRM-LTE (1657) 3GPP (10415)
+type enumerated AAA_3GPP_Collection_Period_RRM_LTE {
+ PERIOD_1024_ms (0),
+ PERIOD_1280_ms (1),
+ PERIOD_2048_ms (2),
+ PERIOD_2560_ms (3),
+ PERIOD_5120_ms (4),
+ PERIOD_10240_ms (5),
+ PERIOD_1_min (6)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.169, TS 32.422 v15.0.0 - 5.10.22
+// AVP: Collection-Period-RRM-UMTS (1658) 3GPP (10415)
+type enumerated AAA_3GPP_Collection_Period_RRM_UMTS {
+ PERIOD_250_ms (0),
+ PERIOD_500_ms (1),
+ PERIOD_1000_ms (2),
+ PERIOD_2000_ms (3),
+ PERIOD_3000_ms (4),
+ PERIOD_4000_ms (5),
+ PERIOD_6000_ms (6),
+ PERIOD_8000_ms (7),
+ PERIOD_12000_ms (8),
+ PERIOD_16000_ms (9),
+ PERIOD_20000_ms (10),
+ PERIOD_24000_ms (11),
+ PERIOD_28000_ms (12),
+ PERIOD_32000_ms (13),
+ PERIOD_64000_ms (14)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.170
+// AVP: Positioning-Method (1659) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Positioning_Method
+
+// 7.3.171
+// AVP: Measurement_Quantity (1660) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Measurement_Quantity
+
+// 7.3.172
+// AVP: Event-Threshold-Event-1F (1661) 3GPP (10415)
+type AVP_Integer32 AAA_3GPP_Event_Threshold_Event_1F
+
+// 7.3.173
+// AVP: Event-Threshold-Event-1I (1662) 3GPP (10415)
+type AVP_Integer32 AAA_3GPP_Event_Threshold_Event_1I
+
+// 7.3.174
+// AVP: Restoration-Priority (1663) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Restoration_Priority
+
+// 7.3.175
+// AVP: SGs-MME-Identity (1664) 3GPP (10415)
+type AVP_UTF8String AAA_3GPP_SGs_MME_Identity
+
+// 7.3.176
+// AVP: SIPTO-Local-Network-Permission (1665) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_SIPTO_Local_Network_Permission
+
+// 7.3.177
+// AVP: Coupled-Node-Diameter-ID (1666) 3GPP (10415)
+type AVP_DiameterIdentity AAA_3GPP_Coupled_Node_Diameter_ID
+
+// 7.3.181
+// AVP: WLAN-offloadability (1667) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_WLAN_offloadability
+
+// 7.3.182
+// AVP: WLAN-offloadability-EUTRAN (1668) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_WLAN_offloadability_EUTRAN
+
+// 7.3.183
+// AVP: WLAN-offloadability-UTRAN (1669) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_WLAN_offloadability_UTRAN
+
+// 7.3.184
+// AVP: Reset-ID (1670) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Reset_ID
+
+// 7.3.185
+// AVP: MDT-Allowed-PLMN-Id (1671) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_MDT_Allowed_PLMN_Id
+
+// 7.3.186
+// AVP: Adjacent-PLMNs (1672) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Adjacent_PLMNs
+
+// 7.3.187
+// AVP: Adjacent-Access-Restriction-Data (1673) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Adjacent_Access_Restriction_Data
+
+// 7.3.188
+// AVP: DL-Buffering-Suggested-Packet-Count (1674) 3GPP (10415)
+type AVP_Integer32 AAA_3GPP_DL_Buffering_Suggested_Packet_Count
+
+// 7.3.189
+// AVP: IMSI-Group-Id (1675) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_IMSI_Group_Id
+
+// 7.3.190
+// AVP: Group-Service-Id (1676) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Group_Service_Id
+
+// 7.3.191
+// AVP: Group-PLMN-Id (1677) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Group_PLMN_Id
+
+// 7.3.192
+// AVP: Local-Group-Id (1678) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_Local_Group_Id
+
+// 7.3.201
+// AVP: AIR-Flags (1679) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_AIR_Flags
+
+// 7.3.202
+// AVP: UE-Usage-Type (1680) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_UE_Usage_Type
+
+// 7.3.204
+// AVP: Non-IP-PDN-Type-Indicator (1681) 3GPP (10415)
+type enumerated AAA_3GPP_Non_IP_PDN_Type_Indicator {
+ FALSE_VALUE (0),
+ TRUE_VALUE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 7.3.205
+// AVP: Non-IP-Data-Delivery-Mechanism (1682) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Non_IP_Data_Delivery_Mechanism
+
+// 7.3.206
+// AVP: Additional-Context-ID (1683) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Additional_Context_ID
+
+// 7.3.207
+// AVP: SCEF-Realm (1684) 3GPP (10415)
+type AVP_DiameterIdentity AAA_3GPP_SCEF_Realm
+
+// 7.3.208
+// AVP: Subscription-Data-Deletion (1685) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Subscription_Data_Deletion
+
+// 7.3.209
+// AVP: Preferred-Data-Mode (1686) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Preferred_Data_Mode
+
+// 7.3.210
+// AVP: Emergency-Info (1687) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_Emergency_Info
+
+// 7.3.212
+// AVP: V2X-Subscription-Data (1688) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_V2X_Subscription_Data
+
+// 7.3.213
+// AVP: V2X-Permission (1689) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_V2X_Permission
+
+// 7.3.214
+// AVP: PDN-Connection-Continuity (1690) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_PDN_Connection_Continuity
+
+// 7.3.215
+// AVP: eDRX-Cycle-Length (1691) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_eDRX_Cycle_Length
+
+// 7.3.216
+// AVP: eDRX-Cycle-Length-Value (1692) 3GPP (10415)
+type AVP_OctetString AAA_3GPP_eDRX_Cycle_Length_Value
+
+// 7.3.217
+// AVP: UE-PC5-AMBR (1693) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_UE_PC5_AMBR
+
+// 7.3.219
+// AVP: MBSFN-Area (1694) 3GPP (10415)
+type AVP_Grouped AAA_3GPP_MBSFN_Area
+
+// 7.3.220
+// AVP: MBSFN-Area-ID (1695) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_MBSFN_Area_ID
+
+// 7.3.221
+// AVP: Carrier-Frequency (1696) 3GPP (10415)
+type AVP_Unsigned32 AAA_3GPP_Carrier_Frequency
+
+// 7.3.222
+// AVP: RDS-Indicator (1697) 3GPP (10415)
+type enumerated AAA_3GPP_RDS_Indicator {
+ DISABLED (0),
+ ENABLED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Gabor Szalai - initial implementation
+******************************************************************************/
+//
+// File: GxInterface_PCC_3GPP_TS29212_f10.ddf
+// Description: DDF for Gx Gxx and Sd according to 3GPP TS 29.212 V15.1.0
+// Rev: R55A
+// Prodnr: CNL 113 462
+///////////////////////////////////////////////
+
+
+// APPLICATION-NAME: PCC
+// APPLICATION-REVISION: Vf_1_0
+
+// AVP implementations according to:
+// 3GPP TS 29.212 V15.1.0 - Policy and Charging Control over Gx interface
+//
+//
+// Dependant applications
+// IETF RFC 3588 - Diameter Base Protocol
+// IETF RFC 4005 - Diameter Network Address Server
+// IETF RFC 4006 - Diameter Credit Control Application
+// 3GPP TS 29.061 - Interworking between the Public Land Mobile Network (PLMN) supporting packet based services and Packet Data Networks (PDN)
+// 3GPP TS 29.214 - Policy and Charging Control over Rx reference points
+// 3GPP TS 29.229 - Cx and Dx interfaces based on the Diameter protocol
+// 3GPP TS 29.272 - EPS; MME and SGSN related interfaces based on Diameter protocol
+// 3GPP2 X.S0057-O - (3GPP2-BSID AVP reused for Gx and Gxx interface)
+// 3GPP TS 32.299 - Telecommunication manegement; Charging management; Diameter charging applications
+//
+// Notes:
+// Present application is based on 3GPP TS 29.210 V6.7.0 but has its own vendor
+// specific Diameter application with application id for the Gx Application : 16777238
+// Application-ID for the Gxx Application is 16777266
+// Application-ID for the Sd Application is 16777303
+
+// 3GPP TS 29.212 V15.1.0
+// 5.6, 5b.6, 5c.6
+// WARNING: Enumeration item with code (258) exists in type Command_Code
+
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Bearer-Usage (1000) 3GPP (10415)
+// 5.3.1
+type enumerated PCC_3GPP_Bearer_Usage {
+ GENERAL (0),
+ IMS_SIGNALLING (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Install (1001) 3GPP (10415)
+// 5.3.2
+type AVP_Grouped PCC_3GPP_Charging_Rule_Install
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Remove (1002) 3GPP (10415)
+// 5.3.3
+type AVP_Grouped PCC_3GPP_Charging_Rule_Remove
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Definition (1003) 3GPP (10415)
+// 5.3.4
+type AVP_Grouped PCC_3GPP_Charging_Rule_Definition
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Base-Name (1004) 3GPP (10415)
+// 5.3.5
+type AVP_UTF8String PCC_3GPP_Charging_Rule_Base_Name
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Name (1005) 3GPP (10415)
+// 5.3.6
+type AVP_OctetString PCC_3GPP_Charging_Rule_Name
+
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Event-Trigger (1006) 3GPP (10415)
+// 5.3.7
+type enumerated PCC_3GPP_Event_Trigger {
+ SGSN_CHANGE (0),
+ QOS_CHANGE (1),
+ RAT_CHANGE (2),
+ TFT_CHANGE (3),
+ PLMN_CHANGE (4),
+ LOSS_OF_BEARER (5),
+ RECOVERY_OF_BEARER (6),
+ IP_CAN_CHANGE (7),
+ QOS_CHANGE_EXCEEDING_AUTHORIZATION (11),
+ RAI_CHANGE (12),
+ USER_LOCATION_CHANGE (13),
+ NO_EVENT_TRIGGERS (14),
+ OUT_OF_CREDIT (15),
+ REALLOCATION_OF_CREDIT (16),
+ REVALIDATION_TIMEOUT (17),
+ UE_IP_ADDRESS_ALLOCATE (18),
+ UE_IP_ADDRESS_RELEASE (19),
+ DEFAULT_EPS_BEARER_QOS_CHANGE (20),
+ AN_GW_CHANGE (21),
+ SUCCESSFUL_RESOURCE_ALLOCATION (22),
+ RESOURCE_MODIFICATION_REQUEST (23),
+ PGW_TRACE_CONTROL (24),
+ UE_TIME_ZONE_CHANGE (25),
+ TAI_CHANGE (26),
+ ECGI_CHANGE (27),
+ CHARGING_CORRELATION_EXCHANGE (28),
+ APN_AMBR_MODIFICATION_FAILURE (29),
+ USER_CSG_INFORMATION_CHANGE (30),
+ USAGE_REPORT (33),
+ DEFAULT_EPS_BEARER_QOS_MODIFICATION_FAILURE (34),
+ USER_CSG_HYBRID_SUBSCRIBED_INFORMATION_CHANGE (35),
+ USER_CSG_HYBRID_UNSUBSCRIBED_INFORMATION_CHANGE (36),
+ ROUTING_RULE_CHANGE (37),
+ APPLICATION_START (39),
+ APPLICATION_STOP (40),
+ CS_TO_PS_HANDOVER (42),
+ UE_LOCAL_IP_ADDRESS_CHANGE (43),
+ HENB_LOCAL_IP_ADDRESS_CHANGE (44),
+ ACCESS_NETWORK_INFO_REPORT (45),
+ CREDIT_MANAGEMENT_SESSION_FAILURE (46),
+ DEFAULT_QOS_CHANGE (47),
+ CHANGE_OF_UE_PRESENCE_IN_PRESENCE_REPORTING_AREA_REPORT (48),
+ ADDITION_OF_ACCESS (49),
+ REMOVAL_OF_ACCESS (50),
+ UNAVAILABLITY_OF_ACCESS (51),
+ AVAILABLITY_OF_ACCESS (52),
+ RESOURCE_RELEASE (53),
+ ENODEB_CHANGE (54),
+ THREEGPP_PS_DATA_OFF_CHANGE (55)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Metering-Method (1007) 3GPP (10415)
+// 5.3.8
+type enumerated PCC_3GPP_Metering_Method {
+ DURATION (0),
+ VOLUME (1),
+ DURATION_VOLUME (2),
+ EVENT (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Offline (1008) 3GPP (10415)
+// 5.3.9
+type enumerated PCC_3GPP_Offline {
+ DISABLE_OFFLINE (0),
+ ENABLE_OFFLINE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Online (1009) 3GPP (10415)
+// 5.3.10
+type enumerated PCC_3GPP_Online {
+ DISABLE_ONLINE (0),
+ ENABLE_ONLINE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Precedence (1010) 3GPP (10415)
+// 5.3.11
+type AVP_Unsigned32 PCC_3GPP_Precedence
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Reporting-Level (1011) 3GPP (10415)
+// 5.3.12
+type enumerated PCC_3GPP_Reporting_Level {
+ SERVICE_IDENTIFIER_LEVEL (0),
+ RATING_GROUP_LEVEL (1),
+ SPONSORED_CONNECTIVITY_LEVEL (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TFT-Filter (1012) 3GPP (10415)
+// 5.3.13
+type AVP_IPFilterRule PCC_3GPP_TFT_Filter
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TFT-Packet-Filter-Information (1013) 3GPP (10415)
+// 5.3.14
+type AVP_Grouped PCC_3GPP_TFT_Packet_Filter_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ToS-Traffic-Class (1014) 3GPP (10415)
+// 5.3.15
+type AVP_OctetString PCC_3GPP_ToS_Traffic_Class
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Information (1016) 3GPP (10415)
+// 5.3.16
+type AVP_Grouped PCC_3GPP_QoS_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Class-Identifier (1028) 3GPP (10415)
+// 5.3.17
+type AVP_Unsigned32 PCC_3GPP_QoS_Class_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Rule-Report (1018) 3GPP (10415)
+// 5.3.18
+type AVP_Grouped PCC_3GPP_Charging_Rule_Report
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PCC-Rule-Status (1019) 3GPP (10415)
+// 5.3.19
+type enumerated PCC_3GPP_PCC_Rule_Status {
+ ACTIVE (0),
+ INACTIVE (1),
+ TEMPORARILY_INACTIVE (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Bearer-Identifier (1020) 3GPP (10415)
+// 5.3.20
+type AVP_OctetString PCC_3GPP_Bearer_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Bearer-Operation (1021) 3GPP (10415)
+// 5.3.21
+type enumerated PCC_3GPP_Bearer_Operation {
+ TERMINATION (0),
+ ESTABLISHMENT (1),
+ MODIFICATION (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Access-Network-Charging-Identifier-Gx (1022) 3GPP (10415)
+// 5.3.22
+type AVP_Grouped PCC_3GPP_Access_Network_Charging_Identifier_Gx
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Bearer-Control-Mode (1023) 3GPP (10415)
+// 5.3.23
+type enumerated PCC_3GPP_Bearer_Control_Mode {
+ UE_ONLY (0),
+ RESERVED (1),
+ UE_NW (2),
+ SX_GX (3),
+ SX_ONLY (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Network-Request-Support (1024) 3GPP (10415)
+// 5.3.24
+type enumerated PCC_3GPP_Network_Request_Support {
+ NETWORK_REQUEST_NOT_SUPPORTED (0),
+ NETWORK_REQUEST_SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Guaranteed-Bitrate-DL (1025) 3GPP (10415)
+// 5.3.25
+type AVP_Unsigned32 PCC_3GPP_Guaranteed_Bitrate_DL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Guaranteed-Bitrate-UL (1026) 3GPP (10415)
+// 5.3.26
+type AVP_Unsigned32 PCC_3GPP_Guaranteed_Bitrate_UL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: IP-CAN-Type (1027) 3GPP (10415)
+// 5.3.27
+type enumerated PCC_3GPP_IP_CAN_Type {
+ threeGPP_GPRS (0),
+ DOCSIS (1),
+ xDSL (2),
+ WiMAX (3),
+ threeGPP2 (4),
+ threeGPP_EPS (5),
+ Non_threeGPP_EPS (6),
+ FBA (7)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Negotiation (1029) 3GPP (10415)
+// 5.3.28
+type enumerated PCC_3GPP_QoS_Negotiation {
+ NO_QoS_NEGOTIATION (0),
+ QoS_NEGOTIATION_SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Upgrade (1030) 3GPP (10415)
+// 5.3.29
+type enumerated PCC_3GPP_QoS_Upgrade {
+ QoS_UPGRADE_NOT_SUPPORTED (0),
+ QoS_UPGRADE_SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Event-Report-Indication (1033) 3GPP (10415)
+// 5.3.30
+type AVP_Grouped PCC_3GPP_Event_Report_Indication
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: RAT-Type (1032) 3GPP (10415)
+// 5.3.31
+type enumerated PCC_3GPP_RAT_Type {
+ WLAN (0),
+ VIRTUAL (1),
+ UTRAN (1000),
+ GERAN (1001),
+ GAN (1002),
+ HSPA_EVOLUTION (1003),
+ EUTRAN (1004),
+ EUTRAN_NB_IoT (1005),
+ CDMA2000_1X (2000),
+ HRPD (2001),
+ UMB (2002),
+ EHRPD (2003)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Allocation-Retention-Priority (1034) 3GPP (10415)
+// 5.3.32
+type AVP_Grouped PCC_3GPP_Allocation_Retention_Priority
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: CoA-IP-Address (1035) 3GPP (10415)
+// 5.3.33
+type AVP_Address PCC_3GPP_CoA_IP_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Tunnel-Header-Filter (1036) 3GPP (10415)
+// 5.3.34
+type AVP_IPFilterRule PCC_3GPP_Tunnel_Header_Filter
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Tunnel-Header-Length (1037) 3GPP (10415)
+// 5.3.35
+type AVP_Unsigned32 PCC_3GPP_Tunnel_Header_Length
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Tunnel-Information (1038) 3GPP (10415)
+// 5.3.36
+type AVP_Grouped PCC_3GPP_Tunnel_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: CoA-Information (1039) 3GPP (10415)
+// 5.3.37
+type AVP_Grouped PCC_3GPP_CoA_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Rule-Failure-Code (1031) 3GPP (10415)
+// 5.3.38
+type enumerated PCC_3GPP_Rule_Failure_Code {
+ UNKNOWN_RULE_NAME (1),
+ RATING_GROUP_ERROR (2),
+ SERVICE_IDENTIFIER_ERROR (3),
+ GW_PCEF_MALFUNCTION (4),
+ RESOURCES_LIMITATION (5),
+ MAX_NR_BEARERS_REACHED (6),
+ UNKNOWN_BEARER_ID (7),
+ MISSING_BEARER_ID (8),
+ MISSING_FLOW_DESCRIPTION (9),
+ RESOURCE_ALLOCATION_FAILURE (10),
+ UNSUCCESSFUL_QOS_VALIDATION (11),
+ INCORRECT_FLOW_INFORMATION (12),
+ PS_TO_CS_HANDOVER (13),
+ TDF_APPLICATION_IDENTIFIER_ERROR (14),
+ NO_BEARER_BOUND (15),
+ FILTER_RESTRICTIONS (16),
+ AN_GW_FAILED (17),
+ MISSING_REDIRECT_SERVER_ADDRESS (18),
+ CM_END_USER_SERVICE_DENIED (19),
+ CM_CREDIT_CONTROL_NOT_APPLICABLE (20),
+ CM_AUTHORIZATION_REJECTED (21),
+ CM_USER_UNKNOWN (22),
+ CM_RATING_FAILED (23),
+ ROUTING_RULE_REJECTION (24),
+ UNKNOWN_ROUTING_ACCESS_INFORMATION (25),
+ NO_NBIFOM_SUPPORT (26)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: APN-Aggregate-Max-Bitrate-DL (1040) 3GPP (10415)
+// 5.3.39
+type AVP_Unsigned32 PCC_3GPP_APN_Aggregate_Max_Bitrate_DL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: APN-Aggregate-Max-Bitrate-UL (1041) 3GPP (10415)
+// 5.3.40
+type AVP_Unsigned32 PCC_3GPP_APN_Aggregate_Max_Bitrate_UL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Revalidation-Time (1042) 3GPP (10415)
+// 5.3.41
+type AVP_Time PCC_3GPP_Revalidation_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Rule-Activation-Time (1043) 3GPP (10415)
+// 5.3.42
+type AVP_Time PCC_3GPP_Rule_Activation_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Rule-DeActivation-Time (1044) 3GPP (10415)
+// 5.3.43
+type AVP_Time PCC_3GPP_Rule_DeActivation_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Session-Release-Cause (1045) 3GPP (10415)
+// 5.3.44
+type enumerated PCC_3GPP_Session_Release_Cause {
+ UNSPECIFIED_REASON (0),
+ UE_SUBSCRIPTION_REASON (1),
+ INSUFFICIENT_SERVER_RESOURCES (2),
+ IP_CAN_SESSION_TERMINATION (3),
+ UE_IP_ADDRESS_RELEASE (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Priority-Level (1046) 3GPP (10415)
+// 5.3.45
+type AVP_Unsigned32 PCC_3GPP_Priority_Level
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Pre-emption-Capability (1047) 3GPP (10415)
+// 5.3.46
+type enumerated PCC_3GPP_Pre_emption_Capability {
+ PRE_EMPTION_CAPABILITY_ENABLED (0),
+ PRE_EMPTION_CAPABILITY_DISABLED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Pre-emption-Vulnerability (1048) 3GPP (10415)
+// 5.3.47
+type enumerated PCC_3GPP_Pre_emption_Vulnerability {
+ PRE_EMPTION_VULNERABILITY_ENABLED (0),
+ PRE_EMPTION_VULNERABILITY_DISABLED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Default-EPS-Bearer-QoS (1049) 3GPP (10415)
+// 5.3.48
+type AVP_Grouped PCC_3GPP_Default_EPS_Bearer_QoS
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: AN-GW-Address (1050) 3GPP (10415)
+// 5.3.49
+type AVP_Address PCC_3GPP_AN_GW_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Resource-Allocation-Notification (1063) 3GPP (10415)
+// 5.3.50
+type enumerated PCC_3GPP_Resource_Allocation_Notification {
+ ENABLE_NOTIFICATION (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Security-Parameter-Index (1056) 3GPP (10415)
+// 5.3.51
+type AVP_OctetString PCC_3GPP_Security_Parameter_Index
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Flow-Label (1057) 3GPP (10415)
+// 5.3.52
+type AVP_OctetString PCC_3GPP_Flow_Label
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Flow-Information (1058) 3GPP (10415)
+// 5.3.53
+type AVP_Grouped PCC_3GPP_Flow_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Packet-Filter-Content (1059) 3GPP (10415)
+// 5.3.54
+type AVP_IPFilterRule PCC_3GPP_Packet_Filter_Content
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Packet-Filter-Identifier (1060) 3GPP (10415)
+// 5.3.55
+type AVP_OctetString PCC_3GPP_Packet_Filter_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Packet-Filter-Information (1061) 3GPP (10415)
+// 5.3.56
+type AVP_Grouped PCC_3GPP_Packet_Filter_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Packet-Filter-Operation (1062) 3GPP (10415)
+// 5.3.57
+type enumerated PCC_3GPP_Packet_Filter_Operation {
+ DELETION (0),
+ ADDITION (1),
+ MODIFICATION (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PDN-Connection-ID (1065) 3GPP (10415)
+// 5.3.58
+type AVP_OctetString PCC_3GPP_PDN_Connection_ID
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Monitoring-Key (1066) 3GPP (10415)
+// 5.3.59
+type AVP_OctetString PCC_3GPP_Monitoring_Key
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Usage-Monitoring-Information (1067) 3GPP (10415)
+// 5.3.60
+type AVP_Grouped PCC_3GPP_Usage_Monitoring_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Usage-Monitoring-Level (1068) 3GPP (10415)
+// 5.3.61
+type enumerated PCC_3GPP_Usage_Monitoring_Level {
+ SESSION_LEVEL (0),
+ PCC_RULE_LEVEL (1),
+ ADC_RULE_LEVEL (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Usage-Monitoring-Report (1069) 3GPP (10415)
+// 5.3.62
+type enumerated PCC_3GPP_Usage_Monitoring_Report {
+ USAGE_MONITORING_REPORT_REQUIRED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Usage-Monitoring-Support (1070) 3GPP (10415)
+// 5.3.63
+type enumerated PCC_3GPP_Usage_Monitoring_Support {
+ USAGE_MONITORING_DISABLED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: CSG-Information-Reporting (1071) 3GPP (10415)
+// 5.3.64
+type enumerated PCC_3GPP_CSG_Information_Reporting {
+ CHANGE_CSG_CELL (0),
+ CHANGE_CSG_SUBSCRIBED_HYBRID_CELL (1),
+ CHANGE_CSG_UNSUBSCRIBED_HYBRID_CELL (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Flow-Direction (1080) 3GPP (10415)
+// 5.3.65
+type enumerated PCC_3GPP_Flow_Direction {
+ UNSPECIFIED (0),
+ DOWNLINK (1),
+ UPLINK (2),
+ BIDIRECTIONAL (3)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Packet-Filter-Usage (1072) 3GPP (10415)
+// 5.3.66
+type enumerated PCC_3GPP_Packet_Filter_Usage {
+ SEND_TO_UE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Charging-Correlation-Indicator (1073) 3GPP (10415)
+// 5.3.67
+type enumerated PCC_3GPP_Charging_Correlation_Indicator {
+ CHARGING_IDENTIFIER_REQUIRED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Install (1081) 3GPP (10415)
+// 5.3.68
+type AVP_Grouped PCC_3GPP_Routing_Rule_Install
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Remove (1075) 3GPP (10415)
+// 5.3.69
+type AVP_Grouped PCC_3GPP_Routing_Rule_Remove
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Definition (1076) 3GPP (10415)
+// 5.3.70
+type AVP_Grouped PCC_3GPP_Routing_Rule_Definition
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Identifier (1077) 3GPP (10415)
+// 5.3.71
+type AVP_OctetString PCC_3GPP_Routing_Rule_Identifier
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Filter (1078) 3GPP (10415)
+// 5.3.72
+type AVP_Grouped PCC_3GPP_Routing_Filter
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-IP-Address (1079) 3GPP (10415)
+// 5.3.73
+type AVP_Address PCC_3GPP_Routing_IP_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-Application-Identifier (1088) 3GPP (10415)
+// 5.3.77
+type AVP_OctetString PCC_3GPP_TDF_Application_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-Information (1087) 3GPP (10415)
+// 5.3.78
+type AVP_Grouped PCC_3GPP_TDF_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-Destination-Realm (1090) 3GPP (10415)
+// 5.3.79
+type AVP_DiameterIdentity PCC_3GPP_TDF_Destination_Realm
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-Destination-Host (1089) 3GPP (10415)
+// 5.3.80
+type AVP_DiameterIdentity PCC_3GPP_TDF_Destination_Host
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-IP-Address (1091) 3GPP (10415)
+// 5.3.81
+type AVP_Address PCC_3GPP_TDF_IP_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Redirect-Information (1085) 3GPP (10415)
+// 5.3.82
+type AVP_Grouped PCC_3GPP_Redirect_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Redirect-Support (1086) 3GPP (10415)
+// 5.3.83
+type enumerated PCC_3GPP_Redirect_Support {
+ REDIRECTION_DISABLED (0),
+ REDIRECTION_ENABLED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PS-to-CS-Session-Continuity (1099) 3GPP (10415)
+// 5.3.84
+type enumerated PCC_3GPP_PS_to_CS_Session_Continuity {
+ VIDEO_PS2CS_CONT_CANDIDATE (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Application-Detection-Information (1098) 3GPP (10415)
+// 5.3.91
+type AVP_Grouped PCC_3GPP_Application_Detection_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TDF-Application-Instance-Identifier (2802) 3GPP (10415)
+// 5.3.92
+type AVP_OctetString PCC_3GPP_TDF_Application_Instance_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: HeNB-Local-IP-Address (2804) 3GPP (10415)
+// 5.3.95
+type AVP_Address PCC_3GPP_HeNB_Local_IP_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: UE-Local-IP-Address (2805) 3GPP (10415)
+// 5.3.96
+type AVP_Address PCC_3GPP_UE_Local_IP_Address
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: UDP-Source-Port (2806) 3GPP (10415)
+// 5.3.97
+type AVP_Unsigned32 PCC_3GPP_UDP_Source_Port
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Mute-Notification (2809) 3GPP (10415)
+// 5.3.98
+type enumerated PCC_3GPP_Mute_Notification {
+ MUTE_REQUIRED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Monitoring-Time (2810) 3GPP (10415)
+// 5.3.99
+type AVP_Time PCC_3GPP_Monitoring_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: AN-GW-Status (2811) 3GPP (10415)
+// 5.3.100
+type enumerated PCC_3GPP_AN_GW_Status {
+ AN_GW_FAILED (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: User-Location-Info-Time (2812) 3GPP (10415)
+// 5.3.101
+type AVP_Time PCC_3GPP_User_Location_Info_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Credit-Management-Status (1082) 3GPP (10415)
+// 5.3.102
+type AVP_Unsigned32 PCC_3GPP_Credit_Management_Status
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Default-QoS-Information (2816) 3GPP (10415)
+// 5.3.103
+type AVP_Grouped PCC_3GPP_Default_QoS_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Default-QoS-Name (2817) 3GPP (10415)
+// 5.3.104
+type AVP_UTF8String PCC_3GPP_Default_QoS_Name
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Conditional-APN-Aggregate-Max-Bitrate (2818) 3GPP (10415)
+// 5.3.105
+type AVP_Grouped PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: RAN-NAS-Release-Cause (2819) 3GPP (10415)
+// 5.3.106
+type AVP_OctetString PCC_3GPP_RAN_NAS_Release_Cause
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Presence-Reporting-Area-Elements-List (2820) 3GPP (10415)
+// 5.3.107
+type AVP_OctetString PCC_3GPP_Presence_Reporting_Area_Elements_List
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Presence-Reporting-Area-Identifier (2821) 3GPP (10415)
+// 5.3.108
+type AVP_OctetString PCC_3GPP_Presence_Reporting_Area_Identifier
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Presence-Reporting-Area-Information (2822) 3GPP (10415)
+// 5.3.109
+type AVP_Grouped PCC_3GPP_Presence_Reporting_Area_Information
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Presence-Reporting-Area-Status (2823) 3GPP (10415)
+// 5.3.110
+type AVP_Unsigned32 PCC_3GPP_Presence_Reporting_Area_Status
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: NetLoc-Access-Support (2824) 3GPP (10415)
+// 5.3.111
+type AVP_Unsigned32 PCC_3GPP_NetLoc_Access_Support
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Fixed-User-Location-Info (2825) 3GPP (10415)
+// 5.3.112
+type AVP_Grouped PCC_3GPP_Fixed_User_Location_Info
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PCSCF-Restoration-Indication (2826) 3GPP (10415)
+// 5.3.113
+type AVP_Unsigned32 PCC_3GPP_PCSCF_Restoration_Indication
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: IP-CAN-Session-Charging-Scope (2827) 3GPP (10415)
+// 5.3.114
+type enumerated PCC_3GPP_IP_CAN_Session_Charging_Scope {
+ IP_CAN_SESSION_SCOPE (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Monitoring-Flags (2828) 3GPP (10415)
+// 5.3.115
+type AVP_Unsigned32 PCC_3GPP_Monitoring_Flags
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: NBIFOM-Support (2831) 3GPP (10415)
+// 5.3.116
+type enumerated PCC_3GPP_NBIFOM_Support {
+ NBIFOM_NOT_SUPPORTED (0),
+ NBIFOM_SUPPORTED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: NBIFOM-Mode (2830) 3GPP (10415)
+// 5.3.117
+type enumerated PCC_3GPP_NBIFOM_Mode {
+ UE_INITIATED (0),
+ NETWORK_INITIATED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Report (2835) 3GPP (10415)
+// 5.3.118
+type AVP_Grouped PCC_3GPP_Routing_Rule_Report
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Routing-Rule-Failure-Code (2834) 3GPP (10415)
+// 5.3.119
+type AVP_Unsigned32 PCC_3GPP_Routing_Rule_Failure_Code
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Default-Access (2829) 3GPP (10415)
+// 5.3.120
+type enumerated PCC_3GPP_Default_Access {
+ threeGPP_GPRS (0),
+ DOCSIS (1),
+ xDSL (2),
+ WiMAX (3),
+ threeGPP2 (4),
+ threeGPP_EPS (5),
+ Non_threeGPP_EPS (6),
+ FBA (7)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Access-Availability-Change-Reason (2833) 3GPP (10415)
+// 5.3.121
+type AVP_Unsigned32 PCC_3GPP_Access_Availability_Change_Reason
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: RAN-Rule-Support (2832) 3GPP (10415)
+// 5.3.122
+type AVP_Unsigned32 PCC_3GPP_RAN_Rule_Support
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Traffic-Steering-Policy-Identifier-DL (2836) 3GPP (10415)
+// 5.3.123
+type AVP_OctetString PCC_3GPP_Traffic_Steering_Policy_Identifier_DL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Traffic-Steering-Policy-Identifier-UL (2837) 3GPP (10415)
+// 5.3.124
+type AVP_OctetString PCC_3GPP_Traffic_Steering_Policy_Identifier_UL
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Resource-Release-Notification (2841) 3GPP (10415)
+// 5.3.125
+type enumerated PCC_3GPP_Resource_Release_Notification {
+ ENABLE_NOTIFICATION (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Removal-Of-Access (2842) 3GPP (10415)
+// 5.3.126
+type enumerated PCC_3GPP_Removal_Of_Access {
+ REMOVAL_OF_ACCESS (0)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Execution-Time (2839) 3GPP (10415)
+// 5.3.127
+type AVP_Time PCC_3GPP_Execution_Time
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Conditional-Policy-Information (2840) 3GPP (10415)
+// 5.3.128
+type AVP_Grouped PCC_3GPP_Conditional_Policy_Information
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: TCP-Source-Port (2843) 3GPP (10415)
+// 5.3.129
+type AVP_Unsigned32 PCC_3GPP_TCP_Source_Port
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PRA-Install (2845) 3GPP (10415)
+// 5.3.130
+type AVP_Grouped PCC_3GPP_PRA_Install
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: PRA-Remove (2846) 3GPP (10415)
+// 5.3.131
+type AVP_Grouped PCC_3GPP_PRA_Remove
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Default-Bearer-Indication (2844) 3GPP (10415)
+// 5.3.132
+type enumerated PCC_3GPP_Default_Bearer_Indication {
+ BIND_TO_DEF_BEARER (0),
+ BIND_TO_APPLICABLE_BEARER (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: 3GPP-PS-Data-Off-Status (2847) 3GPP (10415)
+// 5.3.133
+type enumerated PCC_3GPP_3GPP_PS_Data_Off_Status {
+ ACTIVE (0),
+ INACTIVE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Extended-APN-AMBR-DL (2848) 3GPP (10415)
+// 5.3.134
+type AVP_Unsigned32 PCC_3GPP_Extended_APN_AMBR_DL
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Extended-APN-AMBR-UL (2849) 3GPP (10415)
+// 5.3.135
+type AVP_Unsigned32 PCC_3GPP_Extended_APN_AMBR_UL
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Extended-GBR-DL (2850) 3GPP (10415)
+// 5.3.136
+type AVP_Unsigned32 PCC_3GPP_Extended_GBR_DL
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Extended-GBR-UL (2851) 3GPP (10415)
+// 5.3.137
+type AVP_Unsigned32 PCC_3GPP_Extended_GBR_UL
+
+
+// Gxx specific AVPs
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Install (1051) 3GPP (10415)
+// 5a.3.1
+type AVP_Grouped PCC_3GPP_QoS_Rule_Install
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Remove (1052) 3GPP (10415)
+// 5a.3.2
+type AVP_Grouped PCC_3GPP_QoS_Rule_Remove
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Definition (1053) 3GPP (10415)
+// 5a.3.3
+type AVP_Grouped PCC_3GPP_QoS_Rule_Definition
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Name (1054) 3GPP (10415)
+// 5a.3.4
+type AVP_OctetString PCC_3GPP_QoS_Rule_Name
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Report (1055) 3GPP (10415)
+// 5a.3.5
+type AVP_Grouped PCC_3GPP_QoS_Rule_Report
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: Session-Linking-Indicator (1064) 3GPP (10415)
+// 5a.3.6
+type enumerated PCC_3GPP_Session_Linking_Indicator {
+ SESSION_LINKING_IMMEDIATE (0),
+ SESSION_LINKING_DEFERRED (1),
+ SESSION_LINKING_INVALID (100)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: QoS-Rule-Base-Name (1074) 3GPP (10415)
+// 5a.3.7
+type AVP_UTF8String PCC_3GPP_QoS_Rule_Base_Name
+
+
+// Sd specific AVPs
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Install (1092) 3GPP (10415)
+// 5b.3.1
+type AVP_Grouped PCC_3GPP_ADC_Rule_Install
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Remove (1093) 3GPP (10415)
+// 5b.3.2
+type AVP_Grouped PCC_3GPP_ADC_Rule_Remove
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Definition (1094) 3GPP (10415)
+// 5b.3.3
+type AVP_Grouped PCC_3GPP_ADC_Rule_Definition
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Base-Name (1095) 3GPP (10415)
+// 5b.3.4
+type AVP_UTF8String PCC_3GPP_ADC_Rule_Base_Name
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Name (1096) 3GPP (10415)
+// 5b.3.5
+type AVP_OctetString PCC_3GPP_ADC_Rule_Name
+
+
+// 3GPP TS 29.212 V15.1.0
+// AVP: ADC-Rule-Report (1097) 3GPP (10415)
+// 5b.3.6
+type AVP_Grouped PCC_3GPP_ADC_Rule_Report
+
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Timea Moder
+******************************************************************************/
+//
+// File: S6Interfaces_3GPP_TS29336_f00.ddf
+// Description: DDF for S6m, S6n and S6t Interfaces according to 3GPP TS 29.336 V15.0.0
+// Rev: R55A
+// Prodnr: CNL 113 462
+
+
+// APPLICATION-NAME: S6
+// APPLICATION-REVISION: V15_0_0
+
+// AVP implementations according to:
+// 3GPP TS 29.336 V15.0.0 - Home Subscriber Server (HSS) diameter interfaces for interworking with packet data networks and applications
+
+// 8.2.2
+
+
+//S6m/S6n specific Diameter AVPs
+
+// 6.4.14
+// AVP: IP-SM-GW-Number (3100) 3GPP (10415)
+type AVP_OctetString S6_3GPP_IP_SM_GW_Number
+
+// 6.4.15
+// AVP: IP-SM-GW-Name (3101) 3GPP (10415)
+type AVP_DiameterIdentity S6_3GPP_IP_SM_GW_Name
+
+// 6.4.2
+// AVP: User-Identifier (3102) 3GPP (10415)
+type AVP_Grouped S6_3GPP_User_Identifier
+
+// 6.4.3
+// AVP: Service-ID (3103) 3GPP (10415)
+type enumerated S6_3GPP_Service_ID {
+ DEVICE_TRIGGER (0),
+ SMS_MO (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 6.4.4
+// AVP: SCS-Identity (3104) 3GPP (10415)
+type AVP_OctetString S6_3GPP_SCS_Identity
+
+// 6.4.5
+// AVP: Service-Parameters (3105) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Service_Parameters
+
+// 6.4.6
+// AVP: T4-Parameters (3106) 3GPP (10415)
+type AVP_Grouped S6_3GPP_T4_Parameters
+
+// 6.4.7
+// AVP: Service-Data (3107) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Service_Data
+
+// 6.4.8
+// AVP: T4-Data (3108) 3GPP (10415)
+type AVP_Grouped S6_3GPP_T4_Data
+
+// 6.4.9
+// AVP: HSS-Cause (3109) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_HSS_Cause
+
+// 6.4.10
+// AVP: SIR-Flags (3110) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_SIR_Flags
+
+// 6.4.11
+// AVP: External-Identifier (3111) 3GPP (10415)
+type AVP_UTF8String S6_3GPP_External_Identifier
+
+// 6.4.18
+// AVP: IP-SM-GW-Realm (3112) 3GPP (10415)
+type AVP_DiameterIdentity S6_3GPP_IP_SM_GW_Realm
+
+
+
+//S6t specific Diameter AVPs
+
+// 8.4.25
+// AVP: AESE-Communication-Pattern (3113) 3GPP (10415)
+type AVP_Grouped S6_3GPP_AESE_Communication_Pattern
+
+// 8.4.26
+// AVP: Communication-Pattern-Set (3114) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Communication_Pattern_Set
+
+// 8.4.27
+// AVP: Periodic-Communication-Indicator (3115) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Periodic_Communication_Indicator
+
+// 8.4.28
+// AVP: Communication-Duration-Time (3116) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Communication_Duration_Time
+
+// 8.4.29
+// AVP: Periodic-Time (3117) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Periodic_Time
+
+// 8.4.30
+// AVP: Scheduled-Communication-Time (3118) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Scheduled_Communication_Time
+
+// 8.4.31
+// AVP: Stationary-Indication (3119) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Stationary_Indication
+
+// 8.4.32
+// AVP: AESE-Communication-Pattern-Config-Status (3120) 3GPP (10415)
+type AVP_Grouped S6_3GPP_AESE_Communication_Pattern_Config_Status
+
+// 8.4.33
+// AVP: AESE-Error-Report (3121) 3GPP (10415)
+type AVP_Grouped S6_3GPP_AESE_Error_Report
+
+// 8.4.2
+// AVP: Monitoring-Event-Configuration (3122) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Monitoring_Event_Configuration
+
+// 8.4.3
+// AVP: Monitoring-Event-Report (3123) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Monitoring_Event_Report
+
+// 8.4.4
+// AVP: SCEF-Reference-ID (3124) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_SCEF_Reference_ID
+
+// 8.4.5
+// AVP: SCEF-ID (3125) 3GPP (10415)
+type AVP_DiameterIdentity S6_3GPP_SCEF_ID
+
+// 8.4.6
+// AVP: SCEF-Reference-ID-for-Deletion (3126) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_SCEF_Reference_ID_for_Deletion
+
+// 8.4.7
+// AVP: Monitoring-Type (3127) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Monitoring_Type
+
+// 8.4.8
+// AVP: Maximum-Number-of-Reports (3128) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Maximum_Number_of_Reports
+
+// 8.4.9
+// AVP: UE-Reachability-Configuration (3129) 3GPP (10415)
+type AVP_Grouped S6_3GPP_UE_Reachability_Configuration
+
+// 8.4.10
+// AVP: Monitoring-Duration (3130) 3GPP (10415)
+type AVP_Time S6_3GPP_Monitoring_Duration
+
+// 8.4.11
+// AVP: Maximum-Detection-Time (3131) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Maximum_Detection_Time
+
+// 8.4.12
+// AVP: Reachability-Type (3132) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Reachability_Type
+
+// 8.4.13
+// AVP: Maximum-Latency (3133) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Maximum_Latency
+
+// 8.4.14
+// AVP: Maximum-Response-Time (3134) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Maximum_Response_Time
+
+// 8.4.15
+// AVP: Location-Information-Configuration (3135) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Location_Information_Configuration
+
+// 8.4.16
+// AVP: MONTE-Location-Type (3136) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_MONTE_Location_Type
+
+// 8.4.17
+// AVP: Accuracy (3137) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Accuracy
+
+// 8.4.18
+// AVP: Association-Type (3138) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Association_Type
+
+// 8.4.19
+// AVP: Roaming-Information (3139) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Roaming_Information
+
+// 8.4.20
+// AVP: Reachability-Information (3140) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Reachability_Information
+
+// 8.4.22
+// AVP: IMEI-Change (3141) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_IMEI_Change
+
+// 8.4.24
+// AVP: Monitoring-Event-Config-Status (3142) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Monitoring_Event_Config_Status
+
+// 8.4.40
+// AVP: Supported-Services (3143) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Supported_Services
+
+// 8.4.41
+// AVP: Supported-Monitoring-Events (3144) 3GPP (10415)
+type AVP_Unsigned64 S6_3GPP_Supported_Monitoring_Events
+
+// 8.4.39
+// AVP: CIR-Flags (3145) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_CIR_Flags
+
+// 8.4.37
+// AVP: Service-Result (3146) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Service_Result
+
+// 8.4.38
+// AVP: Service-Result-Code (3147) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Service_Result_Code
+
+// 8.4.42
+// AVP: Reference-ID-Validity-Time (3148) 3GPP (10415)
+type AVP_Time S6_3GPP_Reference_ID_Validity_Time
+
+// 8.4.43
+// AVP: Event-Handling (3149) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Event_Handling
+
+// 8.4.44
+// AVP: NIDD-Authorization-Request (3150) 3GPP (10415)
+type AVP_Grouped S6_3GPP_NIDD_Authorization_Request
+
+// 8.4.45
+// AVP: NIDD-Authorization-Response (3151) 3GPP (10415)
+type AVP_Grouped S6_3GPP_NIDD_Authorization_Response
+
+// 8.4.47
+// AVP: Service-Report (3152) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Service_Report
+
+// 8.4.48
+// AVP: Node-Type (3153) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Node_Type
+
+// 8.4.50
+// AVP: S6t-HSS-Cause (3154) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_S6t_HSS_Cause
+
+// 8.4.51
+// AVP: Enhanced-Coverage-Restriction (3155) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Enhanced_Coverage_Restriction
+
+// 8.4.52
+// AVP: Enhanced-Coverage-Restriction-Data (3156) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Enhanced_Coverage_Restriction_Data
+
+// 8.4.53
+// AVP: Restricted-PLMN-List (3157) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Restricted_PLMN_List
+
+// 8.4.54
+// AVP: Allowed-PLMN-List (3158) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Allowed_PLMN_List
+
+// 8.4.55
+// AVP: Requested-Validity-Time (3159) 3GPP (10415)
+type AVP_Time S6_3GPP_Requested_Validity_Time
+
+// 8.4.56
+// AVP: Granted-Validity-Time (3160) 3GPP (10415)
+type AVP_Time S6_3GPP_Granted_Validity_Time
+
+// 8.4.57
+// AVP: NIDD-Authorization-Update (3161) 3GPP (10415)
+type AVP_Grouped S6_3GPP_NIDD_Authorization_Update
+
+// 8.4.58
+// AVP: Loss-Of-Connectivity-Reason (3162) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Loss_Of_Connectivity_Reason
+
+// 8.4.59
+// AVP: Group-Reporting-Guard-Timer (3163) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Group_Reporting_Guard_Timer
+
+// 8.4.60
+// AVP: CIA-Flags (3164) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_CIA_Flags
+
+// 8.4.61
+// AVP: Group-Monitoring-Event-Report (3165) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Group_Monitoring_Event_Report
+
+// 8.4.62
+// AVP: Group-Monitoring-Event-Report-Item (3166) 3GPP (10415)
+type AVP_Grouped S6_3GPP_Group_Monitoring_Event_Report_Item
+
+// 8.4.63
+// AVP: RIR-Flags (3167) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_RIR_Flags
+
+// 8.4.64
+// AVP: Type-Of-External-Identifier (3168) 3GPP (10415)
+type AVP_Unsigned32 S6_3GPP_Type_Of_External_Identifier
+
+// 8.4.65
+// AVP: APN-Validity-Time (3169) 3GPP (10415)
+type AVP_Grouped S6_3GPP_APN_Validity_Time
+
+
+
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Roland Gecse - initial implementation and initial documentation
+* Akos Pernek
+* Antal Wuh.Hen.Chang
+* Attila Fulop
+* Balazs Barcsik
+* Bence Molnar
+* Csaba Koppany
+* David Juhasz
+* Eduard Czimbalmos
+* Elemer Lelik
+* Endre Kiss
+* Endre Kulcsar
+* Gabor Szalai
+* Gabor Tatarka
+* Gergely Futo
+* Istvan Sandor
+* Krisztian Pandi
+* Kulcsr Endre
+* Laszlo Tamas Zeke
+* Norbert Pinter
+* Roland Gecse
+* Tibor Bende
+* Tibor Szabo
+* Timea Moder
+* Zoltan Medve
+* Zsolt Nandor Torok
+* Zsolt Szalai
+******************************************************************************/
+//
+// File: MobileIPv6_HA_IETF_RFC5778.ddf
+// Description: DDF for Mobile IPv6 according to RFC 5778
+// Rev: R55A
+// Prodnr: CNL113462
+///////////////////////////////////////////////
+
+// APPLICATION-NAME: MIPv6
+// APPLICATION-REVISION: RFC5778
+
+// RFC 5778 6.2
+// AVP: Service-Selection (493)
+type AVP_UTF8String MIPv6_NONE_Service_Selection
+
+// RFC 5778 6.3
+// AVP: MIP-MN-AAA-SPI (341)
+type AVP_Unsigned32 MIPv6_NONE_MIP_MN_AAA_SPI
+
+// RFC 5778 6.4
+// AVP: MIP-MN-HA-SPI (491)
+type AVP_Unsigned32 MIPv6_NONE_MIP_MN_HA_SPI
+
+// RFC 5778 6.5
+// AVP: MIP-Mobile-Node-Address (333)
+type AVP_Address MIPv6_NONE_MIP_Mobile_Node_Address
+
+// RFC 5778 6.7
+// AVP: MIP-Careof-Address (487)
+type AVP_Address MIPv6_NONE_MIP_Careof_Address
+
+// RFC 5778 6.8
+// AVP: MIP-Authenticator (488)
+type AVP_OctetString MIPv6_NONE_MIP_Authenticator
+
+// RFC 5778 6.9
+// AVP: MIP-MAC-Mobility-Data (489)
+type AVP_OctetString MIPv6_NONE_MIP_MAC_Mobility_Data
+
+// RFC 5778 6.10
+// AVP: MIP-Session-Key (343)
+type AVP_OctetString MIPv6_NONE_MIP_Session_Key
+
+// RFC 5778 6.11
+// AVP: MIP-MSA-Lifetime (367)
+type AVP_Unsigned32 MIPv6_NONE_MIP_MSA_Lifetime
+
+// RFC 5778 6.12
+// AVP: MIP-MN-HA-MSA (492)
+type AVP_Grouped MIPv6_NONE_MIP_MN_HA_MSA
+
+// RFC 5778 6.13
+// AVP: MIP-Algorithm-Type (345)
+type AVP_Unsigned32 MIPv6_NONE_MIP_Algorithm_Type
+
+// RFC 5778 6.14
+// AVP: MIP-Replay-Mode (346)
+type enumerated MIPv6_NONE_MIP_Replay_Mode {
+ None (1),
+ Timestamp (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// RFC 5778 6.16
+// AVP: MIP-Timestamp (490)
+type AVP_OctetString MIPv6_NONE_MIP_Timestamp
+
+// RFC 5778 6.17
+// AVP: QoS-Capability (578)
+type AVP_Grouped MIPv6_NONE_QoS_Capability
+
+// RFC 5778 6.18
+// AVP: QoS-Resources (508)
+type AVP_Grouped MIPv6_NONE_QoS_Resources
+
+// RFC 5778 6.19
+// AVP: Chargable-User-Identity (89)
+type AVP_OctetString MIPv6_NONE_Chargable_User_Identity
+
+// RFC 5778 6.20
+// AVP: MIP6-Auth-Mode (494)
+type AVP_Unsigned32 MIPv6_NONE_MIP6_Auth_Mode
+/******************************************************************************
+* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Gabor Szalai - initial implementation
+******************************************************************************/
+//
+// File: RxInterface_PCC_3GPP_TS29214_f20.ddf
+// Description: DDF for Rx according to 3GPP TS 29.214 15.2.0
+// Rev: R55A
+// Prodnr: CNL 113 462
+///////////////////////////////////////////////
+
+
+// APPLICATION-NAME: RX
+// APPLICATION-REVISION: VF_2_0
+
+// AVP implementations according to:
+// 3GPP TS 29.214 15.2.0 - Policy and Charging Control over Rx reference point
+//
+//
+// Dependant applications
+// 3GPP TS 29.229 - Cx and Dx interfaces based on the Diameter protocol
+// TS 183.017 - DIAMETER protocol for session based policy set-up information exchange between
+// the Application Function (AF) and the Service Policy Decision Function (SPDF)
+// IETF RFC 3588 - Diameter Base Protocol
+// IETF RFC 4005 - Diameter Network Address Server
+// IETF RFC 4006 - Diameter Credit Control Application
+//
+// Notes:
+// Present application has its own vendor specific Diameter application id: 16777236
+//
+// Type of enumerated AVP Media-Type is changed to AVP_Unsigned32 to
+// give the ability to contain OTHER (0xFFFFFFFF) value
+//
+
+// 3GPP TS 29.214 15.2.0 5.6
+// WARNING: Enumeration item with code (258) exists in type Command_Code
+// WARNING: Enumeration item with code (275) exists in type Command_Code
+// WARNING: Enumeration item with code (274) exists in type Command_Code
+
+
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Abort-Cause (500) 3GPP (10415)
+// 5.3.1
+type enumerated RX_3GPP_Abort_Cause {
+ BEARER_RELEASED (0),
+ INSUFFICIENT_SERVER_RESOURCES (1),
+ INSUFFICIENT_BEARER_RESOURCES (2),
+ PS_TO_CS_HANDOVER (3),
+ SPONSORED_DATA_CONNECTIVITY_DISALLOWED (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Access-Network-Charging-Address (501) 3GPP (10415)
+// 5.3.2
+type AVP_Address RX_3GPP_Access_Network_Charging_Address
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Access-Network-Charging-Identifier (502) 3GPP (10415)
+// 5.3.3
+type AVP_Grouped RX_3GPP_Access_Network_Charging_Identifier
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Access-Network-Charging-Identifier-Value (503) 3GPP (10415)
+// 5.3.4
+type AVP_OctetString RX_3GPP_Access_Network_Charging_Identifier_Value
+
+
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: AF-Application-Identifier (504) 3GPP (10415)
+// 5.3.5
+type AVP_OctetString RX_3GPP_AF_Application_Identifier
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: AF-Charging-Identifier (505) 3GPP (10415)
+// 5.3.6
+type AVP_OctetString RX_3GPP_AF_Charging_Identifier
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Codec-Data (524) 3GPP (10415)
+// 5.3.7
+type AVP_OctetString RX_3GPP_Codec_Data
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Flow-Description (507) 3GPP (10415)
+// 5.3.8
+type AVP_IPFilterRule RX_3GPP_Flow_Description
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Flow-Number (509) 3GPP (10415)
+// 5.3.9
+type AVP_Unsigned32 RX_3GPP_Flow_Number
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Flows (510) 3GPP (10415)
+// 5.3.10
+type AVP_Grouped RX_3GPP_Flows
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Flow-Status (511) 3GPP (10415)
+// 5.3.11
+type enumerated RX_3GPP_Flow_Status {
+ ENABLED_UPLINK (0),
+ ENABLED_DOWNLINK (1),
+ ENABLED (2),
+ DISABLED (3),
+ REMOVED (4)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Flow-Usage (512) 3GPP (10415)
+// 5.3.12
+type enumerated RX_3GPP_Flow_Usage {
+ NO_INFORMATION (0),
+ RTCP (1),
+ AF_SIGNALLING (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Specific-Action (513) 3GPP (10415)
+// 5.3.13
+type enumerated RX_3GPP_Specific_Action {
+ CHARGING_CORRELATION_EXCHANGE (1),
+ INDICATION_OF_LOSS_OF_BEARER (2),
+ INDICATION_OF_RECOVERY_OF_BEARER (3),
+ INDICATION_OF_RELEASE_OF_BEARER (4),
+ INDICATION_OF_ESTABLISHMENT_OF_BEARER (5),
+ IP_CAN_CHANGE (6),
+ INDICATION_OF_OUT_OF_CREDIT (7),
+ INDICATION_OF_SUCCESSFUL_RESOURCES_ALLOCATION (8),
+ INDICATION_OF_FAILED_RESOURCES_ALLOCATION (9),
+ INDICATION_OF_LIMITED_PCC_DEPLOYMENT (10),
+ USAGE_REPORT (11),
+ ACCESS_NETWORK_INFO_REPORT (12),
+ INDICATION_OF_RECOVERY_FROM_LIMITED_PCC_DEPLOYMENT (13),
+ INDICATION_OF_ACCESS_NETWORK_INFO_REPORTING_FAILURE (14),
+ INDICATION_OF_TRANSFER_POLICY_EXPIRED (15),
+ PLMN_CHANGE (16)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Max-Requested-Bandwidth-DL (515) 3GPP (10415)
+// 5.3.14
+type AVP_Unsigned32 RX_3GPP_Max_Requested_Bandwidth_DL
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Max-Requested-Bandwidth-UL (516) 3GPP (10415)
+// 5.3.15
+type AVP_Unsigned32 RX_3GPP_Max_Requested_Bandwidth_UL
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Media-Component-Description (517) 3GPP (10415)
+// 5.3.16
+type AVP_Grouped RX_3GPP_Media_Component_Description
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Media-Component-Number (518) 3GPP (10415)
+// 5.3.17
+type AVP_Unsigned32 RX_3GPP_Media_Component_Number
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Media-Sub-Component (519) 3GPP (10415)
+// 5.3.18
+type AVP_Grouped RX_3GPP_Media_Sub_Component
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Media-Type (520) 3GPP (10415)
+// 5.3.19
+type AVP_Unsigned32 RX_3GPP_Media_Type
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: RR-Bandwidth (521) 3GPP (10415)
+// 5.3.20
+type AVP_Unsigned32 RX_3GPP_RR_Bandwidth
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: RS-Bandwidth (522) 3GPP (10415)
+// 5.3.21
+type AVP_Unsigned32 RX_3GPP_RS_Bandwidth
+
+// 3GPP TS 29.214 15.2.0
+// AVP: SIP-Forking-Indication (523) 3GPP (10415)
+// 5.3.22
+type enumerated RX_3GPP_SIP_Forking_Indication {
+ SINGLE_DIALOGUE (0),
+ SEVERAL_DIALOGUES (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Service-URN (525) 3GPP (10415)
+// 5.3.23
+type AVP_OctetString RX_3GPP_Service_URN
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Acceptable-Service-Info (526) 3GPP (10415)
+// 5.3.24
+type AVP_Grouped RX_3GPP_Acceptable_Service_Info
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Service-Info-Status (527) 3GPP (10415)
+// 5.3.25
+type enumerated RX_3GPP_Service_Info_Status {
+ FINAL_SERVICE_INFORMATION (0),
+ PRELIMINARY_SERVICE_INFORMATION (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: AF-Signalling-Protocol (529) 3GPP (10415)
+// 5.3.26
+type enumerated RX_3GPP_AF_Signalling_Protocol {
+ NO_INFORMATION (0),
+ SIP (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Sponsored-Connectivity-Data (530) 3GPP (10415)
+// 5.3.27
+type AVP_Grouped RX_3GPP_Sponsored_Connectivity_Data
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Sponsor-Identity (531) 3GPP (10415)
+// 5.3.28
+type AVP_UTF8String RX_3GPP_Sponsor_Identity
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Application-Service-Provider-Identity (532) 3GPP (10415)
+// 5.3.29
+type AVP_UTF8String RX_3GPP_Application_Service_Provider_Identity
+
+
+// 3GPP TS 29.214 15.2.0
+// AVP: MPS-Identifier (528) 3GPP (10415)
+// 5.3.30
+type AVP_OctetString RX_3GPP_MPS_Identifier
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Rx-Request-Type (533) 3GPP (10415)
+// 5.3.31
+type enumerated RX_3GPP_Rx_Request_Type {
+ INITIAL_REQUEST (0),
+ UPDATE_REQUEST (1),
+ PCSCF_RESTORATION (2)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Min-Requested-Bandwidth-DL (534) 3GPP (10415)
+// 5.3.32
+type AVP_Unsigned32 RX_3GPP_Min_Requested_Bandwidth_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Min-Requested-Bandwidth-UL (535) 3GPP (10415)
+// 5.3.33
+type AVP_Unsigned32 RX_3GPP_Min_Requested_Bandwidth_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Required-Access-Info (536) 3GPP (10415)
+// 5.3.34
+type enumerated RX_3GPP_Required_Access_Info {
+ USER_LOCATION (0),
+ MS_TIME_ZONE (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Ip-Domain-Id (537) 3GPP (10415)
+// 5.3.35
+type AVP_OctetString RX_3GPP_Ip_Domain_Id
+
+// 3GPP TS 29.214 15.2.0
+// AVP: GCS-Identifier (538) 3GPP (10415)
+// 5.3.36
+type AVP_OctetString RX_3GPP_GCS_Identifier
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Sharing-Key-DL (539) 3GPP (10415)
+// 5.3.37
+type AVP_Unsigned32 RX_3GPP_Sharing_Key_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Sharing-Key-UL (540) 3GPP (10415)
+// 5.3.38
+type AVP_Unsigned32 RX_3GPP_Sharing_Key_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Retry-Interval (541) 3GPP (10415)
+// 5.3.39
+type AVP_Unsigned32 RX_3GPP_Retry_Interval
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Sponsoring-Action (542) 3GPP (10415)
+// 5.3.40
+type enumerated RX_3GPP_Sponsoring_Action {
+ DISABLE_SPONSORING (0),
+ ENABLE_SPONSORING (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Max-Supported-Bandwidth-DL (543) 3GPP (10415)
+// 5.3.41
+type AVP_Unsigned32 RX_3GPP_Max_Supported_Bandwidth_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Max-Supported-Bandwidth-UL (544) 3GPP (10415)
+// 5.3.42
+type AVP_Unsigned32 RX_3GPP_Max_Supported_Bandwidth_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Min-Desired-Bandwidth-DL (545) 3GPP (10415)
+// 5.3.43
+type AVP_Unsigned32 RX_3GPP_Min_Desired_Bandwidth_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Min-Desired-Bandwidth-UL (546) 3GPP (10415)
+// 5.3.44
+type AVP_Unsigned32 RX_3GPP_Min_Desired_Bandwidth_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: MCPTT-Identifier (547) 3GPP (10415)
+// 5.3.45
+type AVP_OctetString RX_3GPP_MCPTT_Identifier
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Service-Authorization-Info (548) 3GPP (10415)
+// 5.3.46
+type AVP_Unsigned32 RX_3GPP_Service_Authorization_Info
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Priority-Sharing-Indicator (550) 3GPP (10415)
+// 5.3.47
+type enumerated RX_3GPP_Priority_Sharing_Indicator {
+ PRIORITY_SHARING_ENABLED (0),
+ PRIORITY_SHARING_DISABLED (1)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Media-Component-Status (549) 3GPP (10415)
+// 5.3.49
+type AVP_Unsigned32 RX_3GPP_Media_Component_Status
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Content-Version (552) 3GPP (10415)
+// 5.3.49
+type AVP_Unsigned64 RX_3GPP_Content_Version
+
+// 3GPP TS 29.214 15.2.0
+// AVP: AF-Requested-Data (551) 3GPP (10415)
+// 5.3.50
+type AVP_Unsigned32 RX_3GPP_AF_Requested_Data
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Pre-emption-Control-Info (553) 3GPP (10415)
+// 5.3.51
+type AVP_Unsigned32 RX_3GPP_Pre_emption_Control_Info
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Max-Requested-BW-DL (554) 3GPP (10415)
+// 5.3.52
+type AVP_Unsigned32 RX_3GPP_Extended_Max_Requested_BW_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Max-Requested-BW-UL (555) 3GPP (10415)
+// 5.3.53
+type AVP_Unsigned32 RX_3GPP_Extended_Max_Requested_BW_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Max-Supported-BW-DL (556) 3GPP (10415)
+// 5.3.54
+type AVP_Unsigned32 RX_3GPP_Extended_Max_Supported_BW_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Max-Supported-BW-UL (557) 3GPP (10415)
+// 5.3.55
+type AVP_Unsigned32 RX_3GPP_Extended_Max_Supported_BW_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Min-Desired-BW-DL (558) 3GPP (10415)
+// 5.3.56
+type AVP_Unsigned32 RX_3GPP_Extended_Min_Desired_BW_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Min-Desired-BW-UL (559) 3GPP (10415)
+// 5.3.57
+type AVP_Unsigned32 RX_3GPP_Extended_Min_Desired_BW_UL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Min-Requested-BW-DL (560) 3GPP (10415)
+// 5.3.58
+type AVP_Unsigned32 RX_3GPP_Extended_Min_Requested_BW_DL
+
+// 3GPP TS 29.214 15.2.0
+// AVP: Extended-Min-Requested-BW-UL (561) 3GPP (10415)
+// 5.3.59
+type AVP_Unsigned32 RX_3GPP_Extended_Min_Requested_BW_UL
+
+
+// STATISTICS: 523 AVP descriptors found
+// STATISTICS: 523 AVP type definitions matching AVP descriptors found
+// STATISTICS: duplicate AVP definitions deleted
+type enumerated Command_Code {
+ Abort_Session (274), Accounting (271), Capabilities_Exchange (257), Device_Watchdog (280), Disconnect_Peer (282), Re_Auth (258), Session_Termination (275), Experimental1 (16777214), Experimental2 (16777215) , Update_Location (316), Cancel_Location (317), Authentication_Information (318), Insert_Subscriber_Data (319), Delete_Subscriber_Data (320), Purge_UE (321), Reset (322), Notify (323), ME_Identity_Check (324), Update_VCSG_Location (8388638), Cancel_VCSG_Location (8388642), Credit_Control (272), TDF_Session (8388637), Subscriber_Information (8388641), Configuration_Information (8388718), Reporting_Information (8388719), NIDD_Information (8388726), Authorize_Authenticate (265)
+} with {
+ variant "FIELDLENGTH(24)"
+ variant "BYTEORDER(last)"
+}
+
+type enumerated Vendor_Id {
+ vendor_id_NONE (0),
+ vendor_id_3GPP (10415)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+type enumerated AVP_Code_NONE {
+ avp_code_MIPv6_NONE_MIP_Careof_Address (487),
+ avp_code_BASE_NONE_Session_Id (263),
+ avp_code_BASE_NONE_Auth_Application_Id (258),
+ avp_code_BASE_NONE_Firmware_Revision (267),
+ avp_code_BASE_NONE_Auth_Grace_Period (276),
+ avp_code_BASE_NONE_Re_Auth_Request_Type (285),
+ avp_code_MIPv6_NONE_MIP_MN_HA_MSA (492),
+ avp_code_MIPv6_NONE_QoS_Resources (508),
+ avp_code_MIPv6_NONE_MIP_Session_Key (343),
+ avp_code_BASE_NONE_Multi_Round_Time_Out (272),
+ avp_code_BASE_NONE_Experimental_Result_Code (298),
+ avp_code_BASE_NONE_Error_Message (281),
+ avp_code_BASE_NONE_Error_Reporting_Host (294),
+ avp_code_BASE_NONE_Proxy_State (33),
+ avp_code_BASE_NONE_Redirect_Max_Cache_Time (262),
+ avp_code_BASE_NONE_Host_IP_Address (257),
+ avp_code_BASE_NONE_Vendor_Id (266),
+ avp_code_BASE_NONE_Event_Timestamp (55),
+ avp_code_MIPv6_NONE_MIP_MN_HA_SPI (491),
+ avp_code_MIPv6_NONE_MIP_Mobile_Node_Address (333),
+ avp_code_BASE_NONE_Failed_AVP (279),
+ avp_code_BASE_NONE_Session_Server_Failover (271),
+ avp_code_BASE_NONE_Experimental_Result (297),
+ avp_code_MIPv6_NONE_MIP_Replay_Mode (346),
+ avp_code_BASE_NONE_Proxy_Host (280),
+ avp_code_BASE_NONE_Proxy_Info (284),
+ avp_code_BASE_NONE_Destination_Host (293),
+ avp_code_BASE_NONE_Accounting_Record_Number (485),
+ avp_code_BASE_NONE_Redirect_Host_Usage (261),
+ avp_code_MIPv6_NONE_MIP6_Auth_Mode (494),
+ avp_code_BASE_NONE_Session_Timeout (27),
+ avp_code_MIPv6_NONE_MIP_MAC_Mobility_Data (489),
+ avp_code_BASE_NONE_Supported_Vendor_Id (265),
+ avp_code_BASE_NONE_Auth_Request_Type (274),
+ avp_code_MIPv6_NONE_MIP_Timestamp (490),
+ avp_code_BASE_NONE_Product_Name (269),
+ avp_code_BASE_NONE_Origin_State_Id (278),
+ avp_code_BASE_NONE_User_Name (1),
+ avp_code_BASE_NONE_Accounting_Sub_Session_Id (287),
+ avp_code_BASE_NONE_Session_Binding (270),
+ avp_code_BASE_NONE_Acct_Multi_Session_Id (50),
+ avp_code_MIPv6_NONE_MIP_Algorithm_Type (345),
+ avp_code_MIPv6_NONE_QoS_Capability (578),
+ avp_code_BASE_NONE_Destination_Realm (283),
+ avp_code_MIPv6_NONE_Chargable_User_Identity (89),
+ avp_code_BASE_NONE_Redirect_Host (292),
+ avp_code_MIPv6_NONE_MIP_MN_AAA_SPI (341),
+ avp_code_MIPv6_NONE_MIP_MSA_Lifetime (367),
+ avp_code_BASE_NONE_E2E_Sequence (300),
+ avp_code_BASE_NONE_Origin_Realm (296),
+ avp_code_BASE_NONE_Acct_Interim_Interval (85),
+ avp_code_MIPv6_NONE_MIP_Authenticator (488),
+ avp_code_BASE_NONE_Origin_Host (264),
+ avp_code_BASE_NONE_Accounting_Session_Id (44),
+ avp_code_BASE_NONE_Disconnect_Cause (273),
+ avp_code_BASE_NONE_Accounting_Record_Type (480),
+ avp_code_BASE_NONE_Acct_Application_Id (259),
+ avp_code_BASE_NONE_Result_Code (268),
+ avp_code_BASE_NONE_Auth_Session_State (277),
+ avp_code_BASE_NONE_Vendor_Specific_Application_Id (260),
+ avp_code_MIPv6_NONE_Service_Selection (493),
+ avp_code_BASE_NONE_Inband_Security_Id (299),
+ avp_code_BASE_NONE_Route_Record (282),
+ avp_code_BASE_NONE_Authorization_Lifetime (291),
+ avp_code_BASE_NONE_Accounting_Realtime_Required (483),
+ avp_code_BASE_NONE_Termination_Cause (295),
+ avp_code_BASE_NONE_Class (25)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+type enumerated AVP_Code_3GPP {
+ avp_code_PCC_3GPP_Bearer_Identifier (1020),
+ avp_code_RX_3GPP_Content_Version (552),
+ avp_code_RX_3GPP_Media_Component_Description (517),
+ avp_code_PCC_3GPP_CSG_Information_Reporting (1071),
+ avp_code_AAA_3GPP_Measurement_Quantity (1660),
+ avp_code_S6_3GPP_Location_Information_Configuration (3135),
+ avp_code_PCC_3GPP_Bearer_Usage (1000),
+ avp_code_PCC_3GPP_Tunnel_Header_Filter (1036),
+ avp_code_AAA_3GPP_List_Of_Measurements (1625),
+ avp_code_PCC_3GPP_Default_QoS_Name (2817),
+ avp_code_AAA_3GPP_UVA_Flags (1640),
+ avp_code_AAA_3GPP_Group_Service_Id (1676),
+ avp_code_PCC_3GPP_TDF_Information (1087),
+ avp_code_AAA_3GPP_Requested_EUTRAN_Authentication_Info (1408),
+ avp_code_AAA_3GPP_Last_UE_Activity_Time (1494),
+ avp_code_AAA_3GPP_Context_Identifier (1423),
+ avp_code_AAA_3GPP_Trace_Reference (1459),
+ avp_code_RX_3GPP_Sharing_Key_UL (540),
+ avp_code_RX_3GPP_AF_Charging_Identifier (505),
+ avp_code_S6_3GPP_Monitoring_Event_Report (3123),
+ avp_code_RX_3GPP_Media_Type (520),
+ avp_code_PCC_3GPP_Conditional_Policy_Information (2840),
+ avp_code_AAA_3GPP_SIPTO_Permission (1613),
+ avp_code_PCC_3GPP_Network_Request_Support (1024),
+ avp_code_RX_3GPP_Extended_Max_Supported_BW_DL (556),
+ avp_code_PCC_3GPP_UE_Local_IP_Address (2805),
+ avp_code_PCC_3GPP_Presence_Reporting_Area_Elements_List (2820),
+ avp_code_AAA_3GPP_SGs_MME_Identity (1664),
+ avp_code_PCC_3GPP_Routing_Rule_Remove (1075),
+ avp_code_S6_3GPP_Roaming_Information (3139),
+ avp_code_AAA_3GPP_Event_Threshold_RSRP (1629),
+ avp_code_AAA_3GPP_PLMN_Client (1482),
+ avp_code_AAA_3GPP_Re_Synchronization_Info (1411),
+ avp_code_AAA_3GPP_RAND (1447),
+ avp_code_AAA_3GPP_Trace_Depth (1462),
+ avp_code_AAA_3GPP_SGSN_User_State (1498),
+ avp_code_AAA_3GPP_APN_OI_Replacement (1427),
+ avp_code_S6_3GPP_External_Identifier (3111),
+ avp_code_PCC_3GPP_TFT_Filter (1012),
+ avp_code_RX_3GPP_Max_Supported_Bandwidth_UL (544),
+ avp_code_S6_3GPP_Loss_Of_Connectivity_Reason (3162),
+ avp_code_RX_3GPP_Flow_Number (509),
+ avp_code_PCC_3GPP_Resource_Allocation_Notification (1063),
+ avp_code_S6_3GPP_Monitoring_Type (3127),
+ avp_code_PCC_3GPP_Default_Bearer_Indication (2844),
+ avp_code_AAA_3GPP_VPLMN_LIPA_Allowed (1617),
+ avp_code_PCC_3GPP_QoS_Class_Identifier (1028),
+ avp_code_PCC_3GPP_Mute_Notification (2809),
+ avp_code_AAA_3GPP_Logging_Duration (1632),
+ avp_code_AAA_3GPP_WLAN_offloadability_EUTRAN (1668),
+ avp_code_PCC_3GPP_Routing_IP_Address (1079),
+ avp_code_AAA_3GPP_KASME (1450),
+ avp_code_AAA_3GPP_Teleservice_List (1486),
+ avp_code_AAA_3GPP_UTRAN_Vector (1415),
+ avp_code_RX_3GPP_Application_Service_Provider_Identity (532),
+ avp_code_S6_3GPP_NIDD_Authorization_Request (3150),
+ avp_code_PCC_3GPP_QoS_Rule_Install (1051),
+ avp_code_S6_3GPP_Periodic_Communication_Indicator (3115),
+ avp_code_RX_3GPP_Flow_Usage (512),
+ avp_code_PCC_3GPP_RAN_Rule_Support (2832),
+ avp_code_S6_3GPP_Monitoring_Duration (3130),
+ avp_code_AAA_3GPP_Routing_Area_Identity (1605),
+ avp_code_PCC_3GPP_QoS_Information (1016),
+ avp_code_RX_3GPP_Service_Authorization_Info (548),
+ avp_code_AAA_3GPP_eDRX_Cycle_Length (1691),
+ avp_code_S6_3GPP_Group_Monitoring_Event_Report_Item (3166),
+ avp_code_AAA_3GPP_Ext_PDP_Type (1620),
+ avp_code_PCC_3GPP_Rule_Failure_Code (1031),
+ avp_code_PCC_3GPP_User_Location_Info_Time (2812),
+ avp_code_AAA_3GPP_Measurement_Period_LTE (1656),
+ avp_code_PCC_3GPP_Usage_Monitoring_Information (1067),
+ avp_code_PCC_3GPP_Extended_APN_AMBR_DL (2848),
+ avp_code_AAA_3GPP_GMLC_Number (1474),
+ avp_code_AAA_3GPP_Software_Version (1403),
+ avp_code_AAA_3GPP_Expiration_Date (1439),
+ avp_code_AAA_3GPP_SRES (1454),
+ avp_code_AAA_3GPP_Item_Number (1419),
+ avp_code_S6_3GPP_Service_ID (3103),
+ avp_code_RX_3GPP_Abort_Cause (500),
+ avp_code_PCC_3GPP_Charging_Rule_Base_Name (1004),
+ avp_code_RX_3GPP_Required_Access_Info (536),
+ avp_code_PCC_3GPP_TDF_Destination_Realm (1090),
+ avp_code_S6_3GPP_S6t_HSS_Cause (3154),
+ avp_code_RX_3GPP_AF_Requested_Data (551),
+ avp_code_PCC_3GPP_QoS_Rule_Report (1055),
+ avp_code_S6_3GPP_Stationary_Indication (3119),
+ avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL (2836),
+ avp_code_AAA_3GPP_Geodetic_Information (1609),
+ avp_code_PCC_3GPP_Extended_GBR_UL (2851),
+ avp_code_AAA_3GPP_MBSFN_Area_ID (1695),
+ avp_code_AAA_3GPP_Area_Scope (1624),
+ avp_code_AAA_3GPP_PUA_Flags (1442),
+ avp_code_AAA_3GPP_Notification_To_UE_User (1478),
+ avp_code_AAA_3GPP_Visited_PLMN_Id (1407),
+ avp_code_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions (1493),
+ avp_code_RX_3GPP_Codec_Data (524),
+ avp_code_S6_3GPP_Monitoring_Event_Config_Status (3142),
+ avp_code_PCC_3GPP_Rule_Activation_Time (1043),
+ avp_code_S6_3GPP_Service_Data (3107),
+ avp_code_RX_3GPP_AF_Application_Identifier (504),
+ avp_code_PCC_3GPP_NetLoc_Access_Support (2824),
+ avp_code_S6_3GPP_Monitoring_Event_Configuration (3122),
+ avp_code_PCC_3GPP_Offline (1008),
+ avp_code_AAA_3GPP_Additional_Context_ID (1683),
+ avp_code_PCC_3GPP_ADC_Rule_Definition (1094),
+ avp_code_S6_3GPP_Allowed_PLMN_List (3158),
+ avp_code_AAA_3GPP_Active_APN (1612),
+ avp_code_PCC_3GPP_Bearer_Control_Mode (1023),
+ avp_code_PCC_3GPP_HeNB_Local_IP_Address (2804),
+ avp_code_AAA_3GPP_SMS_Register_Request (1648),
+ avp_code_PCC_3GPP_Packet_Filter_Content (1059),
+ avp_code_AAA_3GPP_APN_Configuration (1430),
+ avp_code_AAA_3GPP_OMC_Id (1466),
+ avp_code_AAA_3GPP_GMLC_Restriction (1481),
+ avp_code_AAA_3GPP_Regional_Subscription_Zone_Code (1446),
+ avp_code_S6_3GPP_SIR_Flags (3110),
+ avp_code_RX_3GPP_MPS_Identifier (528),
+ avp_code_AAA_3GPP_MDT_Allowed_PLMN_Id (1671),
+ avp_code_PCC_3GPP_Credit_Management_Status (1082),
+ avp_code_S6_3GPP_Service_Result (3146),
+ avp_code_AAA_3GPP_MME_Location_Information (1600),
+ avp_code_PCC_3GPP_Reporting_Level (1011),
+ avp_code_RX_3GPP_Max_Supported_Bandwidth_DL (543),
+ avp_code_AAA_3GPP_Subscribed_VSRVCC (1636),
+ avp_code_PCC_3GPP_Pre_emption_Capability (1047),
+ avp_code_PCC_3GPP_Monitoring_Flags (2828),
+ avp_code_PCC_3GPP_TCP_Source_Port (2843),
+ avp_code_PCC_3GPP_Application_Detection_Information (1098),
+ avp_code_AAA_3GPP_Emergency_Info (1687),
+ avp_code_AAA_3GPP_MPS_Priority (1616),
+ avp_code_AAA_3GPP_Alert_Reason (1434),
+ avp_code_AAA_3GPP_MO_LR (1485),
+ avp_code_RX_3GPP_Max_Requested_Bandwidth_UL (516),
+ avp_code_PCC_3GPP_Usage_Monitoring_Support (1070),
+ avp_code_S6_3GPP_Maximum_Response_Time (3134),
+ avp_code_RX_3GPP_Sponsor_Identity (531),
+ avp_code_PCC_3GPP_CoA_IP_Address (1035),
+ avp_code_PCC_3GPP_Default_QoS_Information (2816),
+ avp_code_PCC_3GPP_AN_GW_Address (1050),
+ avp_code_PCC_3GPP_NBIFOM_Support (2831),
+ avp_code_PCC_3GPP_Redirect_Support (1086),
+ avp_code_AAA_3GPP_IMSI_Group_Id (1675),
+ avp_code_AAA_3GPP_Cell_Global_Identity (1604),
+ avp_code_AAA_3GPP_PDN_Connection_Continuity (1690),
+ avp_code_AAA_3GPP_DSA_Flags (1422),
+ avp_code_AAA_3GPP_Trace_Data (1458),
+ avp_code_AAA_3GPP_LCS_Info (1473),
+ avp_code_AAA_3GPP_PDN_GW_Allocation_Type (1438),
+ avp_code_RX_3GPP_Extended_Max_Requested_BW_UL (555),
+ avp_code_S6_3GPP_User_Identifier (3102),
+ avp_code_PCC_3GPP_QoS_Rule_Base_Name (1074),
+ avp_code_AAA_3GPP_Restoration_Priority (1663),
+ avp_code_S6_3GPP_Association_Type (3138),
+ avp_code_PCC_3GPP_Charging_Rule_Definition (1003),
+ avp_code_RX_3GPP_Min_Requested_Bandwidth_UL (535),
+ avp_code_AAA_3GPP_Report_Amount (1628),
+ avp_code_PCC_3GPP_CoA_Information (1039),
+ avp_code_AAA_3GPP_A_MSISDN (1643),
+ avp_code_PCC_3GPP_Routing_Rule_Report (2835),
+ avp_code_AAA_3GPP_Number_Of_Requested_Vectors (1410),
+ avp_code_AAA_3GPP_AIR_Flags (1679),
+ avp_code_AAA_3GPP_Geographical_Information (1608),
+ avp_code_AAA_3GPP_MME_User_State (1497),
+ avp_code_AAA_3GPP_Access_Restriction_Data (1426),
+ avp_code_AAA_3GPP_SS_Status (1477),
+ avp_code_S6_3GPP_NIDD_Authorization_Update (3161),
+ avp_code_PCC_3GPP_Packet_Filter_Operation (1062),
+ avp_code_S6_3GPP_SCEF_Reference_ID_for_Deletion (3126),
+ avp_code_RX_3GPP_SIP_Forking_Indication (523),
+ avp_code_S6_3GPP_IMEI_Change (3141),
+ avp_code_PCC_3GPP_IP_CAN_Type (1027),
+ avp_code_RX_3GPP_Extended_Min_Desired_BW_UL (559),
+ avp_code_PCC_3GPP_Revalidation_Time (1042),
+ avp_code_AAA_3GPP_Logging_Interval (1631),
+ avp_code_PCC_3GPP_Presence_Reporting_Area_Status (2823),
+ avp_code_AAA_3GPP_WLAN_offloadability (1667),
+ avp_code_PCC_3GPP_Routing_Filter (1078),
+ avp_code_PCC_3GPP_Metering_Method (1007),
+ avp_code_AAA_3GPP_Non_IP_Data_Delivery_Mechanism (1682),
+ avp_code_AAA_3GPP_E_UTRAN_Vector (1414),
+ avp_code_AAA_3GPP_Trace_Event_List (1465),
+ avp_code_S6_3GPP_Communication_Pattern_Set (3114),
+ avp_code_RX_3GPP_Flow_Status (511),
+ avp_code_RX_3GPP_MCPTT_Identifier (547),
+ avp_code_S6_3GPP_Group_Monitoring_Event_Report (3165),
+ avp_code_PCC_3GPP_QoS_Upgrade (1030),
+ avp_code_PCC_3GPP_AN_GW_Status (2811),
+ avp_code_AAA_3GPP_Measurement_Period_UMTS (1655),
+ avp_code_PCC_3GPP_Monitoring_Key (1066),
+ avp_code_PCC_3GPP_3GPP_PS_Data_Off_Status (2847),
+ avp_code_AAA_3GPP_Reset_ID (1670),
+ avp_code_PCC_3GPP_Routing_Rule_Install (1081),
+ avp_code_AAA_3GPP_PUR_Flags (1635),
+ avp_code_PCC_3GPP_IP_CAN_Session_Charging_Scope (2827),
+ avp_code_AAA_3GPP_IMEI (1402),
+ avp_code_AAA_3GPP_Kc (1453),
+ avp_code_AAA_3GPP_SGSN_Number (1489),
+ avp_code_AAA_3GPP_HPLMN_ODB (1418),
+ avp_code_AAA_3GPP_PDP_Context (1469),
+ avp_code_S6_3GPP_Node_Type (3153),
+ avp_code_RX_3GPP_Priority_Sharing_Indicator (550),
+ avp_code_PCC_3GPP_QoS_Rule_Name (1054),
+ avp_code_S6_3GPP_Scheduled_Communication_Time (3118),
+ avp_code_RX_3GPP_Max_Requested_Bandwidth_DL (515),
+ avp_code_S6_3GPP_Maximum_Latency (3133),
+ avp_code_PCC_3GPP_PCC_Rule_Status (1019),
+ avp_code_PCC_3GPP_Extended_GBR_DL (2850),
+ avp_code_AAA_3GPP_MBSFN_Area (1694),
+ avp_code_S6_3GPP_APN_Validity_Time (3169),
+ avp_code_AAA_3GPP_Job_Type (1623),
+ avp_code_PCC_3GPP_Allocation_Retention_Priority (1034),
+ avp_code_AAA_3GPP_Positioning_Method (1659),
+ avp_code_AAA_3GPP_DL_Buffering_Suggested_Packet_Count (1674),
+ avp_code_AAA_3GPP_IDA_Flags (1441),
+ avp_code_AAA_3GPP_ULA_Flags (1406),
+ avp_code_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported (1492),
+ avp_code_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature (1457),
+ avp_code_S6_3GPP_T4_Parameters (3106),
+ avp_code_RX_3GPP_Access_Network_Charging_Identifier_Value (503),
+ avp_code_S6_3GPP_AESE_Error_Report (3121),
+ avp_code_RX_3GPP_Sharing_Key_DL (539),
+ avp_code_PCC_3GPP_ADC_Rule_Remove (1093),
+ avp_code_S6_3GPP_Restricted_PLMN_List (3157),
+ avp_code_AAA_3GPP_Age_Of_Location_Information (1611),
+ avp_code_PCC_3GPP_Access_Network_Charging_Identifier_Gx (1022),
+ avp_code_RX_3GPP_Extended_Max_Requested_BW_DL (554),
+ avp_code_PCC_3GPP_Flow_Information (1058),
+ avp_code_PCC_3GPP_Execution_Time (2839),
+ avp_code_AAA_3GPP_Event_Threshold_Event_1I (1662),
+ avp_code_PCC_3GPP_Charging_Correlation_Indicator (1073),
+ avp_code_AAA_3GPP_Report_Interval (1627),
+ avp_code_PCC_3GPP_RAN_NAS_Release_Cause (2819),
+ avp_code_AAA_3GPP_Client_Identity (1480),
+ avp_code_AAA_3GPP_Equipment_Status (1445),
+ avp_code_AAA_3GPP_EPS_Location_Information (1496),
+ avp_code_RX_3GPP_Service_Info_Status (527),
+ avp_code_S6_3GPP_CIR_Flags (3145),
+ avp_code_PCC_3GPP_Precedence (1010),
+ avp_code_RX_3GPP_Sponsoring_Action (542),
+ avp_code_S6_3GPP_Granted_Validity_Time (3160),
+ avp_code_PCC_3GPP_Priority_Level (1046),
+ avp_code_RX_3GPP_Flow_Description (507),
+ avp_code_AAA_3GPP_Daylight_Saving_Time (1650),
+ avp_code_PCC_3GPP_Packet_Filter_Information (1061),
+ avp_code_S6_3GPP_SCEF_ID (3125),
+ avp_code_PCC_3GPP_Removal_Of_Access (2842),
+ avp_code_AAA_3GPP_Preferred_Data_Mode (1686),
+ avp_code_PCC_3GPP_ADC_Rule_Report (1097),
+ avp_code_AAA_3GPP_UE_SRVCC_Capability (1615),
+ avp_code_PCC_3GPP_Guaranteed_Bitrate_UL (1026),
+ avp_code_AAA_3GPP_Coupled_Node_Diameter_ID (1666),
+ avp_code_AAA_3GPP_STN_SR (1433),
+ avp_code_AAA_3GPP_ServiceTypeIdentity (1484),
+ avp_code_AAA_3GPP_AUTN (1449),
+ avp_code_RX_3GPP_Sponsored_Connectivity_Data (530),
+ avp_code_S6_3GPP_AESE_Communication_Pattern (3113),
+ avp_code_PCC_3GPP_NBIFOM_Mode (2830),
+ avp_code_PCC_3GPP_Redirect_Information (1085),
+ avp_code_S6_3GPP_Event_Handling (3149),
+ avp_code_AAA_3GPP_Tracking_Area_Identity (1603),
+ avp_code_PCC_3GPP_ToS_Traffic_Class (1014),
+ avp_code_RX_3GPP_Min_Desired_Bandwidth_UL (546),
+ avp_code_AAA_3GPP_UVR_Flags (1639),
+ avp_code_AAA_3GPP_Subscription_Data_Flags (1654),
+ avp_code_PCC_3GPP_PDN_Connection_ID (1065),
+ avp_code_AAA_3GPP_DSR_Flags (1421),
+ avp_code_PCC_3GPP_PRA_Remove (2846),
+ avp_code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer (1619),
+ avp_code_AAA_3GPP_Specific_APN_Info (1472),
+ avp_code_AAA_3GPP_Terminal_Information (1401),
+ avp_code_AAA_3GPP_CSG_Id (1437),
+ avp_code_AAA_3GPP_Call_Barring_Info (1488),
+ avp_code_S6_3GPP_IP_SM_GW_Name (3101),
+ avp_code_RX_3GPP_Media_Sub_Component (519),
+ avp_code_S6_3GPP_Accuracy (3137),
+ avp_code_PCC_3GPP_Charging_Rule_Remove (1002),
+ avp_code_RX_3GPP_Min_Requested_Bandwidth_DL (534),
+ avp_code_S6_3GPP_Service_Report (3152),
+ avp_code_PCC_3GPP_Tunnel_Information (1038),
+ avp_code_AAA_3GPP_Time_Zone (1642),
+ avp_code_PCC_3GPP_QoS_Rule_Definition (1053),
+ avp_code_S6_3GPP_Periodic_Time (3117),
+ avp_code_PCC_3GPP_Routing_Rule_Failure_Code (2834),
+ avp_code_PCC_3GPP_TDF_Destination_Host (1089),
+ avp_code_AAA_3GPP_Local_Group_Id (1678),
+ avp_code_AAA_3GPP_Service_Area_Identity (1607),
+ avp_code_PCC_3GPP_Charging_Rule_Report (1018),
+ avp_code_AAA_3GPP_UE_PC5_AMBR (1693),
+ avp_code_AAA_3GPP_Collection_Period_RRM_UMTS (1658),
+ avp_code_AAA_3GPP_Operator_Determined_Barring (1425),
+ avp_code_AAA_3GPP_SS_Code (1476),
+ avp_code_RX_3GPP_RS_Bandwidth (522),
+ avp_code_S6_3GPP_Reachability_Information (3140),
+ avp_code_RX_3GPP_Extended_Min_Desired_BW_DL (558),
+ avp_code_AAA_3GPP_Event_Threshold_RSRQ (1630),
+ avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL (1041),
+ avp_code_S6_3GPP_Service_Parameters (3105),
+ avp_code_PCC_3GPP_Presence_Reporting_Area_Information (2822),
+ avp_code_PCC_3GPP_Routing_Rule_Identifier (1077),
+ avp_code_PCC_3GPP_Event_Trigger (1006),
+ avp_code_RX_3GPP_GCS_Identifier (538),
+ avp_code_AAA_3GPP_Non_IP_PDN_Type_Indicator (1681),
+ avp_code_PCC_3GPP_ADC_Rule_Install (1092),
+ avp_code_PCC_3GPP_Flow_Label (1057),
+ avp_code_AAA_3GPP_Authentication_Info (1413),
+ avp_code_AAA_3GPP_Trace_Interface_List (1464),
+ avp_code_AAA_3GPP_APN_Configuration_Profile (1429),
+ avp_code_RX_3GPP_Flows (510),
+ avp_code_S6_3GPP_CIA_Flags (3164),
+ avp_code_RX_3GPP_Extended_Min_Requested_BW_UL (561),
+ avp_code_PCC_3GPP_Monitoring_Time (2810),
+ avp_code_S6_3GPP_UE_Reachability_Configuration (3129),
+ avp_code_RX_3GPP_Acceptable_Service_Info (526),
+ avp_code_PCC_3GPP_Flow_Direction (1080),
+ avp_code_S6_3GPP_Supported_Monitoring_Events (3144),
+ avp_code_PCC_3GPP_Session_Release_Cause (1045),
+ avp_code_AAA_3GPP_MDT_User_Consent (1634),
+ avp_code_S6_3GPP_HSS_Cause (3109),
+ avp_code_PCC_3GPP_PCSCF_Restoration_Indication (2826),
+ avp_code_AAA_3GPP_Subscription_Data_Deletion (1685),
+ avp_code_AAA_3GPP_Trace_Collection_Entity (1452),
+ avp_code_AAA_3GPP_Network_Access_Mode (1417),
+ avp_code_AAA_3GPP_Complete_Data_List_Included_Indicator (1468),
+ avp_code_S6_3GPP_Reachability_Type (3132),
+ avp_code_S6_3GPP_Type_Of_External_Identifier (3168),
+ avp_code_PCC_3GPP_Event_Report_Indication (1033),
+ avp_code_AAA_3GPP_MDT_Configuration (1622),
+ avp_code_PCC_3GPP_Usage_Monitoring_Report (1069),
+ avp_code_AAA_3GPP_Adjacent_Access_Restriction_Data (1673),
+ avp_code_AAA_3GPP_RAT_Frequency_Selection_Priority_ID (1440),
+ avp_code_AAA_3GPP_CLR_Flags (1638),
+ avp_code_PCC_3GPP_Default_EPS_Bearer_QoS (1049),
+ avp_code_AAA_3GPP_ULR_Flags (1405),
+ avp_code_AAA_3GPP_ICS_Indicator (1491),
+ avp_code_AAA_3GPP_Cancellation_Type (1420),
+ avp_code_AAA_3GPP_PDN_Type (1456),
+ avp_code_RX_3GPP_Access_Network_Charging_Identifier (502),
+ avp_code_S6_3GPP_AESE_Communication_Pattern_Config_Status (3120),
+ avp_code_S6_3GPP_Enhanced_Coverage_Restriction_Data (3156),
+ avp_code_PCC_3GPP_Bearer_Operation (1021),
+ avp_code_AAA_3GPP_Current_Location_Retrieved (1610),
+ avp_code_RX_3GPP_Pre_emption_Control_Info (553),
+ avp_code_PCC_3GPP_TDF_Application_Instance_Identifier (2802),
+ avp_code_RX_3GPP_Media_Component_Number (518),
+ avp_code_AAA_3GPP_Event_Threshold_Event_1F (1661),
+ avp_code_PCC_3GPP_Packet_Filter_Usage (1072),
+ avp_code_S6_3GPP_MONTE_Location_Type (3136),
+ avp_code_AAA_3GPP_RDS_Indicator (1697),
+ avp_code_AAA_3GPP_Reporting_Trigger (1626),
+ avp_code_PCC_3GPP_Tunnel_Header_Length (1037),
+ avp_code_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate (2818),
+ avp_code_AAA_3GPP_Group_PLMN_Id (1677),
+ avp_code_AAA_3GPP_User_Id (1444),
+ avp_code_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info (1409),
+ avp_code_AAA_3GPP_EPS_User_State (1495),
+ avp_code_RX_3GPP_Retry_Interval (541),
+ avp_code_PCC_3GPP_Packet_Filter_Identifier (1060),
+ avp_code_S6_3GPP_SCEF_Reference_ID (3124),
+ avp_code_PCC_3GPP_Resource_Release_Notification (2841),
+ avp_code_PCC_3GPP_ADC_Rule_Name (1096),
+ avp_code_AAA_3GPP_Error_Diagnostic (1614),
+ avp_code_PCC_3GPP_Guaranteed_Bitrate_DL (1025),
+ avp_code_RX_3GPP_Extended_Max_Supported_BW_UL (557),
+ avp_code_PCC_3GPP_UDP_Source_Port (2806),
+ avp_code_AAA_3GPP_SIPTO_Local_Network_Permission (1665),
+ avp_code_PCC_3GPP_Routing_Rule_Definition (1076),
+ avp_code_AAA_3GPP_VPLMN_Dynamic_Address_Allowed (1432),
+ avp_code_AAA_3GPP_Service_Type (1483),
+ avp_code_AAA_3GPP_Immediate_Response_Preferred (1412),
+ avp_code_AAA_3GPP_XRES (1448),
+ avp_code_AAA_3GPP_User_State (1499),
+ avp_code_S6_3GPP_IP_SM_GW_Realm (3112),
+ avp_code_S6_3GPP_Reference_ID_Validity_Time (3148),
+ avp_code_AAA_3GPP_E_UTRAN_Cell_Global_Identity (1602),
+ avp_code_PCC_3GPP_TFT_Packet_Filter_Information (1013),
+ avp_code_RX_3GPP_Min_Desired_Bandwidth_DL (545),
+ avp_code_S6_3GPP_Group_Reporting_Guard_Timer (3163),
+ avp_code_PCC_3GPP_Session_Linking_Indicator (1064),
+ avp_code_S6_3GPP_Maximum_Number_of_Reports (3128),
+ avp_code_PCC_3GPP_PRA_Install (2845),
+ avp_code_AAA_3GPP_V2X_Permission (1689),
+ avp_code_AAA_3GPP_LIPA_Permission (1618),
+ avp_code_PCC_3GPP_QoS_Negotiation (1029),
+ avp_code_AAA_3GPP_3GPP2_MEID (1471),
+ avp_code_AAA_3GPP_Subscription_Data (1400),
+ avp_code_AAA_3GPP_WLAN_offloadability_UTRAN (1669),
+ avp_code_AAA_3GPP_CSG_Subscription_Data (1436),
+ avp_code_AAA_3GPP_TS_Code (1487),
+ avp_code_S6_3GPP_IP_SM_GW_Number (3100),
+ avp_code_PCC_3GPP_Charging_Rule_Install (1001),
+ avp_code_RX_3GPP_Rx_Request_Type (533),
+ avp_code_S6_3GPP_NIDD_Authorization_Response (3151),
+ avp_code_AAA_3GPP_VPLMN_CSG_Subscription_Data (1641),
+ avp_code_PCC_3GPP_QoS_Rule_Remove (1052),
+ avp_code_S6_3GPP_Communication_Duration_Time (3116),
+ avp_code_PCC_3GPP_Access_Availability_Change_Reason (2833),
+ avp_code_PCC_3GPP_TDF_Application_Identifier (1088),
+ avp_code_AAA_3GPP_Location_Area_Identity (1606),
+ avp_code_RX_3GPP_Media_Component_Status (549),
+ avp_code_AAA_3GPP_eDRX_Cycle_Length_Value (1692),
+ avp_code_S6_3GPP_RIR_Flags (3167),
+ avp_code_AAA_3GPP_Collection_Period_RRM_LTE (1657),
+ avp_code_PCC_3GPP_Usage_Monitoring_Level (1068),
+ avp_code_AAA_3GPP_Subscriber_Status (1424),
+ avp_code_PCC_3GPP_Extended_APN_AMBR_UL (2849),
+ avp_code_AAA_3GPP_LCS_PrivacyException (1475),
+ avp_code_AAA_3GPP_QoS_Subscribed (1404),
+ avp_code_RX_3GPP_RR_Bandwidth (521),
+ avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL (1040),
+ avp_code_S6_3GPP_SCS_Identity (3104),
+ avp_code_RX_3GPP_Access_Network_Charging_Address (501),
+ avp_code_PCC_3GPP_Presence_Reporting_Area_Identifier (2821),
+ avp_code_PCC_3GPP_Charging_Rule_Name (1005),
+ avp_code_RX_3GPP_Ip_Domain_Id (537),
+ avp_code_AAA_3GPP_UE_Usage_Type (1680),
+ avp_code_PCC_3GPP_TDF_IP_Address (1091),
+ avp_code_S6_3GPP_Enhanced_Coverage_Restriction (3155),
+ avp_code_AAA_3GPP_MME_Number_for_MT_SMS (1645),
+ avp_code_PCC_3GPP_Security_Parameter_Index (1056),
+ avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL (2837),
+ avp_code_AAA_3GPP_Carrier_Frequency (1696),
+ avp_code_AAA_3GPP_Trace_NE_Type_List (1463),
+ avp_code_AAA_3GPP_All_APN_Configurations_Included_Indicator (1428),
+ avp_code_AAA_3GPP_NOR_Flags (1443),
+ avp_code_AAA_3GPP_External_Client (1479),
+ avp_code_RX_3GPP_Extended_Min_Requested_BW_DL (560),
+ avp_code_RX_3GPP_Service_URN (525),
+ avp_code_S6_3GPP_Supported_Services (3143),
+ avp_code_AAA_3GPP_Relay_Node_Indicator (1633),
+ avp_code_PCC_3GPP_Rule_DeActivation_Time (1044),
+ avp_code_S6_3GPP_T4_Data (3108),
+ avp_code_PCC_3GPP_Fixed_User_Location_Info (2825),
+ avp_code_PCC_3GPP_Online (1009),
+ avp_code_PCC_3GPP_ADC_Rule_Base_Name (1095),
+ avp_code_AAA_3GPP_SCEF_Realm (1684),
+ avp_code_S6_3GPP_Requested_Validity_Time (3159),
+ avp_code_AAA_3GPP_Local_Time_Zone (1649),
+ avp_code_AAA_3GPP_GERAN_Vector (1416),
+ avp_code_AAA_3GPP_EPS_Subscribed_QoS_Profile (1431),
+ avp_code_AAA_3GPP_GPRS_Subscription_Data (1467),
+ avp_code_RX_3GPP_Specific_Action (513),
+ avp_code_S6_3GPP_Maximum_Detection_Time (3131),
+ avp_code_AAA_3GPP_Ext_PDP_Address (1621),
+ avp_code_PCC_3GPP_RAT_Type (1032),
+ avp_code_RX_3GPP_AF_Signalling_Protocol (529),
+ avp_code_AAA_3GPP_Adjacent_PLMNs (1672),
+ avp_code_S6_3GPP_Service_Result_Code (3147),
+ avp_code_AAA_3GPP_SGSN_Location_Information (1601),
+ avp_code_PCC_3GPP_Pre_emption_Vulnerability (1048),
+ avp_code_AAA_3GPP_Equivalent_PLMN_List (1637),
+ avp_code_PCC_3GPP_Default_Access (2829),
+ avp_code_AAA_3GPP_IDR_Flags (1490),
+ avp_code_AAA_3GPP_V2X_Subscription_Data (1688),
+ avp_code_PCC_3GPP_PS_to_CS_Session_Continuity (1099),
+ avp_code_AAA_3GPP_PDP_Type (1470),
+ avp_code_AAA_3GPP_AMBR (1435)
+} with {
+ variant "FIELDLENGTH(32)"
+ variant "BYTEORDER(last)"
+ variant "COMP(2scompl)"
+}
+type union AVP_Code {
+ AVP_Code_NONE vendor_id_NONE,
+ AVP_Code_3GPP vendor_id_3GPP
+}
+type record AVP_Header {
+ AVP_Code avp_code,
+ BIT8 VMPxxxxx,
+ UINT24 avp_length,
+ Vendor_Id vendor_id optional
+} with {
+ variant (vendor_id) "PRESENCE( {
+ VMPxxxxx = '10000000'B,
+ VMPxxxxx = '10100000'B,
+ VMPxxxxx = '11000000'B,
+ VMPxxxxx = '11100000'B
+ } )"
+ variant (avp_code) "CROSSTAG(
+ vendor_id_NONE, vendor_id = omit;
+ vendor_id_3GPP, vendor_id = vendor_id_3GPP;
+ )"
+}
+type union AVP_Data {
+ MIPv6_NONE_MIP_Careof_Address avp_MIPv6_NONE_MIP_Careof_Address,
+ PCC_3GPP_Bearer_Identifier avp_PCC_3GPP_Bearer_Identifier,
+ RX_3GPP_Content_Version avp_RX_3GPP_Content_Version,
+ BASE_NONE_Session_Id avp_BASE_NONE_Session_Id,
+ RX_3GPP_Media_Component_Description avp_RX_3GPP_Media_Component_Description,
+ PCC_3GPP_CSG_Information_Reporting avp_PCC_3GPP_CSG_Information_Reporting,
+ AAA_3GPP_Measurement_Quantity avp_AAA_3GPP_Measurement_Quantity,
+ S6_3GPP_Location_Information_Configuration avp_S6_3GPP_Location_Information_Configuration,
+ PCC_3GPP_Bearer_Usage avp_PCC_3GPP_Bearer_Usage,
+ PCC_3GPP_Tunnel_Header_Filter avp_PCC_3GPP_Tunnel_Header_Filter,
+ AAA_3GPP_List_Of_Measurements avp_AAA_3GPP_List_Of_Measurements,
+ PCC_3GPP_Default_QoS_Name avp_PCC_3GPP_Default_QoS_Name,
+ AAA_3GPP_UVA_Flags avp_AAA_3GPP_UVA_Flags,
+ AAA_3GPP_Group_Service_Id avp_AAA_3GPP_Group_Service_Id,
+ PCC_3GPP_TDF_Information avp_PCC_3GPP_TDF_Information,
+ AAA_3GPP_Requested_EUTRAN_Authentication_Info avp_AAA_3GPP_Requested_EUTRAN_Authentication_Info,
+ AAA_3GPP_Last_UE_Activity_Time avp_AAA_3GPP_Last_UE_Activity_Time,
+ AAA_3GPP_Context_Identifier avp_AAA_3GPP_Context_Identifier,
+ BASE_NONE_Auth_Application_Id avp_BASE_NONE_Auth_Application_Id,
+ AAA_3GPP_Trace_Reference avp_AAA_3GPP_Trace_Reference,
+ RX_3GPP_Sharing_Key_UL avp_RX_3GPP_Sharing_Key_UL,
+ RX_3GPP_AF_Charging_Identifier avp_RX_3GPP_AF_Charging_Identifier,
+ S6_3GPP_Monitoring_Event_Report avp_S6_3GPP_Monitoring_Event_Report,
+ RX_3GPP_Media_Type avp_RX_3GPP_Media_Type,
+ PCC_3GPP_Conditional_Policy_Information avp_PCC_3GPP_Conditional_Policy_Information,
+ BASE_NONE_Firmware_Revision avp_BASE_NONE_Firmware_Revision,
+ AAA_3GPP_SIPTO_Permission avp_AAA_3GPP_SIPTO_Permission,
+ PCC_3GPP_Network_Request_Support avp_PCC_3GPP_Network_Request_Support,
+ RX_3GPP_Extended_Max_Supported_BW_DL avp_RX_3GPP_Extended_Max_Supported_BW_DL,
+ PCC_3GPP_UE_Local_IP_Address avp_PCC_3GPP_UE_Local_IP_Address,
+ PCC_3GPP_Presence_Reporting_Area_Elements_List avp_PCC_3GPP_Presence_Reporting_Area_Elements_List,
+ AAA_3GPP_SGs_MME_Identity avp_AAA_3GPP_SGs_MME_Identity,
+ PCC_3GPP_Routing_Rule_Remove avp_PCC_3GPP_Routing_Rule_Remove,
+ S6_3GPP_Roaming_Information avp_S6_3GPP_Roaming_Information,
+ AAA_3GPP_Event_Threshold_RSRP avp_AAA_3GPP_Event_Threshold_RSRP,
+ AAA_3GPP_PLMN_Client avp_AAA_3GPP_PLMN_Client,
+ AAA_3GPP_Re_Synchronization_Info avp_AAA_3GPP_Re_Synchronization_Info,
+ BASE_NONE_Auth_Grace_Period avp_BASE_NONE_Auth_Grace_Period,
+ AAA_3GPP_RAND avp_AAA_3GPP_RAND,
+ AAA_3GPP_Trace_Depth avp_AAA_3GPP_Trace_Depth,
+ AAA_3GPP_SGSN_User_State avp_AAA_3GPP_SGSN_User_State,
+ AAA_3GPP_APN_OI_Replacement avp_AAA_3GPP_APN_OI_Replacement,
+ BASE_NONE_Re_Auth_Request_Type avp_BASE_NONE_Re_Auth_Request_Type,
+ S6_3GPP_External_Identifier avp_S6_3GPP_External_Identifier,
+ MIPv6_NONE_MIP_MN_HA_MSA avp_MIPv6_NONE_MIP_MN_HA_MSA,
+ PCC_3GPP_TFT_Filter avp_PCC_3GPP_TFT_Filter,
+ RX_3GPP_Max_Supported_Bandwidth_UL avp_RX_3GPP_Max_Supported_Bandwidth_UL,
+ S6_3GPP_Loss_Of_Connectivity_Reason avp_S6_3GPP_Loss_Of_Connectivity_Reason,
+ RX_3GPP_Flow_Number avp_RX_3GPP_Flow_Number,
+ PCC_3GPP_Resource_Allocation_Notification avp_PCC_3GPP_Resource_Allocation_Notification,
+ S6_3GPP_Monitoring_Type avp_S6_3GPP_Monitoring_Type,
+ PCC_3GPP_Default_Bearer_Indication avp_PCC_3GPP_Default_Bearer_Indication,
+ AAA_3GPP_VPLMN_LIPA_Allowed avp_AAA_3GPP_VPLMN_LIPA_Allowed,
+ PCC_3GPP_QoS_Class_Identifier avp_PCC_3GPP_QoS_Class_Identifier,
+ PCC_3GPP_Mute_Notification avp_PCC_3GPP_Mute_Notification,
+ MIPv6_NONE_QoS_Resources avp_MIPv6_NONE_QoS_Resources,
+ AAA_3GPP_Logging_Duration avp_AAA_3GPP_Logging_Duration,
+ AAA_3GPP_WLAN_offloadability_EUTRAN avp_AAA_3GPP_WLAN_offloadability_EUTRAN,
+ PCC_3GPP_Routing_IP_Address avp_PCC_3GPP_Routing_IP_Address,
+ MIPv6_NONE_MIP_Session_Key avp_MIPv6_NONE_MIP_Session_Key,
+ AAA_3GPP_KASME avp_AAA_3GPP_KASME,
+ AAA_3GPP_Teleservice_List avp_AAA_3GPP_Teleservice_List,
+ AAA_3GPP_UTRAN_Vector avp_AAA_3GPP_UTRAN_Vector,
+ RX_3GPP_Application_Service_Provider_Identity avp_RX_3GPP_Application_Service_Provider_Identity,
+ S6_3GPP_NIDD_Authorization_Request avp_S6_3GPP_NIDD_Authorization_Request,
+ PCC_3GPP_QoS_Rule_Install avp_PCC_3GPP_QoS_Rule_Install,
+ S6_3GPP_Periodic_Communication_Indicator avp_S6_3GPP_Periodic_Communication_Indicator,
+ RX_3GPP_Flow_Usage avp_RX_3GPP_Flow_Usage,
+ PCC_3GPP_RAN_Rule_Support avp_PCC_3GPP_RAN_Rule_Support,
+ S6_3GPP_Monitoring_Duration avp_S6_3GPP_Monitoring_Duration,
+ AAA_3GPP_Routing_Area_Identity avp_AAA_3GPP_Routing_Area_Identity,
+ PCC_3GPP_QoS_Information avp_PCC_3GPP_QoS_Information,
+ RX_3GPP_Service_Authorization_Info avp_RX_3GPP_Service_Authorization_Info,
+ BASE_NONE_Multi_Round_Time_Out avp_BASE_NONE_Multi_Round_Time_Out,
+ AAA_3GPP_eDRX_Cycle_Length avp_AAA_3GPP_eDRX_Cycle_Length,
+ S6_3GPP_Group_Monitoring_Event_Report_Item avp_S6_3GPP_Group_Monitoring_Event_Report_Item,
+ AAA_3GPP_Ext_PDP_Type avp_AAA_3GPP_Ext_PDP_Type,
+ PCC_3GPP_Rule_Failure_Code avp_PCC_3GPP_Rule_Failure_Code,
+ PCC_3GPP_User_Location_Info_Time avp_PCC_3GPP_User_Location_Info_Time,
+ AAA_3GPP_Measurement_Period_LTE avp_AAA_3GPP_Measurement_Period_LTE,
+ PCC_3GPP_Usage_Monitoring_Information avp_PCC_3GPP_Usage_Monitoring_Information,
+ BASE_NONE_Experimental_Result_Code avp_BASE_NONE_Experimental_Result_Code,
+ PCC_3GPP_Extended_APN_AMBR_DL avp_PCC_3GPP_Extended_APN_AMBR_DL,
+ AAA_3GPP_GMLC_Number avp_AAA_3GPP_GMLC_Number,
+ AAA_3GPP_Software_Version avp_AAA_3GPP_Software_Version,
+ AAA_3GPP_Expiration_Date avp_AAA_3GPP_Expiration_Date,
+ BASE_NONE_Error_Message avp_BASE_NONE_Error_Message,
+ AAA_3GPP_SRES avp_AAA_3GPP_SRES,
+ AAA_3GPP_Item_Number avp_AAA_3GPP_Item_Number,
+ S6_3GPP_Service_ID avp_S6_3GPP_Service_ID,
+ RX_3GPP_Abort_Cause avp_RX_3GPP_Abort_Cause,
+ PCC_3GPP_Charging_Rule_Base_Name avp_PCC_3GPP_Charging_Rule_Base_Name,
+ RX_3GPP_Required_Access_Info avp_RX_3GPP_Required_Access_Info,
+ PCC_3GPP_TDF_Destination_Realm avp_PCC_3GPP_TDF_Destination_Realm,
+ S6_3GPP_S6t_HSS_Cause avp_S6_3GPP_S6t_HSS_Cause,
+ RX_3GPP_AF_Requested_Data avp_RX_3GPP_AF_Requested_Data,
+ PCC_3GPP_QoS_Rule_Report avp_PCC_3GPP_QoS_Rule_Report,
+ S6_3GPP_Stationary_Indication avp_S6_3GPP_Stationary_Indication,
+ PCC_3GPP_Traffic_Steering_Policy_Identifier_DL avp_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL,
+ AAA_3GPP_Geodetic_Information avp_AAA_3GPP_Geodetic_Information,
+ PCC_3GPP_Extended_GBR_UL avp_PCC_3GPP_Extended_GBR_UL,
+ AAA_3GPP_MBSFN_Area_ID avp_AAA_3GPP_MBSFN_Area_ID,
+ AAA_3GPP_Area_Scope avp_AAA_3GPP_Area_Scope,
+ AAA_3GPP_PUA_Flags avp_AAA_3GPP_PUA_Flags,
+ AAA_3GPP_Notification_To_UE_User avp_AAA_3GPP_Notification_To_UE_User,
+ AAA_3GPP_Visited_PLMN_Id avp_AAA_3GPP_Visited_PLMN_Id,
+ AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions avp_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions,
+ RX_3GPP_Codec_Data avp_RX_3GPP_Codec_Data,
+ S6_3GPP_Monitoring_Event_Config_Status avp_S6_3GPP_Monitoring_Event_Config_Status,
+ BASE_NONE_Error_Reporting_Host avp_BASE_NONE_Error_Reporting_Host,
+ PCC_3GPP_Rule_Activation_Time avp_PCC_3GPP_Rule_Activation_Time,
+ S6_3GPP_Service_Data avp_S6_3GPP_Service_Data,
+ RX_3GPP_AF_Application_Identifier avp_RX_3GPP_AF_Application_Identifier,
+ PCC_3GPP_NetLoc_Access_Support avp_PCC_3GPP_NetLoc_Access_Support,
+ S6_3GPP_Monitoring_Event_Configuration avp_S6_3GPP_Monitoring_Event_Configuration,
+ PCC_3GPP_Offline avp_PCC_3GPP_Offline,
+ AAA_3GPP_Additional_Context_ID avp_AAA_3GPP_Additional_Context_ID,
+ PCC_3GPP_ADC_Rule_Definition avp_PCC_3GPP_ADC_Rule_Definition,
+ S6_3GPP_Allowed_PLMN_List avp_S6_3GPP_Allowed_PLMN_List,
+ AAA_3GPP_Active_APN avp_AAA_3GPP_Active_APN,
+ PCC_3GPP_Bearer_Control_Mode avp_PCC_3GPP_Bearer_Control_Mode,
+ PCC_3GPP_HeNB_Local_IP_Address avp_PCC_3GPP_HeNB_Local_IP_Address,
+ AAA_3GPP_SMS_Register_Request avp_AAA_3GPP_SMS_Register_Request,
+ PCC_3GPP_Packet_Filter_Content avp_PCC_3GPP_Packet_Filter_Content,
+ AAA_3GPP_APN_Configuration avp_AAA_3GPP_APN_Configuration,
+ AAA_3GPP_OMC_Id avp_AAA_3GPP_OMC_Id,
+ AAA_3GPP_GMLC_Restriction avp_AAA_3GPP_GMLC_Restriction,
+ AAA_3GPP_Regional_Subscription_Zone_Code avp_AAA_3GPP_Regional_Subscription_Zone_Code,
+ BASE_NONE_Proxy_State avp_BASE_NONE_Proxy_State,
+ S6_3GPP_SIR_Flags avp_S6_3GPP_SIR_Flags,
+ RX_3GPP_MPS_Identifier avp_RX_3GPP_MPS_Identifier,
+ AAA_3GPP_MDT_Allowed_PLMN_Id avp_AAA_3GPP_MDT_Allowed_PLMN_Id,
+ PCC_3GPP_Credit_Management_Status avp_PCC_3GPP_Credit_Management_Status,
+ S6_3GPP_Service_Result avp_S6_3GPP_Service_Result,
+ AAA_3GPP_MME_Location_Information avp_AAA_3GPP_MME_Location_Information,
+ PCC_3GPP_Reporting_Level avp_PCC_3GPP_Reporting_Level,
+ RX_3GPP_Max_Supported_Bandwidth_DL avp_RX_3GPP_Max_Supported_Bandwidth_DL,
+ AAA_3GPP_Subscribed_VSRVCC avp_AAA_3GPP_Subscribed_VSRVCC,
+ PCC_3GPP_Pre_emption_Capability avp_PCC_3GPP_Pre_emption_Capability,
+ PCC_3GPP_Monitoring_Flags avp_PCC_3GPP_Monitoring_Flags,
+ BASE_NONE_Redirect_Max_Cache_Time avp_BASE_NONE_Redirect_Max_Cache_Time,
+ PCC_3GPP_TCP_Source_Port avp_PCC_3GPP_TCP_Source_Port,
+ PCC_3GPP_Application_Detection_Information avp_PCC_3GPP_Application_Detection_Information,
+ AAA_3GPP_Emergency_Info avp_AAA_3GPP_Emergency_Info,
+ AAA_3GPP_MPS_Priority avp_AAA_3GPP_MPS_Priority,
+ AAA_3GPP_Alert_Reason avp_AAA_3GPP_Alert_Reason,
+ AAA_3GPP_MO_LR avp_AAA_3GPP_MO_LR,
+ BASE_NONE_Host_IP_Address avp_BASE_NONE_Host_IP_Address,
+ RX_3GPP_Max_Requested_Bandwidth_UL avp_RX_3GPP_Max_Requested_Bandwidth_UL,
+ PCC_3GPP_Usage_Monitoring_Support avp_PCC_3GPP_Usage_Monitoring_Support,
+ S6_3GPP_Maximum_Response_Time avp_S6_3GPP_Maximum_Response_Time,
+ RX_3GPP_Sponsor_Identity avp_RX_3GPP_Sponsor_Identity,
+ PCC_3GPP_CoA_IP_Address avp_PCC_3GPP_CoA_IP_Address,
+ PCC_3GPP_Default_QoS_Information avp_PCC_3GPP_Default_QoS_Information,
+ PCC_3GPP_AN_GW_Address avp_PCC_3GPP_AN_GW_Address,
+ PCC_3GPP_NBIFOM_Support avp_PCC_3GPP_NBIFOM_Support,
+ PCC_3GPP_Redirect_Support avp_PCC_3GPP_Redirect_Support,
+ AAA_3GPP_IMSI_Group_Id avp_AAA_3GPP_IMSI_Group_Id,
+ AAA_3GPP_Cell_Global_Identity avp_AAA_3GPP_Cell_Global_Identity,
+ BASE_NONE_Vendor_Id avp_BASE_NONE_Vendor_Id,
+ AAA_3GPP_PDN_Connection_Continuity avp_AAA_3GPP_PDN_Connection_Continuity,
+ AAA_3GPP_DSA_Flags avp_AAA_3GPP_DSA_Flags,
+ AAA_3GPP_Trace_Data avp_AAA_3GPP_Trace_Data,
+ AAA_3GPP_LCS_Info avp_AAA_3GPP_LCS_Info,
+ AAA_3GPP_PDN_GW_Allocation_Type avp_AAA_3GPP_PDN_GW_Allocation_Type,
+ BASE_NONE_Event_Timestamp avp_BASE_NONE_Event_Timestamp,
+ RX_3GPP_Extended_Max_Requested_BW_UL avp_RX_3GPP_Extended_Max_Requested_BW_UL,
+ S6_3GPP_User_Identifier avp_S6_3GPP_User_Identifier,
+ PCC_3GPP_QoS_Rule_Base_Name avp_PCC_3GPP_QoS_Rule_Base_Name,
+ AAA_3GPP_Restoration_Priority avp_AAA_3GPP_Restoration_Priority,
+ MIPv6_NONE_MIP_MN_HA_SPI avp_MIPv6_NONE_MIP_MN_HA_SPI,
+ S6_3GPP_Association_Type avp_S6_3GPP_Association_Type,
+ PCC_3GPP_Charging_Rule_Definition avp_PCC_3GPP_Charging_Rule_Definition,
+ RX_3GPP_Min_Requested_Bandwidth_UL avp_RX_3GPP_Min_Requested_Bandwidth_UL,
+ AAA_3GPP_Report_Amount avp_AAA_3GPP_Report_Amount,
+ PCC_3GPP_CoA_Information avp_PCC_3GPP_CoA_Information,
+ AAA_3GPP_A_MSISDN avp_AAA_3GPP_A_MSISDN,
+ MIPv6_NONE_MIP_Mobile_Node_Address avp_MIPv6_NONE_MIP_Mobile_Node_Address,
+ PCC_3GPP_Routing_Rule_Report avp_PCC_3GPP_Routing_Rule_Report,
+ AAA_3GPP_Number_Of_Requested_Vectors avp_AAA_3GPP_Number_Of_Requested_Vectors,
+ AAA_3GPP_AIR_Flags avp_AAA_3GPP_AIR_Flags,
+ AAA_3GPP_Geographical_Information avp_AAA_3GPP_Geographical_Information,
+ AAA_3GPP_MME_User_State avp_AAA_3GPP_MME_User_State,
+ AAA_3GPP_Access_Restriction_Data avp_AAA_3GPP_Access_Restriction_Data,
+ BASE_NONE_Failed_AVP avp_BASE_NONE_Failed_AVP,
+ AAA_3GPP_SS_Status avp_AAA_3GPP_SS_Status,
+ S6_3GPP_NIDD_Authorization_Update avp_S6_3GPP_NIDD_Authorization_Update,
+ PCC_3GPP_Packet_Filter_Operation avp_PCC_3GPP_Packet_Filter_Operation,
+ S6_3GPP_SCEF_Reference_ID_for_Deletion avp_S6_3GPP_SCEF_Reference_ID_for_Deletion,
+ RX_3GPP_SIP_Forking_Indication avp_RX_3GPP_SIP_Forking_Indication,
+ S6_3GPP_IMEI_Change avp_S6_3GPP_IMEI_Change,
+ PCC_3GPP_IP_CAN_Type avp_PCC_3GPP_IP_CAN_Type,
+ RX_3GPP_Extended_Min_Desired_BW_UL avp_RX_3GPP_Extended_Min_Desired_BW_UL,
+ PCC_3GPP_Revalidation_Time avp_PCC_3GPP_Revalidation_Time,
+ AAA_3GPP_Logging_Interval avp_AAA_3GPP_Logging_Interval,
+ PCC_3GPP_Presence_Reporting_Area_Status avp_PCC_3GPP_Presence_Reporting_Area_Status,
+ AAA_3GPP_WLAN_offloadability avp_AAA_3GPP_WLAN_offloadability,
+ PCC_3GPP_Routing_Filter avp_PCC_3GPP_Routing_Filter,
+ PCC_3GPP_Metering_Method avp_PCC_3GPP_Metering_Method,
+ AAA_3GPP_Non_IP_Data_Delivery_Mechanism avp_AAA_3GPP_Non_IP_Data_Delivery_Mechanism,
+ BASE_NONE_Session_Server_Failover avp_BASE_NONE_Session_Server_Failover,
+ AAA_3GPP_E_UTRAN_Vector avp_AAA_3GPP_E_UTRAN_Vector,
+ BASE_NONE_Experimental_Result avp_BASE_NONE_Experimental_Result,
+ AAA_3GPP_Trace_Event_List avp_AAA_3GPP_Trace_Event_List,
+ MIPv6_NONE_MIP_Replay_Mode avp_MIPv6_NONE_MIP_Replay_Mode,
+ BASE_NONE_Proxy_Host avp_BASE_NONE_Proxy_Host,
+ S6_3GPP_Communication_Pattern_Set avp_S6_3GPP_Communication_Pattern_Set,
+ RX_3GPP_Flow_Status avp_RX_3GPP_Flow_Status,
+ RX_3GPP_MCPTT_Identifier avp_RX_3GPP_MCPTT_Identifier,
+ S6_3GPP_Group_Monitoring_Event_Report avp_S6_3GPP_Group_Monitoring_Event_Report,
+ PCC_3GPP_QoS_Upgrade avp_PCC_3GPP_QoS_Upgrade,
+ PCC_3GPP_AN_GW_Status avp_PCC_3GPP_AN_GW_Status,
+ AAA_3GPP_Measurement_Period_UMTS avp_AAA_3GPP_Measurement_Period_UMTS,
+ PCC_3GPP_Monitoring_Key avp_PCC_3GPP_Monitoring_Key,
+ PCC_3GPP_3GPP_PS_Data_Off_Status avp_PCC_3GPP_3GPP_PS_Data_Off_Status,
+ AAA_3GPP_Reset_ID avp_AAA_3GPP_Reset_ID,
+ PCC_3GPP_Routing_Rule_Install avp_PCC_3GPP_Routing_Rule_Install,
+ AAA_3GPP_PUR_Flags avp_AAA_3GPP_PUR_Flags,
+ PCC_3GPP_IP_CAN_Session_Charging_Scope avp_PCC_3GPP_IP_CAN_Session_Charging_Scope,
+ AAA_3GPP_IMEI avp_AAA_3GPP_IMEI,
+ AAA_3GPP_Kc avp_AAA_3GPP_Kc,
+ AAA_3GPP_SGSN_Number avp_AAA_3GPP_SGSN_Number,
+ AAA_3GPP_HPLMN_ODB avp_AAA_3GPP_HPLMN_ODB,
+ AAA_3GPP_PDP_Context avp_AAA_3GPP_PDP_Context,
+ BASE_NONE_Proxy_Info avp_BASE_NONE_Proxy_Info,
+ S6_3GPP_Node_Type avp_S6_3GPP_Node_Type,
+ RX_3GPP_Priority_Sharing_Indicator avp_RX_3GPP_Priority_Sharing_Indicator,
+ PCC_3GPP_QoS_Rule_Name avp_PCC_3GPP_QoS_Rule_Name,
+ S6_3GPP_Scheduled_Communication_Time avp_S6_3GPP_Scheduled_Communication_Time,
+ RX_3GPP_Max_Requested_Bandwidth_DL avp_RX_3GPP_Max_Requested_Bandwidth_DL,
+ S6_3GPP_Maximum_Latency avp_S6_3GPP_Maximum_Latency,
+ PCC_3GPP_PCC_Rule_Status avp_PCC_3GPP_PCC_Rule_Status,
+ PCC_3GPP_Extended_GBR_DL avp_PCC_3GPP_Extended_GBR_DL,
+ AAA_3GPP_MBSFN_Area avp_AAA_3GPP_MBSFN_Area,
+ S6_3GPP_APN_Validity_Time avp_S6_3GPP_APN_Validity_Time,
+ AAA_3GPP_Job_Type avp_AAA_3GPP_Job_Type,
+ PCC_3GPP_Allocation_Retention_Priority avp_PCC_3GPP_Allocation_Retention_Priority,
+ BASE_NONE_Destination_Host avp_BASE_NONE_Destination_Host,
+ AAA_3GPP_Positioning_Method avp_AAA_3GPP_Positioning_Method,
+ AAA_3GPP_DL_Buffering_Suggested_Packet_Count avp_AAA_3GPP_DL_Buffering_Suggested_Packet_Count,
+ AAA_3GPP_IDA_Flags avp_AAA_3GPP_IDA_Flags,
+ AAA_3GPP_ULA_Flags avp_AAA_3GPP_ULA_Flags,
+ AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported avp_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported,
+ AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature avp_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature,
+ S6_3GPP_T4_Parameters avp_S6_3GPP_T4_Parameters,
+ RX_3GPP_Access_Network_Charging_Identifier_Value avp_RX_3GPP_Access_Network_Charging_Identifier_Value,
+ S6_3GPP_AESE_Error_Report avp_S6_3GPP_AESE_Error_Report,
+ RX_3GPP_Sharing_Key_DL avp_RX_3GPP_Sharing_Key_DL,
+ PCC_3GPP_ADC_Rule_Remove avp_PCC_3GPP_ADC_Rule_Remove,
+ S6_3GPP_Restricted_PLMN_List avp_S6_3GPP_Restricted_PLMN_List,
+ AAA_3GPP_Age_Of_Location_Information avp_AAA_3GPP_Age_Of_Location_Information,
+ PCC_3GPP_Access_Network_Charging_Identifier_Gx avp_PCC_3GPP_Access_Network_Charging_Identifier_Gx,
+ RX_3GPP_Extended_Max_Requested_BW_DL avp_RX_3GPP_Extended_Max_Requested_BW_DL,
+ PCC_3GPP_Flow_Information avp_PCC_3GPP_Flow_Information,
+ PCC_3GPP_Execution_Time avp_PCC_3GPP_Execution_Time,
+ BASE_NONE_Accounting_Record_Number avp_BASE_NONE_Accounting_Record_Number,
+ AAA_3GPP_Event_Threshold_Event_1I avp_AAA_3GPP_Event_Threshold_Event_1I,
+ PCC_3GPP_Charging_Correlation_Indicator avp_PCC_3GPP_Charging_Correlation_Indicator,
+ AAA_3GPP_Report_Interval avp_AAA_3GPP_Report_Interval,
+ PCC_3GPP_RAN_NAS_Release_Cause avp_PCC_3GPP_RAN_NAS_Release_Cause,
+ AAA_3GPP_Client_Identity avp_AAA_3GPP_Client_Identity,
+ BASE_NONE_Redirect_Host_Usage avp_BASE_NONE_Redirect_Host_Usage,
+ AAA_3GPP_Equipment_Status avp_AAA_3GPP_Equipment_Status,
+ MIPv6_NONE_MIP6_Auth_Mode avp_MIPv6_NONE_MIP6_Auth_Mode,
+ AAA_3GPP_EPS_Location_Information avp_AAA_3GPP_EPS_Location_Information,
+ BASE_NONE_Session_Timeout avp_BASE_NONE_Session_Timeout,
+ RX_3GPP_Service_Info_Status avp_RX_3GPP_Service_Info_Status,
+ S6_3GPP_CIR_Flags avp_S6_3GPP_CIR_Flags,
+ PCC_3GPP_Precedence avp_PCC_3GPP_Precedence,
+ RX_3GPP_Sponsoring_Action avp_RX_3GPP_Sponsoring_Action,
+ S6_3GPP_Granted_Validity_Time avp_S6_3GPP_Granted_Validity_Time,
+ PCC_3GPP_Priority_Level avp_PCC_3GPP_Priority_Level,
+ RX_3GPP_Flow_Description avp_RX_3GPP_Flow_Description,
+ AAA_3GPP_Daylight_Saving_Time avp_AAA_3GPP_Daylight_Saving_Time,
+ PCC_3GPP_Packet_Filter_Information avp_PCC_3GPP_Packet_Filter_Information,
+ S6_3GPP_SCEF_ID avp_S6_3GPP_SCEF_ID,
+ PCC_3GPP_Removal_Of_Access avp_PCC_3GPP_Removal_Of_Access,
+ AAA_3GPP_Preferred_Data_Mode avp_AAA_3GPP_Preferred_Data_Mode,
+ PCC_3GPP_ADC_Rule_Report avp_PCC_3GPP_ADC_Rule_Report,
+ AAA_3GPP_UE_SRVCC_Capability avp_AAA_3GPP_UE_SRVCC_Capability,
+ PCC_3GPP_Guaranteed_Bitrate_UL avp_PCC_3GPP_Guaranteed_Bitrate_UL,
+ MIPv6_NONE_MIP_MAC_Mobility_Data avp_MIPv6_NONE_MIP_MAC_Mobility_Data,
+ AAA_3GPP_Coupled_Node_Diameter_ID avp_AAA_3GPP_Coupled_Node_Diameter_ID,
+ AAA_3GPP_STN_SR avp_AAA_3GPP_STN_SR,
+ BASE_NONE_Supported_Vendor_Id avp_BASE_NONE_Supported_Vendor_Id,
+ AAA_3GPP_ServiceTypeIdentity avp_AAA_3GPP_ServiceTypeIdentity,
+ AAA_3GPP_AUTN avp_AAA_3GPP_AUTN,
+ RX_3GPP_Sponsored_Connectivity_Data avp_RX_3GPP_Sponsored_Connectivity_Data,
+ BASE_NONE_Auth_Request_Type avp_BASE_NONE_Auth_Request_Type,
+ S6_3GPP_AESE_Communication_Pattern avp_S6_3GPP_AESE_Communication_Pattern,
+ PCC_3GPP_NBIFOM_Mode avp_PCC_3GPP_NBIFOM_Mode,
+ PCC_3GPP_Redirect_Information avp_PCC_3GPP_Redirect_Information,
+ S6_3GPP_Event_Handling avp_S6_3GPP_Event_Handling,
+ AAA_3GPP_Tracking_Area_Identity avp_AAA_3GPP_Tracking_Area_Identity,
+ PCC_3GPP_ToS_Traffic_Class avp_PCC_3GPP_ToS_Traffic_Class,
+ RX_3GPP_Min_Desired_Bandwidth_UL avp_RX_3GPP_Min_Desired_Bandwidth_UL,
+ AAA_3GPP_UVR_Flags avp_AAA_3GPP_UVR_Flags,
+ AAA_3GPP_Subscription_Data_Flags avp_AAA_3GPP_Subscription_Data_Flags,
+ PCC_3GPP_PDN_Connection_ID avp_PCC_3GPP_PDN_Connection_ID,
+ AAA_3GPP_DSR_Flags avp_AAA_3GPP_DSR_Flags,
+ PCC_3GPP_PRA_Remove avp_PCC_3GPP_PRA_Remove,
+ MIPv6_NONE_MIP_Timestamp avp_MIPv6_NONE_MIP_Timestamp,
+ AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer,
+ AAA_3GPP_Specific_APN_Info avp_AAA_3GPP_Specific_APN_Info,
+ AAA_3GPP_Terminal_Information avp_AAA_3GPP_Terminal_Information,
+ BASE_NONE_Product_Name avp_BASE_NONE_Product_Name,
+ AAA_3GPP_CSG_Id avp_AAA_3GPP_CSG_Id,
+ AAA_3GPP_Call_Barring_Info avp_AAA_3GPP_Call_Barring_Info,
+ BASE_NONE_Origin_State_Id avp_BASE_NONE_Origin_State_Id,
+ S6_3GPP_IP_SM_GW_Name avp_S6_3GPP_IP_SM_GW_Name,
+ RX_3GPP_Media_Sub_Component avp_RX_3GPP_Media_Sub_Component,
+ S6_3GPP_Accuracy avp_S6_3GPP_Accuracy,
+ PCC_3GPP_Charging_Rule_Remove avp_PCC_3GPP_Charging_Rule_Remove,
+ RX_3GPP_Min_Requested_Bandwidth_DL avp_RX_3GPP_Min_Requested_Bandwidth_DL,
+ S6_3GPP_Service_Report avp_S6_3GPP_Service_Report,
+ PCC_3GPP_Tunnel_Information avp_PCC_3GPP_Tunnel_Information,
+ AAA_3GPP_Time_Zone avp_AAA_3GPP_Time_Zone,
+ PCC_3GPP_QoS_Rule_Definition avp_PCC_3GPP_QoS_Rule_Definition,
+ S6_3GPP_Periodic_Time avp_S6_3GPP_Periodic_Time,
+ PCC_3GPP_Routing_Rule_Failure_Code avp_PCC_3GPP_Routing_Rule_Failure_Code,
+ PCC_3GPP_TDF_Destination_Host avp_PCC_3GPP_TDF_Destination_Host,
+ AAA_3GPP_Local_Group_Id avp_AAA_3GPP_Local_Group_Id,
+ AAA_3GPP_Service_Area_Identity avp_AAA_3GPP_Service_Area_Identity,
+ PCC_3GPP_Charging_Rule_Report avp_PCC_3GPP_Charging_Rule_Report,
+ BASE_NONE_User_Name avp_BASE_NONE_User_Name,
+ AAA_3GPP_UE_PC5_AMBR avp_AAA_3GPP_UE_PC5_AMBR,
+ BASE_NONE_Accounting_Sub_Session_Id avp_BASE_NONE_Accounting_Sub_Session_Id,
+ AAA_3GPP_Collection_Period_RRM_UMTS avp_AAA_3GPP_Collection_Period_RRM_UMTS,
+ AAA_3GPP_Operator_Determined_Barring avp_AAA_3GPP_Operator_Determined_Barring,
+ BASE_NONE_Session_Binding avp_BASE_NONE_Session_Binding,
+ AAA_3GPP_SS_Code avp_AAA_3GPP_SS_Code,
+ BASE_NONE_Acct_Multi_Session_Id avp_BASE_NONE_Acct_Multi_Session_Id,
+ RX_3GPP_RS_Bandwidth avp_RX_3GPP_RS_Bandwidth,
+ MIPv6_NONE_MIP_Algorithm_Type avp_MIPv6_NONE_MIP_Algorithm_Type,
+ S6_3GPP_Reachability_Information avp_S6_3GPP_Reachability_Information,
+ RX_3GPP_Extended_Min_Desired_BW_DL avp_RX_3GPP_Extended_Min_Desired_BW_DL,
+ AAA_3GPP_Event_Threshold_RSRQ avp_AAA_3GPP_Event_Threshold_RSRQ,
+ PCC_3GPP_APN_Aggregate_Max_Bitrate_UL avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL,
+ S6_3GPP_Service_Parameters avp_S6_3GPP_Service_Parameters,
+ PCC_3GPP_Presence_Reporting_Area_Information avp_PCC_3GPP_Presence_Reporting_Area_Information,
+ PCC_3GPP_Routing_Rule_Identifier avp_PCC_3GPP_Routing_Rule_Identifier,
+ PCC_3GPP_Event_Trigger avp_PCC_3GPP_Event_Trigger,
+ RX_3GPP_GCS_Identifier avp_RX_3GPP_GCS_Identifier,
+ MIPv6_NONE_QoS_Capability avp_MIPv6_NONE_QoS_Capability,
+ AAA_3GPP_Non_IP_PDN_Type_Indicator avp_AAA_3GPP_Non_IP_PDN_Type_Indicator,
+ PCC_3GPP_ADC_Rule_Install avp_PCC_3GPP_ADC_Rule_Install,
+ PCC_3GPP_Flow_Label avp_PCC_3GPP_Flow_Label,
+ AAA_3GPP_Authentication_Info avp_AAA_3GPP_Authentication_Info,
+ AAA_3GPP_Trace_Interface_List avp_AAA_3GPP_Trace_Interface_List,
+ AAA_3GPP_APN_Configuration_Profile avp_AAA_3GPP_APN_Configuration_Profile,
+ RX_3GPP_Flows avp_RX_3GPP_Flows,
+ S6_3GPP_CIA_Flags avp_S6_3GPP_CIA_Flags,
+ RX_3GPP_Extended_Min_Requested_BW_UL avp_RX_3GPP_Extended_Min_Requested_BW_UL,
+ PCC_3GPP_Monitoring_Time avp_PCC_3GPP_Monitoring_Time,
+ S6_3GPP_UE_Reachability_Configuration avp_S6_3GPP_UE_Reachability_Configuration,
+ BASE_NONE_Destination_Realm avp_BASE_NONE_Destination_Realm,
+ RX_3GPP_Acceptable_Service_Info avp_RX_3GPP_Acceptable_Service_Info,
+ PCC_3GPP_Flow_Direction avp_PCC_3GPP_Flow_Direction,
+ S6_3GPP_Supported_Monitoring_Events avp_S6_3GPP_Supported_Monitoring_Events,
+ PCC_3GPP_Session_Release_Cause avp_PCC_3GPP_Session_Release_Cause,
+ AAA_3GPP_MDT_User_Consent avp_AAA_3GPP_MDT_User_Consent,
+ S6_3GPP_HSS_Cause avp_S6_3GPP_HSS_Cause,
+ PCC_3GPP_PCSCF_Restoration_Indication avp_PCC_3GPP_PCSCF_Restoration_Indication,
+ AAA_3GPP_Subscription_Data_Deletion avp_AAA_3GPP_Subscription_Data_Deletion,
+ MIPv6_NONE_Chargable_User_Identity avp_MIPv6_NONE_Chargable_User_Identity,
+ AAA_3GPP_Trace_Collection_Entity avp_AAA_3GPP_Trace_Collection_Entity,
+ BASE_NONE_Redirect_Host avp_BASE_NONE_Redirect_Host,
+ AAA_3GPP_Network_Access_Mode avp_AAA_3GPP_Network_Access_Mode,
+ AAA_3GPP_Complete_Data_List_Included_Indicator avp_AAA_3GPP_Complete_Data_List_Included_Indicator,
+ MIPv6_NONE_MIP_MN_AAA_SPI avp_MIPv6_NONE_MIP_MN_AAA_SPI,
+ MIPv6_NONE_MIP_MSA_Lifetime avp_MIPv6_NONE_MIP_MSA_Lifetime,
+ S6_3GPP_Reachability_Type avp_S6_3GPP_Reachability_Type,
+ S6_3GPP_Type_Of_External_Identifier avp_S6_3GPP_Type_Of_External_Identifier,
+ PCC_3GPP_Event_Report_Indication avp_PCC_3GPP_Event_Report_Indication,
+ AAA_3GPP_MDT_Configuration avp_AAA_3GPP_MDT_Configuration,
+ PCC_3GPP_Usage_Monitoring_Report avp_PCC_3GPP_Usage_Monitoring_Report,
+ AAA_3GPP_Adjacent_Access_Restriction_Data avp_AAA_3GPP_Adjacent_Access_Restriction_Data,
+ AAA_3GPP_RAT_Frequency_Selection_Priority_ID avp_AAA_3GPP_RAT_Frequency_Selection_Priority_ID,
+ AAA_3GPP_CLR_Flags avp_AAA_3GPP_CLR_Flags,
+ PCC_3GPP_Default_EPS_Bearer_QoS avp_PCC_3GPP_Default_EPS_Bearer_QoS,
+ AAA_3GPP_ULR_Flags avp_AAA_3GPP_ULR_Flags,
+ AAA_3GPP_ICS_Indicator avp_AAA_3GPP_ICS_Indicator,
+ AAA_3GPP_Cancellation_Type avp_AAA_3GPP_Cancellation_Type,
+ BASE_NONE_E2E_Sequence avp_BASE_NONE_E2E_Sequence,
+ BASE_NONE_Origin_Realm avp_BASE_NONE_Origin_Realm,
+ AAA_3GPP_PDN_Type avp_AAA_3GPP_PDN_Type,
+ RX_3GPP_Access_Network_Charging_Identifier avp_RX_3GPP_Access_Network_Charging_Identifier,
+ S6_3GPP_AESE_Communication_Pattern_Config_Status avp_S6_3GPP_AESE_Communication_Pattern_Config_Status,
+ S6_3GPP_Enhanced_Coverage_Restriction_Data avp_S6_3GPP_Enhanced_Coverage_Restriction_Data,
+ PCC_3GPP_Bearer_Operation avp_PCC_3GPP_Bearer_Operation,
+ AAA_3GPP_Current_Location_Retrieved avp_AAA_3GPP_Current_Location_Retrieved,
+ RX_3GPP_Pre_emption_Control_Info avp_RX_3GPP_Pre_emption_Control_Info,
+ PCC_3GPP_TDF_Application_Instance_Identifier avp_PCC_3GPP_TDF_Application_Instance_Identifier,
+ BASE_NONE_Acct_Interim_Interval avp_BASE_NONE_Acct_Interim_Interval,
+ RX_3GPP_Media_Component_Number avp_RX_3GPP_Media_Component_Number,
+ AAA_3GPP_Event_Threshold_Event_1F avp_AAA_3GPP_Event_Threshold_Event_1F,
+ PCC_3GPP_Packet_Filter_Usage avp_PCC_3GPP_Packet_Filter_Usage,
+ S6_3GPP_MONTE_Location_Type avp_S6_3GPP_MONTE_Location_Type,
+ AAA_3GPP_RDS_Indicator avp_AAA_3GPP_RDS_Indicator,
+ AAA_3GPP_Reporting_Trigger avp_AAA_3GPP_Reporting_Trigger,
+ PCC_3GPP_Tunnel_Header_Length avp_PCC_3GPP_Tunnel_Header_Length,
+ PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate avp_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate,
+ AAA_3GPP_Group_PLMN_Id avp_AAA_3GPP_Group_PLMN_Id,
+ AAA_3GPP_User_Id avp_AAA_3GPP_User_Id,
+ MIPv6_NONE_MIP_Authenticator avp_MIPv6_NONE_MIP_Authenticator,
+ AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info avp_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info,
+ AAA_3GPP_EPS_User_State avp_AAA_3GPP_EPS_User_State,
+ BASE_NONE_Origin_Host avp_BASE_NONE_Origin_Host,
+ RX_3GPP_Retry_Interval avp_RX_3GPP_Retry_Interval,
+ BASE_NONE_Accounting_Session_Id avp_BASE_NONE_Accounting_Session_Id,
+ PCC_3GPP_Packet_Filter_Identifier avp_PCC_3GPP_Packet_Filter_Identifier,
+ S6_3GPP_SCEF_Reference_ID avp_S6_3GPP_SCEF_Reference_ID,
+ PCC_3GPP_Resource_Release_Notification avp_PCC_3GPP_Resource_Release_Notification,
+ PCC_3GPP_ADC_Rule_Name avp_PCC_3GPP_ADC_Rule_Name,
+ BASE_NONE_Disconnect_Cause avp_BASE_NONE_Disconnect_Cause,
+ AAA_3GPP_Error_Diagnostic avp_AAA_3GPP_Error_Diagnostic,
+ PCC_3GPP_Guaranteed_Bitrate_DL avp_PCC_3GPP_Guaranteed_Bitrate_DL,
+ RX_3GPP_Extended_Max_Supported_BW_UL avp_RX_3GPP_Extended_Max_Supported_BW_UL,
+ PCC_3GPP_UDP_Source_Port avp_PCC_3GPP_UDP_Source_Port,
+ BASE_NONE_Accounting_Record_Type avp_BASE_NONE_Accounting_Record_Type,
+ AAA_3GPP_SIPTO_Local_Network_Permission avp_AAA_3GPP_SIPTO_Local_Network_Permission,
+ PCC_3GPP_Routing_Rule_Definition avp_PCC_3GPP_Routing_Rule_Definition,
+ AAA_3GPP_VPLMN_Dynamic_Address_Allowed avp_AAA_3GPP_VPLMN_Dynamic_Address_Allowed,
+ BASE_NONE_Acct_Application_Id avp_BASE_NONE_Acct_Application_Id,
+ AAA_3GPP_Service_Type avp_AAA_3GPP_Service_Type,
+ AAA_3GPP_Immediate_Response_Preferred avp_AAA_3GPP_Immediate_Response_Preferred,
+ AAA_3GPP_XRES avp_AAA_3GPP_XRES,
+ AAA_3GPP_User_State avp_AAA_3GPP_User_State,
+ BASE_NONE_Result_Code avp_BASE_NONE_Result_Code,
+ S6_3GPP_IP_SM_GW_Realm avp_S6_3GPP_IP_SM_GW_Realm,
+ S6_3GPP_Reference_ID_Validity_Time avp_S6_3GPP_Reference_ID_Validity_Time,
+ AAA_3GPP_E_UTRAN_Cell_Global_Identity avp_AAA_3GPP_E_UTRAN_Cell_Global_Identity,
+ PCC_3GPP_TFT_Packet_Filter_Information avp_PCC_3GPP_TFT_Packet_Filter_Information,
+ RX_3GPP_Min_Desired_Bandwidth_DL avp_RX_3GPP_Min_Desired_Bandwidth_DL,
+ S6_3GPP_Group_Reporting_Guard_Timer avp_S6_3GPP_Group_Reporting_Guard_Timer,
+ BASE_NONE_Auth_Session_State avp_BASE_NONE_Auth_Session_State,
+ PCC_3GPP_Session_Linking_Indicator avp_PCC_3GPP_Session_Linking_Indicator,
+ S6_3GPP_Maximum_Number_of_Reports avp_S6_3GPP_Maximum_Number_of_Reports,
+ PCC_3GPP_PRA_Install avp_PCC_3GPP_PRA_Install,
+ AAA_3GPP_V2X_Permission avp_AAA_3GPP_V2X_Permission,
+ AAA_3GPP_LIPA_Permission avp_AAA_3GPP_LIPA_Permission,
+ PCC_3GPP_QoS_Negotiation avp_PCC_3GPP_QoS_Negotiation,
+ AAA_3GPP_3GPP2_MEID avp_AAA_3GPP_3GPP2_MEID,
+ AAA_3GPP_Subscription_Data avp_AAA_3GPP_Subscription_Data,
+ BASE_NONE_Vendor_Specific_Application_Id avp_BASE_NONE_Vendor_Specific_Application_Id,
+ AAA_3GPP_WLAN_offloadability_UTRAN avp_AAA_3GPP_WLAN_offloadability_UTRAN,
+ AAA_3GPP_CSG_Subscription_Data avp_AAA_3GPP_CSG_Subscription_Data,
+ MIPv6_NONE_Service_Selection avp_MIPv6_NONE_Service_Selection,
+ AAA_3GPP_TS_Code avp_AAA_3GPP_TS_Code,
+ S6_3GPP_IP_SM_GW_Number avp_S6_3GPP_IP_SM_GW_Number,
+ PCC_3GPP_Charging_Rule_Install avp_PCC_3GPP_Charging_Rule_Install,
+ RX_3GPP_Rx_Request_Type avp_RX_3GPP_Rx_Request_Type,
+ S6_3GPP_NIDD_Authorization_Response avp_S6_3GPP_NIDD_Authorization_Response,
+ AAA_3GPP_VPLMN_CSG_Subscription_Data avp_AAA_3GPP_VPLMN_CSG_Subscription_Data,
+ PCC_3GPP_QoS_Rule_Remove avp_PCC_3GPP_QoS_Rule_Remove,
+ S6_3GPP_Communication_Duration_Time avp_S6_3GPP_Communication_Duration_Time,
+ PCC_3GPP_Access_Availability_Change_Reason avp_PCC_3GPP_Access_Availability_Change_Reason,
+ PCC_3GPP_TDF_Application_Identifier avp_PCC_3GPP_TDF_Application_Identifier,
+ AAA_3GPP_Location_Area_Identity avp_AAA_3GPP_Location_Area_Identity,
+ RX_3GPP_Media_Component_Status avp_RX_3GPP_Media_Component_Status,
+ AAA_3GPP_eDRX_Cycle_Length_Value avp_AAA_3GPP_eDRX_Cycle_Length_Value,
+ S6_3GPP_RIR_Flags avp_S6_3GPP_RIR_Flags,
+ AAA_3GPP_Collection_Period_RRM_LTE avp_AAA_3GPP_Collection_Period_RRM_LTE,
+ PCC_3GPP_Usage_Monitoring_Level avp_PCC_3GPP_Usage_Monitoring_Level,
+ AAA_3GPP_Subscriber_Status avp_AAA_3GPP_Subscriber_Status,
+ PCC_3GPP_Extended_APN_AMBR_UL avp_PCC_3GPP_Extended_APN_AMBR_UL,
+ AAA_3GPP_LCS_PrivacyException avp_AAA_3GPP_LCS_PrivacyException,
+ AAA_3GPP_QoS_Subscribed avp_AAA_3GPP_QoS_Subscribed,
+ RX_3GPP_RR_Bandwidth avp_RX_3GPP_RR_Bandwidth,
+ PCC_3GPP_APN_Aggregate_Max_Bitrate_DL avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL,
+ S6_3GPP_SCS_Identity avp_S6_3GPP_SCS_Identity,
+ RX_3GPP_Access_Network_Charging_Address avp_RX_3GPP_Access_Network_Charging_Address,
+ PCC_3GPP_Presence_Reporting_Area_Identifier avp_PCC_3GPP_Presence_Reporting_Area_Identifier,
+ BASE_NONE_Inband_Security_Id avp_BASE_NONE_Inband_Security_Id,
+ PCC_3GPP_Charging_Rule_Name avp_PCC_3GPP_Charging_Rule_Name,
+ RX_3GPP_Ip_Domain_Id avp_RX_3GPP_Ip_Domain_Id,
+ AAA_3GPP_UE_Usage_Type avp_AAA_3GPP_UE_Usage_Type,
+ PCC_3GPP_TDF_IP_Address avp_PCC_3GPP_TDF_IP_Address,
+ S6_3GPP_Enhanced_Coverage_Restriction avp_S6_3GPP_Enhanced_Coverage_Restriction,
+ AAA_3GPP_MME_Number_for_MT_SMS avp_AAA_3GPP_MME_Number_for_MT_SMS,
+ PCC_3GPP_Security_Parameter_Index avp_PCC_3GPP_Security_Parameter_Index,
+ PCC_3GPP_Traffic_Steering_Policy_Identifier_UL avp_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL,
+ BASE_NONE_Route_Record avp_BASE_NONE_Route_Record,
+ AAA_3GPP_Carrier_Frequency avp_AAA_3GPP_Carrier_Frequency,
+ AAA_3GPP_Trace_NE_Type_List avp_AAA_3GPP_Trace_NE_Type_List,
+ AAA_3GPP_All_APN_Configurations_Included_Indicator avp_AAA_3GPP_All_APN_Configurations_Included_Indicator,
+ AAA_3GPP_NOR_Flags avp_AAA_3GPP_NOR_Flags,
+ AAA_3GPP_External_Client avp_AAA_3GPP_External_Client,
+ BASE_NONE_Authorization_Lifetime avp_BASE_NONE_Authorization_Lifetime,
+ RX_3GPP_Extended_Min_Requested_BW_DL avp_RX_3GPP_Extended_Min_Requested_BW_DL,
+ RX_3GPP_Service_URN avp_RX_3GPP_Service_URN,
+ S6_3GPP_Supported_Services avp_S6_3GPP_Supported_Services,
+ AAA_3GPP_Relay_Node_Indicator avp_AAA_3GPP_Relay_Node_Indicator,
+ PCC_3GPP_Rule_DeActivation_Time avp_PCC_3GPP_Rule_DeActivation_Time,
+ S6_3GPP_T4_Data avp_S6_3GPP_T4_Data,
+ PCC_3GPP_Fixed_User_Location_Info avp_PCC_3GPP_Fixed_User_Location_Info,
+ PCC_3GPP_Online avp_PCC_3GPP_Online,
+ PCC_3GPP_ADC_Rule_Base_Name avp_PCC_3GPP_ADC_Rule_Base_Name,
+ AAA_3GPP_SCEF_Realm avp_AAA_3GPP_SCEF_Realm,
+ S6_3GPP_Requested_Validity_Time avp_S6_3GPP_Requested_Validity_Time,
+ AAA_3GPP_Local_Time_Zone avp_AAA_3GPP_Local_Time_Zone,
+ AAA_3GPP_GERAN_Vector avp_AAA_3GPP_GERAN_Vector,
+ AAA_3GPP_EPS_Subscribed_QoS_Profile avp_AAA_3GPP_EPS_Subscribed_QoS_Profile,
+ AAA_3GPP_GPRS_Subscription_Data avp_AAA_3GPP_GPRS_Subscription_Data,
+ BASE_NONE_Accounting_Realtime_Required avp_BASE_NONE_Accounting_Realtime_Required,
+ BASE_NONE_Termination_Cause avp_BASE_NONE_Termination_Cause,
+ RX_3GPP_Specific_Action avp_RX_3GPP_Specific_Action,
+ S6_3GPP_Maximum_Detection_Time avp_S6_3GPP_Maximum_Detection_Time,
+ AAA_3GPP_Ext_PDP_Address avp_AAA_3GPP_Ext_PDP_Address,
+ PCC_3GPP_RAT_Type avp_PCC_3GPP_RAT_Type,
+ RX_3GPP_AF_Signalling_Protocol avp_RX_3GPP_AF_Signalling_Protocol,
+ AAA_3GPP_Adjacent_PLMNs avp_AAA_3GPP_Adjacent_PLMNs,
+ S6_3GPP_Service_Result_Code avp_S6_3GPP_Service_Result_Code,
+ AAA_3GPP_SGSN_Location_Information avp_AAA_3GPP_SGSN_Location_Information,
+ PCC_3GPP_Pre_emption_Vulnerability avp_PCC_3GPP_Pre_emption_Vulnerability,
+ AAA_3GPP_Equivalent_PLMN_List avp_AAA_3GPP_Equivalent_PLMN_List,
+ PCC_3GPP_Default_Access avp_PCC_3GPP_Default_Access,
+ BASE_NONE_Class avp_BASE_NONE_Class,
+ AAA_3GPP_IDR_Flags avp_AAA_3GPP_IDR_Flags,
+ AAA_3GPP_V2X_Subscription_Data avp_AAA_3GPP_V2X_Subscription_Data,
+ PCC_3GPP_PS_to_CS_Session_Continuity avp_PCC_3GPP_PS_to_CS_Session_Continuity,
+ AAA_3GPP_PDP_Type avp_AAA_3GPP_PDP_Type,
+ AAA_3GPP_AMBR avp_AAA_3GPP_AMBR,
+ octetstring avp_UNKNOWN
+}
+type union GenericAVP {
+ AVP avp,
+ Undefined_AVP avp_undefined,
+ octetstring avp_UNKNOWN
+}
+type record Undefined_AVP {
+ OCTET4 avp_code,
+ BIT8 VMPxxxxx,
+ UINT24 avp_length,
+ OCTET4 vendor_id optional,
+ octetstring avp_data
+} with {
+ variant "PADDING(dword32)"
+ variant (vendor_id) "PRESENCE( {
+ VMPxxxxx = '10000000'B,
+ VMPxxxxx = '10100000'B,
+ VMPxxxxx = '11000000'B,
+ VMPxxxxx = '11100000'B
+ } )"
+ variant (avp_length) "LENGTHTO(avp_code, VMPxxxxx, avp_length, vendor_id, avp_data)"
+}
+type record AVP {
+ AVP_Header avp_header,
+ AVP_Data avp_data
+} with {
+ variant "PADDING(dword32)"
+ variant (avp_header) "LENGTHTO(avp_header, avp_data)"
+ variant (avp_header) "LENGTHINDEX(avp_length)"
+ variant (avp_data) "CROSSTAG(
+ avp_MIPv6_NONE_MIP_Careof_Address, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Careof_Address;
+ avp_PCC_3GPP_Bearer_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Bearer_Identifier;
+ avp_RX_3GPP_Content_Version, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Content_Version;
+ avp_BASE_NONE_Session_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Session_Id;
+ avp_RX_3GPP_Media_Component_Description, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Media_Component_Description;
+ avp_PCC_3GPP_CSG_Information_Reporting, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_CSG_Information_Reporting;
+ avp_AAA_3GPP_Measurement_Quantity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Measurement_Quantity;
+ avp_S6_3GPP_Location_Information_Configuration, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Location_Information_Configuration;
+ avp_PCC_3GPP_Bearer_Usage, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Bearer_Usage;
+ avp_PCC_3GPP_Tunnel_Header_Filter, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Tunnel_Header_Filter;
+ avp_AAA_3GPP_List_Of_Measurements, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_List_Of_Measurements;
+ avp_PCC_3GPP_Default_QoS_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Default_QoS_Name;
+ avp_AAA_3GPP_UVA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UVA_Flags;
+ avp_AAA_3GPP_Group_Service_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Group_Service_Id;
+ avp_PCC_3GPP_TDF_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_Information;
+ avp_AAA_3GPP_Requested_EUTRAN_Authentication_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Requested_EUTRAN_Authentication_Info;
+ avp_AAA_3GPP_Last_UE_Activity_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Last_UE_Activity_Time;
+ avp_AAA_3GPP_Context_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Context_Identifier;
+ avp_BASE_NONE_Auth_Application_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Auth_Application_Id;
+ avp_AAA_3GPP_Trace_Reference, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Reference;
+ avp_RX_3GPP_Sharing_Key_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Sharing_Key_UL;
+ avp_RX_3GPP_AF_Charging_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_AF_Charging_Identifier;
+ avp_S6_3GPP_Monitoring_Event_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Monitoring_Event_Report;
+ avp_RX_3GPP_Media_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Media_Type;
+ avp_PCC_3GPP_Conditional_Policy_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Conditional_Policy_Information;
+ avp_BASE_NONE_Firmware_Revision, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Firmware_Revision;
+ avp_AAA_3GPP_SIPTO_Permission, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SIPTO_Permission;
+ avp_PCC_3GPP_Network_Request_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Network_Request_Support;
+ avp_RX_3GPP_Extended_Max_Supported_BW_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Max_Supported_BW_DL;
+ avp_PCC_3GPP_UE_Local_IP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_UE_Local_IP_Address;
+ avp_PCC_3GPP_Presence_Reporting_Area_Elements_List, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Presence_Reporting_Area_Elements_List;
+ avp_AAA_3GPP_SGs_MME_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SGs_MME_Identity;
+ avp_PCC_3GPP_Routing_Rule_Remove, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Remove;
+ avp_S6_3GPP_Roaming_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Roaming_Information;
+ avp_AAA_3GPP_Event_Threshold_RSRP, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Event_Threshold_RSRP;
+ avp_AAA_3GPP_PLMN_Client, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PLMN_Client;
+ avp_AAA_3GPP_Re_Synchronization_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Re_Synchronization_Info;
+ avp_BASE_NONE_Auth_Grace_Period, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Auth_Grace_Period;
+ avp_AAA_3GPP_RAND, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_RAND;
+ avp_AAA_3GPP_Trace_Depth, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Depth;
+ avp_AAA_3GPP_SGSN_User_State, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SGSN_User_State;
+ avp_AAA_3GPP_APN_OI_Replacement, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_APN_OI_Replacement;
+ avp_BASE_NONE_Re_Auth_Request_Type, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Re_Auth_Request_Type;
+ avp_S6_3GPP_External_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_External_Identifier;
+ avp_MIPv6_NONE_MIP_MN_HA_MSA, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_MN_HA_MSA;
+ avp_PCC_3GPP_TFT_Filter, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TFT_Filter;
+ avp_RX_3GPP_Max_Supported_Bandwidth_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Max_Supported_Bandwidth_UL;
+ avp_S6_3GPP_Loss_Of_Connectivity_Reason, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Loss_Of_Connectivity_Reason;
+ avp_RX_3GPP_Flow_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Flow_Number;
+ avp_PCC_3GPP_Resource_Allocation_Notification, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Resource_Allocation_Notification;
+ avp_S6_3GPP_Monitoring_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Monitoring_Type;
+ avp_PCC_3GPP_Default_Bearer_Indication, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Default_Bearer_Indication;
+ avp_AAA_3GPP_VPLMN_LIPA_Allowed, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_VPLMN_LIPA_Allowed;
+ avp_PCC_3GPP_QoS_Class_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Class_Identifier;
+ avp_PCC_3GPP_Mute_Notification, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Mute_Notification;
+ avp_MIPv6_NONE_QoS_Resources, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_QoS_Resources;
+ avp_AAA_3GPP_Logging_Duration, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Logging_Duration;
+ avp_AAA_3GPP_WLAN_offloadability_EUTRAN, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_WLAN_offloadability_EUTRAN;
+ avp_PCC_3GPP_Routing_IP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_IP_Address;
+ avp_MIPv6_NONE_MIP_Session_Key, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Session_Key;
+ avp_AAA_3GPP_KASME, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_KASME;
+ avp_AAA_3GPP_Teleservice_List, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Teleservice_List;
+ avp_AAA_3GPP_UTRAN_Vector, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UTRAN_Vector;
+ avp_RX_3GPP_Application_Service_Provider_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Application_Service_Provider_Identity;
+ avp_S6_3GPP_NIDD_Authorization_Request, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_NIDD_Authorization_Request;
+ avp_PCC_3GPP_QoS_Rule_Install, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Install;
+ avp_S6_3GPP_Periodic_Communication_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Periodic_Communication_Indicator;
+ avp_RX_3GPP_Flow_Usage, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Flow_Usage;
+ avp_PCC_3GPP_RAN_Rule_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_RAN_Rule_Support;
+ avp_S6_3GPP_Monitoring_Duration, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Monitoring_Duration;
+ avp_AAA_3GPP_Routing_Area_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Routing_Area_Identity;
+ avp_PCC_3GPP_QoS_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Information;
+ avp_RX_3GPP_Service_Authorization_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Service_Authorization_Info;
+ avp_BASE_NONE_Multi_Round_Time_Out, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Multi_Round_Time_Out;
+ avp_AAA_3GPP_eDRX_Cycle_Length, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_eDRX_Cycle_Length;
+ avp_S6_3GPP_Group_Monitoring_Event_Report_Item, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Group_Monitoring_Event_Report_Item;
+ avp_AAA_3GPP_Ext_PDP_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Ext_PDP_Type;
+ avp_PCC_3GPP_Rule_Failure_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Rule_Failure_Code;
+ avp_PCC_3GPP_User_Location_Info_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_User_Location_Info_Time;
+ avp_AAA_3GPP_Measurement_Period_LTE, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Measurement_Period_LTE;
+ avp_PCC_3GPP_Usage_Monitoring_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Usage_Monitoring_Information;
+ avp_BASE_NONE_Experimental_Result_Code, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Experimental_Result_Code;
+ avp_PCC_3GPP_Extended_APN_AMBR_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Extended_APN_AMBR_DL;
+ avp_AAA_3GPP_GMLC_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_GMLC_Number;
+ avp_AAA_3GPP_Software_Version, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Software_Version;
+ avp_AAA_3GPP_Expiration_Date, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Expiration_Date;
+ avp_BASE_NONE_Error_Message, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Error_Message;
+ avp_AAA_3GPP_SRES, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SRES;
+ avp_AAA_3GPP_Item_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Item_Number;
+ avp_S6_3GPP_Service_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_ID;
+ avp_RX_3GPP_Abort_Cause, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Abort_Cause;
+ avp_PCC_3GPP_Charging_Rule_Base_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Base_Name;
+ avp_RX_3GPP_Required_Access_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Required_Access_Info;
+ avp_PCC_3GPP_TDF_Destination_Realm, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_Destination_Realm;
+ avp_S6_3GPP_S6t_HSS_Cause, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_S6t_HSS_Cause;
+ avp_RX_3GPP_AF_Requested_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_AF_Requested_Data;
+ avp_PCC_3GPP_QoS_Rule_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Report;
+ avp_S6_3GPP_Stationary_Indication, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Stationary_Indication;
+ avp_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL;
+ avp_AAA_3GPP_Geodetic_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Geodetic_Information;
+ avp_PCC_3GPP_Extended_GBR_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Extended_GBR_UL;
+ avp_AAA_3GPP_MBSFN_Area_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MBSFN_Area_ID;
+ avp_AAA_3GPP_Area_Scope, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Area_Scope;
+ avp_AAA_3GPP_PUA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PUA_Flags;
+ avp_AAA_3GPP_Notification_To_UE_User, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Notification_To_UE_User;
+ avp_AAA_3GPP_Visited_PLMN_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Visited_PLMN_Id;
+ avp_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions;
+ avp_RX_3GPP_Codec_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Codec_Data;
+ avp_S6_3GPP_Monitoring_Event_Config_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Monitoring_Event_Config_Status;
+ avp_BASE_NONE_Error_Reporting_Host, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Error_Reporting_Host;
+ avp_PCC_3GPP_Rule_Activation_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Rule_Activation_Time;
+ avp_S6_3GPP_Service_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_Data;
+ avp_RX_3GPP_AF_Application_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_AF_Application_Identifier;
+ avp_PCC_3GPP_NetLoc_Access_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_NetLoc_Access_Support;
+ avp_S6_3GPP_Monitoring_Event_Configuration, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Monitoring_Event_Configuration;
+ avp_PCC_3GPP_Offline, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Offline;
+ avp_AAA_3GPP_Additional_Context_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Additional_Context_ID;
+ avp_PCC_3GPP_ADC_Rule_Definition, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Definition;
+ avp_S6_3GPP_Allowed_PLMN_List, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Allowed_PLMN_List;
+ avp_AAA_3GPP_Active_APN, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Active_APN;
+ avp_PCC_3GPP_Bearer_Control_Mode, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Bearer_Control_Mode;
+ avp_PCC_3GPP_HeNB_Local_IP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_HeNB_Local_IP_Address;
+ avp_AAA_3GPP_SMS_Register_Request, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SMS_Register_Request;
+ avp_PCC_3GPP_Packet_Filter_Content, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Packet_Filter_Content;
+ avp_AAA_3GPP_APN_Configuration, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_APN_Configuration;
+ avp_AAA_3GPP_OMC_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_OMC_Id;
+ avp_AAA_3GPP_GMLC_Restriction, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_GMLC_Restriction;
+ avp_AAA_3GPP_Regional_Subscription_Zone_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Regional_Subscription_Zone_Code;
+ avp_BASE_NONE_Proxy_State, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Proxy_State;
+ avp_S6_3GPP_SIR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_SIR_Flags;
+ avp_RX_3GPP_MPS_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_MPS_Identifier;
+ avp_AAA_3GPP_MDT_Allowed_PLMN_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MDT_Allowed_PLMN_Id;
+ avp_PCC_3GPP_Credit_Management_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Credit_Management_Status;
+ avp_S6_3GPP_Service_Result, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_Result;
+ avp_AAA_3GPP_MME_Location_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MME_Location_Information;
+ avp_PCC_3GPP_Reporting_Level, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Reporting_Level;
+ avp_RX_3GPP_Max_Supported_Bandwidth_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Max_Supported_Bandwidth_DL;
+ avp_AAA_3GPP_Subscribed_VSRVCC, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscribed_VSRVCC;
+ avp_PCC_3GPP_Pre_emption_Capability, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Pre_emption_Capability;
+ avp_PCC_3GPP_Monitoring_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Monitoring_Flags;
+ avp_BASE_NONE_Redirect_Max_Cache_Time, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Redirect_Max_Cache_Time;
+ avp_PCC_3GPP_TCP_Source_Port, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TCP_Source_Port;
+ avp_PCC_3GPP_Application_Detection_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Application_Detection_Information;
+ avp_AAA_3GPP_Emergency_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Emergency_Info;
+ avp_AAA_3GPP_MPS_Priority, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MPS_Priority;
+ avp_AAA_3GPP_Alert_Reason, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Alert_Reason;
+ avp_AAA_3GPP_MO_LR, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MO_LR;
+ avp_BASE_NONE_Host_IP_Address, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Host_IP_Address;
+ avp_RX_3GPP_Max_Requested_Bandwidth_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Max_Requested_Bandwidth_UL;
+ avp_PCC_3GPP_Usage_Monitoring_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Usage_Monitoring_Support;
+ avp_S6_3GPP_Maximum_Response_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Maximum_Response_Time;
+ avp_RX_3GPP_Sponsor_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Sponsor_Identity;
+ avp_PCC_3GPP_CoA_IP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_CoA_IP_Address;
+ avp_PCC_3GPP_Default_QoS_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Default_QoS_Information;
+ avp_PCC_3GPP_AN_GW_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_AN_GW_Address;
+ avp_PCC_3GPP_NBIFOM_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_NBIFOM_Support;
+ avp_PCC_3GPP_Redirect_Support, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Redirect_Support;
+ avp_AAA_3GPP_IMSI_Group_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_IMSI_Group_Id;
+ avp_AAA_3GPP_Cell_Global_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Cell_Global_Identity;
+ avp_BASE_NONE_Vendor_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Vendor_Id;
+ avp_AAA_3GPP_PDN_Connection_Continuity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PDN_Connection_Continuity;
+ avp_AAA_3GPP_DSA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_DSA_Flags;
+ avp_AAA_3GPP_Trace_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Data;
+ avp_AAA_3GPP_LCS_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_LCS_Info;
+ avp_AAA_3GPP_PDN_GW_Allocation_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PDN_GW_Allocation_Type;
+ avp_BASE_NONE_Event_Timestamp, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Event_Timestamp;
+ avp_RX_3GPP_Extended_Max_Requested_BW_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Max_Requested_BW_UL;
+ avp_S6_3GPP_User_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_User_Identifier;
+ avp_PCC_3GPP_QoS_Rule_Base_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Base_Name;
+ avp_AAA_3GPP_Restoration_Priority, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Restoration_Priority;
+ avp_MIPv6_NONE_MIP_MN_HA_SPI, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_MN_HA_SPI;
+ avp_S6_3GPP_Association_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Association_Type;
+ avp_PCC_3GPP_Charging_Rule_Definition, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Definition;
+ avp_RX_3GPP_Min_Requested_Bandwidth_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Min_Requested_Bandwidth_UL;
+ avp_AAA_3GPP_Report_Amount, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Report_Amount;
+ avp_PCC_3GPP_CoA_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_CoA_Information;
+ avp_AAA_3GPP_A_MSISDN, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_A_MSISDN;
+ avp_MIPv6_NONE_MIP_Mobile_Node_Address, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Mobile_Node_Address;
+ avp_PCC_3GPP_Routing_Rule_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Report;
+ avp_AAA_3GPP_Number_Of_Requested_Vectors, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Number_Of_Requested_Vectors;
+ avp_AAA_3GPP_AIR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_AIR_Flags;
+ avp_AAA_3GPP_Geographical_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Geographical_Information;
+ avp_AAA_3GPP_MME_User_State, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MME_User_State;
+ avp_AAA_3GPP_Access_Restriction_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Access_Restriction_Data;
+ avp_BASE_NONE_Failed_AVP, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Failed_AVP;
+ avp_AAA_3GPP_SS_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SS_Status;
+ avp_S6_3GPP_NIDD_Authorization_Update, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_NIDD_Authorization_Update;
+ avp_PCC_3GPP_Packet_Filter_Operation, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Packet_Filter_Operation;
+ avp_S6_3GPP_SCEF_Reference_ID_for_Deletion, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_SCEF_Reference_ID_for_Deletion;
+ avp_RX_3GPP_SIP_Forking_Indication, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_SIP_Forking_Indication;
+ avp_S6_3GPP_IMEI_Change, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_IMEI_Change;
+ avp_PCC_3GPP_IP_CAN_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_IP_CAN_Type;
+ avp_RX_3GPP_Extended_Min_Desired_BW_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Min_Desired_BW_UL;
+ avp_PCC_3GPP_Revalidation_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Revalidation_Time;
+ avp_AAA_3GPP_Logging_Interval, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Logging_Interval;
+ avp_PCC_3GPP_Presence_Reporting_Area_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Presence_Reporting_Area_Status;
+ avp_AAA_3GPP_WLAN_offloadability, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_WLAN_offloadability;
+ avp_PCC_3GPP_Routing_Filter, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Filter;
+ avp_PCC_3GPP_Metering_Method, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Metering_Method;
+ avp_AAA_3GPP_Non_IP_Data_Delivery_Mechanism, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Non_IP_Data_Delivery_Mechanism;
+ avp_BASE_NONE_Session_Server_Failover, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Session_Server_Failover;
+ avp_AAA_3GPP_E_UTRAN_Vector, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_E_UTRAN_Vector;
+ avp_BASE_NONE_Experimental_Result, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Experimental_Result;
+ avp_AAA_3GPP_Trace_Event_List, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Event_List;
+ avp_MIPv6_NONE_MIP_Replay_Mode, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Replay_Mode;
+ avp_BASE_NONE_Proxy_Host, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Proxy_Host;
+ avp_S6_3GPP_Communication_Pattern_Set, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Communication_Pattern_Set;
+ avp_RX_3GPP_Flow_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Flow_Status;
+ avp_RX_3GPP_MCPTT_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_MCPTT_Identifier;
+ avp_S6_3GPP_Group_Monitoring_Event_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Group_Monitoring_Event_Report;
+ avp_PCC_3GPP_QoS_Upgrade, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Upgrade;
+ avp_PCC_3GPP_AN_GW_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_AN_GW_Status;
+ avp_AAA_3GPP_Measurement_Period_UMTS, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Measurement_Period_UMTS;
+ avp_PCC_3GPP_Monitoring_Key, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Monitoring_Key;
+ avp_PCC_3GPP_3GPP_PS_Data_Off_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_3GPP_PS_Data_Off_Status;
+ avp_AAA_3GPP_Reset_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Reset_ID;
+ avp_PCC_3GPP_Routing_Rule_Install, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Install;
+ avp_AAA_3GPP_PUR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PUR_Flags;
+ avp_PCC_3GPP_IP_CAN_Session_Charging_Scope, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_IP_CAN_Session_Charging_Scope;
+ avp_AAA_3GPP_IMEI, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_IMEI;
+ avp_AAA_3GPP_Kc, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Kc;
+ avp_AAA_3GPP_SGSN_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SGSN_Number;
+ avp_AAA_3GPP_HPLMN_ODB, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_HPLMN_ODB;
+ avp_AAA_3GPP_PDP_Context, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PDP_Context;
+ avp_BASE_NONE_Proxy_Info, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Proxy_Info;
+ avp_S6_3GPP_Node_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Node_Type;
+ avp_RX_3GPP_Priority_Sharing_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Priority_Sharing_Indicator;
+ avp_PCC_3GPP_QoS_Rule_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Name;
+ avp_S6_3GPP_Scheduled_Communication_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Scheduled_Communication_Time;
+ avp_RX_3GPP_Max_Requested_Bandwidth_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Max_Requested_Bandwidth_DL;
+ avp_S6_3GPP_Maximum_Latency, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Maximum_Latency;
+ avp_PCC_3GPP_PCC_Rule_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PCC_Rule_Status;
+ avp_PCC_3GPP_Extended_GBR_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Extended_GBR_DL;
+ avp_AAA_3GPP_MBSFN_Area, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MBSFN_Area;
+ avp_S6_3GPP_APN_Validity_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_APN_Validity_Time;
+ avp_AAA_3GPP_Job_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Job_Type;
+ avp_PCC_3GPP_Allocation_Retention_Priority, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Allocation_Retention_Priority;
+ avp_BASE_NONE_Destination_Host, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Destination_Host;
+ avp_AAA_3GPP_Positioning_Method, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Positioning_Method;
+ avp_AAA_3GPP_DL_Buffering_Suggested_Packet_Count, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_DL_Buffering_Suggested_Packet_Count;
+ avp_AAA_3GPP_IDA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_IDA_Flags;
+ avp_AAA_3GPP_ULA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_ULA_Flags;
+ avp_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported;
+ avp_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature;
+ avp_S6_3GPP_T4_Parameters, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_T4_Parameters;
+ avp_RX_3GPP_Access_Network_Charging_Identifier_Value, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Access_Network_Charging_Identifier_Value;
+ avp_S6_3GPP_AESE_Error_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_AESE_Error_Report;
+ avp_RX_3GPP_Sharing_Key_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Sharing_Key_DL;
+ avp_PCC_3GPP_ADC_Rule_Remove, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Remove;
+ avp_S6_3GPP_Restricted_PLMN_List, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Restricted_PLMN_List;
+ avp_AAA_3GPP_Age_Of_Location_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Age_Of_Location_Information;
+ avp_PCC_3GPP_Access_Network_Charging_Identifier_Gx, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Access_Network_Charging_Identifier_Gx;
+ avp_RX_3GPP_Extended_Max_Requested_BW_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Max_Requested_BW_DL;
+ avp_PCC_3GPP_Flow_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Flow_Information;
+ avp_PCC_3GPP_Execution_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Execution_Time;
+ avp_BASE_NONE_Accounting_Record_Number, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Accounting_Record_Number;
+ avp_AAA_3GPP_Event_Threshold_Event_1I, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Event_Threshold_Event_1I;
+ avp_PCC_3GPP_Charging_Correlation_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Correlation_Indicator;
+ avp_AAA_3GPP_Report_Interval, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Report_Interval;
+ avp_PCC_3GPP_RAN_NAS_Release_Cause, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_RAN_NAS_Release_Cause;
+ avp_AAA_3GPP_Client_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Client_Identity;
+ avp_BASE_NONE_Redirect_Host_Usage, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Redirect_Host_Usage;
+ avp_AAA_3GPP_Equipment_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Equipment_Status;
+ avp_MIPv6_NONE_MIP6_Auth_Mode, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP6_Auth_Mode;
+ avp_AAA_3GPP_EPS_Location_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_EPS_Location_Information;
+ avp_BASE_NONE_Session_Timeout, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Session_Timeout;
+ avp_RX_3GPP_Service_Info_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Service_Info_Status;
+ avp_S6_3GPP_CIR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_CIR_Flags;
+ avp_PCC_3GPP_Precedence, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Precedence;
+ avp_RX_3GPP_Sponsoring_Action, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Sponsoring_Action;
+ avp_S6_3GPP_Granted_Validity_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Granted_Validity_Time;
+ avp_PCC_3GPP_Priority_Level, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Priority_Level;
+ avp_RX_3GPP_Flow_Description, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Flow_Description;
+ avp_AAA_3GPP_Daylight_Saving_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Daylight_Saving_Time;
+ avp_PCC_3GPP_Packet_Filter_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Packet_Filter_Information;
+ avp_S6_3GPP_SCEF_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_SCEF_ID;
+ avp_PCC_3GPP_Removal_Of_Access, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Removal_Of_Access;
+ avp_AAA_3GPP_Preferred_Data_Mode, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Preferred_Data_Mode;
+ avp_PCC_3GPP_ADC_Rule_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Report;
+ avp_AAA_3GPP_UE_SRVCC_Capability, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UE_SRVCC_Capability;
+ avp_PCC_3GPP_Guaranteed_Bitrate_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Guaranteed_Bitrate_UL;
+ avp_MIPv6_NONE_MIP_MAC_Mobility_Data, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_MAC_Mobility_Data;
+ avp_AAA_3GPP_Coupled_Node_Diameter_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Coupled_Node_Diameter_ID;
+ avp_AAA_3GPP_STN_SR, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_STN_SR;
+ avp_BASE_NONE_Supported_Vendor_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Supported_Vendor_Id;
+ avp_AAA_3GPP_ServiceTypeIdentity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_ServiceTypeIdentity;
+ avp_AAA_3GPP_AUTN, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_AUTN;
+ avp_RX_3GPP_Sponsored_Connectivity_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Sponsored_Connectivity_Data;
+ avp_BASE_NONE_Auth_Request_Type, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Auth_Request_Type;
+ avp_S6_3GPP_AESE_Communication_Pattern, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_AESE_Communication_Pattern;
+ avp_PCC_3GPP_NBIFOM_Mode, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_NBIFOM_Mode;
+ avp_PCC_3GPP_Redirect_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Redirect_Information;
+ avp_S6_3GPP_Event_Handling, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Event_Handling;
+ avp_AAA_3GPP_Tracking_Area_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Tracking_Area_Identity;
+ avp_PCC_3GPP_ToS_Traffic_Class, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ToS_Traffic_Class;
+ avp_RX_3GPP_Min_Desired_Bandwidth_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Min_Desired_Bandwidth_UL;
+ avp_AAA_3GPP_UVR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UVR_Flags;
+ avp_AAA_3GPP_Subscription_Data_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscription_Data_Flags;
+ avp_PCC_3GPP_PDN_Connection_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PDN_Connection_ID;
+ avp_AAA_3GPP_DSR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_DSR_Flags;
+ avp_PCC_3GPP_PRA_Remove, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PRA_Remove;
+ avp_MIPv6_NONE_MIP_Timestamp, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Timestamp;
+ avp_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer;
+ avp_AAA_3GPP_Specific_APN_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Specific_APN_Info;
+ avp_AAA_3GPP_Terminal_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Terminal_Information;
+ avp_BASE_NONE_Product_Name, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Product_Name;
+ avp_AAA_3GPP_CSG_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_CSG_Id;
+ avp_AAA_3GPP_Call_Barring_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Call_Barring_Info;
+ avp_BASE_NONE_Origin_State_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Origin_State_Id;
+ avp_S6_3GPP_IP_SM_GW_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_IP_SM_GW_Name;
+ avp_RX_3GPP_Media_Sub_Component, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Media_Sub_Component;
+ avp_S6_3GPP_Accuracy, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Accuracy;
+ avp_PCC_3GPP_Charging_Rule_Remove, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Remove;
+ avp_RX_3GPP_Min_Requested_Bandwidth_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Min_Requested_Bandwidth_DL;
+ avp_S6_3GPP_Service_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_Report;
+ avp_PCC_3GPP_Tunnel_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Tunnel_Information;
+ avp_AAA_3GPP_Time_Zone, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Time_Zone;
+ avp_PCC_3GPP_QoS_Rule_Definition, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Definition;
+ avp_S6_3GPP_Periodic_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Periodic_Time;
+ avp_PCC_3GPP_Routing_Rule_Failure_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Failure_Code;
+ avp_PCC_3GPP_TDF_Destination_Host, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_Destination_Host;
+ avp_AAA_3GPP_Local_Group_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Local_Group_Id;
+ avp_AAA_3GPP_Service_Area_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Service_Area_Identity;
+ avp_PCC_3GPP_Charging_Rule_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Report;
+ avp_BASE_NONE_User_Name, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_User_Name;
+ avp_AAA_3GPP_UE_PC5_AMBR, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UE_PC5_AMBR;
+ avp_BASE_NONE_Accounting_Sub_Session_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Accounting_Sub_Session_Id;
+ avp_AAA_3GPP_Collection_Period_RRM_UMTS, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Collection_Period_RRM_UMTS;
+ avp_AAA_3GPP_Operator_Determined_Barring, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Operator_Determined_Barring;
+ avp_BASE_NONE_Session_Binding, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Session_Binding;
+ avp_AAA_3GPP_SS_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SS_Code;
+ avp_BASE_NONE_Acct_Multi_Session_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Acct_Multi_Session_Id;
+ avp_RX_3GPP_RS_Bandwidth, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_RS_Bandwidth;
+ avp_MIPv6_NONE_MIP_Algorithm_Type, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Algorithm_Type;
+ avp_S6_3GPP_Reachability_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Reachability_Information;
+ avp_RX_3GPP_Extended_Min_Desired_BW_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Min_Desired_BW_DL;
+ avp_AAA_3GPP_Event_Threshold_RSRQ, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Event_Threshold_RSRQ;
+ avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL;
+ avp_S6_3GPP_Service_Parameters, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_Parameters;
+ avp_PCC_3GPP_Presence_Reporting_Area_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Presence_Reporting_Area_Information;
+ avp_PCC_3GPP_Routing_Rule_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Identifier;
+ avp_PCC_3GPP_Event_Trigger, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Event_Trigger;
+ avp_RX_3GPP_GCS_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_GCS_Identifier;
+ avp_MIPv6_NONE_QoS_Capability, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_QoS_Capability;
+ avp_AAA_3GPP_Non_IP_PDN_Type_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Non_IP_PDN_Type_Indicator;
+ avp_PCC_3GPP_ADC_Rule_Install, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Install;
+ avp_PCC_3GPP_Flow_Label, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Flow_Label;
+ avp_AAA_3GPP_Authentication_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Authentication_Info;
+ avp_AAA_3GPP_Trace_Interface_List, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Interface_List;
+ avp_AAA_3GPP_APN_Configuration_Profile, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_APN_Configuration_Profile;
+ avp_RX_3GPP_Flows, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Flows;
+ avp_S6_3GPP_CIA_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_CIA_Flags;
+ avp_RX_3GPP_Extended_Min_Requested_BW_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Min_Requested_BW_UL;
+ avp_PCC_3GPP_Monitoring_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Monitoring_Time;
+ avp_S6_3GPP_UE_Reachability_Configuration, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_UE_Reachability_Configuration;
+ avp_BASE_NONE_Destination_Realm, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Destination_Realm;
+ avp_RX_3GPP_Acceptable_Service_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Acceptable_Service_Info;
+ avp_PCC_3GPP_Flow_Direction, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Flow_Direction;
+ avp_S6_3GPP_Supported_Monitoring_Events, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Supported_Monitoring_Events;
+ avp_PCC_3GPP_Session_Release_Cause, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Session_Release_Cause;
+ avp_AAA_3GPP_MDT_User_Consent, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MDT_User_Consent;
+ avp_S6_3GPP_HSS_Cause, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_HSS_Cause;
+ avp_PCC_3GPP_PCSCF_Restoration_Indication, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PCSCF_Restoration_Indication;
+ avp_AAA_3GPP_Subscription_Data_Deletion, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscription_Data_Deletion;
+ avp_MIPv6_NONE_Chargable_User_Identity, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_Chargable_User_Identity;
+ avp_AAA_3GPP_Trace_Collection_Entity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_Collection_Entity;
+ avp_BASE_NONE_Redirect_Host, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Redirect_Host;
+ avp_AAA_3GPP_Network_Access_Mode, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Network_Access_Mode;
+ avp_AAA_3GPP_Complete_Data_List_Included_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Complete_Data_List_Included_Indicator;
+ avp_MIPv6_NONE_MIP_MN_AAA_SPI, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_MN_AAA_SPI;
+ avp_MIPv6_NONE_MIP_MSA_Lifetime, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_MSA_Lifetime;
+ avp_S6_3GPP_Reachability_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Reachability_Type;
+ avp_S6_3GPP_Type_Of_External_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Type_Of_External_Identifier;
+ avp_PCC_3GPP_Event_Report_Indication, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Event_Report_Indication;
+ avp_AAA_3GPP_MDT_Configuration, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MDT_Configuration;
+ avp_PCC_3GPP_Usage_Monitoring_Report, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Usage_Monitoring_Report;
+ avp_AAA_3GPP_Adjacent_Access_Restriction_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Adjacent_Access_Restriction_Data;
+ avp_AAA_3GPP_RAT_Frequency_Selection_Priority_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_RAT_Frequency_Selection_Priority_ID;
+ avp_AAA_3GPP_CLR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_CLR_Flags;
+ avp_PCC_3GPP_Default_EPS_Bearer_QoS, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Default_EPS_Bearer_QoS;
+ avp_AAA_3GPP_ULR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_ULR_Flags;
+ avp_AAA_3GPP_ICS_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_ICS_Indicator;
+ avp_AAA_3GPP_Cancellation_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Cancellation_Type;
+ avp_BASE_NONE_E2E_Sequence, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_E2E_Sequence;
+ avp_BASE_NONE_Origin_Realm, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Origin_Realm;
+ avp_AAA_3GPP_PDN_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PDN_Type;
+ avp_RX_3GPP_Access_Network_Charging_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Access_Network_Charging_Identifier;
+ avp_S6_3GPP_AESE_Communication_Pattern_Config_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_AESE_Communication_Pattern_Config_Status;
+ avp_S6_3GPP_Enhanced_Coverage_Restriction_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Enhanced_Coverage_Restriction_Data;
+ avp_PCC_3GPP_Bearer_Operation, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Bearer_Operation;
+ avp_AAA_3GPP_Current_Location_Retrieved, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Current_Location_Retrieved;
+ avp_RX_3GPP_Pre_emption_Control_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Pre_emption_Control_Info;
+ avp_PCC_3GPP_TDF_Application_Instance_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_Application_Instance_Identifier;
+ avp_BASE_NONE_Acct_Interim_Interval, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Acct_Interim_Interval;
+ avp_RX_3GPP_Media_Component_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Media_Component_Number;
+ avp_AAA_3GPP_Event_Threshold_Event_1F, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Event_Threshold_Event_1F;
+ avp_PCC_3GPP_Packet_Filter_Usage, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Packet_Filter_Usage;
+ avp_S6_3GPP_MONTE_Location_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_MONTE_Location_Type;
+ avp_AAA_3GPP_RDS_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_RDS_Indicator;
+ avp_AAA_3GPP_Reporting_Trigger, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Reporting_Trigger;
+ avp_PCC_3GPP_Tunnel_Header_Length, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Tunnel_Header_Length;
+ avp_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate;
+ avp_AAA_3GPP_Group_PLMN_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Group_PLMN_Id;
+ avp_AAA_3GPP_User_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_User_Id;
+ avp_MIPv6_NONE_MIP_Authenticator, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_MIP_Authenticator;
+ avp_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info;
+ avp_AAA_3GPP_EPS_User_State, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_EPS_User_State;
+ avp_BASE_NONE_Origin_Host, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Origin_Host;
+ avp_RX_3GPP_Retry_Interval, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Retry_Interval;
+ avp_BASE_NONE_Accounting_Session_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Accounting_Session_Id;
+ avp_PCC_3GPP_Packet_Filter_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Packet_Filter_Identifier;
+ avp_S6_3GPP_SCEF_Reference_ID, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_SCEF_Reference_ID;
+ avp_PCC_3GPP_Resource_Release_Notification, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Resource_Release_Notification;
+ avp_PCC_3GPP_ADC_Rule_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Name;
+ avp_BASE_NONE_Disconnect_Cause, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Disconnect_Cause;
+ avp_AAA_3GPP_Error_Diagnostic, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Error_Diagnostic;
+ avp_PCC_3GPP_Guaranteed_Bitrate_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Guaranteed_Bitrate_DL;
+ avp_RX_3GPP_Extended_Max_Supported_BW_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Max_Supported_BW_UL;
+ avp_PCC_3GPP_UDP_Source_Port, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_UDP_Source_Port;
+ avp_BASE_NONE_Accounting_Record_Type, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Accounting_Record_Type;
+ avp_AAA_3GPP_SIPTO_Local_Network_Permission, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SIPTO_Local_Network_Permission;
+ avp_PCC_3GPP_Routing_Rule_Definition, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Routing_Rule_Definition;
+ avp_AAA_3GPP_VPLMN_Dynamic_Address_Allowed, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_VPLMN_Dynamic_Address_Allowed;
+ avp_BASE_NONE_Acct_Application_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Acct_Application_Id;
+ avp_AAA_3GPP_Service_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Service_Type;
+ avp_AAA_3GPP_Immediate_Response_Preferred, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Immediate_Response_Preferred;
+ avp_AAA_3GPP_XRES, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_XRES;
+ avp_AAA_3GPP_User_State, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_User_State;
+ avp_BASE_NONE_Result_Code, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Result_Code;
+ avp_S6_3GPP_IP_SM_GW_Realm, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_IP_SM_GW_Realm;
+ avp_S6_3GPP_Reference_ID_Validity_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Reference_ID_Validity_Time;
+ avp_AAA_3GPP_E_UTRAN_Cell_Global_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_E_UTRAN_Cell_Global_Identity;
+ avp_PCC_3GPP_TFT_Packet_Filter_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TFT_Packet_Filter_Information;
+ avp_RX_3GPP_Min_Desired_Bandwidth_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Min_Desired_Bandwidth_DL;
+ avp_S6_3GPP_Group_Reporting_Guard_Timer, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Group_Reporting_Guard_Timer;
+ avp_BASE_NONE_Auth_Session_State, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Auth_Session_State;
+ avp_PCC_3GPP_Session_Linking_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Session_Linking_Indicator;
+ avp_S6_3GPP_Maximum_Number_of_Reports, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Maximum_Number_of_Reports;
+ avp_PCC_3GPP_PRA_Install, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PRA_Install;
+ avp_AAA_3GPP_V2X_Permission, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_V2X_Permission;
+ avp_AAA_3GPP_LIPA_Permission, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_LIPA_Permission;
+ avp_PCC_3GPP_QoS_Negotiation, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Negotiation;
+ avp_AAA_3GPP_3GPP2_MEID, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_3GPP2_MEID;
+ avp_AAA_3GPP_Subscription_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscription_Data;
+ avp_BASE_NONE_Vendor_Specific_Application_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Vendor_Specific_Application_Id;
+ avp_AAA_3GPP_WLAN_offloadability_UTRAN, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_WLAN_offloadability_UTRAN;
+ avp_AAA_3GPP_CSG_Subscription_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_CSG_Subscription_Data;
+ avp_MIPv6_NONE_Service_Selection, avp_header.avp_code.vendor_id_NONE = avp_code_MIPv6_NONE_Service_Selection;
+ avp_AAA_3GPP_TS_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_TS_Code;
+ avp_S6_3GPP_IP_SM_GW_Number, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_IP_SM_GW_Number;
+ avp_PCC_3GPP_Charging_Rule_Install, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Install;
+ avp_RX_3GPP_Rx_Request_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Rx_Request_Type;
+ avp_S6_3GPP_NIDD_Authorization_Response, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_NIDD_Authorization_Response;
+ avp_AAA_3GPP_VPLMN_CSG_Subscription_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_VPLMN_CSG_Subscription_Data;
+ avp_PCC_3GPP_QoS_Rule_Remove, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_QoS_Rule_Remove;
+ avp_S6_3GPP_Communication_Duration_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Communication_Duration_Time;
+ avp_PCC_3GPP_Access_Availability_Change_Reason, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Access_Availability_Change_Reason;
+ avp_PCC_3GPP_TDF_Application_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_Application_Identifier;
+ avp_AAA_3GPP_Location_Area_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Location_Area_Identity;
+ avp_RX_3GPP_Media_Component_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Media_Component_Status;
+ avp_AAA_3GPP_eDRX_Cycle_Length_Value, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_eDRX_Cycle_Length_Value;
+ avp_S6_3GPP_RIR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_RIR_Flags;
+ avp_AAA_3GPP_Collection_Period_RRM_LTE, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Collection_Period_RRM_LTE;
+ avp_PCC_3GPP_Usage_Monitoring_Level, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Usage_Monitoring_Level;
+ avp_AAA_3GPP_Subscriber_Status, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Subscriber_Status;
+ avp_PCC_3GPP_Extended_APN_AMBR_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Extended_APN_AMBR_UL;
+ avp_AAA_3GPP_LCS_PrivacyException, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_LCS_PrivacyException;
+ avp_AAA_3GPP_QoS_Subscribed, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_QoS_Subscribed;
+ avp_RX_3GPP_RR_Bandwidth, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_RR_Bandwidth;
+ avp_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL;
+ avp_S6_3GPP_SCS_Identity, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_SCS_Identity;
+ avp_RX_3GPP_Access_Network_Charging_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Access_Network_Charging_Address;
+ avp_PCC_3GPP_Presence_Reporting_Area_Identifier, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Presence_Reporting_Area_Identifier;
+ avp_BASE_NONE_Inband_Security_Id, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Inband_Security_Id;
+ avp_PCC_3GPP_Charging_Rule_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Charging_Rule_Name;
+ avp_RX_3GPP_Ip_Domain_Id, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Ip_Domain_Id;
+ avp_AAA_3GPP_UE_Usage_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_UE_Usage_Type;
+ avp_PCC_3GPP_TDF_IP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_TDF_IP_Address;
+ avp_S6_3GPP_Enhanced_Coverage_Restriction, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Enhanced_Coverage_Restriction;
+ avp_AAA_3GPP_MME_Number_for_MT_SMS, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_MME_Number_for_MT_SMS;
+ avp_PCC_3GPP_Security_Parameter_Index, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Security_Parameter_Index;
+ avp_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL;
+ avp_BASE_NONE_Route_Record, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Route_Record;
+ avp_AAA_3GPP_Carrier_Frequency, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Carrier_Frequency;
+ avp_AAA_3GPP_Trace_NE_Type_List, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Trace_NE_Type_List;
+ avp_AAA_3GPP_All_APN_Configurations_Included_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_All_APN_Configurations_Included_Indicator;
+ avp_AAA_3GPP_NOR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_NOR_Flags;
+ avp_AAA_3GPP_External_Client, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_External_Client;
+ avp_BASE_NONE_Authorization_Lifetime, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Authorization_Lifetime;
+ avp_RX_3GPP_Extended_Min_Requested_BW_DL, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Extended_Min_Requested_BW_DL;
+ avp_RX_3GPP_Service_URN, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Service_URN;
+ avp_S6_3GPP_Supported_Services, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Supported_Services;
+ avp_AAA_3GPP_Relay_Node_Indicator, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Relay_Node_Indicator;
+ avp_PCC_3GPP_Rule_DeActivation_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Rule_DeActivation_Time;
+ avp_S6_3GPP_T4_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_T4_Data;
+ avp_PCC_3GPP_Fixed_User_Location_Info, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Fixed_User_Location_Info;
+ avp_PCC_3GPP_Online, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Online;
+ avp_PCC_3GPP_ADC_Rule_Base_Name, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_ADC_Rule_Base_Name;
+ avp_AAA_3GPP_SCEF_Realm, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SCEF_Realm;
+ avp_S6_3GPP_Requested_Validity_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Requested_Validity_Time;
+ avp_AAA_3GPP_Local_Time_Zone, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Local_Time_Zone;
+ avp_AAA_3GPP_GERAN_Vector, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_GERAN_Vector;
+ avp_AAA_3GPP_EPS_Subscribed_QoS_Profile, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_EPS_Subscribed_QoS_Profile;
+ avp_AAA_3GPP_GPRS_Subscription_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_GPRS_Subscription_Data;
+ avp_BASE_NONE_Accounting_Realtime_Required, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Accounting_Realtime_Required;
+ avp_BASE_NONE_Termination_Cause, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Termination_Cause;
+ avp_RX_3GPP_Specific_Action, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_Specific_Action;
+ avp_S6_3GPP_Maximum_Detection_Time, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Maximum_Detection_Time;
+ avp_AAA_3GPP_Ext_PDP_Address, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Ext_PDP_Address;
+ avp_PCC_3GPP_RAT_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_RAT_Type;
+ avp_RX_3GPP_AF_Signalling_Protocol, avp_header.avp_code.vendor_id_3GPP = avp_code_RX_3GPP_AF_Signalling_Protocol;
+ avp_AAA_3GPP_Adjacent_PLMNs, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Adjacent_PLMNs;
+ avp_S6_3GPP_Service_Result_Code, avp_header.avp_code.vendor_id_3GPP = avp_code_S6_3GPP_Service_Result_Code;
+ avp_AAA_3GPP_SGSN_Location_Information, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_SGSN_Location_Information;
+ avp_PCC_3GPP_Pre_emption_Vulnerability, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Pre_emption_Vulnerability;
+ avp_AAA_3GPP_Equivalent_PLMN_List, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_Equivalent_PLMN_List;
+ avp_PCC_3GPP_Default_Access, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_Default_Access;
+ avp_BASE_NONE_Class, avp_header.avp_code.vendor_id_NONE = avp_code_BASE_NONE_Class;
+ avp_AAA_3GPP_IDR_Flags, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_IDR_Flags;
+ avp_AAA_3GPP_V2X_Subscription_Data, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_V2X_Subscription_Data;
+ avp_PCC_3GPP_PS_to_CS_Session_Continuity, avp_header.avp_code.vendor_id_3GPP = avp_code_PCC_3GPP_PS_to_CS_Session_Continuity;
+ avp_AAA_3GPP_PDP_Type, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_PDP_Type;
+ avp_AAA_3GPP_AMBR, avp_header.avp_code.vendor_id_3GPP = avp_code_AAA_3GPP_AMBR;
+ avp_UNKNOWN, OTHERWISE
+ )"
+}
+type set of GenericAVP AVP_list;
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Careof_Address := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Careof_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_Bearer_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Bearer_Identifier };
+const AVP_Code c_AVP_Code_RX_3GPP_Content_Version := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Content_Version };
+const AVP_Code c_AVP_Code_BASE_NONE_Session_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Session_Id };
+const AVP_Code c_AVP_Code_RX_3GPP_Media_Component_Description := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Media_Component_Description };
+const AVP_Code c_AVP_Code_PCC_3GPP_CSG_Information_Reporting := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_CSG_Information_Reporting };
+const AVP_Code c_AVP_Code_AAA_3GPP_Measurement_Quantity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Measurement_Quantity };
+const AVP_Code c_AVP_Code_S6_3GPP_Location_Information_Configuration := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Location_Information_Configuration };
+const AVP_Code c_AVP_Code_PCC_3GPP_Bearer_Usage := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Bearer_Usage };
+const AVP_Code c_AVP_Code_PCC_3GPP_Tunnel_Header_Filter := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Tunnel_Header_Filter };
+const AVP_Code c_AVP_Code_AAA_3GPP_List_Of_Measurements := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_List_Of_Measurements };
+const AVP_Code c_AVP_Code_PCC_3GPP_Default_QoS_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Default_QoS_Name };
+const AVP_Code c_AVP_Code_AAA_3GPP_UVA_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UVA_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Group_Service_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Group_Service_Id };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_Requested_EUTRAN_Authentication_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Requested_EUTRAN_Authentication_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_Last_UE_Activity_Time := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Last_UE_Activity_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Context_Identifier := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Context_Identifier };
+const AVP_Code c_AVP_Code_BASE_NONE_Auth_Application_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Auth_Application_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Reference := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Reference };
+const AVP_Code c_AVP_Code_RX_3GPP_Sharing_Key_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Sharing_Key_UL };
+const AVP_Code c_AVP_Code_RX_3GPP_AF_Charging_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_AF_Charging_Identifier };
+const AVP_Code c_AVP_Code_S6_3GPP_Monitoring_Event_Report := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Monitoring_Event_Report };
+const AVP_Code c_AVP_Code_RX_3GPP_Media_Type := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Media_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_Conditional_Policy_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Conditional_Policy_Information };
+const AVP_Code c_AVP_Code_BASE_NONE_Firmware_Revision := {
+ vendor_id_NONE := avp_code_BASE_NONE_Firmware_Revision };
+const AVP_Code c_AVP_Code_AAA_3GPP_SIPTO_Permission := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SIPTO_Permission };
+const AVP_Code c_AVP_Code_PCC_3GPP_Network_Request_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Network_Request_Support };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Max_Supported_BW_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Max_Supported_BW_DL };
+const AVP_Code c_AVP_Code_PCC_3GPP_UE_Local_IP_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_UE_Local_IP_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_Presence_Reporting_Area_Elements_List := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Presence_Reporting_Area_Elements_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_SGs_MME_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SGs_MME_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Remove := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Remove };
+const AVP_Code c_AVP_Code_S6_3GPP_Roaming_Information := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Roaming_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_Event_Threshold_RSRP := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Event_Threshold_RSRP };
+const AVP_Code c_AVP_Code_AAA_3GPP_PLMN_Client := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PLMN_Client };
+const AVP_Code c_AVP_Code_AAA_3GPP_Re_Synchronization_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Re_Synchronization_Info };
+const AVP_Code c_AVP_Code_BASE_NONE_Auth_Grace_Period := {
+ vendor_id_NONE := avp_code_BASE_NONE_Auth_Grace_Period };
+const AVP_Code c_AVP_Code_AAA_3GPP_RAND := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_RAND };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Depth := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Depth };
+const AVP_Code c_AVP_Code_AAA_3GPP_SGSN_User_State := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SGSN_User_State };
+const AVP_Code c_AVP_Code_AAA_3GPP_APN_OI_Replacement := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_APN_OI_Replacement };
+const AVP_Code c_AVP_Code_BASE_NONE_Re_Auth_Request_Type := {
+ vendor_id_NONE := avp_code_BASE_NONE_Re_Auth_Request_Type };
+const AVP_Code c_AVP_Code_S6_3GPP_External_Identifier := {
+ vendor_id_3GPP := avp_code_S6_3GPP_External_Identifier };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_MN_HA_MSA := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_MN_HA_MSA };
+const AVP_Code c_AVP_Code_PCC_3GPP_TFT_Filter := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TFT_Filter };
+const AVP_Code c_AVP_Code_RX_3GPP_Max_Supported_Bandwidth_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Max_Supported_Bandwidth_UL };
+const AVP_Code c_AVP_Code_S6_3GPP_Loss_Of_Connectivity_Reason := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Loss_Of_Connectivity_Reason };
+const AVP_Code c_AVP_Code_RX_3GPP_Flow_Number := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Flow_Number };
+const AVP_Code c_AVP_Code_PCC_3GPP_Resource_Allocation_Notification := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Resource_Allocation_Notification };
+const AVP_Code c_AVP_Code_S6_3GPP_Monitoring_Type := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Monitoring_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_Default_Bearer_Indication := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Default_Bearer_Indication };
+const AVP_Code c_AVP_Code_AAA_3GPP_VPLMN_LIPA_Allowed := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_VPLMN_LIPA_Allowed };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Class_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Class_Identifier };
+const AVP_Code c_AVP_Code_PCC_3GPP_Mute_Notification := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Mute_Notification };
+const AVP_Code c_AVP_Code_MIPv6_NONE_QoS_Resources := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_QoS_Resources };
+const AVP_Code c_AVP_Code_AAA_3GPP_Logging_Duration := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Logging_Duration };
+const AVP_Code c_AVP_Code_AAA_3GPP_WLAN_offloadability_EUTRAN := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_WLAN_offloadability_EUTRAN };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_IP_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_IP_Address };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Session_Key := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Session_Key };
+const AVP_Code c_AVP_Code_AAA_3GPP_KASME := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_KASME };
+const AVP_Code c_AVP_Code_AAA_3GPP_Teleservice_List := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Teleservice_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_UTRAN_Vector := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UTRAN_Vector };
+const AVP_Code c_AVP_Code_RX_3GPP_Application_Service_Provider_Identity := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Application_Service_Provider_Identity };
+const AVP_Code c_AVP_Code_S6_3GPP_NIDD_Authorization_Request := {
+ vendor_id_3GPP := avp_code_S6_3GPP_NIDD_Authorization_Request };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Install := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Install };
+const AVP_Code c_AVP_Code_S6_3GPP_Periodic_Communication_Indicator := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Periodic_Communication_Indicator };
+const AVP_Code c_AVP_Code_RX_3GPP_Flow_Usage := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Flow_Usage };
+const AVP_Code c_AVP_Code_PCC_3GPP_RAN_Rule_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_RAN_Rule_Support };
+const AVP_Code c_AVP_Code_S6_3GPP_Monitoring_Duration := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Monitoring_Duration };
+const AVP_Code c_AVP_Code_AAA_3GPP_Routing_Area_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Routing_Area_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Information };
+const AVP_Code c_AVP_Code_RX_3GPP_Service_Authorization_Info := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Service_Authorization_Info };
+const AVP_Code c_AVP_Code_BASE_NONE_Multi_Round_Time_Out := {
+ vendor_id_NONE := avp_code_BASE_NONE_Multi_Round_Time_Out };
+const AVP_Code c_AVP_Code_AAA_3GPP_eDRX_Cycle_Length := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_eDRX_Cycle_Length };
+const AVP_Code c_AVP_Code_S6_3GPP_Group_Monitoring_Event_Report_Item := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Group_Monitoring_Event_Report_Item };
+const AVP_Code c_AVP_Code_AAA_3GPP_Ext_PDP_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Ext_PDP_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_Rule_Failure_Code := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Rule_Failure_Code };
+const AVP_Code c_AVP_Code_PCC_3GPP_User_Location_Info_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_User_Location_Info_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Measurement_Period_LTE := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Measurement_Period_LTE };
+const AVP_Code c_AVP_Code_PCC_3GPP_Usage_Monitoring_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Usage_Monitoring_Information };
+const AVP_Code c_AVP_Code_BASE_NONE_Experimental_Result_Code := {
+ vendor_id_NONE := avp_code_BASE_NONE_Experimental_Result_Code };
+const AVP_Code c_AVP_Code_PCC_3GPP_Extended_APN_AMBR_DL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Extended_APN_AMBR_DL };
+const AVP_Code c_AVP_Code_AAA_3GPP_GMLC_Number := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_GMLC_Number };
+const AVP_Code c_AVP_Code_AAA_3GPP_Software_Version := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Software_Version };
+const AVP_Code c_AVP_Code_AAA_3GPP_Expiration_Date := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Expiration_Date };
+const AVP_Code c_AVP_Code_BASE_NONE_Error_Message := {
+ vendor_id_NONE := avp_code_BASE_NONE_Error_Message };
+const AVP_Code c_AVP_Code_AAA_3GPP_SRES := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SRES };
+const AVP_Code c_AVP_Code_AAA_3GPP_Item_Number := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Item_Number };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_ID := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_ID };
+const AVP_Code c_AVP_Code_RX_3GPP_Abort_Cause := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Abort_Cause };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Base_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Base_Name };
+const AVP_Code c_AVP_Code_RX_3GPP_Required_Access_Info := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Required_Access_Info };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_Destination_Realm := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_Destination_Realm };
+const AVP_Code c_AVP_Code_S6_3GPP_S6t_HSS_Cause := {
+ vendor_id_3GPP := avp_code_S6_3GPP_S6t_HSS_Cause };
+const AVP_Code c_AVP_Code_RX_3GPP_AF_Requested_Data := {
+ vendor_id_3GPP := avp_code_RX_3GPP_AF_Requested_Data };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Report := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Report };
+const AVP_Code c_AVP_Code_S6_3GPP_Stationary_Indication := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Stationary_Indication };
+const AVP_Code c_AVP_Code_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_DL };
+const AVP_Code c_AVP_Code_AAA_3GPP_Geodetic_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Geodetic_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Extended_GBR_UL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Extended_GBR_UL };
+const AVP_Code c_AVP_Code_AAA_3GPP_MBSFN_Area_ID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MBSFN_Area_ID };
+const AVP_Code c_AVP_Code_AAA_3GPP_Area_Scope := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Area_Scope };
+const AVP_Code c_AVP_Code_AAA_3GPP_PUA_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PUA_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Notification_To_UE_User := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Notification_To_UE_User };
+const AVP_Code c_AVP_Code_AAA_3GPP_Visited_PLMN_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Visited_PLMN_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Homogeneous_Support_of_IMS_Voice_Over_PS_Sessions };
+const AVP_Code c_AVP_Code_RX_3GPP_Codec_Data := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Codec_Data };
+const AVP_Code c_AVP_Code_S6_3GPP_Monitoring_Event_Config_Status := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Monitoring_Event_Config_Status };
+const AVP_Code c_AVP_Code_BASE_NONE_Error_Reporting_Host := {
+ vendor_id_NONE := avp_code_BASE_NONE_Error_Reporting_Host };
+const AVP_Code c_AVP_Code_PCC_3GPP_Rule_Activation_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Rule_Activation_Time };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_Data := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_Data };
+const AVP_Code c_AVP_Code_RX_3GPP_AF_Application_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_AF_Application_Identifier };
+const AVP_Code c_AVP_Code_PCC_3GPP_NetLoc_Access_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_NetLoc_Access_Support };
+const AVP_Code c_AVP_Code_S6_3GPP_Monitoring_Event_Configuration := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Monitoring_Event_Configuration };
+const AVP_Code c_AVP_Code_PCC_3GPP_Offline := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Offline };
+const AVP_Code c_AVP_Code_AAA_3GPP_Additional_Context_ID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Additional_Context_ID };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Definition := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Definition };
+const AVP_Code c_AVP_Code_S6_3GPP_Allowed_PLMN_List := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Allowed_PLMN_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_Active_APN := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Active_APN };
+const AVP_Code c_AVP_Code_PCC_3GPP_Bearer_Control_Mode := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Bearer_Control_Mode };
+const AVP_Code c_AVP_Code_PCC_3GPP_HeNB_Local_IP_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_HeNB_Local_IP_Address };
+const AVP_Code c_AVP_Code_AAA_3GPP_SMS_Register_Request := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SMS_Register_Request };
+const AVP_Code c_AVP_Code_PCC_3GPP_Packet_Filter_Content := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Packet_Filter_Content };
+const AVP_Code c_AVP_Code_AAA_3GPP_APN_Configuration := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_APN_Configuration };
+const AVP_Code c_AVP_Code_AAA_3GPP_OMC_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_OMC_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_GMLC_Restriction := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_GMLC_Restriction };
+const AVP_Code c_AVP_Code_AAA_3GPP_Regional_Subscription_Zone_Code := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Regional_Subscription_Zone_Code };
+const AVP_Code c_AVP_Code_BASE_NONE_Proxy_State := {
+ vendor_id_NONE := avp_code_BASE_NONE_Proxy_State };
+const AVP_Code c_AVP_Code_S6_3GPP_SIR_Flags := {
+ vendor_id_3GPP := avp_code_S6_3GPP_SIR_Flags };
+const AVP_Code c_AVP_Code_RX_3GPP_MPS_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_MPS_Identifier };
+const AVP_Code c_AVP_Code_AAA_3GPP_MDT_Allowed_PLMN_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MDT_Allowed_PLMN_Id };
+const AVP_Code c_AVP_Code_PCC_3GPP_Credit_Management_Status := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Credit_Management_Status };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_Result := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_Result };
+const AVP_Code c_AVP_Code_AAA_3GPP_MME_Location_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MME_Location_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Reporting_Level := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Reporting_Level };
+const AVP_Code c_AVP_Code_RX_3GPP_Max_Supported_Bandwidth_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Max_Supported_Bandwidth_DL };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscribed_VSRVCC := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscribed_VSRVCC };
+const AVP_Code c_AVP_Code_PCC_3GPP_Pre_emption_Capability := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Pre_emption_Capability };
+const AVP_Code c_AVP_Code_PCC_3GPP_Monitoring_Flags := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Monitoring_Flags };
+const AVP_Code c_AVP_Code_BASE_NONE_Redirect_Max_Cache_Time := {
+ vendor_id_NONE := avp_code_BASE_NONE_Redirect_Max_Cache_Time };
+const AVP_Code c_AVP_Code_PCC_3GPP_TCP_Source_Port := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TCP_Source_Port };
+const AVP_Code c_AVP_Code_PCC_3GPP_Application_Detection_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Application_Detection_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_Emergency_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Emergency_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_MPS_Priority := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MPS_Priority };
+const AVP_Code c_AVP_Code_AAA_3GPP_Alert_Reason := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Alert_Reason };
+const AVP_Code c_AVP_Code_AAA_3GPP_MO_LR := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MO_LR };
+const AVP_Code c_AVP_Code_BASE_NONE_Host_IP_Address := {
+ vendor_id_NONE := avp_code_BASE_NONE_Host_IP_Address };
+const AVP_Code c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Max_Requested_Bandwidth_UL };
+const AVP_Code c_AVP_Code_PCC_3GPP_Usage_Monitoring_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Usage_Monitoring_Support };
+const AVP_Code c_AVP_Code_S6_3GPP_Maximum_Response_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Maximum_Response_Time };
+const AVP_Code c_AVP_Code_RX_3GPP_Sponsor_Identity := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Sponsor_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_CoA_IP_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_CoA_IP_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_Default_QoS_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Default_QoS_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_AN_GW_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_AN_GW_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_NBIFOM_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_NBIFOM_Support };
+const AVP_Code c_AVP_Code_PCC_3GPP_Redirect_Support := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Redirect_Support };
+const AVP_Code c_AVP_Code_AAA_3GPP_IMSI_Group_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_IMSI_Group_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Cell_Global_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Cell_Global_Identity };
+const AVP_Code c_AVP_Code_BASE_NONE_Vendor_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Vendor_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_PDN_Connection_Continuity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PDN_Connection_Continuity };
+const AVP_Code c_AVP_Code_AAA_3GPP_DSA_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_DSA_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Data };
+const AVP_Code c_AVP_Code_AAA_3GPP_LCS_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_LCS_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_PDN_GW_Allocation_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PDN_GW_Allocation_Type };
+const AVP_Code c_AVP_Code_BASE_NONE_Event_Timestamp := {
+ vendor_id_NONE := avp_code_BASE_NONE_Event_Timestamp };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Max_Requested_BW_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Max_Requested_BW_UL };
+const AVP_Code c_AVP_Code_S6_3GPP_User_Identifier := {
+ vendor_id_3GPP := avp_code_S6_3GPP_User_Identifier };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Base_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Base_Name };
+const AVP_Code c_AVP_Code_AAA_3GPP_Restoration_Priority := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Restoration_Priority };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_MN_HA_SPI := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_MN_HA_SPI };
+const AVP_Code c_AVP_Code_S6_3GPP_Association_Type := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Association_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Definition := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Definition };
+const AVP_Code c_AVP_Code_RX_3GPP_Min_Requested_Bandwidth_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Min_Requested_Bandwidth_UL };
+const AVP_Code c_AVP_Code_AAA_3GPP_Report_Amount := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Report_Amount };
+const AVP_Code c_AVP_Code_PCC_3GPP_CoA_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_CoA_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_A_MSISDN := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_A_MSISDN };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Mobile_Node_Address := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Mobile_Node_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Report := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Report };
+const AVP_Code c_AVP_Code_AAA_3GPP_Number_Of_Requested_Vectors := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Number_Of_Requested_Vectors };
+const AVP_Code c_AVP_Code_AAA_3GPP_AIR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_AIR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Geographical_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Geographical_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_MME_User_State := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MME_User_State };
+const AVP_Code c_AVP_Code_AAA_3GPP_Access_Restriction_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Access_Restriction_Data };
+const AVP_Code c_AVP_Code_BASE_NONE_Failed_AVP := {
+ vendor_id_NONE := avp_code_BASE_NONE_Failed_AVP };
+const AVP_Code c_AVP_Code_AAA_3GPP_SS_Status := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SS_Status };
+const AVP_Code c_AVP_Code_S6_3GPP_NIDD_Authorization_Update := {
+ vendor_id_3GPP := avp_code_S6_3GPP_NIDD_Authorization_Update };
+const AVP_Code c_AVP_Code_PCC_3GPP_Packet_Filter_Operation := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Packet_Filter_Operation };
+const AVP_Code c_AVP_Code_S6_3GPP_SCEF_Reference_ID_for_Deletion := {
+ vendor_id_3GPP := avp_code_S6_3GPP_SCEF_Reference_ID_for_Deletion };
+const AVP_Code c_AVP_Code_RX_3GPP_SIP_Forking_Indication := {
+ vendor_id_3GPP := avp_code_RX_3GPP_SIP_Forking_Indication };
+const AVP_Code c_AVP_Code_S6_3GPP_IMEI_Change := {
+ vendor_id_3GPP := avp_code_S6_3GPP_IMEI_Change };
+const AVP_Code c_AVP_Code_PCC_3GPP_IP_CAN_Type := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_IP_CAN_Type };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Min_Desired_BW_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Min_Desired_BW_UL };
+const AVP_Code c_AVP_Code_PCC_3GPP_Revalidation_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Revalidation_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Logging_Interval := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Logging_Interval };
+const AVP_Code c_AVP_Code_PCC_3GPP_Presence_Reporting_Area_Status := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Presence_Reporting_Area_Status };
+const AVP_Code c_AVP_Code_AAA_3GPP_WLAN_offloadability := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_WLAN_offloadability };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Filter := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Filter };
+const AVP_Code c_AVP_Code_PCC_3GPP_Metering_Method := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Metering_Method };
+const AVP_Code c_AVP_Code_AAA_3GPP_Non_IP_Data_Delivery_Mechanism := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Non_IP_Data_Delivery_Mechanism };
+const AVP_Code c_AVP_Code_BASE_NONE_Session_Server_Failover := {
+ vendor_id_NONE := avp_code_BASE_NONE_Session_Server_Failover };
+const AVP_Code c_AVP_Code_AAA_3GPP_E_UTRAN_Vector := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_E_UTRAN_Vector };
+const AVP_Code c_AVP_Code_BASE_NONE_Experimental_Result := {
+ vendor_id_NONE := avp_code_BASE_NONE_Experimental_Result };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Event_List := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Event_List };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Replay_Mode := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Replay_Mode };
+const AVP_Code c_AVP_Code_BASE_NONE_Proxy_Host := {
+ vendor_id_NONE := avp_code_BASE_NONE_Proxy_Host };
+const AVP_Code c_AVP_Code_S6_3GPP_Communication_Pattern_Set := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Communication_Pattern_Set };
+const AVP_Code c_AVP_Code_RX_3GPP_Flow_Status := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Flow_Status };
+const AVP_Code c_AVP_Code_RX_3GPP_MCPTT_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_MCPTT_Identifier };
+const AVP_Code c_AVP_Code_S6_3GPP_Group_Monitoring_Event_Report := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Group_Monitoring_Event_Report };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Upgrade := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Upgrade };
+const AVP_Code c_AVP_Code_PCC_3GPP_AN_GW_Status := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_AN_GW_Status };
+const AVP_Code c_AVP_Code_AAA_3GPP_Measurement_Period_UMTS := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Measurement_Period_UMTS };
+const AVP_Code c_AVP_Code_PCC_3GPP_Monitoring_Key := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Monitoring_Key };
+const AVP_Code c_AVP_Code_PCC_3GPP_3GPP_PS_Data_Off_Status := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_3GPP_PS_Data_Off_Status };
+const AVP_Code c_AVP_Code_AAA_3GPP_Reset_ID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Reset_ID };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Install := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Install };
+const AVP_Code c_AVP_Code_AAA_3GPP_PUR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PUR_Flags };
+const AVP_Code c_AVP_Code_PCC_3GPP_IP_CAN_Session_Charging_Scope := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_IP_CAN_Session_Charging_Scope };
+const AVP_Code c_AVP_Code_AAA_3GPP_IMEI := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_IMEI };
+const AVP_Code c_AVP_Code_AAA_3GPP_Kc := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Kc };
+const AVP_Code c_AVP_Code_AAA_3GPP_SGSN_Number := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SGSN_Number };
+const AVP_Code c_AVP_Code_AAA_3GPP_HPLMN_ODB := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_HPLMN_ODB };
+const AVP_Code c_AVP_Code_AAA_3GPP_PDP_Context := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PDP_Context };
+const AVP_Code c_AVP_Code_BASE_NONE_Proxy_Info := {
+ vendor_id_NONE := avp_code_BASE_NONE_Proxy_Info };
+const AVP_Code c_AVP_Code_S6_3GPP_Node_Type := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Node_Type };
+const AVP_Code c_AVP_Code_RX_3GPP_Priority_Sharing_Indicator := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Priority_Sharing_Indicator };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Name };
+const AVP_Code c_AVP_Code_S6_3GPP_Scheduled_Communication_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Scheduled_Communication_Time };
+const AVP_Code c_AVP_Code_RX_3GPP_Max_Requested_Bandwidth_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Max_Requested_Bandwidth_DL };
+const AVP_Code c_AVP_Code_S6_3GPP_Maximum_Latency := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Maximum_Latency };
+const AVP_Code c_AVP_Code_PCC_3GPP_PCC_Rule_Status := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PCC_Rule_Status };
+const AVP_Code c_AVP_Code_PCC_3GPP_Extended_GBR_DL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Extended_GBR_DL };
+const AVP_Code c_AVP_Code_AAA_3GPP_MBSFN_Area := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MBSFN_Area };
+const AVP_Code c_AVP_Code_S6_3GPP_APN_Validity_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_APN_Validity_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Job_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Job_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_Allocation_Retention_Priority := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Allocation_Retention_Priority };
+const AVP_Code c_AVP_Code_BASE_NONE_Destination_Host := {
+ vendor_id_NONE := avp_code_BASE_NONE_Destination_Host };
+const AVP_Code c_AVP_Code_AAA_3GPP_Positioning_Method := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Positioning_Method };
+const AVP_Code c_AVP_Code_AAA_3GPP_DL_Buffering_Suggested_Packet_Count := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_DL_Buffering_Suggested_Packet_Count };
+const AVP_Code c_AVP_Code_AAA_3GPP_IDA_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_IDA_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_ULA_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_ULA_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_IMS_Voice_Over_PS_Sessions_Supported };
+const AVP_Code c_AVP_Code_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Roaming_Restricted_Due_To_Unsupported_Feature };
+const AVP_Code c_AVP_Code_S6_3GPP_T4_Parameters := {
+ vendor_id_3GPP := avp_code_S6_3GPP_T4_Parameters };
+const AVP_Code c_AVP_Code_RX_3GPP_Access_Network_Charging_Identifier_Value := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Access_Network_Charging_Identifier_Value };
+const AVP_Code c_AVP_Code_S6_3GPP_AESE_Error_Report := {
+ vendor_id_3GPP := avp_code_S6_3GPP_AESE_Error_Report };
+const AVP_Code c_AVP_Code_RX_3GPP_Sharing_Key_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Sharing_Key_DL };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Remove := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Remove };
+const AVP_Code c_AVP_Code_S6_3GPP_Restricted_PLMN_List := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Restricted_PLMN_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_Age_Of_Location_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Age_Of_Location_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Access_Network_Charging_Identifier_Gx := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Access_Network_Charging_Identifier_Gx };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Max_Requested_BW_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Max_Requested_BW_DL };
+const AVP_Code c_AVP_Code_PCC_3GPP_Flow_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Flow_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Execution_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Execution_Time };
+const AVP_Code c_AVP_Code_BASE_NONE_Accounting_Record_Number := {
+ vendor_id_NONE := avp_code_BASE_NONE_Accounting_Record_Number };
+const AVP_Code c_AVP_Code_AAA_3GPP_Event_Threshold_Event_1I := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Event_Threshold_Event_1I };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Correlation_Indicator := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Correlation_Indicator };
+const AVP_Code c_AVP_Code_AAA_3GPP_Report_Interval := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Report_Interval };
+const AVP_Code c_AVP_Code_PCC_3GPP_RAN_NAS_Release_Cause := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_RAN_NAS_Release_Cause };
+const AVP_Code c_AVP_Code_AAA_3GPP_Client_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Client_Identity };
+const AVP_Code c_AVP_Code_BASE_NONE_Redirect_Host_Usage := {
+ vendor_id_NONE := avp_code_BASE_NONE_Redirect_Host_Usage };
+const AVP_Code c_AVP_Code_AAA_3GPP_Equipment_Status := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Equipment_Status };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP6_Auth_Mode := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP6_Auth_Mode };
+const AVP_Code c_AVP_Code_AAA_3GPP_EPS_Location_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_EPS_Location_Information };
+const AVP_Code c_AVP_Code_BASE_NONE_Session_Timeout := {
+ vendor_id_NONE := avp_code_BASE_NONE_Session_Timeout };
+const AVP_Code c_AVP_Code_RX_3GPP_Service_Info_Status := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Service_Info_Status };
+const AVP_Code c_AVP_Code_S6_3GPP_CIR_Flags := {
+ vendor_id_3GPP := avp_code_S6_3GPP_CIR_Flags };
+const AVP_Code c_AVP_Code_PCC_3GPP_Precedence := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Precedence };
+const AVP_Code c_AVP_Code_RX_3GPP_Sponsoring_Action := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Sponsoring_Action };
+const AVP_Code c_AVP_Code_S6_3GPP_Granted_Validity_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Granted_Validity_Time };
+const AVP_Code c_AVP_Code_PCC_3GPP_Priority_Level := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Priority_Level };
+const AVP_Code c_AVP_Code_RX_3GPP_Flow_Description := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Flow_Description };
+const AVP_Code c_AVP_Code_AAA_3GPP_Daylight_Saving_Time := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Daylight_Saving_Time };
+const AVP_Code c_AVP_Code_PCC_3GPP_Packet_Filter_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Packet_Filter_Information };
+const AVP_Code c_AVP_Code_S6_3GPP_SCEF_ID := {
+ vendor_id_3GPP := avp_code_S6_3GPP_SCEF_ID };
+const AVP_Code c_AVP_Code_PCC_3GPP_Removal_Of_Access := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Removal_Of_Access };
+const AVP_Code c_AVP_Code_AAA_3GPP_Preferred_Data_Mode := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Preferred_Data_Mode };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Report := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Report };
+const AVP_Code c_AVP_Code_AAA_3GPP_UE_SRVCC_Capability := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UE_SRVCC_Capability };
+const AVP_Code c_AVP_Code_PCC_3GPP_Guaranteed_Bitrate_UL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Guaranteed_Bitrate_UL };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_MAC_Mobility_Data := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_MAC_Mobility_Data };
+const AVP_Code c_AVP_Code_AAA_3GPP_Coupled_Node_Diameter_ID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Coupled_Node_Diameter_ID };
+const AVP_Code c_AVP_Code_AAA_3GPP_STN_SR := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_STN_SR };
+const AVP_Code c_AVP_Code_BASE_NONE_Supported_Vendor_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Supported_Vendor_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_ServiceTypeIdentity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_ServiceTypeIdentity };
+const AVP_Code c_AVP_Code_AAA_3GPP_AUTN := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_AUTN };
+const AVP_Code c_AVP_Code_RX_3GPP_Sponsored_Connectivity_Data := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Sponsored_Connectivity_Data };
+const AVP_Code c_AVP_Code_BASE_NONE_Auth_Request_Type := {
+ vendor_id_NONE := avp_code_BASE_NONE_Auth_Request_Type };
+const AVP_Code c_AVP_Code_S6_3GPP_AESE_Communication_Pattern := {
+ vendor_id_3GPP := avp_code_S6_3GPP_AESE_Communication_Pattern };
+const AVP_Code c_AVP_Code_PCC_3GPP_NBIFOM_Mode := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_NBIFOM_Mode };
+const AVP_Code c_AVP_Code_PCC_3GPP_Redirect_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Redirect_Information };
+const AVP_Code c_AVP_Code_S6_3GPP_Event_Handling := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Event_Handling };
+const AVP_Code c_AVP_Code_AAA_3GPP_Tracking_Area_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Tracking_Area_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_ToS_Traffic_Class := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ToS_Traffic_Class };
+const AVP_Code c_AVP_Code_RX_3GPP_Min_Desired_Bandwidth_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Min_Desired_Bandwidth_UL };
+const AVP_Code c_AVP_Code_AAA_3GPP_UVR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UVR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscription_Data_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscription_Data_Flags };
+const AVP_Code c_AVP_Code_PCC_3GPP_PDN_Connection_ID := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PDN_Connection_ID };
+const AVP_Code c_AVP_Code_AAA_3GPP_DSR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_DSR_Flags };
+const AVP_Code c_AVP_Code_PCC_3GPP_PRA_Remove := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PRA_Remove };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Timestamp := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Timestamp };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscribed_Periodic_RAU_TAU_Timer };
+const AVP_Code c_AVP_Code_AAA_3GPP_Specific_APN_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Specific_APN_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_Terminal_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Terminal_Information };
+const AVP_Code c_AVP_Code_BASE_NONE_Product_Name := {
+ vendor_id_NONE := avp_code_BASE_NONE_Product_Name };
+const AVP_Code c_AVP_Code_AAA_3GPP_CSG_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_CSG_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Call_Barring_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Call_Barring_Info };
+const AVP_Code c_AVP_Code_BASE_NONE_Origin_State_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Origin_State_Id };
+const AVP_Code c_AVP_Code_S6_3GPP_IP_SM_GW_Name := {
+ vendor_id_3GPP := avp_code_S6_3GPP_IP_SM_GW_Name };
+const AVP_Code c_AVP_Code_RX_3GPP_Media_Sub_Component := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Media_Sub_Component };
+const AVP_Code c_AVP_Code_S6_3GPP_Accuracy := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Accuracy };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Remove := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Remove };
+const AVP_Code c_AVP_Code_RX_3GPP_Min_Requested_Bandwidth_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Min_Requested_Bandwidth_DL };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_Report := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_Report };
+const AVP_Code c_AVP_Code_PCC_3GPP_Tunnel_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Tunnel_Information };
+const AVP_Code c_AVP_Code_AAA_3GPP_Time_Zone := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Time_Zone };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Definition := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Definition };
+const AVP_Code c_AVP_Code_S6_3GPP_Periodic_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Periodic_Time };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Failure_Code := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Failure_Code };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_Destination_Host := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_Destination_Host };
+const AVP_Code c_AVP_Code_AAA_3GPP_Local_Group_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Local_Group_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Service_Area_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Service_Area_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Report := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Report };
+const AVP_Code c_AVP_Code_BASE_NONE_User_Name := {
+ vendor_id_NONE := avp_code_BASE_NONE_User_Name };
+const AVP_Code c_AVP_Code_AAA_3GPP_UE_PC5_AMBR := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UE_PC5_AMBR };
+const AVP_Code c_AVP_Code_BASE_NONE_Accounting_Sub_Session_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Accounting_Sub_Session_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Collection_Period_RRM_UMTS := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Collection_Period_RRM_UMTS };
+const AVP_Code c_AVP_Code_AAA_3GPP_Operator_Determined_Barring := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Operator_Determined_Barring };
+const AVP_Code c_AVP_Code_BASE_NONE_Session_Binding := {
+ vendor_id_NONE := avp_code_BASE_NONE_Session_Binding };
+const AVP_Code c_AVP_Code_AAA_3GPP_SS_Code := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SS_Code };
+const AVP_Code c_AVP_Code_BASE_NONE_Acct_Multi_Session_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Acct_Multi_Session_Id };
+const AVP_Code c_AVP_Code_RX_3GPP_RS_Bandwidth := {
+ vendor_id_3GPP := avp_code_RX_3GPP_RS_Bandwidth };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Algorithm_Type := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Algorithm_Type };
+const AVP_Code c_AVP_Code_S6_3GPP_Reachability_Information := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Reachability_Information };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Min_Desired_BW_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Min_Desired_BW_DL };
+const AVP_Code c_AVP_Code_AAA_3GPP_Event_Threshold_RSRQ := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Event_Threshold_RSRQ };
+const AVP_Code c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_UL };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_Parameters := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_Parameters };
+const AVP_Code c_AVP_Code_PCC_3GPP_Presence_Reporting_Area_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Presence_Reporting_Area_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Identifier };
+const AVP_Code c_AVP_Code_PCC_3GPP_Event_Trigger := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Event_Trigger };
+const AVP_Code c_AVP_Code_RX_3GPP_GCS_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_GCS_Identifier };
+const AVP_Code c_AVP_Code_MIPv6_NONE_QoS_Capability := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_QoS_Capability };
+const AVP_Code c_AVP_Code_AAA_3GPP_Non_IP_PDN_Type_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Non_IP_PDN_Type_Indicator };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Install := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Install };
+const AVP_Code c_AVP_Code_PCC_3GPP_Flow_Label := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Flow_Label };
+const AVP_Code c_AVP_Code_AAA_3GPP_Authentication_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Authentication_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Interface_List := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Interface_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_APN_Configuration_Profile := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_APN_Configuration_Profile };
+const AVP_Code c_AVP_Code_RX_3GPP_Flows := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Flows };
+const AVP_Code c_AVP_Code_S6_3GPP_CIA_Flags := {
+ vendor_id_3GPP := avp_code_S6_3GPP_CIA_Flags };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Min_Requested_BW_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Min_Requested_BW_UL };
+const AVP_Code c_AVP_Code_PCC_3GPP_Monitoring_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Monitoring_Time };
+const AVP_Code c_AVP_Code_S6_3GPP_UE_Reachability_Configuration := {
+ vendor_id_3GPP := avp_code_S6_3GPP_UE_Reachability_Configuration };
+const AVP_Code c_AVP_Code_BASE_NONE_Destination_Realm := {
+ vendor_id_NONE := avp_code_BASE_NONE_Destination_Realm };
+const AVP_Code c_AVP_Code_RX_3GPP_Acceptable_Service_Info := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Acceptable_Service_Info };
+const AVP_Code c_AVP_Code_PCC_3GPP_Flow_Direction := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Flow_Direction };
+const AVP_Code c_AVP_Code_S6_3GPP_Supported_Monitoring_Events := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Supported_Monitoring_Events };
+const AVP_Code c_AVP_Code_PCC_3GPP_Session_Release_Cause := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Session_Release_Cause };
+const AVP_Code c_AVP_Code_AAA_3GPP_MDT_User_Consent := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MDT_User_Consent };
+const AVP_Code c_AVP_Code_S6_3GPP_HSS_Cause := {
+ vendor_id_3GPP := avp_code_S6_3GPP_HSS_Cause };
+const AVP_Code c_AVP_Code_PCC_3GPP_PCSCF_Restoration_Indication := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PCSCF_Restoration_Indication };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscription_Data_Deletion := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscription_Data_Deletion };
+const AVP_Code c_AVP_Code_MIPv6_NONE_Chargable_User_Identity := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_Chargable_User_Identity };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_Collection_Entity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_Collection_Entity };
+const AVP_Code c_AVP_Code_BASE_NONE_Redirect_Host := {
+ vendor_id_NONE := avp_code_BASE_NONE_Redirect_Host };
+const AVP_Code c_AVP_Code_AAA_3GPP_Network_Access_Mode := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Network_Access_Mode };
+const AVP_Code c_AVP_Code_AAA_3GPP_Complete_Data_List_Included_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Complete_Data_List_Included_Indicator };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_MN_AAA_SPI := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_MN_AAA_SPI };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_MSA_Lifetime := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_MSA_Lifetime };
+const AVP_Code c_AVP_Code_S6_3GPP_Reachability_Type := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Reachability_Type };
+const AVP_Code c_AVP_Code_S6_3GPP_Type_Of_External_Identifier := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Type_Of_External_Identifier };
+const AVP_Code c_AVP_Code_PCC_3GPP_Event_Report_Indication := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Event_Report_Indication };
+const AVP_Code c_AVP_Code_AAA_3GPP_MDT_Configuration := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MDT_Configuration };
+const AVP_Code c_AVP_Code_PCC_3GPP_Usage_Monitoring_Report := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Usage_Monitoring_Report };
+const AVP_Code c_AVP_Code_AAA_3GPP_Adjacent_Access_Restriction_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Adjacent_Access_Restriction_Data };
+const AVP_Code c_AVP_Code_AAA_3GPP_RAT_Frequency_Selection_Priority_ID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_RAT_Frequency_Selection_Priority_ID };
+const AVP_Code c_AVP_Code_AAA_3GPP_CLR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_CLR_Flags };
+const AVP_Code c_AVP_Code_PCC_3GPP_Default_EPS_Bearer_QoS := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Default_EPS_Bearer_QoS };
+const AVP_Code c_AVP_Code_AAA_3GPP_ULR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_ULR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_ICS_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_ICS_Indicator };
+const AVP_Code c_AVP_Code_AAA_3GPP_Cancellation_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Cancellation_Type };
+const AVP_Code c_AVP_Code_BASE_NONE_E2E_Sequence := {
+ vendor_id_NONE := avp_code_BASE_NONE_E2E_Sequence };
+const AVP_Code c_AVP_Code_BASE_NONE_Origin_Realm := {
+ vendor_id_NONE := avp_code_BASE_NONE_Origin_Realm };
+const AVP_Code c_AVP_Code_AAA_3GPP_PDN_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PDN_Type };
+const AVP_Code c_AVP_Code_RX_3GPP_Access_Network_Charging_Identifier := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Access_Network_Charging_Identifier };
+const AVP_Code c_AVP_Code_S6_3GPP_AESE_Communication_Pattern_Config_Status := {
+ vendor_id_3GPP := avp_code_S6_3GPP_AESE_Communication_Pattern_Config_Status };
+const AVP_Code c_AVP_Code_S6_3GPP_Enhanced_Coverage_Restriction_Data := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Enhanced_Coverage_Restriction_Data };
+const AVP_Code c_AVP_Code_PCC_3GPP_Bearer_Operation := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Bearer_Operation };
+const AVP_Code c_AVP_Code_AAA_3GPP_Current_Location_Retrieved := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Current_Location_Retrieved };
+const AVP_Code c_AVP_Code_RX_3GPP_Pre_emption_Control_Info := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Pre_emption_Control_Info };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_Application_Instance_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_Application_Instance_Identifier };
+const AVP_Code c_AVP_Code_BASE_NONE_Acct_Interim_Interval := {
+ vendor_id_NONE := avp_code_BASE_NONE_Acct_Interim_Interval };
+const AVP_Code c_AVP_Code_RX_3GPP_Media_Component_Number := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Media_Component_Number };
+const AVP_Code c_AVP_Code_AAA_3GPP_Event_Threshold_Event_1F := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Event_Threshold_Event_1F };
+const AVP_Code c_AVP_Code_PCC_3GPP_Packet_Filter_Usage := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Packet_Filter_Usage };
+const AVP_Code c_AVP_Code_S6_3GPP_MONTE_Location_Type := {
+ vendor_id_3GPP := avp_code_S6_3GPP_MONTE_Location_Type };
+const AVP_Code c_AVP_Code_AAA_3GPP_RDS_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_RDS_Indicator };
+const AVP_Code c_AVP_Code_AAA_3GPP_Reporting_Trigger := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Reporting_Trigger };
+const AVP_Code c_AVP_Code_PCC_3GPP_Tunnel_Header_Length := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Tunnel_Header_Length };
+const AVP_Code c_AVP_Code_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Conditional_APN_Aggregate_Max_Bitrate };
+const AVP_Code c_AVP_Code_AAA_3GPP_Group_PLMN_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Group_PLMN_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_User_Id := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_User_Id };
+const AVP_Code c_AVP_Code_MIPv6_NONE_MIP_Authenticator := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_MIP_Authenticator };
+const AVP_Code c_AVP_Code_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Requested_UTRAN_GERAN_Authentication_Info };
+const AVP_Code c_AVP_Code_AAA_3GPP_EPS_User_State := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_EPS_User_State };
+const AVP_Code c_AVP_Code_BASE_NONE_Origin_Host := {
+ vendor_id_NONE := avp_code_BASE_NONE_Origin_Host };
+const AVP_Code c_AVP_Code_RX_3GPP_Retry_Interval := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Retry_Interval };
+const AVP_Code c_AVP_Code_BASE_NONE_Accounting_Session_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Accounting_Session_Id };
+const AVP_Code c_AVP_Code_PCC_3GPP_Packet_Filter_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Packet_Filter_Identifier };
+const AVP_Code c_AVP_Code_S6_3GPP_SCEF_Reference_ID := {
+ vendor_id_3GPP := avp_code_S6_3GPP_SCEF_Reference_ID };
+const AVP_Code c_AVP_Code_PCC_3GPP_Resource_Release_Notification := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Resource_Release_Notification };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Name };
+const AVP_Code c_AVP_Code_BASE_NONE_Disconnect_Cause := {
+ vendor_id_NONE := avp_code_BASE_NONE_Disconnect_Cause };
+const AVP_Code c_AVP_Code_AAA_3GPP_Error_Diagnostic := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Error_Diagnostic };
+const AVP_Code c_AVP_Code_PCC_3GPP_Guaranteed_Bitrate_DL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Guaranteed_Bitrate_DL };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Max_Supported_BW_UL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Max_Supported_BW_UL };
+const AVP_Code c_AVP_Code_PCC_3GPP_UDP_Source_Port := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_UDP_Source_Port };
+const AVP_Code c_AVP_Code_BASE_NONE_Accounting_Record_Type := {
+ vendor_id_NONE := avp_code_BASE_NONE_Accounting_Record_Type };
+const AVP_Code c_AVP_Code_AAA_3GPP_SIPTO_Local_Network_Permission := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SIPTO_Local_Network_Permission };
+const AVP_Code c_AVP_Code_PCC_3GPP_Routing_Rule_Definition := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Routing_Rule_Definition };
+const AVP_Code c_AVP_Code_AAA_3GPP_VPLMN_Dynamic_Address_Allowed := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_VPLMN_Dynamic_Address_Allowed };
+const AVP_Code c_AVP_Code_BASE_NONE_Acct_Application_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Acct_Application_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_Service_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Service_Type };
+const AVP_Code c_AVP_Code_AAA_3GPP_Immediate_Response_Preferred := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Immediate_Response_Preferred };
+const AVP_Code c_AVP_Code_AAA_3GPP_XRES := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_XRES };
+const AVP_Code c_AVP_Code_AAA_3GPP_User_State := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_User_State };
+const AVP_Code c_AVP_Code_BASE_NONE_Result_Code := {
+ vendor_id_NONE := avp_code_BASE_NONE_Result_Code };
+const AVP_Code c_AVP_Code_S6_3GPP_IP_SM_GW_Realm := {
+ vendor_id_3GPP := avp_code_S6_3GPP_IP_SM_GW_Realm };
+const AVP_Code c_AVP_Code_S6_3GPP_Reference_ID_Validity_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Reference_ID_Validity_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_E_UTRAN_Cell_Global_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_E_UTRAN_Cell_Global_Identity };
+const AVP_Code c_AVP_Code_PCC_3GPP_TFT_Packet_Filter_Information := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TFT_Packet_Filter_Information };
+const AVP_Code c_AVP_Code_RX_3GPP_Min_Desired_Bandwidth_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Min_Desired_Bandwidth_DL };
+const AVP_Code c_AVP_Code_S6_3GPP_Group_Reporting_Guard_Timer := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Group_Reporting_Guard_Timer };
+const AVP_Code c_AVP_Code_BASE_NONE_Auth_Session_State := {
+ vendor_id_NONE := avp_code_BASE_NONE_Auth_Session_State };
+const AVP_Code c_AVP_Code_PCC_3GPP_Session_Linking_Indicator := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Session_Linking_Indicator };
+const AVP_Code c_AVP_Code_S6_3GPP_Maximum_Number_of_Reports := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Maximum_Number_of_Reports };
+const AVP_Code c_AVP_Code_PCC_3GPP_PRA_Install := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PRA_Install };
+const AVP_Code c_AVP_Code_AAA_3GPP_V2X_Permission := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_V2X_Permission };
+const AVP_Code c_AVP_Code_AAA_3GPP_LIPA_Permission := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_LIPA_Permission };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Negotiation := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Negotiation };
+const AVP_Code c_AVP_Code_AAA_3GPP_3GPP2_MEID := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_3GPP2_MEID };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscription_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscription_Data };
+const AVP_Code c_AVP_Code_BASE_NONE_Vendor_Specific_Application_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Vendor_Specific_Application_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_WLAN_offloadability_UTRAN := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_WLAN_offloadability_UTRAN };
+const AVP_Code c_AVP_Code_AAA_3GPP_CSG_Subscription_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_CSG_Subscription_Data };
+const AVP_Code c_AVP_Code_MIPv6_NONE_Service_Selection := {
+ vendor_id_NONE := avp_code_MIPv6_NONE_Service_Selection };
+const AVP_Code c_AVP_Code_AAA_3GPP_TS_Code := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_TS_Code };
+const AVP_Code c_AVP_Code_S6_3GPP_IP_SM_GW_Number := {
+ vendor_id_3GPP := avp_code_S6_3GPP_IP_SM_GW_Number };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Install := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Install };
+const AVP_Code c_AVP_Code_RX_3GPP_Rx_Request_Type := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Rx_Request_Type };
+const AVP_Code c_AVP_Code_S6_3GPP_NIDD_Authorization_Response := {
+ vendor_id_3GPP := avp_code_S6_3GPP_NIDD_Authorization_Response };
+const AVP_Code c_AVP_Code_AAA_3GPP_VPLMN_CSG_Subscription_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_VPLMN_CSG_Subscription_Data };
+const AVP_Code c_AVP_Code_PCC_3GPP_QoS_Rule_Remove := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_QoS_Rule_Remove };
+const AVP_Code c_AVP_Code_S6_3GPP_Communication_Duration_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Communication_Duration_Time };
+const AVP_Code c_AVP_Code_PCC_3GPP_Access_Availability_Change_Reason := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Access_Availability_Change_Reason };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_Application_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_Application_Identifier };
+const AVP_Code c_AVP_Code_AAA_3GPP_Location_Area_Identity := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Location_Area_Identity };
+const AVP_Code c_AVP_Code_RX_3GPP_Media_Component_Status := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Media_Component_Status };
+const AVP_Code c_AVP_Code_AAA_3GPP_eDRX_Cycle_Length_Value := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_eDRX_Cycle_Length_Value };
+const AVP_Code c_AVP_Code_S6_3GPP_RIR_Flags := {
+ vendor_id_3GPP := avp_code_S6_3GPP_RIR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_Collection_Period_RRM_LTE := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Collection_Period_RRM_LTE };
+const AVP_Code c_AVP_Code_PCC_3GPP_Usage_Monitoring_Level := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Usage_Monitoring_Level };
+const AVP_Code c_AVP_Code_AAA_3GPP_Subscriber_Status := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Subscriber_Status };
+const AVP_Code c_AVP_Code_PCC_3GPP_Extended_APN_AMBR_UL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Extended_APN_AMBR_UL };
+const AVP_Code c_AVP_Code_AAA_3GPP_LCS_PrivacyException := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_LCS_PrivacyException };
+const AVP_Code c_AVP_Code_AAA_3GPP_QoS_Subscribed := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_QoS_Subscribed };
+const AVP_Code c_AVP_Code_RX_3GPP_RR_Bandwidth := {
+ vendor_id_3GPP := avp_code_RX_3GPP_RR_Bandwidth };
+const AVP_Code c_AVP_Code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_APN_Aggregate_Max_Bitrate_DL };
+const AVP_Code c_AVP_Code_S6_3GPP_SCS_Identity := {
+ vendor_id_3GPP := avp_code_S6_3GPP_SCS_Identity };
+const AVP_Code c_AVP_Code_RX_3GPP_Access_Network_Charging_Address := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Access_Network_Charging_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_Presence_Reporting_Area_Identifier := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Presence_Reporting_Area_Identifier };
+const AVP_Code c_AVP_Code_BASE_NONE_Inband_Security_Id := {
+ vendor_id_NONE := avp_code_BASE_NONE_Inband_Security_Id };
+const AVP_Code c_AVP_Code_PCC_3GPP_Charging_Rule_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Charging_Rule_Name };
+const AVP_Code c_AVP_Code_RX_3GPP_Ip_Domain_Id := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Ip_Domain_Id };
+const AVP_Code c_AVP_Code_AAA_3GPP_UE_Usage_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_UE_Usage_Type };
+const AVP_Code c_AVP_Code_PCC_3GPP_TDF_IP_Address := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_TDF_IP_Address };
+const AVP_Code c_AVP_Code_S6_3GPP_Enhanced_Coverage_Restriction := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Enhanced_Coverage_Restriction };
+const AVP_Code c_AVP_Code_AAA_3GPP_MME_Number_for_MT_SMS := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_MME_Number_for_MT_SMS };
+const AVP_Code c_AVP_Code_PCC_3GPP_Security_Parameter_Index := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Security_Parameter_Index };
+const AVP_Code c_AVP_Code_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Traffic_Steering_Policy_Identifier_UL };
+const AVP_Code c_AVP_Code_BASE_NONE_Route_Record := {
+ vendor_id_NONE := avp_code_BASE_NONE_Route_Record };
+const AVP_Code c_AVP_Code_AAA_3GPP_Carrier_Frequency := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Carrier_Frequency };
+const AVP_Code c_AVP_Code_AAA_3GPP_Trace_NE_Type_List := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Trace_NE_Type_List };
+const AVP_Code c_AVP_Code_AAA_3GPP_All_APN_Configurations_Included_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_All_APN_Configurations_Included_Indicator };
+const AVP_Code c_AVP_Code_AAA_3GPP_NOR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_NOR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_External_Client := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_External_Client };
+const AVP_Code c_AVP_Code_BASE_NONE_Authorization_Lifetime := {
+ vendor_id_NONE := avp_code_BASE_NONE_Authorization_Lifetime };
+const AVP_Code c_AVP_Code_RX_3GPP_Extended_Min_Requested_BW_DL := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Extended_Min_Requested_BW_DL };
+const AVP_Code c_AVP_Code_RX_3GPP_Service_URN := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Service_URN };
+const AVP_Code c_AVP_Code_S6_3GPP_Supported_Services := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Supported_Services };
+const AVP_Code c_AVP_Code_AAA_3GPP_Relay_Node_Indicator := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Relay_Node_Indicator };
+const AVP_Code c_AVP_Code_PCC_3GPP_Rule_DeActivation_Time := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Rule_DeActivation_Time };
+const AVP_Code c_AVP_Code_S6_3GPP_T4_Data := {
+ vendor_id_3GPP := avp_code_S6_3GPP_T4_Data };
+const AVP_Code c_AVP_Code_PCC_3GPP_Fixed_User_Location_Info := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Fixed_User_Location_Info };
+const AVP_Code c_AVP_Code_PCC_3GPP_Online := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Online };
+const AVP_Code c_AVP_Code_PCC_3GPP_ADC_Rule_Base_Name := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_ADC_Rule_Base_Name };
+const AVP_Code c_AVP_Code_AAA_3GPP_SCEF_Realm := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SCEF_Realm };
+const AVP_Code c_AVP_Code_S6_3GPP_Requested_Validity_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Requested_Validity_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Local_Time_Zone := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Local_Time_Zone };
+const AVP_Code c_AVP_Code_AAA_3GPP_GERAN_Vector := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_GERAN_Vector };
+const AVP_Code c_AVP_Code_AAA_3GPP_EPS_Subscribed_QoS_Profile := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_EPS_Subscribed_QoS_Profile };
+const AVP_Code c_AVP_Code_AAA_3GPP_GPRS_Subscription_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_GPRS_Subscription_Data };
+const AVP_Code c_AVP_Code_BASE_NONE_Accounting_Realtime_Required := {
+ vendor_id_NONE := avp_code_BASE_NONE_Accounting_Realtime_Required };
+const AVP_Code c_AVP_Code_BASE_NONE_Termination_Cause := {
+ vendor_id_NONE := avp_code_BASE_NONE_Termination_Cause };
+const AVP_Code c_AVP_Code_RX_3GPP_Specific_Action := {
+ vendor_id_3GPP := avp_code_RX_3GPP_Specific_Action };
+const AVP_Code c_AVP_Code_S6_3GPP_Maximum_Detection_Time := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Maximum_Detection_Time };
+const AVP_Code c_AVP_Code_AAA_3GPP_Ext_PDP_Address := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Ext_PDP_Address };
+const AVP_Code c_AVP_Code_PCC_3GPP_RAT_Type := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_RAT_Type };
+const AVP_Code c_AVP_Code_RX_3GPP_AF_Signalling_Protocol := {
+ vendor_id_3GPP := avp_code_RX_3GPP_AF_Signalling_Protocol };
+const AVP_Code c_AVP_Code_AAA_3GPP_Adjacent_PLMNs := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Adjacent_PLMNs };
+const AVP_Code c_AVP_Code_S6_3GPP_Service_Result_Code := {
+ vendor_id_3GPP := avp_code_S6_3GPP_Service_Result_Code };
+const AVP_Code c_AVP_Code_AAA_3GPP_SGSN_Location_Information := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_SGSN_Location_Information };
+const AVP_Code c_AVP_Code_PCC_3GPP_Pre_emption_Vulnerability := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Pre_emption_Vulnerability };
+const AVP_Code c_AVP_Code_AAA_3GPP_Equivalent_PLMN_List := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_Equivalent_PLMN_List };
+const AVP_Code c_AVP_Code_PCC_3GPP_Default_Access := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_Default_Access };
+const AVP_Code c_AVP_Code_BASE_NONE_Class := {
+ vendor_id_NONE := avp_code_BASE_NONE_Class };
+const AVP_Code c_AVP_Code_AAA_3GPP_IDR_Flags := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_IDR_Flags };
+const AVP_Code c_AVP_Code_AAA_3GPP_V2X_Subscription_Data := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_V2X_Subscription_Data };
+const AVP_Code c_AVP_Code_PCC_3GPP_PS_to_CS_Session_Continuity := {
+ vendor_id_3GPP := avp_code_PCC_3GPP_PS_to_CS_Session_Continuity };
+const AVP_Code c_AVP_Code_AAA_3GPP_PDP_Type := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_PDP_Type };
+const AVP_Code c_AVP_Code_AAA_3GPP_AMBR := {
+ vendor_id_3GPP := avp_code_AAA_3GPP_AMBR };
+} with { encode "RAW" } // End module
diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
index 10cf1b8..74fbfc4 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -419,6 +419,17 @@ template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
ies := ies
}
+template (value) GSUP_IMEI ts_GSUP_IMEI(hexstring digits) := {
+ len := 0, /* overwritten */
+ digits := digits
+}
+
+template GSUP_IMEI tr_GSUP_IMEI(template hexstring digits) := {
+ len := ?,
+ digits := digits
+}
+
+
template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
@@ -523,6 +534,38 @@ template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer
tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei) :=
+ ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, {
+ valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI(imei)) });
+
+template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
+ template hexstring imsi,
+ template hexstring imei
+) := tr_GSUP(
+ OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST,
+ {
+ tr_GSUP_IE_IMSI(imsi),
+ tr_GSUP_IE_IMEI(imei),
+ tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT)
+ }
+);
+
+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_RES(hexstring imsi, GSUP_IMEIResult result) :=
+ ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
+ valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });
+
+template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result) :=
+ tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
+ tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_IMEI_Result(result) });
+
+template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=
+ ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
+ valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
+
+template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause) :=
+ tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
+ tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
+
template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
tag := OSMO_GSUP_CANCEL_TYPE_IE,
@@ -764,29 +807,29 @@ template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
}
}
-template (value) GSUP_IE ts_GSUP_IE_IMEI_IE(GSUP_IMEI imei) := {
+template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {
tag := OSMO_GSUP_IMEI_IE,
len := 0, /* overwritten */
val := {
- imei := imei
+ imei := ts_GSUP_IMEI(imei)
}
}
-template GSUP_IE tr_GSUP_IE_IMEI_IE(template GSUP_IMEI imei) := {
+template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {
tag := OSMO_GSUP_IMEI_IE,
len := ?,
val := {
- imei := imei
+ imei := tr_GSUP_IMEI(imei)
}
}
-template (value) GSUP_IE ts_GSUP_IE_IMEI_RESULT_IE(GSUP_IMEIResult result) := {
+template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {
tag := OSMO_GSUP_IMEI_RESULT_IE,
len := 0, /* overwritten */
val := {
imei_result := result
}
}
-template GSUP_IE tr_GSUP_IE_IMEI_RESULT_IE(template GSUP_IMEIResult result) := {
+template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {
tag := OSMO_GSUP_IMEI_RESULT_IE,
len := ?,
val := {
@@ -1066,18 +1109,26 @@ private function f_gen_ts_ss_ies(
hexstring imsi,
OCT4 sid,
GSUP_SessionState state,
- template (omit) octetstring ss
+ template (omit) octetstring ss := omit,
+ template (omit) integer cause := omit
) return GSUP_IEs {
/* Mandatory IEs */
var GSUP_IEs ies := {
- valueof(ts_GSUP_IE_IMSI(imsi)),
- valueof(ts_GSUP_IE_SessionId(sid)),
- valueof(ts_GSUP_IE_SessionState(state))
+ valueof(ts_GSUP_IE_IMSI(imsi))
};
+ /* Cause IE is needed for PROC_SS_ERR */
+ if (isvalue(cause)) {
+ ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
+ }
+
+ /* Mandatory session IEs */
+ ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
+ ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };
+
/* Optional SS payload */
if (isvalue(ss)) {
- ies[3] := valueof(ts_GSUP_IE_SSInfo(valueof(ss)));
+ ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
}
return ies;
@@ -1086,29 +1137,42 @@ private function f_gen_tr_ss_ies(
template hexstring imsi,
template OCT4 sid := ?,
template GSUP_SessionState state := ?,
- template octetstring ss := ?
+ template octetstring ss := omit,
+ template integer cause := omit
) return template GSUP_IEs {
/* Mandatory IEs */
var template GSUP_IEs ies := {
- tr_GSUP_IE_IMSI(imsi),
- tr_GSUP_IE_SessionId(sid),
- tr_GSUP_IE_SessionState(state)
+ tr_GSUP_IE_IMSI(imsi)
};
- var integer last_idx := 3;
+ var integer idx := 1;
+
+ /* Cause IE is needed for PROC_SS_ERR */
+ if (istemplatekind(cause, "*")) {
+ ies[idx] := *;
+ idx := idx + 1;
+ } else if (not istemplatekind(cause, "omit")) {
+ ies[idx] := tr_GSUP_IE_Cause(cause);
+ idx := idx + 1;
+ }
+
+ /* Mandatory session IEs */
+ ies[idx] := tr_GSUP_IE_SessionId(sid);
+ ies[idx + 1] := tr_GSUP_IE_SessionState(state);
+ idx := idx + 2;
/* Optional SS payload */
if (istemplatekind(ss, "*")) {
- ies[3] := *;
- last_idx := last_idx + 1;
+ ies[idx] := *;
+ idx := idx + 1;
} else if (not istemplatekind(ss, "omit")) {
- ies[3] := tr_GSUP_IE_SSInfo(ss);
- last_idx := last_idx + 1;
+ ies[idx] := tr_GSUP_IE_SSInfo(ss);
+ idx := idx + 1;
}
/* the GSUP Message Class IE is optional, as old implementations don't have it yet */
var template GSUP_IEs ies2 := ies;
- ies2[last_idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
- last_idx := last_idx + 1;
+ ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
+ idx := idx + 1;
return (ies, ies2);
}
@@ -1158,12 +1222,7 @@ template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
integer cause
) := ts_GSUP(
OSMO_GSUP_MSGT_PROC_SS_ERROR,
- {
- valueof(ts_GSUP_IE_IMSI(imsi)),
- valueof(ts_GSUP_IE_Cause(cause)),
- valueof(ts_GSUP_IE_SessionId(sid)),
- valueof(ts_GSUP_IE_SessionState(state))
- }
+ f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
);
template GSUP_PDU tr_GSUP_PROC_SS_ERR(
template hexstring imsi,
@@ -1172,13 +1231,7 @@ template GSUP_PDU tr_GSUP_PROC_SS_ERR(
template integer cause := ?
) := tr_GSUP(
OSMO_GSUP_MSGT_PROC_SS_ERROR,
- {
- tr_GSUP_IE_IMSI(imsi),
- tr_GSUP_IE_Cause(cause),
- tr_GSUP_IE_SessionId(sid),
- tr_GSUP_IE_SessionState(state),
- tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD)
- }
+ f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
);
template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
diff --git a/library/GTP_Templates.ttcn b/library/GTP_Templates.ttcn
index f2e6ac0..aa42759 100644
--- a/library/GTP_Templates.ttcn
+++ b/library/GTP_Templates.ttcn
@@ -471,6 +471,18 @@ module GTP_Templates {
lengthProtoID := ?,
protoIDContents := ?
}
+ template ProtocolElement ts_PCOelem_PAP_broken := {
+ protocolID := 'C023'O,
+ lengthProtoID := 60,
+ /* PPP Password Authentication Protocol containing incorrect Peer-Id-Length set to 4 (6-7 should be the valid one), see OS#3914. */
+ protoIDContents := '0100003c'O & '0444435338323700bc1c08087c1508083e00790000150808fd06000001000000000000000000000000000000000000000000000000000000'O
+ }
+ template ProtConfigOptions ts_PCO_PAP_IPv4_DNS modifies ts_PCO := {
+ protocols := {
+ ts_PCOelem_PAP_broken,
+ { protocolID := '8021'O, lengthProtoID := 16, protoIDContents := enc_IpcpPacket(valueof(ts_IPCP_ReqDNS)) }
+ }
+ }
template ProtConfigOptions tr_PCO_Contains(OCT2 prot_id) modifies tr_PCO := {
protocols := { *, tr_PCO_Proto(prot_id), * }
}
diff --git a/library/GTPv2_CodecPort.ttcn b/library/GTPv2_CodecPort.ttcn
new file mode 100644
index 0000000..1f08f19
--- /dev/null
+++ b/library/GTPv2_CodecPort.ttcn
@@ -0,0 +1,57 @@
+/* dual-faced port sitting on top of IPL4_asp UDP to encode/decode GTPv2C
+ * (C) 2019 Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+
+module GTPv2_CodecPort {
+ import from IPL4asp_PortType all;
+ import from IPL4asp_Types all;
+ import from GTPv2C_Types all;
+
+ /* identifies a remote peer (sender or receiver) */
+ type record GtpPeer {
+ ConnectionId connId,
+ HostName remName,
+ PortNumber remPort
+ }
+
+ /* Decoded GTP2C (Control Plane), used in send and receive direction */
+ type record Gtp2cUnitdata {
+ GtpPeer peer,
+ PDU_GTPCv2 gtpc
+ }
+
+ /* Translation port on top of IPL4asp; ASP_Event passed through transparently */
+ type port GTPv2C_PT message {
+ out Gtp2cUnitdata;
+ in Gtp2cUnitdata,
+ ASP_ConnId_ReadyToRelease,
+ ASP_Event;
+ } with { extension "user IPL4asp_PT
+ out(Gtp2cUnitdata -> ASP_SendTo: function(f_enc_Gtp2cUD))
+ in(ASP_RecvFrom -> Gtp2cUnitdata: function(f_dec_Gtp2cUD);
+ ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
+ ASP_Event -> ASP_Event: simple)" }
+
+ private function f_enc_Gtp2cUD(in Gtp2cUnitdata in_ud, out ASP_SendTo out_ud) {
+ out_ud.connId := in_ud.peer.connId;
+ out_ud.remName := in_ud.peer.remName;
+ out_ud.remPort := in_ud.peer.remPort;
+ out_ud.proto := { udp := {} };
+ out_ud.msg := enc_PDU_GTPCv2(in_ud.gtpc);
+ } with { extension "prototype(fast)" };
+
+ private function f_dec_Gtp2cUD(in ASP_RecvFrom in_ud, out Gtp2cUnitdata out_ud) {
+ out_ud.peer.connId := in_ud.connId;
+ out_ud.peer.remName := in_ud.remName;
+ out_ud.peer.remPort := in_ud.remPort;
+ out_ud.gtpc := dec_PDU_GTPCv2(in_ud.msg);
+ } with { extension "prototype(fast)" };
+
+}
diff --git a/library/GTPv2_PrivateExtensions.ttcn b/library/GTPv2_PrivateExtensions.ttcn
new file mode 100644
index 0000000..63552f2
--- /dev/null
+++ b/library/GTPv2_PrivateExtensions.ttcn
@@ -0,0 +1,21 @@
+module GTPv2_PrivateExtensions {
+
+/* This is a small stub module to make GTPv2_Types.ttcn from
+ * titan.ProtocolModules.GTPv2_v13.7.0 compile */
+
+import from General_Types all;
+
+type record PrivateExtension {
+ OCT1 elementIdentifier,
+ LIN2_BO_LAST lengthIndicator,
+ BIT4 instance,
+ BIT4 spare,
+ octetstring data
+} with {
+ variant (lengthIndicator) "LENGTHTO(data)";
+ variant "PRESENCE (elementIdentifier = 'FE'O; )"
+}
+
+type record of PrivateExtension PrivateExtension_List;
+
+} with{ encode "RAW" }
diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn
new file mode 100644
index 0000000..23b0053
--- /dev/null
+++ b/library/GTPv2_Templates.ttcn
@@ -0,0 +1,323 @@
+module GTPv2_Templates {
+
+/* (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GTPv2_Types all;
+
+private function fs_GTP2C_t_bit(template (omit) OCT4 teid) return BIT1 {
+ if (istemplatekind(teid, "omit")) {
+ return '0'B;
+ } else {
+ return '1'B;
+ }
+}
+
+private function fs_GTP2C_p_bit(template (omit) PDU_GTPCv2 piggyback) return BIT1 {
+ if (istemplatekind(piggyback, "omit")) {
+ return '0'B;
+ } else {
+ return '1'B;
+ }
+}
+
+template (present) PDU_GTPCv2 tr_PDU_GTP2C(template OCT4 teid := ?,
+ template (present) GTPCv2_PDUs pdus := ?,
+ template PDU_GTPCv2 piggyback := omit) := {
+ spare := '000'B,
+ t_Bit := ?,
+ p_Bit := ?,
+ version := '010'B,
+ messageType := ?,
+ lengthf := ?,
+ tEID := teid,
+ sequenceNumber := ?,
+ spare3 := '00'O,
+ gtpcv2_pdu := pdus,
+ piggybackPDU_GTPCv2 := piggyback
+}
+
+
+/* 8.3 */
+template (value) IMSI ts_GTP2C_Imsi(template (value) hexstring imsi) := {
+ elementIdentifier := '01'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ iMSI_Value := imsi
+}
+template (present) IMSI tr_GTP2C_Imsi(template (present) hexstring imsi) := {
+ elementIdentifier := '01'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ iMSI_Value := imsi
+}
+
+/* 8.4-1 */
+/*
+type enumerated GTP2C_Cause {
+ Local_Detach (2),
+ Complete_Detach (3),
+ RAT_changed_from_3GPP_to_Non_3GPP (4),
+ ISR_deactivation (5),
+ Error_Ind_from_RNC_eNB_SGSN_MME (5),
+ IMSI_Detach_Only (7),
+ Reactivation_Required (8),
+}
+*/
+
+const integer c_GTP2C_Cause_LocalDetach := 1;
+
+/* 8.4 */
+template (value) Cause ts_GTP2C_Cause(template (value) OCT1 cause,
+ template (value) BIT1 cs) := {
+ elementIdentifier := '02'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ causeValue := cause,
+ cS := cs,
+ bCE := '0'B,
+ pCE := '0'B,
+ spare2 := '00000'B,
+ typeOfOffendingIE := omit,
+ lengthIndicator2 := omit,
+ instanceOfOffendingIE := omit,
+ spare3 := omit
+}
+template (present) Cause tr_GTP2C_Cause(template (present) OCT1 cause) := {
+ elementIdentifier := '02'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ causeValue := cause,
+ cS := ?,
+ bCE := ?,
+ pCE := ?,
+ spare2 := '00000'B,
+ typeOfOffendingIE := *,
+ lengthIndicator2 := *,
+ instanceOfOffendingIE := *,
+ spare3 := *
+}
+
+/* 8.5 */
+template (value) AccessPointName ts_GTP2C_APN(template (value) octetstring apn) := {
+ elementIdentifier := '48'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ aPN_Value := apn
+}
+template (present) AccessPointName tr_GTP2C_APN(template (present) octetstring apn) := {
+ elementIdentifier := '48'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ aPN_Value := apn
+}
+
+/* 8.14 */
+template (value) PDN_AddressAllocation
+ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,
+ template (value) PDN_Address_and_Prefix addr_pfx) := {
+ elementIdentifier := '4F'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ pDN_Type := pdn_type,
+ spare2 := '00000'B,
+ pDN_Address_and_Prefix := addr_pfx
+}
+template (present) PDN_AddressAllocation
+tr_GTP2C_PdnAddrAlloc(template (present) BIT3 pdn_type,
+ template (present) PDN_Address_and_Prefix addr_pfx) := {
+ elementIdentifier := '4F'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ pDN_Type := pdn_type,
+ spare2 := '00000'B,
+ pDN_Address_and_Prefix := addr_pfx
+}
+template (value) PDN_AddressAllocation
+ts_GTP2C_PdnAddrAlloc_v4(template (value) OCT4 addr) :=
+ ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
+template (present) PDN_AddressAllocation
+tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=
+ ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
+
+/* 8.17 */
+template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {
+ elementIdentifier := '53'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ rAT_TypeValue := rat,
+ additionalOctets := omit
+}
+template (present) RAT_Type tr_GTP2C_RatType(template (present) integer rat) := {
+ elementIdentifier := '53'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ rAT_TypeValue := rat,
+ additionalOctets := *
+}
+
+
+/* 8.22 */
+private function f_bit4oct(template (omit) octetstring os) return BIT1
+{
+ if (istemplatekind(os, "omit")) {
+ return '0'B;
+ } else {
+ return '1'B;
+ }
+}
+template (value) FullyQualifiedTEID
+ts_GTP2C_FTEID(integer if_type, OCT4 teid, template (omit) OCT4 v4_addr := omit,
+ template (omit) OCT16 v6_addr := omit) := {
+ elementIdentifier := '57'O,
+ lengthIndicator := 0, /* overwritten */
+ instance := '0000'B,
+ spare := '0000'B,
+ interfaceType := if_type,
+ v6_Flag := f_bit4oct(v4_addr),
+ v4_Flag := f_bit4oct(v6_addr),
+ tEID_GRE_Key := teid,
+ iPv4_Address := v4_addr,
+ iPv6_Address := v6_addr,
+ additionalOctets := omit
+}
+template (present) FullyQualifiedTEID
+tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,
+ template OCT4 v4_addr := omit,
+ template OCT16 v6_addr := omit) := {
+ elementIdentifier := '57'O,
+ lengthIndicator := ?,
+ instance := ?,
+ spare := '0000'B,
+ interfaceType := if_type,
+ v6_Flag := ?,
+ v4_Flag := ?,
+ tEID_GRE_Key := teid,
+ iPv4_Address := v4_addr,
+ iPv6_Address := v6_addr,
+ additionalOctets := omit
+}
+
+
+
+template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,
+ template (value) OCT1 msg_type,
+ template (value) GTPCv2_PDUs pdus,
+ template (omit) PDU_GTPCv2 piggyback := omit) := {
+ spare := '000'B,
+ t_Bit := fs_GTP2C_t_bit(teid),
+ p_Bit := fs_GTP2C_p_bit(piggyback),
+ version := '010'B,
+ messageType := msg_type,
+ lengthf := 0, /* overwritten */
+ tEID := teid,
+ sequenceNumber := seq,
+ spare3 := '00'O,
+ gtpcv2_pdu := pdus,
+ piggybackPDU_GTPCv2 := piggyback
+}
+
+
+template (present) PDU_GTPCv2
+tr_GTP2C_CreateSessionReq(template (present) hexstring imsi) := tr_PDU_GTP2C('00000000'O, {
+ createSessionRequest := {
+ iMSI := tr_GTP2C_Imsi(imsi),
+ mSISDN := *,
+ mEI := *,
+ userLocationInfo := ?,
+ servingNetwork := ?,
+ rAT_Type := tr_GTP2C_RatType(6),
+ indication := *,
+ fullyQualifiedTEID := ?,
+ accessPointName := tr_GTP2C_APN('012a'O), // '*'
+ selectionMode := ?,
+ pDN_Type := ?,
+ pDN_AddressAllocation := ?,
+ maxAPN_Restriction := ?,
+ ambr := *,
+ linkedEPS_Bearer_ID := omit,
+ trustedWLANModeIndication := omit,
+ protocolConfigOptions := omit,
+ bearerContextGrouped := ?,
+ traceInformation := *,
+ recovery := omit,
+ csid := omit,
+ uE_TimeZone := ?,
+ user_CSG_Information := omit,
+ chargingCharacteristics := ?,
+ lDN := omit,
+ signallingPriorityIndication := *,
+ iP_Addr := omit,
+ portNumber := omit,
+ aPCO := omit,
+ trustedWLANAccessNetworkIdentifier := omit,
+ cNOperatorSelectionEntity := omit,
+ presenceReportingAreaInformation := omit,
+ overloadControlInformationGrouped := omit,
+ originationTimeStamp := *,
+ maximumWaitTime := *,
+ wLANLocationTimestamp := omit,
+ nBIFOMContainer := omit,
+ remoteUEContextGrouped := *,
+ nodeIdentifier := *,
+ extendedProtocolConfigOptions := omit,
+ servingPLMNRateControl := omit,
+ counter := omit,
+ privateExtension := omit
+ }});
+
+template (value) PDU_GTPCv2
+ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,
+ template (value) PDN_AddressAllocation addr) :=
+ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
+ createSessionResponse := {
+ cause := ts_GTP2C_Cause(int2oct(16, 1), '0'B),
+ changeReportingAction := omit,
+ cSG_InformationReportingAction := omit,
+ heNBInformationReporting := omit,
+ fullyQualifiedTEID := fteids,
+ pDN_AddressAllocation := addr,
+ aPN_Restriction := omit,
+ ambr := omit,
+ linkedEPS_Bearer_ID := omit,
+ protocolConfigOptions := omit,
+ bearerContextGrouped := omit,
+ recovery := omit,
+ chargingGatewayName := omit,
+ chargingGatewayAddress := omit,
+ csid := omit,
+ lDN := omit,
+ pGW_Back_OffTime := omit,
+ aPCO := omit,
+ trustedWLANIPv4Parameters := omit,
+ indicationFlags := omit,
+ presenceReportingAreaAction := omit,
+ loadControlInformationGrouped := omit,
+ overloadControlInformationGrouped := omit,
+ nBIFOMContainer := omit,
+ pDNConnectionChargingID := omit,
+ extendedProtocolConfigOptions := omit,
+ privateExtension := omit
+ }});
+
+
+
+}
diff --git a/library/IPA_Emulation.ttcnpp b/library/IPA_Emulation.ttcnpp
index 3180621..2305b7b 100644
--- a/library/IPA_Emulation.ttcnpp
+++ b/library/IPA_Emulation.ttcnpp
@@ -2,7 +2,7 @@ module IPA_Emulation {
/* This module implements the IPA multiplex protocol on top of TCP, using the IPL4asp
* test-port as provider. It implements both client and server roles, as well was the CCM
- * handshake for establishing the identity of the client to the server.
+ * handshake for establishing the identity of the client to the server.
*
* It already knows certain well-known sub-protocols such as A-bis RSL, MGCP and SCCP and
* GSUP. IT hence transcodes messages so the user can work with abstract data types rather
@@ -186,8 +186,10 @@ type component IPA_Emulation_CT {
/* up-facing port for OML */
port IPA_OML_PT IPA_OML_PORT;
#endif
+#ifdef IPA_EMULATION_CTRL
/* up-facing port for CTRL */
port IPA_CTRL_PT IPA_CTRL_PORT;
+#endif
#ifdef IPA_EMULATION_GSUP
/* up-facing port for GSUP */
port IPA_GSUP_PT IPA_GSUP_PORT;
@@ -258,7 +260,7 @@ function f_connect(charstring remote_host, IPL4asp_Types.PortNumber remote_port,
function f_bind(charstring local_host, IPL4asp_Types.PortNumber local_port,
IPA_CCM_Parameters ccm_pars := c_IPA_default_ccm_pars) runs on IPA_Emulation_CT {
var IPL4asp_Types.Result res;
- res := IPA_CodecPort_CtrlFunct.f_IPL4_listen(IPA_PORT,
+ res := IPA_CodecPort_CtrlFunct.f_IPL4_listen(IPA_PORT,
local_host, local_port, { tcp:={} });
if (not ispresent(res.connId)) {
setverdict(fail, "Could not listen IPA socket ", local_host, ":", local_port, ", check your configuration");
@@ -300,9 +302,11 @@ private function f_send_IPA_EVT(template ASP_IPA_Event evt) runs on IPA_Emulatio
IPA_OML_PORT.send(evt);
}
#endif
+#ifdef IPA_EMULATION_CTRL
if (IPA_CTRL_PORT.checkstate("Connected")) {
IPA_CTRL_PORT.send(evt);
}
+#endif
#ifdef IPA_EMULATION_GSUP
if (IPA_GSUP_PORT.checkstate("Connected")) {
IPA_GSUP_PORT.send(evt);
@@ -497,10 +501,12 @@ runs on IPA_Emulation_CT {
ScanEvents();
}
+#ifdef IPA_EMULATION_CTRL
private function f_ctrl_to_user(octetstring msg) runs on IPA_Emulation_CT {
var charstring msg_ch := oct2char(msg);
IPA_CTRL_PORT.send(dec_CtrlMessage(msg_ch));
}
+#endif
#ifdef IPA_EMULATION_GSUP
private function f_gsup_to_user(octetstring msg) runs on IPA_Emulation_CT {
@@ -703,11 +709,13 @@ private function ScanEvents() runs on IPA_Emulation_CT {
}
#endif
+#ifdef IPA_EMULATION_CTRL
[] IPA_CTRL_PORT.receive(CtrlMessage:?) -> value ctrl_msg {
payload := char2oct(enc_CtrlMessage(ctrl_msg));
ipa_ud := valueof(t_ASP_IPA_UD(IPAC_PROTO_OSMO, payload, IPAC_PROTO_EXT_CTRL));
IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
}
+#endif
#ifdef IPA_EMULATION_GSUP
[] IPA_GSUP_PORT.receive(GSUP_PDU:?) -> value gsup_msg {
diff --git a/library/L1CTL_PortType.ttcn b/library/L1CTL_PortType.ttcn
index 7af680c..2423715 100644
--- a/library/L1CTL_PortType.ttcn
+++ b/library/L1CTL_PortType.ttcn
@@ -59,7 +59,7 @@ module L1CTL_PortType {
}
[] pt.receive { repeat; };
[] T.timeout {
- setverdict(fail, "Timeout in FBSB")
+ setverdict(fail, "Timeout waiting for L1CTL_FBSB_CONF");
mtc.stop;
};
}
@@ -74,7 +74,7 @@ module L1CTL_PortType {
[] pt.receive(tr_L1CTL_CCCH_MODE_CONF) { }
[] pt.receive { repeat; }
[] T.timeout {
- setverdict(fail, "Timeout in CCH_MODE");
+ setverdict(fail, "Timeout waiting for L1CTL_CCCH_MODE_CONF");
mtc.stop;
}
}
@@ -93,7 +93,7 @@ module L1CTL_PortType {
[] pt.receive(tr_L1CTL_RACH_CONF) -> value rc { fn := rc.dl_info.frame_nr };
[] pt.receive { repeat; };
[] T.timeout {
- setverdict(fail, "Timeout in RACH");
+ setverdict(fail, "Timeout waiting for L1CTL_RACH_CONF");
mtc.stop;
}
}
@@ -114,7 +114,7 @@ module L1CTL_PortType {
[] pt.receive(tr_L1CTL_RACH_CONF) -> value rc { fn := rc.dl_info.frame_nr };
[] pt.receive { repeat; };
[] T.timeout {
- setverdict(fail, "Timeout in extended RACH");
+ setverdict(fail, "Timeout waiting for (extended) L1CTL_RACH_CONF");
mtc.stop;
}
}
@@ -168,7 +168,7 @@ module L1CTL_PortType {
};
[] pt.receive { repeat };
[] T.timeout {
- setverdict(fail, "Timeout waiting for IMM ASS");
+ setverdict(fail, "Timeout waiting for TBF IMM ASS");
mtc.stop;
}
}
@@ -184,7 +184,7 @@ module L1CTL_PortType {
[] pt.receive(tr_L1CTL_TBF_CFG_CONF(is_uplink)) {}
[] pt.receive { repeat };
[] T.timeout {
- setverdict(fail, "Timeout waiting for TBF-CFG.conf");
+ setverdict(fail, "Timeout waiting for L1CTL_TBF_CFG_CONF");
mtc.stop;
};
}
@@ -213,7 +213,7 @@ module L1CTL_PortType {
[] pt.receive(tr_L1CTL_MsgType(L1CTL_RESET_CONF)) { }
[] pt.receive { repeat; }
[] T.timeout {
- setverdict(fail, "Timeout waiting for RESET.conf");
+ setverdict(fail, "Timeout waiting for L1CTL_RESET_CONF");
mtc.stop;
}
}
diff --git a/library/L1CTL_Types.ttcn b/library/L1CTL_Types.ttcn
index 01214b2..77c1f6a 100644
--- a/library/L1CTL_Types.ttcn
+++ b/library/L1CTL_Types.ttcn
@@ -622,6 +622,24 @@ module L1CTL_Types {
}
}
+ template (value) L1ctlUlMessage ts_L1CTL_TRAFFIC_REQ(template (value) RslChannelNr chan_nr,
+ template (value) RslLinkId link_id,
+ octetstring frame) := {
+ header := ts_L1ctlHeader(L1CTL_TRAFFIC_REQ),
+ ul_info := {
+ chan_nr := chan_nr,
+ link_id := link_id,
+ padding := '0000'O
+ },
+ ul_info_tbf := omit,
+ ul_info_abs := omit,
+ payload := {
+ traffic_req := {
+ data := frame
+ }
+ }
+ };
+
template (value) L1ctlUlMessage ts_L1CTL_TBF_CFG_REQ(boolean is_uplink, TfiUsfArr tfi_usf) := {
header := ts_L1ctlHeader(L1CTL_TBF_CFG_REQ),
ul_info := omit,
@@ -719,6 +737,30 @@ module L1CTL_Types {
}
};
+ /* for matching against incoming TRAFFIC_IND */
+ template L1ctlDlMessage tr_L1CTL_TRAFFIC_IND(template RslChannelNr chan_nr,
+ template RslLinkId link_id := ?,
+ template octetstring frame := ?,
+ template uint8_t num_biterr := 0,
+ template uint8_t fire_crc := 0) := {
+ header := tr_L1ctlHeader(L1CTL_TRAFFIC_IND),
+ dl_info := {
+ chan_nr := chan_nr,
+ link_id := link_id,
+ arfcn := ?,
+ frame_nr := ?,
+ rx_level := ?,
+ snr := ?,
+ num_biterr := num_biterr,
+ fire_crc := fire_crc
+ },
+ payload := {
+ traffic_ind := {
+ data := frame
+ }
+ }
+ };
+
template (value) L1ctlUlMessage ts_L1CTL_CRYPTO_REQ(RslChannelNr chan_nr, uint8_t algo,
octetstring key) := {
header := ts_L1ctlHeader(L1CTL_CRYPTO_REQ),
diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
index a2fe67a..bc0e797 100644
--- a/library/L3_Templates.ttcn
+++ b/library/L3_Templates.ttcn
@@ -35,6 +35,15 @@ type enumerated CmServiceType {
CM_TYPE_LCS ('1011'B)
}
+/* TS 24.008 10.5.3.4 Identity Type */
+type enumerated CmIdentityType {
+ CM_ID_TYPE_IMSI ('001'B),
+ CM_ID_TYPE_IMEI ('010'B),
+ CM_ID_TYPE_IMEISV ('011'B),
+ CM_ID_TYPE_TMSI ('100'B),
+ CM_ID_TYPE_PTMSI_RAI_PTMSI_SIG ('101'B)
+}
+
template ML3_Cause_TLV ts_ML3_Cause(BIT7 cause, BIT4 loc := '0001'B, BIT2 std := '11'B) := {
elementIdentifier := '08'O,
lengthIndicator := 0, /* overwritten */
@@ -54,7 +63,7 @@ template ML3_Cause_TLV ts_ML3_Cause(BIT7 cause, BIT4 loc := '0001'B, BIT2 std :=
}
-/* send template fro Mobile Identity (TMSI) */
+/* send template for Mobile Identity (TMSI) */
template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := {
lengthIndicator := 0, /* overwritten */
mobileIdentityV := {
@@ -69,7 +78,7 @@ template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := {
}
}
-/* send template fro Mobile Identity (TMSI) */
+/* send template for Mobile Identity (TMSI) */
function ts_MI_TMSI_TLV(template (omit) OCT4 tmsi) return template (omit) MobileIdentityTLV {
var template (omit) MobileIdentityTLV ret;
if (istemplatekind(tmsi, "omit")) {
@@ -129,7 +138,7 @@ private function f_enc_IMEI_SV(hexstring digits) return IMEI_SV {
return l3;
}
-/* send template fro Mobile Identity (IMSI) */
+/* send template for Mobile Identity (IMSI) */
template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
lengthIndicator := 0, /* overwritten */
mobileIdentityV := {
@@ -140,7 +149,7 @@ template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
}
}
-/* send template fro Mobile Identity (IMEI) */
+/* send template for Mobile Identity (IMEI) */
template (value) MobileIdentityLV ts_MI_IMEI_LV(hexstring imei_digits) := {
lengthIndicator := 0, /* overwritten */
mobileIdentityV := {
@@ -151,7 +160,7 @@ template (value) MobileIdentityLV ts_MI_IMEI_LV(hexstring imei_digits) := {
}
}
-/* send template fro Mobile Identity (IMEISV) */
+/* send template for Mobile Identity (IMEISV) */
template (value) MobileIdentityLV ts_MI_IMEISV_LV(hexstring imei_digits) := {
lengthIndicator := 0, /* overwritten */
mobileIdentityV := {
@@ -864,7 +873,15 @@ template PDU_ML3_NW_MS tr_ML3_MT_LU_Rej(template OCT1 cause := ?) := {
}
}
-template PDU_ML3_NW_MS tr_ML3_MT_MM_ID_Req(template BIT3 id_type := ?) := {
+private function f_id_type_or_any(template CmIdentityType id_type) return template bitstring {
+ if (istemplatekind(id_type, "?")) {
+ return ?;
+ } else {
+ return int2bit(enum2int(valueof(id_type)), 3);
+ }
+}
+
+template PDU_ML3_NW_MS tr_ML3_MT_MM_ID_Req(template CmIdentityType id_type := ?) := {
discriminator := '0101'B,
tiOrSkip := {
skipIndicator := '0000'B
@@ -874,7 +891,7 @@ template PDU_ML3_NW_MS tr_ML3_MT_MM_ID_Req(template BIT3 id_type := ?) := {
identityRequest := {
messageType := '011000'B,
nsd := '00'B,
- identityType := id_type,
+ identityType := f_id_type_or_any(id_type),
spare1_5 := ?
}
}
@@ -2779,7 +2796,7 @@ private function f_concat_pad(integer tot_len, hexstring prefix, integer suffix)
}
function f_gen_imei(integer suffix) return hexstring {
- return f_concat_pad(15, '49999'H, suffix);
+ return f_concat_pad(14, '49999'H, suffix);
}
function f_gen_imsi(integer suffix) return hexstring {
diff --git a/library/MGCP_CodecPort.ttcn b/library/MGCP_CodecPort.ttcn
index d33afe1..8614eef 100644
--- a/library/MGCP_CodecPort.ttcn
+++ b/library/MGCP_CodecPort.ttcn
@@ -41,11 +41,33 @@ module MGCP_CodecPort {
MgcpMessage msg
}
+ type record MGCP_SendTo {
+ ConnectionId connId,
+ HostName remName,
+ PortNumber remPort,
+ MgcpMessage msg
+ };
+
template MGCP_Send t_MGCP_Send(template ConnectionId connId, template MgcpMessage msg) := {
connId := connId,
msg := msg
}
+ template MGCP_SendTo t_MGCP_SendTo(template ConnectionId connId, HostName remName,
+ PortNumber remPort,template MgcpMessage msg) := {
+ connId := connId,
+ remName := remName,
+ remPort := remPort,
+ msg := msg
+ }
+
+ template MGCP_SendTo t_MGCP_SendToMrf(MGCP_RecvFrom mrf,template MgcpMessage msg) := {
+ connId := mrf.connId,
+ remName := mrf.remName,
+ remPort := mrf.remPort,
+ msg := msg
+ }
+
private function IPL4_to_MGCP_RecvFrom(in ASP_RecvFrom pin, out MGCP_RecvFrom pout) {
pout.connId := pin.connId;
pout.remName := pin.remName;
@@ -65,13 +87,23 @@ module MGCP_CodecPort {
pout.msg := char2oct(enc_MgcpMessage(pin.msg));
} with { extension "prototype(fast)" };
+ private function MGCP_to_IPL4_SendTo(in MGCP_SendTo pin, out ASP_SendTo out_ud) {
+ out_ud.connId := pin.connId;
+ out_ud.remName := pin.remName;
+ out_ud.remPort := pin.remPort;
+ out_ud.proto := { udp := {} };
+ out_ud.msg := char2oct(enc_MgcpMessage(pin.msg));
+ } with { extension "prototype(fast)" };
+
type port MGCP_CODEC_PT message {
- out MGCP_Send;
+ out MGCP_Send,
+ MGCP_SendTo;
in MGCP_RecvFrom,
ASP_ConnId_ReadyToRelease,
ASP_Event;
} with { extension "user IPL4asp_PT
- out(MGCP_Send -> ASP_Send:function(MGCP_to_IPL4_Send))
+ out(MGCP_Send -> ASP_Send:function(MGCP_to_IPL4_Send);
+ MGCP_SendTo -> ASP_SendTo: function(MGCP_to_IPL4_SendTo))
in(ASP_RecvFrom -> MGCP_RecvFrom: function(IPL4_to_MGCP_RecvFrom);
ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
ASP_Event -> ASP_Event: simple)"
diff --git a/library/MGCP_Emulation.ttcn b/library/MGCP_Emulation.ttcn
index 23cfeb4..494b171 100644
--- a/library/MGCP_Emulation.ttcn
+++ b/library/MGCP_Emulation.ttcn
@@ -37,8 +37,11 @@ import from Osmocom_Types all;
import from IPL4asp_Types all;
type component MGCP_ConnHdlr {
+ /* Simple send/recv without caring about peer addr+port. Used with multi_conn_mode=false. */
port MGCP_Conn_PT MGCP;
- /* procedure based port to register for incoming connections */
+ /* Handle multiple connections concurrently. Used with multi_conn_mode=true. */
+ port MGCP_Conn_Multi_PT MGCP_MULTI;
+ /* procedure based port to register for incoming connections. */
port MGCPEM_PROC_PT MGCP_PROC;
}
@@ -47,6 +50,11 @@ type port MGCP_Conn_PT message {
inout MgcpCommand, MgcpResponse;
} with { extension "internal" };
+/* port between individual per-connection components and this dispatcher */
+type port MGCP_Conn_Multi_PT message {
+ inout MGCP_RecvFrom, MGCP_SendTo;
+} with { extension "internal" };
+
/* represents a single MGCP Endpoint */
type record EndpointData {
MGCP_ConnHdlr comp_ref,
@@ -63,6 +71,8 @@ type component MGCP_Emulation_CT {
* MGCP_Emulation_CT.main needs to figure out what messages
* to send where with CLIENT.send() to vc_conn */
port MGCP_Conn_PT MGCP_CLIENT;
+ /* This one is used with multi_conn_mode=true and allows differentiating UDP sockets */
+ port MGCP_Conn_Multi_PT MGCP_CLIENT_MULTI;
/* currently tracked connections */
var EndpointData MgcpEndpointTable[16];
var MgcpTransIds MgcpPendingTrans := {};
@@ -73,6 +83,8 @@ type component MGCP_Emulation_CT {
var charstring g_mgcp_id;
var integer g_mgcp_conn_id := -1;
+
+ var MGCP_conn_parameters g_pars;
}
type function MGCPCreateCallback(MgcpCommand cmd, charstring id)
@@ -90,7 +102,8 @@ type record MGCP_conn_parameters {
HostName callagent_ip,
PortNumber callagent_udp_port,
HostName mgw_ip,
- PortNumber mgw_udp_port
+ PortNumber mgw_udp_port,
+ boolean multi_conn_mode
}
function tr_MGCP_RecvFrom_R(template MgcpMessage msg)
@@ -224,14 +237,23 @@ runs on MGCP_Emulation_CT {
}
}
+private function f_forward_to_client(MGCP_RecvFrom mrf, MGCP_ConnHdlr vc_conn) runs on MGCP_Emulation_CT {
+ if (g_pars.multi_conn_mode) {
+ MGCP_CLIENT_MULTI.send(mrf) to vc_conn;
+ } else {
+ MGCP_CLIENT.send(mrf.msg.command) to vc_conn;
+ }
+}
+
function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_Emulation_CT {
var Result res;
+ g_pars := p;
g_mgcp_id := id;
f_ep_table_init();
f_expect_table_init();
map(self:MGCP, system:MGCP_CODEC_PT);
- if (p.callagent_udp_port == -1) {
+ if (p.multi_conn_mode or p.callagent_udp_port == -1) {
res := MGCP_CodecPort_CtrlFunct.f_IPL4_listen(MGCP, p.mgw_ip, p.mgw_udp_port, { udp:={} });
} else {
res := MGCP_CodecPort_CtrlFunct.f_IPL4_connect(MGCP, p.callagent_ip, p.callagent_udp_port, p.mgw_ip, p.mgw_udp_port, -1, { udp:={} });
@@ -246,6 +268,7 @@ function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_E
var MGCP_ConnHdlr vc_conn;
var ExpectCriteria crit;
var MGCP_RecvFrom mrf;
+ var MGCP_SendTo mst;
var MgcpMessage msg;
var MgcpCommand cmd;
var MgcpResponse resp;
@@ -253,7 +276,7 @@ function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_E
alt {
/* MGCP from client */
- [] MGCP_CLIENT.receive(MgcpResponse:?) -> value resp sender vc_conn {
+ [not p.multi_conn_mode] MGCP_CLIENT.receive(MgcpResponse:?) -> value resp sender vc_conn {
msg := {
response := resp
};
@@ -265,9 +288,23 @@ function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_E
/* TODO: check which ConnectionID client has allocated + store in table? */
MGCP.send(t_MGCP_Send(g_mgcp_conn_id, msg));
}
+
+ /* MGCP from client in Multi Conn mode */
+ [p.multi_conn_mode] MGCP_CLIENT_MULTI.receive(MGCP_SendTo:?) -> value mst sender vc_conn {
+ /* If this is the resposne to a pending CRCX, extract Endpoint and store in table */
+ if (f_trans_id_was_pending(mst.msg.response.line.trans_id)) {
+ f_ep_table_add(vc_conn, f_mgcp_ep(mst.msg));
+ }
+ /* Pass message through */
+ /* TODO: check which ConnectionID client has allocated + store in table? */
+ MGCP.send(mst);
+ }
[] MGCP.receive(tr_MGCP_RecvFrom_R(?)) -> value mrf {
- if (p.callagent_udp_port == -1) {
- /* we aren't yet connected to the remote side port, let's fix this */
+ if (not p.multi_conn_mode and p.callagent_udp_port == -1) {
+ /* we aren't yet connected to the remote side
+ port, let's fix this. This way upper layers
+ can use Send/Recv without caring about UDP
+ src/dst addr + port */
p.callagent_udp_port := mrf.remPort;
res := MGCP_CodecPort_CtrlFunct.f_IPL4_connect(MGCP, p.callagent_ip, p.callagent_udp_port, p.mgw_ip, p.mgw_udp_port, g_mgcp_conn_id, { udp:={} });
if (not ispresent(res.connId)) {
@@ -279,7 +316,7 @@ function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_E
cmd := mrf.msg.command;
if (f_ep_known(cmd.line.ep)) {
vc_conn := f_comp_by_ep(cmd.line.ep);
- MGCP_CLIENT.send(cmd) to vc_conn;
+ f_forward_to_client(mrf, vc_conn);
} else {
if (cmd.line.verb == "CRCX") {
vc_conn := ops.create_cb.apply(cmd, id);
@@ -290,12 +327,12 @@ function main(MGCPOps ops, MGCP_conn_parameters p, charstring id) runs on MGCP_E
/* add this transaction to list of pending transactions */
MgcpPendingTrans := MgcpPendingTrans & {cmd.line.trans_id};
}
- MGCP_CLIENT.send(cmd) to vc_conn;
+ f_forward_to_client(mrf, vc_conn);
} else {
/* connectionless MGCP, i.e. messages without ConnectionId */
var template MgcpMessage r := ops.unitdata_cb.apply(mrf.msg);
if (isvalue(r)) {
- MGCP.send(t_MGCP_Send(g_mgcp_conn_id, r));
+ MGCP.send(t_MGCP_SendToMrf(mrf, r));
}
}
}
diff --git a/library/NAS_Templates.ttcn b/library/NAS_Templates.ttcn
new file mode 100644
index 0000000..f819862
--- /dev/null
+++ b/library/NAS_Templates.ttcn
@@ -0,0 +1,1011 @@
+/* EPC (Evolved Packet Core) NAS (Non-Access Stratum) templates in TTCN-3
+ * (C) 2019 Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+module NAS_Templates {
+
+import from General_Types all;
+import from NAS_EPS_Types all;
+
+template (value) PDU_NAS_EPS
+ts_NAS_SM(template (value) EPS_SessionManagement sm) := {
+ protocolDiscriminator := '0010'B,
+ ePS_messages := {
+ ePS_SessionManagement := sm
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_SM(template (present) EPS_SessionManagement sm) := {
+ protocolDiscriminator := '0010'B,
+ ePS_messages := {
+ ePS_SessionManagement := sm
+ }
+}
+
+template (value) PDU_NAS_EPS
+ts_NAS_MM(template (value) EPS_MobilityManagement mm) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := mm
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_MM(template (present) EPS_MobilityManagement mm) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := mm
+ }
+}
+
+const BIT4 c_EPS_SEC_NONE := '0000'B;
+const BIT4 c_EPS_NAS_PD_EMM := '0111'B;
+const BIT4 c_EPS_NAS_PD_ESM := '0010'B;
+
+private template (value) ESM_MessageContainerLVE
+ts_NAS_EsmMsgContLVE(template (value) octetstring inp) := {
+ lengthIndicator := 0,
+ content := inp
+}
+private template (present) ESM_MessageContainerLVE
+tr_NAS_EsmMsgContLVE(template (present) octetstring inp) := {
+ lengthIndicator := ?,
+ content := inp
+}
+
+private template (value) MobileIdentityLV
+ts_NAS_MobileIdLV(template (value) MobileIdentityV mid) := {
+ lengthIndicator := 0,
+ mobileIdentityV := mid
+}
+private template (present) MobileIdentityLV
+tr_NAS_MobileIdLV(template (present) MobileIdentityV mid) := {
+ lengthIndicator := ?,
+ mobileIdentityV := mid
+}
+
+private function f_enc_IMSI_NAS(hexstring digits) return IMSI {
+ var IMSI l3;
+ var integer len := lengthof(digits);
+ if (len rem 2 == 1) { /* modulo remainder */
+ l3.oddevenIndicator := '1'B;
+ l3.fillerDigit := omit;
+ } else {
+ l3.oddevenIndicator := '0'B;
+ l3.fillerDigit := '1111'B;
+ }
+ l3.digits := digits;
+ return l3;
+}
+
+private function f_enc_IMEI_NAS(hexstring digits) return IMEI {
+ var IMEI l3;
+ var integer len := lengthof(digits);
+ if (len rem 2 == 1) { /* modulo remainder */
+ l3.oddevenIndicator := '1'B;
+ } else {
+ l3.oddevenIndicator := '0'B;
+ }
+ l3.digits := digits;
+ return l3;
+}
+
+private function f_enc_IMEI_SV(hexstring digits) return IMEI_SV {
+ var IMEI_SV l3;
+ var integer len := lengthof(digits);
+ if (len rem 2 == 1) { /* modulo remainder */
+ l3.oddevenIndicator := '1'B;
+ } else {
+ l3.oddevenIndicator := '0'B;
+ }
+ l3.digits := digits;
+ l3.fillerDigit := '1111'B;
+ return l3;
+}
+
+template (value) GUTI ts_NAS_GUTI(hexstring mcc_mnc, OCT2 mmegi, OCT1 mmec, OCT4 tmsi) := {
+ oddevenIndicator := '0'B,
+ spare := '1111'B,
+ /* mcc_mnc specified in format 262f42 */
+ mccDigit1 := mcc_mnc[0],
+ mccDigit2 := mcc_mnc[1],
+ mccDigit3 := mcc_mnc[2],
+ mncDigit3 := mcc_mnc[5],
+ mncDigit1 := mcc_mnc[3],
+ mncDigit2 := mcc_mnc[4],
+ mMEGI := mmegi,
+ mMEC := mmec,
+ mTMSI := tmsi
+}
+
+template (value) EPS_MobileIdentityV
+ts_NAS_MobileId_IMSI(hexstring imsi) := {
+ typeOfIdentity := '001'B,
+ oddEvenInd_identity := {
+ imsi := f_enc_IMSI_NAS(imsi)
+ }
+}
+
+template (value) EPS_MobileIdentityV
+ts_NAS_MobileId_IMEI(hexstring imei) := {
+ typeOfIdentity := '011'B,
+ oddEvenInd_identity := {
+ imei := f_enc_IMEI_NAS(imei)
+ }
+}
+
+template (value) EPS_MobileIdentityV
+ts_NAS_MobileId_GUTI(hexstring mcc_mnc, OCT2 mmegi, OCT1 mmec, OCT4 tmsi) := {
+ typeOfIdentity := '110'B,
+ oddEvenInd_identity := {
+ guti := ts_NAS_GUTI(mcc_mnc, mmegi, mmec, tmsi)
+ }
+}
+
+template (value) PDU_NAS_EPS
+ts_NAS_EMM_SecurityProtected(BIT4 sec_hdr_t, integer seq_nr, octetstring inner_nas) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityProtectedNASMessage := {
+ securityHeaderType := sec_hdr_t,
+ messageAuthenticationCode := '00000000'O,
+ sequenceNumber := seq_nr,
+ nAS_Message := inner_nas
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_EMM_SecurityProtected := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityProtectedNASMessage := ?
+ }
+ }
+}
+
+const BIT3 NAS_PDN_T_IPv4 := '001'B;
+const BIT3 NAS_PDN_T_IPv6 := '010'B;
+const BIT3 NAS_PDN_T_IPv4v6 := '011'B;
+const BIT3 NAS_PDN_T_NonIP := '101'B;
+
+
+/*********************************************************************************
+ * Mobility Management
+ *********************************************************************************/
+
+/* 8.2.1 Attach Accept */
+template (value) PDU_NAS_EPS
+ts_NAS_AttachAccept(template (value) EPS_AttachResultV result,
+ template (value) GPRSTimerV t3412,
+ template (value) TAI_Lists tai_lists,
+ template (value) octetstring esm_enc) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachAccept := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000010'B,
+ ePS_AttachResult := result,
+ spare := '0000'B,
+ t3412 := t3412,
+ tAI_List := {
+ lengthIndicator := 0,
+ trackingAreaIdentityLists := tai_lists
+ },
+ eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc),
+ gUTI := omit,
+ locationAreaIdentification := omit,
+ msIdentity := omit,
+ eMMCause := omit,
+ t3402 := omit,
+ t3423 := omit,
+ equivalentPLMNs := omit,
+ emergencyNumberList := omit,
+ ePS_NetworkFeatureSupport := omit,
+ additionalUpdateResult := omit,
+ t3412_Extended := omit,
+ t3324 := omit,
+ extendedDRXParameters := omit,
+ dNCID := omit,
+ sMS_ServiceStatus := omit,
+ non3GPP_NW_ProvidedPolicies := omit,
+ t3448 := omit,
+ networkPolicy := omit,
+ t3447 := omit,
+ extendedEmergencyNumberList := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AttachAccept(template (present) EPS_AttachResultV result := ?,
+ template (present) GPRSTimerV t3412 := ?,
+ template (present) TAI_Lists tai_lists := ?,
+ template (present) octetstring esm_enc := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachAccept := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000010'B,
+ ePS_AttachResult := result,
+ spare := ?,
+ t3412 := t3412,
+ tAI_List := {
+ lengthIndicator := ?,
+ trackingAreaIdentityLists := tai_lists
+ },
+ eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc),
+ gUTI := *,
+ locationAreaIdentification := *,
+ msIdentity := *,
+ eMMCause := *,
+ t3402 := *,
+ t3423 := *,
+ equivalentPLMNs := *,
+ emergencyNumberList := *,
+ ePS_NetworkFeatureSupport := *,
+ additionalUpdateResult := *,
+ t3412_Extended := *,
+ t3324 := *,
+ extendedDRXParameters := *,
+ dNCID := *,
+ sMS_ServiceStatus := *,
+ non3GPP_NW_ProvidedPolicies := *,
+ t3448 := *,
+ networkPolicy := *,
+ t3447 := *,
+ extendedEmergencyNumberList := *
+ }
+ }
+ }
+}
+
+
+/* 8.2.2 Attach Complete */
+template (value) PDU_NAS_EPS
+ts_NAS_AttachComplete(template (value) octetstring esm_enc) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachComplete := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000011'B,
+ eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc)
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AttachComplete(template (present) octetstring esm_enc := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachComplete := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000011'B,
+ eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc)
+ }
+ }
+ }
+}
+
+
+/* 8.2.3 Attach Reject */
+template (value) PDU_NAS_EPS
+ts_NAS_AttachReject(template (value) EMM_CauseV cause) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachReject := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000100'B,
+ emmCause := cause,
+ eSM_MessageContainer := omit,
+ t3346 := omit,
+ t3402 := omit,
+ extendedEmmCause := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AttachReject(template (present) EMM_CauseV cause := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachReject := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000100'B,
+ emmCause := cause,
+ eSM_MessageContainer := omit,
+ t3346 := omit,
+ t3402 := omit,
+ extendedEmmCause := omit
+ }
+ }
+ }
+}
+
+/* 8.2.4 Attach Request */
+template (value) PDU_NAS_EPS
+ts_NAS_AttachRequest(template (value) BIT3 att_type,
+ template (value) BIT3 kset_id,
+ template (value) EPS_MobileIdentityV mobile_id,
+ template (value) UENetworkCapabilityV ue_net_cap,
+ template (value) octetstring esm_enc) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachRequest := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01000001'B,
+ ePS_attachType := {
+ typeOfAttach := att_type,
+ spare := '0'B
+ },
+ nasKeySetId := {
+ identifier := kset_id,
+ tSC := '1'B
+ },
+ ePSMobileId := {
+ lengthIndicator := 0,
+ ePS_MobileIdentity := mobile_id
+ },
+ uENetworkCapability := {
+ lengthIndicator := 0,
+ uENetworkCapabilityV := ue_net_cap
+ },
+ eSM_MessageContainer := ts_NAS_EsmMsgContLVE(esm_enc),
+ old_P_TMSISignature := omit,
+ additionalGUTI := omit,
+ lastVisitedRegisteredTAI := omit,
+ dRXParameter := omit,
+ mSNetworkCapability := omit,
+ oldLocationAreaIdentification := omit,
+ tMSIStatusTV := omit,
+ mobileStationClassmark2 := omit,
+ mobileStationClassmark3 := omit,
+ supportedCodecList := omit,
+ additionalUpdateType := omit,
+ voiceDomainPrefandUEsettings := omit,
+ deviceProperties := omit,
+ oldGUTI_Type := omit,
+ mS_NetworkFeatureSupport := omit,
+ tMSIBasedNRIContainer := omit,
+ t3324 := omit,
+ t3412_Extended := omit,
+ extendedDRXParameters := omit,
+ uEAdditionalSecurityCapability := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AttachRequest(template (present) BIT3 att_type := ?,
+ template (present) BIT3 kset_id := ?,
+ template (present) EPS_MobileIdentityV mobile_id := ?,
+ template (present) UENetworkCapabilityV ue_net_cap := ?,
+ template (present) octetstring esm_enc := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AttachRequest := {
+ securityHeaderType := ?,
+ messageType := '01000001'B,
+ ePS_attachType := {
+ typeOfAttach := att_type,
+ spare := ?
+ },
+ nasKeySetId := {
+ identifier := kset_id,
+ tSC := ?
+ },
+ ePSMobileId := {
+ lengthIndicator := ?,
+ ePS_MobileIdentity := mobile_id
+ },
+ uENetworkCapability := {
+ lengthIndicator := ?,
+ uENetworkCapabilityV := ue_net_cap
+ },
+ eSM_MessageContainer := tr_NAS_EsmMsgContLVE(esm_enc),
+ old_P_TMSISignature := *,
+ additionalGUTI := *,
+ lastVisitedRegisteredTAI := *,
+ dRXParameter := *,
+ mSNetworkCapability := *,
+ oldLocationAreaIdentification := *,
+ tMSIStatusTV := *,
+ mobileStationClassmark2 := *,
+ mobileStationClassmark3 := *,
+ supportedCodecList := *,
+ additionalUpdateType := *,
+ voiceDomainPrefandUEsettings := *,
+ deviceProperties := *,
+ oldGUTI_Type := *,
+ mS_NetworkFeatureSupport := *,
+ tMSIBasedNRIContainer := *,
+ t3324 := *,
+ t3412_Extended := *,
+ extendedDRXParameters := *,
+ uEAdditionalSecurityCapability := *
+ }
+ }
+ }
+}
+
+
+/* 8.2.5 Authentication Failure */
+template (value) PDU_NAS_EPS
+ts_NAS_AuthFail(template (value) EMM_CauseV cause /* template (omit) OCT14 auth_fail_par */) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationFailure := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011100'B,
+ emmCause := cause,
+ authenticationFailureParameter := omit
+ }
+ }
+ }
+}
+template (value) PDU_NAS_EPS
+ts_NAS_AuthFail_par(template (value) EMM_CauseV cause,
+ template (value) OCT14 auth_fail_par) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationFailure := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011100'B,
+ emmCause := cause,
+ authenticationFailureParameter := {
+ elementIdentifier := '30'O,
+ lengthIndicator := lengthof(auth_fail_par),
+ authenticationFailureParameter := auth_fail_par
+ }
+ }
+ }
+ }
+}
+
+/* 8.2.6 Authentication Reject */
+template (value) PDU_NAS_EPS
+ts_NAS_AuthRej := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationReject := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010100'B
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AuthRej := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationReject := {
+ securityHeaderType := ?,
+ messageType := '01010100'B
+ }
+ }
+ }
+}
+
+/* 8.2.7 Authentication Request */
+template (value) PDU_NAS_EPS
+ts_NAS_AuthReq(template (value) NAS_KeySetIdentifierV kset_id,
+ OCT16 rand, OCT16 autn) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationRequest := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010010'B,
+ nasKeySetId := kset_id,
+ spare := '0000'B,
+ authenticationParameterRAND := {
+ rAND := rand
+ },
+ authenticationParameterAUTN := {
+ lengthIndicator := lengthof(autn),
+ aUTN := autn
+ }
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AuthReq(template (present) NAS_KeySetIdentifierV kset_id := ?,
+ template (present) OCT16 rand := ?,
+ template (present) OCT16 autn := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationRequest := {
+ securityHeaderType := ?,
+ messageType := '01010010'B,
+ nasKeySetId := kset_id,
+ spare := '0000'B,
+ authenticationParameterRAND := {
+ rAND := rand
+ },
+ authenticationParameterAUTN := {
+ lengthIndicator := ?,
+ aUTN := autn
+ }
+ }
+ }
+ }
+}
+
+/* 8.2.8 Authentication Response */
+template (value) PDU_NAS_EPS
+ts_NAS_AuthResp(octetstring res) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationResponse := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010011'B,
+ authenticationResponseParameter := {
+ lengthIndicator := lengthof(res),
+ authenticationResponseParameter := {
+ rES := res
+ }
+ }
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_AuthResp(template OCT16 res := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_AuthenticationResponse := {
+ securityHeaderType := ?,
+ messageType := '01010011'B,
+ authenticationResponseParameter := {
+ lengthIndicator := ?,
+ authenticationResponseParameter := {
+ rES := res
+ }
+ }
+ }
+ }
+ }
+}
+
+/* 8.2.18 Identity Request */
+template (value) PDU_NAS_EPS
+ts_NAS_IdentityReq(template (value) IdentityType2V id_type) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_IdentityRequest := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010101'B,
+ identityType := id_type,
+ spareHalfOctet := '0000'B
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_IdentityReq(template (present) IdentityType2V id_type := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_IdentityRequest := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010101'B,
+ identityType := id_type,
+ spareHalfOctet := ?
+ }
+ }
+ }
+}
+
+/* 8.2.19 Identity Response */
+template (value) PDU_NAS_EPS
+ts_NAS_IdentityResp(template (value) MobileIdentityV mobile_id) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_IdentityResponse := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010110'B,
+ mobileIdentity := ts_NAS_MobileIdLV(mobile_id)
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_IdentityResp(template (present) MobileIdentityV mobile_id := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_IdentityResponse := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01010110'B,
+ mobileIdentity := tr_NAS_MobileIdLV(mobile_id)
+ }
+ }
+ }
+}
+
+
+
+
+/* 8.2.20 Security Mode Command */
+template (value) PDU_NAS_EPS
+ts_NAS_SecModeCmd(template (value) NAS_SecurityAlgorithmsV alg,
+ template (value) NAS_KeySetIdentifierV kset_id,
+ template (value) UESecurityCapabilityLV ue_sec_cap) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityModeCommand := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011101'B,
+ selected_NAS_SecurityAlgorithms := alg,
+ nasKeySetId := kset_id,
+ spareHalfOctet := '0000'B,
+ replayed_UE_SecurityCapability := ue_sec_cap,
+ iMEISV_Request := omit,
+ replayedNonceUE := omit,
+ nonceMME := omit,
+ hashMME := omit,
+ uEAdditionalSecurityCapability := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_SecModeCmd(template (present) NAS_SecurityAlgorithmsV alg := ?,
+ template (present) NAS_KeySetIdentifierV kset_id := ?,
+ template (present) UESecurityCapabilityLV ue_sec_cap := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityModeCommand := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011101'B,
+ selected_NAS_SecurityAlgorithms := alg,
+ nasKeySetId := kset_id,
+ spareHalfOctet := ?,
+ replayed_UE_SecurityCapability := ue_sec_cap,
+ iMEISV_Request := *,
+ replayedNonceUE := *,
+ nonceMME := *,
+ hashMME := *,
+ uEAdditionalSecurityCapability := *
+ }
+ }
+ }
+}
+
+/* 8.2.21 Security Mode Complete */
+template (value) PDU_NAS_EPS
+ts_NAS_SecModeCmpl := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityModeComplete := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011110'B,
+ iMEISV := omit,
+ replayedNASMessageContainer := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_SecModeCmpl := {
+ protocolDiscriminator := c_EPS_NAS_PD_EMM,
+ ePS_messages := {
+ ePS_MobilityManagement := {
+ pDU_NAS_EPS_SecurityModeComplete := {
+ securityHeaderType := c_EPS_SEC_NONE,
+ messageType := '01011110'B,
+ iMEISV := *,
+ replayedNASMessageContainer := *
+ }
+ }
+ }
+}
+
+/*********************************************************************************
+ * Session Management
+ *********************************************************************************/
+
+/* 9.9.4.11 - 10.5.6.3/24.008 */
+private function ts_NAS_PCO_TLV(template (omit) ProtocolConfigOptionsV pco)
+return template (omit) ProtocolConfigOptionsTLV {
+ var template (value) ProtocolConfigOptionsTLV ret;
+ if (istemplatekind(pco, "omit")) {
+ return omit;
+ }
+ ret := {
+ elementIdentifier := '27'O,
+ protocolConfigOptions := {
+ lengthIndicator := 0,
+ protocolConfigOptionsV := pco
+ }
+ }
+ return ret;
+}
+private function tr_NAS_PCO_TLV(template ProtocolConfigOptionsV pco := ?)
+return template ProtocolConfigOptionsTLV {
+ var template ProtocolConfigOptionsTLV ret := {
+ elementIdentifier := '27'O,
+ protocolConfigOptions := {
+ lengthIndicator := ?,
+ protocolConfigOptionsV := pco
+ }
+ }
+ if (istemplatekind(pco, "omit")) {
+ return omit;
+ } else if (istemplatekind(pco, "*")) {
+ return *;
+ } else {
+ return ret;
+ }
+}
+
+
+
+/* 8.3.20 PDN Connectivity Request */
+template (value) PDU_NAS_EPS
+ts_NAS_PdnConnReq(template (value) BIT4 bearer_id,
+ template (value) BIT8 proc_tid,
+ template (value) BIT3 pdn_type,
+ template (value) BIT3 req_type) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_PDN_ConnectivityRequest := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11010000'B,
+ requestType := {
+ requestTypeValue := req_type,
+ spare := '0'B
+ },
+ pDN_Type := {
+ pDN_TypeValue := pdn_type,
+ spare := '0'B
+ },
+ eSM_InformationTransferFlag := omit,
+ accessPointName := omit,
+ protocolConfigOptions := omit,
+ deviceProperties := omit,
+ nBIFOMContainer := omit,
+ headerCompressinConfiguration := omit,
+ extendedProtocolConfigurationOptions := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_PdnConnReq(template (present) BIT4 bearer_id := ?,
+ template (present) BIT8 proc_tid := ?,
+ template (present) BIT3 pdn_type := ?,
+ template (present) BIT3 req_type := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_PDN_ConnectivityRequest := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11010000'B,
+ requestType := {
+ requestTypeValue := req_type,
+ spare := '0'B
+ },
+ pDN_Type := {
+ pDN_TypeValue := pdn_type,
+ spare := '0'B
+ },
+ eSM_InformationTransferFlag := omit,
+ accessPointName := omit,
+ protocolConfigOptions := omit,
+ deviceProperties := omit,
+ nBIFOMContainer := omit,
+ headerCompressinConfiguration := omit,
+ extendedProtocolConfigurationOptions := omit
+ }
+ }
+ }
+}
+
+/* 8.3.19 PDN Connectivity Reject */
+template (value) PDU_NAS_EPS
+ts_NAS_PdnConnRej(template (value) BIT4 bearer_id,
+ template (value) BIT8 proc_tid,
+ template (value) ESM_CauseV cause) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_PDN_ConnectivityReject := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11010001'B,
+ esmCause := cause,
+ protocolConfigOptions := omit,
+ backOffTimer := omit,
+ reAttemptIndicator := omit,
+ nBIFOMContainer := omit,
+ extendedProtocolConfigurationOptions := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_PdnConnRej(template (present) BIT4 bearer_id := ?,
+ template (present) BIT8 proc_tid := ?,
+ template (present) ESM_CauseV cause := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_PDN_ConnectivityReject := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11010001'B,
+ esmCause := cause,
+ protocolConfigOptions := *,
+ backOffTimer := *,
+ reAttemptIndicator := *,
+ nBIFOMContainer := *,
+ extendedProtocolConfigurationOptions := *
+ }
+ }
+ }
+}
+
+
+/* 8.3.6 Activate Default EPS Bearer Context Request */
+template (value) PDU_NAS_EPS
+ts_NAS_ActDefEpsBearCtxReq(template (value) BIT4 bearer_id,
+ template (value) BIT8 proc_tid,
+ template (value) EPS_QualityOfServiceV qos,
+ template (value) octetstring apn,
+ template (value) BIT3 addr_type,
+ template (value) octetstring addr_info) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_ActDefEPSBearerContextRequest := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11000001'B,
+ ePS_QoS := {
+ lengthIndicator := 0,
+ ePS_QualityOfServiceV := qos
+ },
+ accessPointName := {
+ lengthIndicator := 0,
+ accessPointNameValue := apn
+ },
+ pDN_Address := {
+ lengthIndicator := 0,
+ typeValue := addr_type,
+ spare := '00000'B,
+ addressInformation := addr_info
+ },
+ transactionIdentifier := omit,
+ negotiatedQoS := omit,
+ negotiated_LLC_SAPI := omit,
+ radioPriority := omit,
+ packetFlowID := omit,
+ aPN_AMBR := omit,
+ esmCause := omit,
+ protocolConfigOptions := omit,
+ connectivityType := omit,
+ wLANOffloadIndication := omit,
+ nBIFOMContainer := omit,
+ headerCompressinConfiguration := omit,
+ controlPlaneOnlyIndication := omit,
+ extendedProtocolConfigurationOptions := omit,
+ servingPLMNRateControl := omit,
+ extended_APN_AMBR := omit,
+ extendedQoS := omit
+ }
+ }
+ }
+}
+
+/* 8.3.4 Activate Default EPS Bearer Context Accept */
+template (value) PDU_NAS_EPS
+ts_NAS_ActDefEpsBearCtxAck(template (value) BIT4 bearer_id,
+ template (value) BIT8 proc_tid,
+ template (omit) ProtocolConfigOptionsV pco) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_ActDefEPSBearerContextAccept := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11000010'B,
+ protocolConfigOptions := ts_NAS_PCO_TLV(pco),
+ extendedProtocolConfigurationOptions := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_ActDefEpsBearCtxAck(template (present) BIT4 bearer_id := ?,
+ template (present) BIT8 proc_tid := ?,
+ template ProtocolConfigOptionsV pco := *) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_ActDefEPSBearerContextAccept := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11000010'B,
+ protocolConfigOptions := tr_NAS_PCO_TLV(pco),
+ extendedProtocolConfigurationOptions := *
+ }
+ }
+ }
+}
+
+
+/* 8.3.5 Activate Default EPS Bearer Context Reject */
+template (value) PDU_NAS_EPS
+ts_NAS_ActDefEpsBearCtxRej(template (value) BIT4 bearer_id,
+ template (value) BIT8 proc_tid,
+ template (value) ESM_CauseV cause) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_ActDefEPSBearerContextReject := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11000011'B,
+ esmCause := cause,
+ protocolConfigOptions := omit,
+ extendedProtocolConfigurationOptions := omit
+ }
+ }
+ }
+}
+template (present) PDU_NAS_EPS
+tr_NAS_ActDefEpsBearCtxRej(template (present) BIT4 bearer_id := ?,
+ template (present) BIT8 proc_tid := ?,
+ template (present) ESM_CauseV cause := ?) := {
+ protocolDiscriminator := c_EPS_NAS_PD_ESM,
+ ePS_messages := {
+ ePS_SessionManagement := {
+ pDU_NAS_EPS_ActDefEPSBearerContextReject := {
+ ePSBearerIdentity := bearer_id,
+ procedureTransactionIdentifier := proc_tid,
+ messageType := '11000011'B,
+ esmCause := cause,
+ protocolConfigOptions := *,
+ extendedProtocolConfigurationOptions := *
+ }
+ }
+ }
+}
+
+
+
+
+
+}
diff --git a/library/Osmocom_CTRL_Adapter.ttcn b/library/Osmocom_CTRL_Adapter.ttcn
index 93e893f..08195c8 100644
--- a/library/Osmocom_CTRL_Adapter.ttcn
+++ b/library/Osmocom_CTRL_Adapter.ttcn
@@ -61,6 +61,9 @@ function f_ipa_ctrl_stop() runs on CTRL_Adapter_CT {
function f_ctrl_get_bts(IPA_CTRL_PT pt, integer bts_nr, charstring suffix) return CtrlValue {
return f_ctrl_get(pt, "bts." & int2str(bts_nr) & "." & suffix);
}
+function f_ctrl_set_bts(IPA_CTRL_PT pt, integer bts_nr, charstring suffix, CtrlValue val) {
+ f_ctrl_set(pt, "bts." & int2str(bts_nr) & "." & suffix, val);
+}
template charstring ts_bts(integer bts_nr) := "bts." & int2str(bts_nr) & ".";
template charstring ts_bts_trx(integer bts_nr, integer trx_nr ) :=
diff --git a/library/Osmocom_CTRL_Functions.ttcn b/library/Osmocom_CTRL_Functions.ttcn
index 4356ba9..22ed405 100644
--- a/library/Osmocom_CTRL_Functions.ttcn
+++ b/library/Osmocom_CTRL_Functions.ttcn
@@ -6,7 +6,7 @@ module Osmocom_CTRL_Functions {
* implements blocking functions, instead of asynchronous functions. The
* rationale for this is simple: One normally wants to inquire a value or set
* a value and not continue the main program until that operation is complete.
- *
+ *
* CTRL is a machine-type protocol on how external programs can interact with
* an Osmocom program in a structured way. It is intended for programmatic
* access (by other software), as opposed to the VTY interface intended for
@@ -71,10 +71,16 @@ module Osmocom_CTRL_Functions {
}
}
+ /* send a TRAP */
+ function f_ctrl_trap(IPA_CTRL_PT pt, CtrlVariable variable, CtrlValue val) {
+ pt.send(ts_CtrlMsgTrap(variable, val));
+ }
+
/* Expect a matching TRAP */
function f_ctrl_exp_trap(IPA_CTRL_PT pt, template CtrlVariable variable,
- template CtrlValue val := ?) return CtrlValue {
- timer T := 2.0;
+ template CtrlValue val := ?, float timeout_val := 2.0)
+ return CtrlValue {
+ timer T := timeout_val;
var CtrlMessage rx;
T.start;
alt {
@@ -88,6 +94,29 @@ module Osmocom_CTRL_Functions {
return rx.trap.val;
}
+ /* Expect a matching SET, optionally answer */
+ function f_ctrl_exp_set(IPA_CTRL_PT pt, template CtrlVariable variable,
+ template CtrlValue val := ?,
+ template (omit) CtrlValue rsp := omit,
+ float timeout_val := 2.0)
+ return CtrlValue {
+ timer T := timeout_val;
+ var CtrlMessage rx;
+ T.start;
+ alt {
+ [] pt.receive(tr_CtrlMsgSet(?, variable, val)) -> value rx {
+ if (ispresent(rsp)) {
+ pt.send(ts_CtrlMsgSetRepl(rx.cmd.id, valueof(variable), valueof(rsp)));
+ }
+ }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for SET ", variable);
+ mtc.stop;
+ }
+ }
+ return rx.cmd.val;
+ }
+
/* Expect a matching GET result */
function f_ctrl_get_exp(IPA_CTRL_PT pt, CtrlVariable variable, template CtrlValue exp) {
var charstring ctrl_resp;
diff --git a/library/Osmocom_CTRL_Types.ttcn b/library/Osmocom_CTRL_Types.ttcn
index eb22056..52be956 100644
--- a/library/Osmocom_CTRL_Types.ttcn
+++ b/library/Osmocom_CTRL_Types.ttcn
@@ -90,7 +90,51 @@ template CtrlMessage ts_CtrlMsgSet(CtrlId id, CtrlVariable variable, CtrlValue v
verb := "SET",
id := id,
variable := variable,
- val := omit
+ val := val
+ }
+}
+
+template CtrlMessage ts_CtrlMsgTrap(CtrlVariable variable, template (omit) CtrlValue val := omit) := {
+ trap := {
+ variable := variable,
+ val := val
+ }
+}
+
+template CtrlMessage ts_CtrlMsgGetRepl(CtrlId id, CtrlVariable variable, CtrlValue val) := {
+ resp := {
+ verb := "GET_REPLY",
+ id := id,
+ variable := variable,
+ val := val
+ }
+};
+
+template CtrlMessage ts_CtrlMsgSetRepl(CtrlId id, CtrlVariable variable, CtrlValue val) := {
+ resp := {
+ verb := "SET_REPLY",
+ id := id,
+ variable := variable,
+ val := val
+ }
+}
+
+template CtrlMessage tr_CtrlMsgGet(template CtrlId id, template CtrlVariable variable := ?) := {
+ cmd := {
+ verb := "GET",
+ id := id,
+ variable := variable,
+ val := ?
+ }
+}
+
+template CtrlMessage tr_CtrlMsgSet(template CtrlId id, template CtrlVariable variable := ?,
+ template CtrlValue val := ?) := {
+ cmd := {
+ verb := "SET",
+ id := id,
+ variable := variable,
+ val := val
}
}
diff --git a/library/RAN_Adapter.ttcnpp b/library/RAN_Adapter.ttcnpp
index 30a1a9e..8e19241 100644
--- a/library/RAN_Adapter.ttcnpp
+++ b/library/RAN_Adapter.ttcnpp
@@ -52,13 +52,6 @@ type record RAN_Adapter {
RAN_Emulation_CT vc_RAN
}
-type enumerated RAN_Transport {
- BSSAP_TRANSPORT_AoIP, /* 3GPP AoIP: SCCP over M3UA over SCTP */
- BSSAP_TRANSPORT_SCCPlite_SERVER, /* SCCPlite: SCCP over IPA over TCP */
- BSSAP_TRANSPORT_SCCPlite_CLIENT, /* SCCPlite: SCCP over IPA over TCP */
- RANAP_TRANSPORT_IuCS /* 3GPP IuCS: SCCP over M3UA over SCTP */
-};
-
type record RAN_Configuration {
RAN_Transport transport,
charstring sccp_service_type,
@@ -97,7 +90,7 @@ function f_ran_adapter_init(inout RAN_Adapter ba, in RAN_Configuration cfg, char
/* create components */
ba.vc_SCCP := SCCP_CT.create(id & "-SCCP");
- if (isvalue(ops)) {
+ if (not istemplatekind(ops, "omit")) {
ba.vc_RAN := RAN_Emulation_CT.create(id & "-RAN");
}
select (cfg.transport) {
@@ -149,10 +142,11 @@ function f_ran_adapter_init(inout RAN_Adapter ba, in RAN_Configuration cfg, char
}
}
- if (isvalue(ops)) {
+ if (not istemplatekind(ops, "omit")) {
timer T := 5.0;
T.start;
//T.timeout;
+ ops.transport := cfg.transport;
/* connect BSSNAP component to upper side of SCCP */
if (cfg.transport == RANAP_TRANSPORT_IuCS) {
#ifdef RAN_EMULATION_RANAP
@@ -173,6 +167,13 @@ function f_ran_adapter_init(inout RAN_Adapter ba, in RAN_Configuration cfg, char
log("Connecting MGCP RAN Emulation to IPA MGCP PORT");
connect(ba.vc_IPA:IPA_MGCP_PORT, ba.vc_RAN:MGCP);
#endif
+#ifdef IPA_EMULATION_CTRL
+#ifdef RAN_EMULATION_CTRL
+ /* connect IPA CTRL port with BSSMAP CTRL port */
+ log("Connecting CTRL RAN Emulation to IPA CTRL PORT");
+ connect(ba.vc_IPA:IPA_CTRL_PORT, ba.vc_RAN:CTRL);
+#endif
+#endif
}
log("Starting RAN_Emulation");
ba.vc_RAN.start(RAN_Emulation.main(valueof(ops), ""));
diff --git a/library/RAN_Emulation.ttcnpp b/library/RAN_Emulation.ttcnpp
index 41aec47..891de09 100644
--- a/library/RAN_Emulation.ttcnpp
+++ b/library/RAN_Emulation.ttcnpp
@@ -36,6 +36,7 @@ import from SCCP_Emulation all;
import from SCCPasp_Types all;
import from IPA_Emulation all;
import from MobileL3_Types all;
+import from Misc_Helpers all;
#ifdef RAN_EMULATION_BSSAP
import from BSSAP_Types all;
@@ -48,6 +49,11 @@ import from MGCP_Types all;
import from MGCP_Templates all;
#endif
+#ifdef RAN_EMULATION_CTRL
+import from Osmocom_CTRL_Types all;
+import from Osmocom_CTRL_Adapter all;
+#endif
+
#ifdef RAN_EMULATION_RANAP
import from RANAP_CodecPort all;
import from RANAP_PDU_Descriptions all;
@@ -75,6 +81,13 @@ type enumerated RAN_Conn_Prim {
MSC_CONN_PRIM_CONF_IND
}
+type enumerated RAN_Transport {
+ BSSAP_TRANSPORT_AoIP, /* 3GPP AoIP: SCCP over M3UA over SCTP */
+ BSSAP_TRANSPORT_SCCPlite_SERVER, /* SCCPlite: SCCP over IPA over TCP */
+ BSSAP_TRANSPORT_SCCPlite_CLIENT, /* SCCPlite: SCCP over IPA over TCP */
+ RANAP_TRANSPORT_IuCS /* 3GPP IuCS: SCCP over M3UA over SCTP */
+};
+
/* similar to PDU_BSSAP with DTAP, but DTAP is already decoded! */
type record PDU_DTAP_MO {
OCT1 dlci optional,
@@ -88,6 +101,17 @@ type record PDU_DTAP_MT {
PDU_ML3_NW_MS dtap
}
+type record PDU_DTAP_PS_MO {
+ OCT1 dlci optional,
+ boolean skip_seq_patching optional,
+ PDU_L3_MS_SGSN dtap
+}
+
+type record PDU_DTAP_PS_MT {
+ OCT1 dlci optional,
+ PDU_L3_SGSN_MS dtap
+}
+
template PDU_DTAP_MT ts_PDU_DTAP_MT(template PDU_ML3_NW_MS dtap, template OCT1 dlci := omit) := {
dlci := dlci,
dtap := dtap
@@ -110,6 +134,29 @@ template PDU_DTAP_MO tr_PDU_DTAP_MO(template PDU_ML3_MS_NW dtap, template OCT1 d
dtap := dtap
}
+template (value) PDU_DTAP_PS_MT ts_PDU_DTAP_PS_MT(template (value) PDU_L3_SGSN_MS dtap, template (omit) OCT1 dlci := omit) := {
+ dlci := dlci,
+ dtap := dtap
+}
+
+template (value) PDU_DTAP_PS_MO ts_PDU_DTAP_PS_MO(template (value) PDU_L3_MS_SGSN dtap, template (value) OCT1 dlci := '00'O,
+ boolean skip_seq_patching := false) := {
+ dlci := dlci,
+ skip_seq_patching := skip_seq_patching,
+ dtap := dtap
+}
+
+template PDU_DTAP_PS_MT tr_PDU_DTAP_PS_MT(template PDU_L3_SGSN_MS dtap, template OCT1 dlci := *) := {
+ dlci := dlci,
+ dtap := dtap
+}
+
+template PDU_DTAP_PS_MO tr_PDU_DTAP_PS_MO(template PDU_L3_MS_SGSN dtap, template OCT1 dlci := *) := {
+ dlci := dlci,
+ skip_seq_patching := ?,
+ dtap := dtap
+}
+
/* port between individual per-connection components and this dispatcher */
type port RAN_Conn_PT message {
inout
@@ -129,6 +176,7 @@ type port RAN_Conn_PT message {
#endif
/* direct DTAP messages from/to clients */
PDU_DTAP_MO, PDU_DTAP_MT,
+ PDU_DTAP_PS_MO, PDU_DTAP_PS_MT,
/* misc indications / requests between SCCP and client */
RAN_Conn_Prim;
} with { extension "internal" };
@@ -170,6 +218,11 @@ type component RAN_Emulation_CT {
/* MGCP port */
port IPA_MGCP_PT MGCP;
#endif
+#ifdef RAN_EMULATION_CTRL
+ /* CTRL port */
+ port IPA_CTRL_PT CTRL;
+ port IPA_CTRL_PT CTRL_CLIENT;
+#endif
/* use 16 as this is also the number of SCCP connections that SCCP_Emulation can handle */
var ConnectionData ConnectionTable[16];
@@ -404,7 +457,7 @@ runs on RAN_Emulation_CT {
ispresent(bssap.pdu.bssmap.assignmentRequest.circuitIdentityCode)) {
var BSSMAP_IE_CircuitIdentityCode cic_ie :=
bssap.pdu.bssmap.assignmentRequest.circuitIdentityCode;
- var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
+ var integer cic := f_bssmap_ie_cic_2_int(cic_ie);
f_comp_store_cic(client, cic);
}
}
@@ -438,6 +491,11 @@ runs on RAN_Emulation_CT return RAN_ConnHdlr;
type function BssmapUnitdataCallback(PDU_BSSAP bssap)
runs on RAN_Emulation_CT return template PDU_BSSAP;
+private function append_osmux_ie()
+runs on RAN_Emulation_CT return boolean {
+ return g_ran_ops.use_osmux and (g_ran_ops.transport == BSSAP_TRANSPORT_AoIP);
+}
+
/* handle common Unitdata such as Paging */
private function CommonBssmapUnitdataCallback(PDU_BSSAP bssap)
runs on RAN_Emulation_CT return template PDU_BSSAP {
@@ -462,14 +520,15 @@ runs on RAN_Emulation_CT return template PDU_BSSAP {
private function f_bssap_wait_for_reset() runs on RAN_Emulation_CT {
var BSSAP_N_UNITDATA_ind ud_ind;
timer T := 20.0;
+ var boolean append_osmux_support := append_osmux_ie();
T.start;
alt {
- [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) -> value ud_ind {
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(append_osmux_support))) -> value ud_ind {
BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
- ts_BSSMAP_ResetAck(g_ran_ops.use_osmux)));
+ ts_BSSMAP_ResetAck(append_osmux_support)));
}
- [] as_reset_ack();
+ [] as_reset_ack(append_osmux_support);
[] BSSAP.receive {
repeat;
}
@@ -482,14 +541,15 @@ private function f_bssap_wait_for_reset() runs on RAN_Emulation_CT {
function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on RAN_Emulation_CT {
timer T := 5.0;
+ var boolean append_osmux_support := append_osmux_ie();
- BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0, g_ran_ops.use_osmux)));
+ BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0, append_osmux_support)));
T.start;
alt {
- [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(own, peer, tr_BSSMAP_ResetAck(g_ran_ops.use_osmux))) {
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(own, peer, tr_BSSMAP_ResetAck(append_osmux_support))) {
log("Received RESET-ACK in response to RESET, we're ready to go!");
}
- [] as_reset_ack();
+ [] as_reset_ack(append_osmux_support);
[] BSSAP.receive { repeat };
[] T.timeout {
setverdict(fail, "Timeout waiting for RESET-ACK after sending RESET");
@@ -537,24 +597,46 @@ runs on RAN_Emulation_CT {
var template (omit) OCT1 dlci := fake_dlci_from_sapi(sapi);
if (g_ran_ops.role_ms) {
/* we are the MS, so any message to us must be MT */
- var PDU_DTAP_MT mt := {
- dlci := omit,
- dtap := dec_PDU_ML3_NW_MS(valueof(l3))
- };
- if (isvalue(dlci)) {
- mt.dlci := valueof(dlci)
+ if (g_ran_ops.ps_domain) {
+ var PDU_DTAP_PS_MT mt := {
+ dlci := omit,
+ dtap := dec_PDU_L3_SGSN_MS(valueof(l3))
+ };
+ if (isvalue(dlci)) {
+ mt.dlci := valueof(dlci);
+ }
+ CLIENT.send(mt) to client;
+ } else {
+ var PDU_DTAP_MT mt := {
+ dlci := omit,
+ dtap := dec_PDU_ML3_NW_MS(valueof(l3))
+ };
+ if (isvalue(dlci)) {
+ mt.dlci := valueof(dlci)
+ }
+ CLIENT.send(mt) to client;
}
- CLIENT.send(mt) to client;
} else {
/* we are the Network, so any message to us must be MO */
- var PDU_DTAP_MO mo := {
- dlci := omit,
- dtap := dec_PDU_ML3_MS_NW(valueof(l3))
- };
- if (isvalue(dlci)) {
- mo.dlci := valueof(dlci)
+ if (g_ran_ops.ps_domain) {
+ var PDU_DTAP_PS_MO mo := {
+ dlci := omit,
+ dtap := dec_PDU_L3_MS_SGSN(valueof(l3))
+ };
+ if (isvalue(dlci)) {
+ mo.dlci := valueof(dlci);
+ }
+ CLIENT.send(mo) to client;
+ } else {
+ var PDU_DTAP_MO mo := {
+ dlci := omit,
+ dtap := dec_PDU_ML3_MS_NW(valueof(l3))
+ };
+ if (isvalue(dlci)) {
+ mo.dlci := valueof(dlci)
+ }
+ CLIENT.send(mo) to client;
}
- CLIENT.send(mo) to client;
}
}
}
@@ -650,6 +732,7 @@ type record RanOps {
boolean decode_dtap,
boolean role_ms,
RanProtocol protocol,
+ RAN_Transport transport,
boolean use_osmux,
/* needed for performing BSSMAP RESET */
SCCP_PAR_Address sccp_addr_local optional,
@@ -720,7 +803,7 @@ function f_ML3_patch_seq(inout ConnectionData cd, in PDU_ML3_MS_NW dtap, inout o
f_ML3_patch_seq_nr(seq_nr, enc_l3);
}
-private altstep as_reset_ack() runs on RAN_Emulation_CT {
+private altstep as_reset_ack(boolean append_osmux_support := false) runs on RAN_Emulation_CT {
#ifdef RAN_EMULATION_BSSAP
var BSSAP_N_UNITDATA_ind ud_ind;
#endif
@@ -728,10 +811,10 @@ private altstep as_reset_ack() runs on RAN_Emulation_CT {
var RANAP_N_UNITDATA_ind rud_ind;
#endif
#ifdef RAN_EMULATION_BSSAP
- [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) -> value ud_ind {
+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(append_osmux_support))) -> value ud_ind {
log("Respoding to inbound RESET with RESET-ACK");
BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
- ts_BSSMAP_ResetAck(g_ran_ops.use_osmux)));
+ ts_BSSMAP_ResetAck(append_osmux_support)));
repeat;
}
#endif
@@ -878,6 +961,8 @@ private altstep as_main_ranap() runs on RAN_Emulation_CT {
var RANAP_Conn_Req creq;
var RANAP_PDU ranap;
var RAN_ConnHdlr vc_conn;
+ var PDU_DTAP_PS_MO ps_mo;
+ var PDU_DTAP_PS_MT ps_mt;
/* SCCP -> Client: UNIT-DATA (connectionless SCCP) from a BSC */
[] RANAP.receive(RANAP_N_UNITDATA_ind:?) -> value rud_ind {
@@ -972,6 +1057,25 @@ private altstep as_main_ranap() runs on RAN_Emulation_CT {
}
}
+ [g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_PS_MO:?) -> value ps_mo sender vc_conn {
+ var integer idx := f_idx_by_comp(vc_conn);
+ /* convert from decoded DTAP to encoded DTAP */
+ var octetstring l3_enc := enc_PDU_L3_MS_SGSN(ps_mo.dtap);
+ /* patch correct L3 send sequence number N(SD) into l3_enc */
+ if (ps_mo.skip_seq_patching == false) {
+ //f_ML3_patch_seq(ConnectionTable[idx], ps_mo.dtap, l3_enc);
+ }
+ f_xmit_raw_l3(ConnectionTable[idx].sccp_conn_id, ps_mo.dlci, l3_enc);
+ }
+
+ [not g_ran_ops.role_ms] CLIENT.receive(PDU_DTAP_PS_MT:?) -> value ps_mt sender vc_conn {
+ var integer idx := f_idx_by_comp(vc_conn);
+ /* convert from decoded DTAP to encoded DTAP */
+ var octetstring l3_enc := enc_PDU_L3_SGSN_MS(ps_mt.dtap);
+ f_xmit_raw_l3(ConnectionTable[idx].sccp_conn_id, ps_mt.dlci, l3_enc);
+ }
+
+
#else
[false] CLIENT.receive {}
#endif
@@ -1026,6 +1130,37 @@ private altstep as_main_mgcp() runs on RAN_Emulation_CT {
#endif
}
+private altstep as_main_ctrl() runs on RAN_Emulation_CT {
+#ifdef RAN_EMULATION_CTRL
+ var CtrlMessage ctrl;
+ var RAN_ConnHdlr vc_conn;
+ var ASP_IPA_Event evt;
+
+ /* Handling of CTRL in IPA SCCPLite case. This predates 3GPP AoIP
+ * and uses a CTRL session in parallel to BSSAP. */
+
+ /* CTRL_CLIENT -> CTRL */
+ [] CTRL_CLIENT.receive(CtrlMessage:?) -> value ctrl sender vc_conn {
+ CTRL.send(ctrl);
+ }
+
+ /* CTRL -> CTRL_CLIENT */
+ [] CTRL.receive(CtrlMessage:?) -> value ctrl {
+ CTRL_CLIENT.send(ctrl);
+ }
+
+ [] CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) -> value evt {
+ CTRL_CLIENT.send(evt);
+ }
+ [] CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Lost IPA connection!");
+ }
+ [] CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) {}
+#else
+ [false] CLIENT.receive {}
+#endif
+}
+
/* send a raw (encoded) L3 message over given SCCP connection */
private function f_xmit_raw_l3(integer sccp_conn_id, OCT1 dlci, octetstring l3_enc) runs on RAN_Emulation_CT
{
@@ -1039,13 +1174,15 @@ private function f_xmit_raw_l3(integer sccp_conn_id, OCT1 dlci, octetstring l3_e
#endif
#ifdef RAN_EMULATION_RANAP
case (RAN_PROTOCOL_RANAP) {
+ var template (omit) RANAP_IEs.SAPI sapi := omit;
var RANAP_PDU ranap;
- if (false /* SAPI */) {
- var RANAP_IEs.SAPI sapi := sapi_0;
- ranap := valueof(ts_RANAP_DirectTransferSAPI(l3_enc, sapi));
- } else {
- ranap := valueof(ts_RANAP_DirectTransfer(l3_enc));
+
+ /* Perform DLCI -> SAPI transformation (x & 0x07) */
+ if (dlci and4b '07'O == '03'O) {
+ sapi := sapi_3;
}
+
+ ranap := valueof(ts_RANAP_DirectTransfer(l3_enc, sapi := sapi));
RANAP.send(ts_RANAP_DATA_req(sccp_conn_id, ranap));
}
#endif
@@ -1108,6 +1245,7 @@ function main(RanOps ops, charstring id) runs on RAN_Emulation_CT {
}
[] as_main_mgcp();
+ [] as_main_ctrl();
[] PROC.getcall(RAN_register:{?,?}) -> param(l3_info, vc_hdlr) {
f_create_expect(l3_info, vc_hdlr);
diff --git a/library/RSL_Emulation.ttcn b/library/RSL_Emulation.ttcn
index 790dd7a..309ec13 100644
--- a/library/RSL_Emulation.ttcn
+++ b/library/RSL_Emulation.ttcn
@@ -45,6 +45,8 @@ type component RSL_DchanHdlr {
/* second BTS / DChan during hand-over */
port RSL_DCHAN_PT RSL1;
port RSLEM_PROC_PT RSL1_PROC;
+ port RSL_DCHAN_PT RSL2;
+ port RSLEM_PROC_PT RSL2_PROC;
};
type record RSLDC_ChanRqd {
diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn
index 456d6d2..87de9a4 100644
--- a/library/RSL_Types.ttcn
+++ b/library/RSL_Types.ttcn
@@ -390,6 +390,14 @@ module RSL_Types {
uint5_t power_level
}
+ template (value) RSL_IE_BS_Power ts_RSL_IE_BS_Power(uint5_t power_level,
+ boolean epc := false, boolean fpc := false) := {
+ reserved := 0,
+ epc := epc,
+ fpc := fpc,
+ power_level := power_level
+ }
+
/* 9.3.7 */
type enumerated RSL_AlgId {
RSL_ALG_ID_A5_0 ('00000001'B),
@@ -626,6 +634,18 @@ module RSL_Types {
msg := msg
}
+ /* 9.3.31 */
+ type record RSL_IE_MS_Power_Parameters {
+ uint8_t len,
+ octetstring params
+ } with {
+ variant (len) "LENGTHTO(params)";
+ };
+ template (value) RSL_IE_MS_Power_Parameters ts_RSL_IE_MS_Power_Parameters(octetstring params) := {
+ len := 0, /* overwritten */
+ params := params
+ }
+
/* 9.3.40 */
type enumerated RSL_ChanNeeded {
RSL_CHANNEED_ANY ('00'B),
@@ -765,6 +785,7 @@ module RSL_Types {
uint8_t handover_ref,
RSL_IE_BS_Power bs_power,
RSL_IE_MS_Power ms_power,
+ RSL_IE_MS_Power_Parameters ms_power_params,
uint8_t timing_adv,
RSL_IE_MultirateCtrl multirate_ctrl,
uint8_t msg_id,
@@ -819,6 +840,7 @@ module RSL_Types {
handover_ref, iei = RSL_IE_HANDO_REF;
bs_power, iei = RSL_IE_BS_POWER;
ms_power, iei = RSL_IE_MS_POWER;
+ ms_power_params, iei = RSL_IE_MS_POWER_PARAM;
timing_adv, iei = RSL_IE_TIMING_ADVANCE;
multirate_ctrl, iei = RSL_IE_MR_CONTROL;
msg_id, iei = RSL_IE_MSG_ID;
@@ -1442,6 +1464,30 @@ template RSL_Message tr_RSL_MsgTypeDR(template RSL_MessageType msg_type) modifie
}
}
+ template (value) RSL_Message ts_RSL_MS_PWR_CTRL_with_pp(template (value) RslChannelNr chan_nr,
+ integer pwr_level) := {
+ msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false),
+ msg_type := RSL_MT_MS_POWER_CONTROL,
+ ies := {
+ t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}),
+ t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_level)}),
+ t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params :=
+ ts_RSL_IE_MS_Power_Parameters(''O)})
+ }
+ }
+
+ /* 8.4.16: BTS <- BSC */
+ template (value) RSL_Message ts_RSL_BS_PWR_CTRL(template (value) RslChannelNr chan_nr,
+ template (value) RSL_IE_BS_Power bs_power) := {
+ msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false),
+ msg_type := RSL_MT_BS_POWER_CONTROL,
+ ies := {
+ t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}),
+ t_RSL_IE(RSL_IE_BS_POWER, RSL_IE_Body:{bs_power := bs_power})
+ /* One optional IE: BS POWER PARAMETERS */
+ }
+ }
+
/* 8.4.19 BTS -> BSC */
template (value) RSL_Message ts_RSL_RF_CHAN_REL_ACK(template (value) RslChannelNr chan_nr) :=
ts_RSL_MsgDiscType(ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false),
diff --git a/library/RTP_Emulation.ttcn b/library/RTP_Emulation.ttcn
index 31bf68a..70604dc 100644
--- a/library/RTP_Emulation.ttcn
+++ b/library/RTP_Emulation.ttcn
@@ -105,6 +105,9 @@ type component RTP_Emulation_CT {
var uint32_t g_rx_last_ts;
var IuUP_Entity g_iuup_ent; // := valueof(t_IuUP_Entity(1));
+
+ var boolean g_conn_refuse_expect := false;
+ var boolean g_conn_refuse_received := false;
}
type enumerated RtpemMode {
@@ -175,9 +178,12 @@ signature RTPEM_connect(in HostName remote_host, in PortNumber remote_port);
signature RTPEM_mode(in RtpemMode mode);
signature RTPEM_configure(in RtpemConfig cfg);
signature RTPEM_stats_get(out RtpemStats stats, in boolean rtcp);
+signature RTPEM_conn_refuse_expect(in boolean expect);
+signature RTPEM_conn_refuse_received(out boolean received);
type port RTPEM_CTRL_PT procedure {
- inout RTPEM_bind, RTPEM_connect, RTPEM_mode, RTPEM_configure, RTPEM_stats_get;
+ inout RTPEM_bind, RTPEM_connect, RTPEM_mode, RTPEM_configure, RTPEM_stats_get, RTPEM_conn_refuse_expect,
+ RTPEM_conn_refuse_received;
} with { extension "internal" };
function f_rtpem_bind(RTPEM_CTRL_PT pt, in HostName local_host, inout PortNumber local_port) {
@@ -299,6 +305,21 @@ function f_rtpem_stats_err_check(RtpemStats s) {
}
}
+function f_rtpem_conn_refuse_expect(RTPEM_CTRL_PT pt) {
+ pt.call(RTPEM_conn_refuse_expect:{true}) {
+ [] pt.getreply(RTPEM_conn_refuse_expect:{true}) {};
+ }
+}
+
+function f_rtpem_conn_refuse_verify(RTPEM_CTRL_PT pt) {
+ pt.call(RTPEM_conn_refuse_received:{?}) {
+ [] pt.getreply(RTPEM_conn_refuse_received:{true}) {};
+ [] pt.getreply(RTPEM_conn_refuse_received:{false}) {
+ setverdict(fail, "Expected to receive connection refused");
+ };
+ }
+}
+
template PDU_RTP ts_RTP(BIT32_BO_LAST ssrc, INT7b pt, LIN2_BO_LAST seq, uint32_t ts,
octetstring payload, BIT1 marker := '0'B) := {
version := 2,
@@ -348,6 +369,11 @@ function f_main() runs on RTP_Emulation_CT
tr_rtp.msg := { rtp := ? };
tr_rtcp.msg := { rtcp := ? };
+ var template ASP_Event tr_conn_refuse := {result := { errorCode := ERROR_SOCKET,
+ connId := ?,
+ os_error_code := 111,
+ os_error_text := ? /* "Connection refused" */}};
+
g_iuup_ent := valueof(t_IuUP_Entity(g_cfg.iuup_tx_init));
while (true) {
@@ -448,7 +474,12 @@ function f_main() runs on RTP_Emulation_CT
CTRL.reply(RTPEM_stats_get:{g_stats_rtp, is_rtcp});
}
}
-
+ [] CTRL.getcall(RTPEM_conn_refuse_expect:{?}) -> param(g_conn_refuse_expect) {
+ CTRL.reply(RTPEM_conn_refuse_expect:{g_conn_refuse_expect});
+ }
+ [] CTRL.getcall(RTPEM_conn_refuse_received:{?}) {
+ CTRL.reply(RTPEM_conn_refuse_received:{g_conn_refuse_received});
+ }
/* simply ignore any RTTP/RTP if receiver not enabled */
@@ -491,6 +522,16 @@ function f_main() runs on RTP_Emulation_CT
lengthof(g_cfg.tx_fixed_payload);
}
+ /* connection refused */
+ [g_conn_refuse_expect] RTP.receive(tr_conn_refuse) {
+ log("Connection refused (expected)");
+ g_conn_refuse_received := true;
+ }
+ [not g_conn_refuse_expect] RTP.receive(tr_conn_refuse) {
+ setverdict(fail, "Connection refused (unexpected)");
+ mtc.stop;
+ }
+
/* fail on any unexpected messages */
[] RTP.receive {
setverdict(fail, "Received unexpected type from RTP");
diff --git a/library/S1AP_CodecPort.ttcn b/library/S1AP_CodecPort.ttcn
new file mode 100644
index 0000000..59cef18
--- /dev/null
+++ b/library/S1AP_CodecPort.ttcn
@@ -0,0 +1,82 @@
+module S1AP_CodecPort {
+
+/* Simple S1AP Codec Port, translating between raw SCTP primitives with
+ * octetstring payload towards the IPL4asp provider, and S1AP primitives
+ * which carry the decoded S1AP data types as payload.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+ import from IPL4asp_PortType all;
+ import from IPL4asp_Types all;
+ import from S1AP_PDU_Descriptions all;
+ import from S1AP_Types all;
+
+ type record S1AP_RecvFrom {
+ ConnectionId connId,
+ HostName remName,
+ PortNumber remPort,
+ HostName locName,
+ PortNumber locPort,
+ S1AP_PDU msg
+ };
+
+ template S1AP_RecvFrom t_S1AP_RecvFrom(template S1AP_PDU msg) := {
+ connId := ?,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := msg
+ }
+
+ type record S1AP_Send {
+ ConnectionId connId,
+ S1AP_PDU msg
+ }
+
+ template S1AP_Send t_S1AP_Send(template ConnectionId connId, template S1AP_PDU msg) := {
+ connId := connId,
+ msg := msg
+ }
+
+ private function IPL4_to_S1AP_RecvFrom(in ASP_RecvFrom pin, out S1AP_RecvFrom pout) {
+ pout.connId := pin.connId;
+ pout.remName := pin.remName;
+ pout.remPort := pin.remPort;
+ pout.locName := pin.locName;
+ pout.locPort := pin.locPort;
+ pout.msg := dec_S1AP_PDU(pin.msg);
+ } with { extension "prototype(fast)" };
+
+ private function S1AP_to_IPL4_Send(in S1AP_Send pin, out ASP_Send pout) {
+ pout.connId := pin.connId;
+ pout.proto := {
+ sctp := {
+ sinfo_stream := omit,
+ sinfo_ppid := 18,
+ remSocks := omit,
+ assocId := omit
+ }
+ };
+ pout.msg := enc_S1AP_PDU(pin.msg);
+ } with { extension "prototype(fast)" };
+
+ type port S1AP_CODEC_PT message {
+ out S1AP_Send;
+ in S1AP_RecvFrom,
+ ASP_ConnId_ReadyToRelease,
+ ASP_Event;
+ } with { extension "user IPL4asp_PT
+ out(S1AP_Send -> ASP_Send:function(S1AP_to_IPL4_Send))
+ in(ASP_RecvFrom -> S1AP_RecvFrom: function(IPL4_to_S1AP_RecvFrom);
+ ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
+ ASP_Event -> ASP_Event: simple)"
+ }
+}
diff --git a/library/S1AP_CodecPort_CtrlFunct.ttcn b/library/S1AP_CodecPort_CtrlFunct.ttcn
new file mode 100644
index 0000000..0399199
--- /dev/null
+++ b/library/S1AP_CodecPort_CtrlFunct.ttcn
@@ -0,0 +1,44 @@
+module S1AP_CodecPort_CtrlFunct {
+
+ import from S1AP_CodecPort all;
+ import from IPL4asp_Types all;
+
+ external function f_IPL4_listen(
+ inout S1AP_CODEC_PT portRef,
+ in HostName locName,
+ in PortNumber locPort,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_connect(
+ inout S1AP_CODEC_PT portRef,
+ in HostName remName,
+ in PortNumber remPort,
+ in HostName locName,
+ in PortNumber locPort,
+ in ConnectionId connId,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_close(
+ inout S1AP_CODEC_PT portRef,
+ in ConnectionId id,
+ in ProtoTuple proto := { unspecified := {} }
+ ) return Result;
+
+ external function f_IPL4_setUserData(
+ inout S1AP_CODEC_PT portRef,
+ in ConnectionId id,
+ in UserData userData
+ ) return Result;
+
+ external function f_IPL4_getUserData(
+ inout S1AP_CODEC_PT portRef,
+ in ConnectionId id,
+ out UserData userData
+ ) return Result;
+
+}
+
diff --git a/library/S1AP_CodecPort_CtrlFunctDef.cc b/library/S1AP_CodecPort_CtrlFunctDef.cc
new file mode 100644
index 0000000..dc73046
--- /dev/null
+++ b/library/S1AP_CodecPort_CtrlFunctDef.cc
@@ -0,0 +1,56 @@
+#include "IPL4asp_PortType.hh"
+#include "S1AP_CodecPort.hh"
+#include "IPL4asp_PT.hh"
+
+namespace S1AP__CodecPort__CtrlFunct {
+
+ IPL4asp__Types::Result f__IPL4__listen(
+ S1AP__CodecPort::S1AP__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__connect(
+ S1AP__CodecPort::S1AP__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& remName,
+ const IPL4asp__Types::PortNumber& remPort,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__connect(portRef, remName, remPort,
+ locName, locPort, connId, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__close(
+ S1AP__CodecPort::S1AP__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto)
+ {
+ return f__IPL4__PROVIDER__close(portRef, connId, proto);
+ }
+
+ IPL4asp__Types::Result f__IPL4__setUserData(
+ S1AP__CodecPort::S1AP__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);
+ }
+
+ IPL4asp__Types::Result f__IPL4__getUserData(
+ S1AP__CodecPort::S1AP__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);
+ }
+
+}
+
diff --git a/library/S1AP_Emulation.ttcn b/library/S1AP_Emulation.ttcn
new file mode 100644
index 0000000..d09b499
--- /dev/null
+++ b/library/S1AP_Emulation.ttcn
@@ -0,0 +1,681 @@
+module S1AP_Emulation {
+
+/* S1AP Emulation, runs on top of S1AP_CodecPort. It multiplexes/demultiplexes
+ * the individual IMSIs/subscribers, so there can be separate TTCN-3 components handling
+ * each of them.
+ *
+ * The S1AP_Emulation.main() function processes S1AP primitives from the S1AP
+ * socket via the S1AP_CodecPort, and dispatches them to the per-IMSI components.
+ *
+ * For each new IMSI, the S1apOps.create_cb() is called. It can create
+ * or resolve a TTCN-3 component, and returns a component reference to which that IMSI
+ * is routed/dispatched.
+ *
+ * If a pre-existing component wants to register to handle a future inbound IMSI, it can
+ * do so by registering an "expect" with the expected IMSI.
+ *
+ * Inbound non-UE related S1AP messages (such as RESET, SETUP, OVERLOAD) are dispatched to
+ * the S1apOps.unitdata_cb() callback, which is registered with an argument to the
+ * main() function below.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from S1AP_CodecPort all;
+import from S1AP_CodecPort_CtrlFunct all;
+import from S1AP_Types all;
+import from S1AP_Constants all;
+import from S1AP_PDU_Contents all;
+import from S1AP_PDU_Descriptions all;
+import from S1AP_IEs all;
+import from S1AP_Templates all;
+
+import from NAS_EPS_Types all;
+import from NAS_Templates all;
+
+import from LTE_CryptoFunctions all;
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from IPL4asp_Types all;
+import from DNS_Helpers all;
+
+
+type component S1AP_ConnHdlr {
+ port S1AP_Conn_PT S1AP;
+ /* procedure based port to register for incoming connections */
+ port S1APEM_PROC_PT S1AP_PROC;
+}
+
+/* port between individual per-connection components and this dispatcher */
+type port S1AP_Conn_PT message {
+ inout S1AP_PDU, PDU_NAS_EPS, S1APEM_Config;
+} with { extension "internal" };
+
+type record NAS_Keys {
+ octetstring k_nas_int,
+ octetstring k_nas_enc
+};
+type union S1APEM_Config {
+ NAS_Keys set_nas_keys
+};
+
+type enumerated S1APEM_EventUpDown {
+ S1APEM_EVENT_DOWN,
+ S1APEM_EVENT_UP
+}
+
+/* an event indicating us whether or not a connection is physically up or down,
+ * and whether we have received an ID_ACK */
+type union S1APEM_Event {
+ S1APEM_EventUpDown up_down
+}
+
+/* global test port e.g. for non-imsi/conn specific messages */
+type port S1AP_PT message {
+ inout S1AP_PDU, S1APEM_Event;
+} with { extension "internal" };
+
+
+/* represents a single S1AP Association */
+type record AssociationData {
+ S1AP_ConnHdlr comp_ref, /* component handling this UE connection */
+ uint24_t enb_ue_s1ap_id optional, /* eNB side S1AP ID */
+ uint32_t mme_ue_s1ap_id optional, /* MME side S1AP ID */
+ EUTRAN_CGI cgi optional,
+ TAI tai optional,
+ NAS_UE_State nus
+
+ //hexstring imsi optional
+};
+
+type component S1AP_Emulation_CT {
+ /* Port facing to the UDP SUT */
+ port S1AP_CODEC_PT S1AP;
+ /* All S1AP_ConnHdlr S1AP ports connect here
+ * S1AP_Emulation_CT.main needs to figure out what messages
+ * to send where with CLIENT.send() to vc_conn */
+ port S1AP_Conn_PT S1AP_CLIENT;
+ /* currently tracked connections */
+ var AssociationData S1apAssociationTable[16];
+ /* pending expected CRCX */
+ var ExpectData S1apExpectTable[8];
+ /* procedure based port to register for incoming connections */
+ port S1APEM_PROC_PT S1AP_PROC;
+ /* test port for unit data messages */
+ port S1AP_PT S1AP_UNIT;
+
+ var S1AP_conn_parameters g_pars;
+ var charstring g_s1ap_id;
+ var integer g_s1ap_conn_id := -1;
+}
+
+type function S1APCreateCallback(S1AP_PDU msg, template (omit) MME_UE_S1AP_ID mme_id,
+ template (omit) ENB_UE_S1AP_ID enb_id, charstring id)
+runs on S1AP_Emulation_CT return S1AP_ConnHdlr;
+
+type function S1APUnitdataCallback(S1AP_PDU msg)
+runs on S1AP_Emulation_CT return template S1AP_PDU;
+
+type record S1APOps {
+ S1APCreateCallback create_cb,
+ S1APUnitdataCallback unitdata_cb
+}
+
+type record S1AP_conn_parameters {
+ HostName remote_ip,
+ PortNumber remote_sctp_port,
+ HostName local_ip,
+ PortNumber local_sctp_port,
+ NAS_Role role
+}
+
+function tr_S1AP_RecvFrom_R(template S1AP_PDU msg)
+runs on S1AP_Emulation_CT return template S1AP_RecvFrom {
+ var template S1AP_RecvFrom mrf := {
+ connId := g_s1ap_conn_id,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := msg
+ }
+ return mrf;
+}
+
+private function f_s1ap_ids_known(template (omit) MME_UE_S1AP_ID mme_id,
+ template (omit) ENB_UE_S1AP_ID enb_id)
+runs on S1AP_Emulation_CT return boolean {
+ var integer i;
+ log("f_s1ap_ids_known(",mme_id,", ",enb_id,")");
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ log("tbl[",i,"]: mme=", S1apAssociationTable[i].mme_ue_s1ap_id,
+ ", enb=", S1apAssociationTable[i].enb_ue_s1ap_id);
+ /* skip empty records */
+ if (S1apAssociationTable[i].mme_ue_s1ap_id == omit and
+ S1apAssociationTable[i].enb_ue_s1ap_id == omit) {
+ log("skipping empty ", i);
+ continue;
+ }
+ if (S1apAssociationTable[i].mme_ue_s1ap_id == omit) {
+ log("entry ", i, " has no MME ID yet (enb=", S1apAssociationTable[i].enb_ue_s1ap_id);
+ /* Table doesn't yet know the MME side ID, let's look-up only
+ * based on the eNB side ID */
+ if (match(S1apAssociationTable[i].enb_ue_s1ap_id, enb_id)) {
+ /* update table with MME side ID */
+ S1apAssociationTable[i].mme_ue_s1ap_id := valueof(mme_id);
+ return true;
+ }
+ } else if (match(S1apAssociationTable[i].enb_ue_s1ap_id, enb_id) and
+ match(S1apAssociationTable[i].mme_ue_s1ap_id, mme_id)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_comp_known(S1AP_ConnHdlr client)
+runs on S1AP_Emulation_CT return boolean {
+ var integer i;
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ if (S1apAssociationTable[i].comp_ref == client) {
+ return true;
+ }
+ }
+ return false;
+}
+
+private function f_assoc_id_by_s1ap_ids(template (omit) MME_UE_S1AP_ID mme_id,
+ template (omit) ENB_UE_S1AP_ID enb_id)
+runs on S1AP_Emulation_CT return integer {
+ var integer i;
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ if (match(S1apAssociationTable[i].enb_ue_s1ap_id, enb_id)) {
+ if (istemplatekind(mme_id, "omit")) {
+ return i;
+ } else {
+ if (match(S1apAssociationTable[i].mme_ue_s1ap_id, mme_id)) {
+ return i;
+ }
+ }
+ }
+ }
+ setverdict(fail, "S1AP Association Table not found by ENB-ID=", enb_id, " MME-ID=", mme_id);
+ mtc.stop;
+}
+
+private function f_assoc_id_by_comp(S1AP_ConnHdlr client)
+runs on S1AP_Emulation_CT return integer {
+ var integer i;
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ if (S1apAssociationTable[i].comp_ref == client) {
+ return i;
+ }
+ }
+ setverdict(fail, "S1AP Association Table not found by component ", client);
+ mtc.stop;
+}
+
+private function f_assoc_by_comp(S1AP_ConnHdlr client)
+runs on S1AP_Emulation_CT return AssociationData {
+ var integer i := f_assoc_id_by_comp(client);
+ return S1apAssociationTable[i];
+}
+
+private function f_s1ap_id_table_add(S1AP_ConnHdlr comp_ref,
+ template (omit) MME_UE_S1AP_ID mme_id, ENB_UE_S1AP_ID enb_id)
+runs on S1AP_Emulation_CT return integer {
+ var integer i;
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ if (not isvalue(S1apAssociationTable[i].enb_ue_s1ap_id)) {
+ S1apAssociationTable[i].enb_ue_s1ap_id := enb_id;
+ if (istemplatekind(mme_id, "omit")) {
+ S1apAssociationTable[i].mme_ue_s1ap_id := omit;
+ } else {
+ S1apAssociationTable[i].mme_ue_s1ap_id := valueof(mme_id);
+ }
+ S1apAssociationTable[i].comp_ref := comp_ref;
+ return i;
+ }
+ }
+ testcase.stop("S1AP Association Table full!");
+ return -1;
+}
+
+private function f_s1ap_id_table_del(S1AP_ConnHdlr comp_ref, ENB_UE_S1AP_ID enb_id)
+runs on S1AP_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ if (S1apAssociationTable[i].comp_ref == comp_ref and
+ S1apAssociationTable[i].mme_ue_s1ap_id == enb_id) {
+ S1apAssociationTable[i].enb_ue_s1ap_id := omit;
+ S1apAssociationTable[i].mme_ue_s1ap_id := omit;
+ S1apAssociationTable[i].comp_ref := null;
+ return;
+ }
+ }
+ setverdict(fail, "S1AP Association Table: Couldn't find to-be-deleted entry!");
+ mtc.stop;
+}
+
+
+private function f_s1ap_id_table_init()
+runs on S1AP_Emulation_CT {
+ for (var integer i := 0; i < sizeof(S1apAssociationTable); i := i+1) {
+ S1apAssociationTable[i].mme_ue_s1ap_id := omit;
+ S1apAssociationTable[i].enb_ue_s1ap_id := omit;
+ S1apAssociationTable[i].cgi := omit;
+ S1apAssociationTable[i].tai := omit;
+ S1apAssociationTable[i].nus := valueof(t_NAS_UE_State(g_pars.role));
+ }
+}
+
+private template (value) SctpTuple ts_SCTP(template (omit) integer ppid := 18) := {
+ sinfo_stream := omit,
+ sinfo_ppid := ppid,
+ remSocks := omit,
+ assocId := omit
+};
+
+private template PortEvent tr_SctpAssocChange := {
+ sctpEvent := {
+ sctpAssocChange := ?
+ }
+}
+private template PortEvent tr_SctpPeerAddrChange := {
+ sctpEvent := {
+ sctpPeerAddrChange := ?
+ }
+}
+
+private function f_s1ap_xceive(template (value) S1AP_PDU tx,
+ template S1AP_PDU rx_t := ?)
+runs on S1AP_Emulation_CT return S1AP_PDU {
+ timer T := 10.0;
+ var S1AP_RecvFrom mrf;
+
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id, tx));
+ alt {
+ [] S1AP.receive(tr_S1AP_RecvFrom_R(rx_t)) -> value mrf { }
+ [] S1AP.receive(tr_SctpAssocChange) { repeat; }
+ [] S1AP.receive(tr_SctpPeerAddrChange) { repeat; }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for ", rx_t);
+ mtc.stop;
+ }
+ }
+ return mrf.msg;
+}
+
+/*
+private function f_nas_try_decaps(PDU_NAS_EPS nas) return PDU_NAS_EPS
+{
+ var PDU_NAS_EPS_SecurityProtectedNASMessage secp_nas;
+ if (not match(nas, tr_NAS_EMM_SecurityProtected)) {
+ return nas;
+ }
+ secp_nas := nas.ePS_messages.ePS_MobilityManagement.pDU_NAS_EPS_SecurityProtectedNASMessage;
+ select (secp_nas.securityHeaderType) {
+ case ('0011'B) {
+ var octetstring knas_int := '530ce32318f26264eab26bc116870b86'O;
+ var octetstring data_with_seq := int2oct(secp_nas.sequenceNumber, 1) & secp_nas.nAS_Message;
+ var OCT4 exp_mac := f_snow_3g_f9(knas_int, secp_nas.sequenceNumber, 0,
+ is_downlink:=true, data:=data_with_seq);
+ if (exp_mac != secp_nas.messageAuthenticationCode) {
+ setverdict(fail, "Received NAS MAC ", secp_nas.messageAuthenticationCode,
+ " doesn't match expected MAC ", exp_mac, ": ", nas);
+ mtc.stop;
+ }
+ return dec_PDU_NAS_EPS(secp_nas.nAS_Message);
+ }
+ case else {
+ setverdict(fail, "Implement SecHdrType for ", secp_nas);
+ mtc.stop;
+ }
+ }
+}
+*/
+
+function main(S1APOps ops, S1AP_conn_parameters p, charstring id) runs on S1AP_Emulation_CT {
+ var Result res;
+ g_pars := p;
+ g_s1ap_id := id;
+ f_s1ap_id_table_init();
+ f_expect_table_init();
+
+ map(self:S1AP, system:S1AP_CODEC_PT);
+ if (p.remote_sctp_port == -1) {
+ res := S1AP_CodecPort_CtrlFunct.f_IPL4_listen(S1AP, p.local_ip, p.local_sctp_port, { sctp := valueof(ts_SCTP) });
+ } else {
+ res := S1AP_CodecPort_CtrlFunct.f_IPL4_connect(S1AP, p.remote_ip, p.remote_sctp_port,
+ p.local_ip, p.local_sctp_port, -1, { sctp := valueof(ts_SCTP) });
+ }
+ if (not ispresent(res.connId)) {
+ setverdict(fail, "Could not connect S1AP socket, check your configuration");
+ mtc.stop;
+ }
+ g_s1ap_conn_id := res.connId;
+
+ /* notify user about SCTP establishment */
+ if (p.remote_sctp_port != -1) {
+ S1AP_UNIT.send(S1APEM_Event:{up_down:=S1APEM_EVENT_UP})
+ }
+
+ while (true) {
+ var S1AP_ConnHdlr vc_conn;
+ var PDU_NAS_EPS nas;
+ var hexstring imsi;
+ var S1AP_RecvFrom mrf;
+ var S1AP_PDU msg;
+ var S1APEM_Config s1cfg;
+ var charstring vlr_name, mme_name;
+ var integer ai;
+
+ alt {
+ /* Configuration primitive from client */
+ [] S1AP_CLIENT.receive(S1APEM_Config:{set_nas_keys:=?}) -> value s1cfg sender vc_conn {
+ var integer assoc_id := f_assoc_id_by_comp(vc_conn);
+ S1apAssociationTable[assoc_id].nus.k_nas_int := s1cfg.set_nas_keys.k_nas_int;
+ S1apAssociationTable[assoc_id].nus.k_nas_enc := s1cfg.set_nas_keys.k_nas_enc;
+ }
+ /* S1AP from client: InitialUE */
+ [] S1AP_CLIENT.receive(tr_S1AP_InitialUE) -> value msg sender vc_conn {
+ /* create a table entry about this connection */
+ ai := f_s1ap_id_table_add(vc_conn, omit, valueof(f_S1AP_get_ENB_UE_S1AP_ID(msg)));
+ /* Store CGI + TAI so we can use it for generating UlNasTransport from NAS */
+ S1apAssociationTable[ai].tai := msg.initiatingMessage.value_.InitialUEMessage.protocolIEs[2].value_.TAI;
+ S1apAssociationTable[ai].cgi := msg.initiatingMessage.value_.InitialUEMessage.protocolIEs[3].value_.EUTRAN_CGI;
+ /* Pass message through */
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id, msg));
+ }
+ /* NAS from client: Wrap in S1AP Uplink NAS Transport */
+ [] S1AP_CLIENT.receive(PDU_NAS_EPS:?) -> value nas sender vc_conn {
+ var integer assoc_id := f_assoc_id_by_comp(vc_conn);
+ var AssociationData ad := S1apAssociationTable[assoc_id];
+ nas := f_nas_encaps(S1apAssociationTable[assoc_id].nus, nas, new_ctx := false);
+ var octetstring nas_enc := enc_PDU_NAS_EPS(nas);
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id,
+ ts_S1AP_UlNasTransport(ad.mme_ue_s1ap_id,
+ ad.enb_ue_s1ap_id,
+ nas_enc, ad.cgi, ad.tai)));
+ }
+ /* S1AP from client: pass on transparently */
+ [] S1AP_CLIENT.receive(S1AP_PDU:?) -> value msg sender vc_conn {
+ /* Pass message through */
+ /* FIXME: validate S1AP_IDs ? */
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id, msg));
+ }
+
+ /* non-UE related S1AP: pass through unmodified/unverified */
+ [] S1AP_UNIT.receive(S1AP_PDU:?) -> value msg sender vc_conn {
+ /* Pass message through */
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id, msg));
+ }
+
+ /* S1AP received from peer (MME) */
+ [] S1AP.receive(tr_S1AP_RecvFrom_R(?)) -> value mrf {
+ if (match(mrf.msg, tr_S1AP_nonUErelated)) {
+ /* non-UE-related S1AP message */
+ var template S1AP_PDU resp := ops.unitdata_cb.apply(mrf.msg);
+ if (isvalue(resp)) {
+ S1AP.send(t_S1AP_Send(g_s1ap_conn_id, valueof(resp)));
+ }
+ } else if (match(mrf.msg, tr_S1AP_UeContextReleaseCmd)) {
+ /* TODO: special handling, as it contains multiple eNB or MME IDs */
+ setverdict(fail, "implement UeContextReleaseCmd handling");
+ mtc.stop;
+ } else {
+ /* Ue-related S1AP message */
+ /* obtain MME + ENB UE S1AP ID */
+ var template (omit) MME_UE_S1AP_ID mme_ue_id := f_S1AP_get_MME_UE_S1AP_ID(mrf.msg);
+ var template (omit) ENB_UE_S1AP_ID enb_ue_id := f_S1AP_get_ENB_UE_S1AP_ID(mrf.msg);
+ /* check if those IDs are known in our table */
+ if (f_s1ap_ids_known(mme_ue_id, enb_ue_id)) {
+ /* if yes, dispatch to the ConnHdlr for this Ue-Connection */
+ var template (omit) octetstring nas_enc;
+ var integer assoc_id := f_assoc_id_by_s1ap_ids(mme_ue_id, enb_ue_id);
+ vc_conn := S1apAssociationTable[assoc_id].comp_ref;
+ nas_enc := f_S1AP_get_NAS_PDU(mrf.msg);
+ if (isvalue(nas_enc)) {
+ nas := dec_PDU_NAS_EPS(valueof(nas_enc));
+ if (match(nas, tr_NAS_EMM_SecurityProtected)) {
+ nas := f_nas_try_decaps(S1apAssociationTable[assoc_id].nus, nas);
+ }
+ /* send decoded NAS */
+ S1AP_CLIENT.send(nas) to vc_conn;
+ } else {
+ /* send raw S1AP */
+ S1AP_CLIENT.send(mrf.msg) to vc_conn;
+ }
+ } else {
+ /* if not, call create_cb so it can create new ConnHdlr */
+ vc_conn := ops.create_cb.apply(mrf.msg, mme_ue_id, enb_ue_id, id);
+ f_s1ap_id_table_add(vc_conn, mme_ue_id, valueof(enb_ue_id));
+ S1AP_CLIENT.send(mrf.msg) to vc_conn;
+ }
+ }
+ }
+ [] S1AP.receive(tr_SctpAssocChange) { }
+ [] S1AP.receive(tr_SctpPeerAddrChange) { }
+ [] S1AP_PROC.getcall(S1APEM_register:{?,?}) -> param(imsi, vc_conn) {
+ f_create_expect(imsi, vc_conn);
+ S1AP_PROC.reply(S1APEM_register:{imsi, vc_conn}) to vc_conn;
+ }
+ }
+
+ }
+}
+
+/* "Expect" Handling */
+
+type record ExpectData {
+ hexstring imsi optional,
+ S1AP_ConnHdlr vc_conn
+}
+
+signature S1APEM_register(in hexstring imsi, in S1AP_ConnHdlr hdlr);
+
+type port S1APEM_PROC_PT procedure {
+ inout S1APEM_register;
+} with { extension "internal" };
+
+/* Function that can be used as create_cb and will usse the expect table */
+function ExpectedCreateCallback(S1AP_PDU msg, hexstring imsi, charstring id)
+runs on S1AP_Emulation_CT return S1AP_ConnHdlr {
+ var S1AP_ConnHdlr ret := null;
+ var integer i;
+
+ for (i := 0; i < sizeof(S1apExpectTable); i := i+1) {
+ if (not ispresent(S1apExpectTable[i].imsi)) {
+ continue;
+ }
+ if (imsi == S1apExpectTable[i].imsi) {
+ ret := S1apExpectTable[i].vc_conn;
+ /* Release this entry */
+ S1apExpectTable[i].imsi := omit;
+ S1apExpectTable[i].vc_conn := null;
+ log("Found Expect[", i, "] for ", msg, " handled at ", ret);
+ return ret;
+ }
+ }
+ setverdict(fail, "Couldn't find Expect for ", msg);
+ mtc.stop;
+}
+
+private function f_create_expect(hexstring imsi, S1AP_ConnHdlr hdlr)
+runs on S1AP_Emulation_CT {
+ var integer i;
+
+ /* Check an entry like this is not already presnt */
+ for (i := 0; i < sizeof(S1apExpectTable); i := i+1) {
+ if (imsi == S1apExpectTable[i].imsi) {
+ setverdict(fail, "IMSI already present", imsi);
+ mtc.stop;
+ }
+ }
+ for (i := 0; i < sizeof(S1apExpectTable); i := i+1) {
+ if (not ispresent(S1apExpectTable[i].imsi)) {
+ S1apExpectTable[i].imsi := imsi;
+ S1apExpectTable[i].vc_conn := hdlr;
+ log("Created Expect[", i, "] for ", imsi, " to be handled at ", hdlr);
+ return;
+ }
+ }
+ testcase.stop("No space left in S1apExpectTable")
+}
+
+/* client/conn_hdlr side function to use procedure port to create expect in emulation */
+function f_create_s1ap_expect(hexstring imsi) runs on S1AP_ConnHdlr {
+ S1AP_PROC.call(S1APEM_register:{imsi, self}) {
+ [] S1AP_PROC.getreply(S1APEM_register:{?,?}) {};
+ }
+}
+
+
+private function f_expect_table_init()
+runs on S1AP_Emulation_CT {
+ var integer i;
+ for (i := 0; i < sizeof(S1apExpectTable); i := i + 1) {
+ S1apExpectTable[i].imsi := omit;
+ }
+}
+
+function DummyUnitdataCallback(S1AP_PDU msg)
+runs on S1AP_Emulation_CT return template S1AP_PDU {
+ log("Ignoring S1AP ", msg);
+ return omit;
+}
+
+
+function f_S1AP_get_ENB_UE_S1AP_ID(S1AP_PDU s1ap) return template (omit) ENB_UE_S1AP_ID
+{
+ if (ischosen(s1ap.initiatingMessage)) {
+ var InitiatingMessage im := s1ap.initiatingMessage;
+ select (s1ap) {
+ case (tr_S1AP_InitialUE) {
+ return im.value_.InitialUEMessage.protocolIEs[0].value_.ENB_UE_S1AP_ID;
+ }
+ case (tr_S1AP_DlNasTransport) {
+ return im.value_.DownlinkNASTransport.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UlNasTransport) {
+ return im.value_.UplinkNASTransport.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ case (tr_S1AP_IntialCtxSetupReq) {
+ return im.value_.initialContextSetupRequest.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UeContextReleaseReq) {
+ return im.value_.UEContextReleaseRequest.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ /* UeContextReleaseCmd needs special handling; it can contain any number of MME/UE IDs */
+ case (tr_S1AP_ConnEstInd) {
+ return im.value_.ConnectionEstablishmentIndication.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ } else if (ischosen(s1ap.successfulOutcome)) {
+ var SuccessfulOutcome so := s1ap.successfulOutcome;
+ select (s1ap) {
+ case (tr_S1AP_InitialCtxSetupResp) {
+ return so.value_.initialContextSetupResponse.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UeContextReleaseCompl) {
+ return so.value_.UEContextReleaseComplete.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ } else if (ischosen(s1ap.unsuccessfulOutcome)) {
+ var UnsuccessfulOutcome uo := s1ap.unsuccessfulOutcome;
+ select (s1ap) {
+ case (tr_S1AP_InitialCtxSetupFail) {
+ return uo.value_.initialContextSetupFailure.protocolIEs[1].value_.ENB_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ }
+ return omit;
+}
+
+function f_S1AP_get_MME_UE_S1AP_ID(S1AP_PDU s1ap) return template (omit) MME_UE_S1AP_ID
+{
+ if (ischosen(s1ap.initiatingMessage)) {
+ var InitiatingMessage im := s1ap.initiatingMessage;
+ select (s1ap) {
+ case (tr_S1AP_DlNasTransport) {
+ return im.value_.DownlinkNASTransport.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UlNasTransport) {
+ return im.value_.UplinkNASTransport.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ case (tr_S1AP_IntialCtxSetupReq) {
+ return im.value_.initialContextSetupRequest.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UeContextReleaseReq) {
+ return im.value_.UEContextReleaseRequest.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ /* UeContextReleaseCmd needs special handling; it can contain any number of MME/UE IDs */
+ case (tr_S1AP_ConnEstInd) {
+ return im.value_.ConnectionEstablishmentIndication.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ } else if (ischosen(s1ap.successfulOutcome)) {
+ var SuccessfulOutcome so := s1ap.successfulOutcome;
+ select (s1ap) {
+ case (tr_S1AP_InitialCtxSetupResp) {
+ return so.value_.initialContextSetupResponse.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ case (tr_S1AP_UeContextReleaseCompl) {
+ return so.value_.UEContextReleaseComplete.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ } else if (ischosen(s1ap.unsuccessfulOutcome)) {
+ var UnsuccessfulOutcome uo := s1ap.unsuccessfulOutcome;
+ select (s1ap) {
+ case (tr_S1AP_InitialCtxSetupFail) {
+ return uo.value_.initialContextSetupFailure.protocolIEs[0].value_.MME_UE_S1AP_ID;
+ }
+ /* TODO */
+ }
+ }
+ return omit;
+}
+
+function f_S1AP_get_NAS_PDU(S1AP_PDU s1ap) return template (omit) NAS_PDU
+{
+ var integer i;
+
+ if (ischosen(s1ap.initiatingMessage)) {
+ var InitiatingMessage im := s1ap.initiatingMessage;
+ select (s1ap) {
+ case (tr_S1AP_DlNasTransport) {
+ var DownlinkNASTransport msg := im.value_.DownlinkNASTransport;
+ for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) {
+ if (msg.protocolIEs[i].id == id_NAS_PDU) {
+ return msg.protocolIEs[i].value_.NAS_PDU;
+ }
+ }
+ }
+ case (tr_S1AP_UlNasTransport) {
+ var UplinkNASTransport msg := im.value_.UplinkNASTransport;
+ for (i := 0; i < lengthof(msg.protocolIEs); i := i+1) {
+ if (msg.protocolIEs[i].id == id_NAS_PDU) {
+ return msg.protocolIEs[i].value_.NAS_PDU;
+ }
+ }
+ }
+ }
+ }
+ return omit;
+}
+
+
+
+}
diff --git a/library/SGsAP_Emulation.ttcn b/library/SGsAP_Emulation.ttcn
index f91e076..6cd1052 100644
--- a/<