sgsn: First PDP CTX ACT test: TC_attach_pdp_act

Change-Id: Ia1bfaca99a2a70bb097e2ee44f54e4a31b849a1b
This commit is contained in:
Harald Welte 2018-02-17 20:57:34 +01:00
parent c69cf4e933
commit eded9ad578
6 changed files with 420 additions and 5 deletions

View File

@ -105,7 +105,12 @@ type record GSUP_IE {
msisdn, tag = OSMO_GSUP_MSISDN_IE;
hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE)"
pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
)"
};
type record of GSUP_IE GSUP_IEs;
@ -116,7 +121,6 @@ type union GSUP_IeValue {
GSUP_CancelType cancel_type,
//boolean pdp_info_compl,
//boolean freeze_ptmsi,
GSUP_IEs pdp_info,
GSUP_IEs auth_tuple,
octetstring auts,
octetstring rand,
@ -129,6 +133,11 @@ type union GSUP_IeValue {
GSUP_MSISDN msisdn,
octetstring hlr_number,
GSUP_CnDomain cn_domain,
/* PDP context + nested IEs */
GSUP_IEs pdp_info,
octetstring apn,
octetstring pdp_qos,
OCT2 pdp_type,
octetstring charg_char
};
@ -217,6 +226,35 @@ template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
}
}
template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
tag := OSMO_GSUP_PDP_INFO_IE,
len := 0, /* overwritten */
val := {
pdp_info := {
valueof(ts_GSUP_IE_APN(apn)),
valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
}
}
}
template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
tag := OSMO_GSUP_PDP_TYPE_IE,
len := 0,
val := {
pdp_type := pdp_type
}
}
template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
tag := OSMO_GSUP_PDP_QOS_IE,
len := 0,
val := {
pdp_qos := pdp_qos
}
}
template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
msg_type := msgt,
ies := ies
@ -428,6 +466,14 @@ template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
}
}
template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
len := 0, /* overwritten */
val := {
apn := apn
}
}
} with { encode "RAW"; variant "FIELDORDER(msb)" }

View File

@ -280,6 +280,71 @@ module GTP_Templates {
sgsn_ip_data, msisdn, pco)), seq)
}
template NSAPI_GTPC ts_NSAPI(BIT4 nsapi) := {
type_gtpc := '14'O,
nsapi := nsapi,
unused := '0000'B
}
template ReorderingRequired ts_ReorderReq(boolean req := false) := {
type_gtpc := '08'O,
reordreq := bool2bit(req),
spare := '0000000'B
}
template GTPC_PDUs ts_CreatePdpRespPDU(OCT1 cause, OCT4 teid_data, OCT4 teid_ctrl, BIT4 nsapi,
octetstring ggsn_ip_sign, octetstring ggsn_ip_data,
template EndUserAddress eua := omit,
template ProtConfigOptions pco := omit) := {
createPDPContextResponse := {
cause := { '00'O, cause },
reorderingRequired := ts_ReorderReq(false),
recovery := omit,
teidDataI := {
type_gtpc := '00'O,
teidDataI := teid_data
},
teidControlPlane := {
type_gtpc := '00'O,
teidControlPlane := teid_ctrl
},
nsapi := ts_NSAPI(nsapi),
chargingID := omit,
endUserAddress := eua,
protConfigOptions := pco,
ggsn_addr_controlPlane := ts_GsnAddr(ggsn_ip_sign),
ggsn_addr_traffic := ts_GsnAddr(ggsn_ip_data),
alt_ggsn_addr_controlPane := omit,
alt_ggsn_addr_traffic := omit,
qualityOfServiceProfile := ts_QosDefault,
commonFlags := omit,
aPN_Restriction := omit,
mS_InfoChangeReportingAction := omit,
bearerControlMode := omit,
evolvedAllocationRetentionPriorityI := omit,
extendedCommonFlag := omit,
csg_information_reporting_action := omit,
aPN_AMBR := omit,
gGSN_BackOffTime := omit,
private_extension_gtpc := omit
}
}
template Gtp1cUnitdata ts_GTPC_CreatePdpResp(GtpPeer peer, uint16_t seq, OCT4 teid,
OCT1 cause,
OCT4 teid_ctrl, OCT4 teid_data,
BIT4 nsapi, octetstring ggsn_ip_sign,
octetstring ggsn_ip_data,
template EndUserAddress eua := omit,
template ProtConfigOptions pco := omit) := {
peer := peer,
gtpc := ts_GTP1C_PDU(createPDPContextResponse, teid,
valueof(ts_CreatePdpRespPDU(cause, teid_data, teid_ctrl, nsapi,
ggsn_ip_sign, ggsn_ip_data,
eua, pco)), seq)
}
/* PCO send base template */
template ProtConfigOptions ts_PCO := {
type_gtpc := '84'O,

View File

@ -1766,6 +1766,130 @@ template PDU_L3_SGSN_MS tr_GMM_DET_ACCEPT_MT := {
}
}
function ts_ApnTLV(template (omit) octetstring apn) return template (omit) AccessPointNameTLV {
if (istemplatekind(apn, "omit")) {
return omit;
} else {
var template (omit) AccessPointNameTLV ret := {
elementIdentifier := '28'O,
lengthIndicator := 0, /* overwritten */
accessPointNameValue := apn
}
return ret;
}
}
function ts_PcoTLV(template (omit) ProtocolConfigOptionsV pco)
return template (omit) ProtocolConfigOptionsTLV {
if (istemplatekind(pco, "omit")) {
return omit;
} else {
var template (omit) ProtocolConfigOptionsTLV ret := {
elementIdentifier := '27'O,
lengthIndicator := 0, /* overwritten */
protocolConfigOptionsV := pco
}
return ret;
}
}
template (value) PDU_L3_MS_SGSN ts_SM_ACT_PDP_REQ(BIT3 tid, BIT4 nsapi, BIT4 sapi, QoSV qos,
PDPAddressV addr,
template (omit) octetstring apn := omit,
template (omit) ProtocolConfigOptionsV pco := omit
) := {
discriminator := '0000'B, /* overwritten */
tiOrSkip := {
transactionId := {
tio := tid,
tiFlag := '0'B,
tIExtension := omit
}
},
msgs := {
gprs_sm := {
activatePDPContextRequest := {
messageType := '00000000'B, /* overwritten */
requestedNSAPI := { nsapi, '0000'B },
requestedLLCSAPI := { sapi, '0000'B },
requestedQoS := {
lengthIndicator := 0, /* overwritten */
qoSV := qos
},
requestedPDPaddress := {
lengthIndicator := 0, /* overwritten */
pdpAddressV := addr
},
accessPointName := ts_ApnTLV(apn),
protocolConfigOpts := ts_PcoTLV(pco),
requestType := omit,
deviceProperties := omit,
nBIFOM_Container := omit
}
}
}
}
template PDU_L3_SGSN_MS tr_SM_ACT_PDP_REJ(template BIT3 tid := ?, template OCT1 cause := ?) := {
discriminator := '1010'B,
tiOrSkip := {
transactionId := {
tio := tid,
tiFlag := '1'B,
tIExtension := omit
}
},
msgs := {
gprs_sm := {
activatePDPContextReject := {
messageType := '01001111'B,
smCause := cause,
protocolConfigOpts := *,
backOffTimer := *,
reAttemptIndicator := *,
nBIFOM_Container := *
}
}
}
}
template PDU_L3_SGSN_MS tr_SM_ACT_PDP_ACCEPT(template BIT3 tid := ?, template BIT4 sapi := ?,
template QoSV qos := ?)
:= {
discriminator := '1010'B,
tiOrSkip := {
transactionId := {
tio := tid,
tiFlag := '1'B,
tIExtension := omit
}
},
msgs := {
gprs_sm := {
activatePDPContextAccept := {
messageType := '01000010'B,
negotiatedLLCSAPI := { sapi, '0000'B },
negotiatedQoS := {
lengthIndicator := ?,
qoSV := qos
},
radioPriority := ?,
spare := '0000'B,
pdpAddress := *,
protocolConfigOpts := *,
packetFlowID := *,
sMCause2 := *,
connectivityType := *,
wLANOffloadIndication := *,
nBIFOM_Container := *
}
}
}
}
private function f_concat_pad(integer tot_len, hexstring prefix, integer suffix) return hexstring {
var integer suffix_len := tot_len - lengthof(prefix);
var charstring suffix_ch := int2str(suffix);

View File

@ -18,13 +18,21 @@ import from GSUP_Emulation all;
import from GSUP_Types all;
import from IPA_Emulation all;
import from GTP_Emulation all;
import from GTP_Templates all;
import from GTP_CodecPort all;
import from GTPC_Types all;
import from GTPU_Types all;
import from TELNETasp_PortType all;
import from Osmocom_VTY_Functions all;
modulepar {
/* IP/port on which we run our internal GSUP/HLR emulation */
charstring mp_hlr_ip := "127.0.0.1";
integer mp_hlr_port := 4222;
charstring mp_ggsn_ip := "127.0.0.2";
};
type record GbInstance {
@ -41,12 +49,14 @@ type component test_CT {
/* only to get events from IPA underneath GSUP */
port IPA_CTRL_PT GSUP_IPA_EVENT;
var GTP_Emulation_CT vc_GTP;
port TELNETasp_PT SGSNVTY;
var boolean g_initialized := false;
};
type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr {
type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
var BSSGP_ConnHdlrPars g_pars;
timer g_Tguard;
}
@ -118,6 +128,21 @@ private function f_init_gsup(charstring id) runs on test_CT {
}
}
private function f_init_gtp(charstring id) runs on test_CT {
id := id & "-GTP";
var GtpEmulationCfg gtp_cfg := {
gtpc_bind_ip := mp_ggsn_ip,
gtpc_bind_port := GTP1C_PORT,
gtpu_bind_ip := mp_ggsn_ip,
gtpu_bind_port := GTP1U_PORT,
sgsn_role := false
};
vc_GTP := GTP_Emulation_CT.create(id);
vc_GTP.start(GTP_Emulation.main(gtp_cfg));
}
private function f_init_vty() runs on test_CT {
map(self:SGSNVTY, system:SGSNVTY);
f_vty_set_prompts(SGSNVTY);
@ -147,6 +172,7 @@ function f_init() runs on test_CT {
f_init_gb(g_gb[0]);
f_init_gsup("SGSN_Test");
f_init_gtp("SGSN_Test");
f_init_vty();
}
@ -184,6 +210,9 @@ runs on test_CT return BSSGP_ConnHdlr {
connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
connect(vc_conn:GTP, vc_GTP:CLIENT);
connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
vc_conn.start(f_handler_init(fn, id, pars));
return vc_conn;
}
@ -205,6 +234,8 @@ runs on BSSGP_ConnHdlr {
f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
/* tell GSUP dispatcher to send this IMSI to us */
f_create_gsup_expect(hex2str(g_pars.imsi));
/* tell GTP dispatcher to send this IMSI to us */
f_gtp_register_imsi(g_pars.imsi);
g_Tguard.start(pars.t_guard);
activate(as_Tguard());
@ -349,9 +380,12 @@ private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
}
private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
var GSUP_PDU gsup;
/* Expect MSC to perform LU with HLR */
GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
GSUP.send(gsup);
GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
}
@ -720,7 +754,146 @@ testcase TC_detach_poweroff() runs on test_CT {
vc_conn.done;
}
type record PdpActPars {
BIT3 tid,
BIT4 nsapi,
BIT4 sapi,
QoSV qos,
PDPAddressV addr,
octetstring apn optional,
ProtocolConfigOptionsV pco optional,
OCT1 exp_rej_cause optional,
OCT4 ggsn_tei_c,
OCT4 ggsn_tei_u,
octetstring ggsn_ip_c,
octetstring ggsn_ip_u,
GtpPeer sgsn,
OCT4 sgsn_tei_c optional,
OCT4 sgsn_tei_u optional
};
function f_pdp_ctx_act(PdpActPars apars) runs on BSSGP_ConnHdlr {
var boolean exp_rej := ispresent(apars.exp_rej_cause);
var Gtp1cUnitdata g_ud;
BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
apars.apn, apars.pco));
if (not exp_rej) {
GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
var GTPC_PDUs gtpc_rx := g_ud.gtpc.gtpc_pdu;
apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
var OCT1 cause := int2oct(128, 1);
GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
apars.sgsn_tei_c, cause,
apars.ggsn_tei_c, apars.ggsn_tei_u,
apars.nsapi,
apars.ggsn_ip_c, apars.ggsn_ip_u));
}
}
alt {
[exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
setverdict(pass);
}
[exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_ACCEPT)) {
setverdict(fail, "Unexpected PDP CTX ACT ACC");
}
[not exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
setverdict(fail, "Unexpected PDP CTX ACT FAIL");
}
[not exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
setverdict(pass);
}
}
}
/* Table 10.5.156/3GPP TS 24.008 */
template (value) QoSV t_QosDefault := {
reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
delayClass := '100'B, /* best effort */
spare1 := '00'B,
precedenceClass := '010'B, /* normal */
spare2 := '0'B,
peakThroughput := '0000'B, /* subscribed */
meanThroughput := '00000'B, /* subscribed */
spare3 := '000'B,
deliverErroneusSDU := omit,
deliveryOrder := omit,
trafficClass := omit,
maxSDUSize := omit,
maxBitrateUplink := omit,
maxBitrateDownlink := omit,
sduErrorRatio := omit,
residualBER := omit,
trafficHandlingPriority := omit,
transferDelay := omit,
guaranteedBitRateUplink := omit,
guaranteedBitRateDownlink := omit,
sourceStatisticsDescriptor := omit,
signallingIndication := omit,
spare4 := omit,
maxBitrateDownlinkExt := omit,
guaranteedBitRateDownlinkExt := omit,
maxBitrateUplinkExt := omit,
guaranteedBitRateUplinkExt := omit,
maxBitrateDownlinkExt2 := omit,
guaranteedBitRateDownlinkExt2 := omit,
maxBitrateUplinkExt2 := omit,
guaranteedBitRateUplinkExt2 := omit
}
/* 10.5.6.4 / 3GPP TS 24.008 */
template (value) PDPAddressV t_AddrIPv4dyn := {
pdpTypeOrg := '0001'B, /* IETF */
spare := '0000'B,
pdpTypeNum := '21'O, /* IPv4 */
addressInfo := omit
}
template (value) PDPAddressV t_AddrIPv6dyn := {
pdpTypeOrg := '0001'B, /* IETF */
spare := '0000'B,
pdpTypeNum := '53'O, /* IPv6 */
addressInfo := omit
}
template (value) PdpActPars t_PdpActPars := {
tid := '000'B,
nsapi := '0101'B, /* < 5 are reserved */
sapi := '0011'B, /* 3/5/9/11 */
qos := t_QosDefault,
addr := t_AddrIPv4dyn,
apn := omit,
pco := omit,
exp_rej_cause := omit,
/* FIXME: make below dynamic !! */
ggsn_tei_c := '00010000'O,
ggsn_tei_u := '00020000'O,
ggsn_ip_c := '7F000001'O,
ggsn_ip_u := '7F000001'O,
sgsn := { },
sgsn_tei_c := omit,
sgsn_tei_u := omit
}
private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
var PdpActPars apars := valueof(t_PdpActPars);
/* first perform regular attach */
f_TC_attach(id);
f_pdp_ctx_act(apars);
}
testcase TC_attach_pdp_act() runs on test_CT {
var BSSGP_ConnHdlr vc_conn;
f_init();
vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb[0], 17);
vc_conn.done;
}
control {
@ -739,6 +912,7 @@ control {
execute( TC_detach_unknown_poweroff() );
execute( TC_detach_nopoweroff() );
execute( TC_detach_poweroff() );
execute( TC_attach_pdp_act() );
}

View File

@ -63,6 +63,10 @@ DIR=$BASEDIR/titan.ProtocolModules.MobileL3_v13.4.0/src
FILES="MobileL3_CC_Types.ttcn MobileL3_CommonIE_Types.ttcn MobileL3_GMM_SM_Types.ttcn MobileL3_MM_Types.ttcn MobileL3_RRM_Types.ttcn MobileL3_SMS_Types.ttcn MobileL3_SS_Types.ttcn MobileL3_Types.ttcn"
gen_links $DIR $FILES
DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src
FILES="GTPC_EncDec.cc GTPC_Types.ttcn GTPU_EncDec.cc GTPU_Types.ttcn"
gen_links $DIR $FILES
DIR=../library
FILES="General_Types.ttcn GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn RLCMAC_Types.ttcn RLCMAC_CSN1_Types.ttcn RLCMAC_EncDec.cc "
FILES+="NS_Emulation.ttcn NS_CodecPort.ttcn NS_CodecPort_CtrlFunct.ttcn NS_CodecPort_CtrlFunctDef.cc "
@ -73,4 +77,6 @@ FILES+="LLC_Templates.ttcn L3_Templates.ttcn L3_Common.ttcn "
# IPA_Emulation + dependencies
FILES+="IPA_Types.ttcn IPA_Emulation.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn
IPA_CodecPort_CtrlFunctDef.cc Native_Functions.ttcn Native_FunctionDefs.cc GSUP_Types.ttcn GSUP_Emulation.ttcn MGCP_Types.ttcn RSL_Types.ttcn "
FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Emulation.ttcn
GTP_Templates.ttcn IPCP_Types.ttcn "
gen_links $DIR $FILES

View File

@ -1,5 +1,5 @@
#!/bin/sh
FILES="*.ttcn BSSGP_EncDec.cc LLC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc RLCMAC_EncDec.cc Native_FunctionDefs.cc SDP_EncDec.cc SDP_parse_.tab.c lex.SDP_parse_.c TELNETasp_PT.cc IPA_CodecPort_CtrlFunctDef.cc"
FILES="*.ttcn BSSGP_EncDec.cc LLC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc RLCMAC_EncDec.cc Native_FunctionDefs.cc SDP_EncDec.cc SDP_parse_.tab.c lex.SDP_parse_.c TELNETasp_PT.cc IPA_CodecPort_CtrlFunctDef.cc GTPU_EncDec.cc GTPC_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc"
../regen-makefile.sh SGSN_Tests.ttcn $FILES