3319 lines
74 KiB
Plaintext
3319 lines
74 KiB
Plaintext
module L3_Templates {
|
|
|
|
/* L3 Templates, building on top of MobileL3*_Types from Ericsson.
|
|
*
|
|
* (C) 2017-2018 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 MobileL3_Types all;
|
|
import from MobileL3_CommonIE_Types all;
|
|
import from MobileL3_MM_Types all;
|
|
import from MobileL3_RRM_Types all;
|
|
import from MobileL3_CC_Types all;
|
|
import from MobileL3_GMM_SM_Types all;
|
|
import from MobileL3_SMS_Types all;
|
|
|
|
/* TS 24.007 Table 11.3 TI Flag */
|
|
const BIT1 c_TIF_ORIG := '0'B;
|
|
const BIT1 c_TIF_REPL := '1'B;
|
|
|
|
type enumerated CmServiceType {
|
|
CM_TYPE_MO_CALL ('0001'B),
|
|
CM_TYPE_EMERG_CALL ('0010'B),
|
|
CM_TYPE_MO_SMS ('0100'B),
|
|
CM_TYPE_SS_ACT ('1000'B),
|
|
CM_TYPE_VGCS ('1001'B),
|
|
CM_TYPE_VBS ('1010'B),
|
|
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 */
|
|
oct3 := {
|
|
location := loc,
|
|
spare1_1 := '0'B,
|
|
codingStandard := std,
|
|
ext1 := '0'B,
|
|
recommendation := omit,
|
|
ext2 := omit
|
|
},
|
|
oct4 := {
|
|
causeValue := cause,
|
|
ext3 := '1'B
|
|
},
|
|
diagnostics := omit
|
|
}
|
|
|
|
|
|
/* 3GPP TS 24.008, section 10.5.1.4 "Mobile Identity" */
|
|
template (value) MobileIdentityTLV ts_MI_TLV(template (value) MobileIdentityV mi) := {
|
|
elementIdentifier := '0010111'B,
|
|
spare1 := '0'B,
|
|
mobileIdentityLV := ts_MI_LV(mi)
|
|
};
|
|
template MobileIdentityTLV tr_MI_TLV(template MobileIdentityV mi) := {
|
|
elementIdentifier := '0010111'B,
|
|
spare1 := '0'B,
|
|
mobileIdentityLV := tr_MI_LV(mi)
|
|
};
|
|
|
|
template (value) MobileIdentityLV ts_MI_LV(template (value) MobileIdentityV mi) := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
mobileIdentityV := mi
|
|
};
|
|
template MobileIdentityLV tr_MI_LV(template MobileIdentityV mi) := {
|
|
lengthIndicator := ?,
|
|
mobileIdentityV := mi
|
|
};
|
|
|
|
/* Universal (send & receive) template for No Identity */
|
|
template MobileIdentityV t_MI_NoIdentity(template (present) hexstring filler := 'F'H) := {
|
|
typeOfIdentity := '000'B,
|
|
oddEvenInd_identity := {
|
|
no_identity := {
|
|
/* Always old, since length can be 1, 3, or 5 */
|
|
oddevenIndicator := '0'B,
|
|
fillerDigits := filler
|
|
}
|
|
}
|
|
};
|
|
|
|
/* Universal (send & receive) template for TMSI/P-TMSI */
|
|
template MobileIdentityV t_MI_TMSI(template (present) OCT4 tmsi) := {
|
|
typeOfIdentity := '100'B,
|
|
oddEvenInd_identity := {
|
|
tmsi_ptmsi := {
|
|
oddevenIndicator := '0'B,
|
|
fillerDigit := '1111'B,
|
|
octets := tmsi
|
|
}
|
|
}
|
|
};
|
|
|
|
private function f_tr_MI_IMSI(template (present) hexstring digits)
|
|
return template (present) IMSI_L3 {
|
|
if (istemplatekind(digits, "?")) {
|
|
return ?;
|
|
} else {
|
|
return f_enc_IMSI_L3(valueof(digits))
|
|
}
|
|
}
|
|
template MobileIdentityV tr_MI_IMSI(template (present) hexstring imsi) := {
|
|
typeOfIdentity := '001'B,
|
|
oddEvenInd_identity := {
|
|
imsi := f_tr_MI_IMSI(imsi)
|
|
}
|
|
};
|
|
template (value) MobileIdentityV ts_MI_IMSI(hexstring imsi) := {
|
|
typeOfIdentity := '001'B,
|
|
oddEvenInd_identity := {
|
|
imsi := f_enc_IMSI_L3(imsi)
|
|
}
|
|
};
|
|
|
|
|
|
/* send template for Mobile Identity (TMSI) */
|
|
template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
mobileIdentityV := {
|
|
typeOfIdentity := '000'B, /* overwritten */
|
|
oddEvenInd_identity := {
|
|
tmsi_ptmsi := {
|
|
oddevenIndicator := '0'B,
|
|
fillerDigit := '1111'B,
|
|
octets := 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")) {
|
|
return omit;
|
|
} else {
|
|
ret := {
|
|
elementIdentifier := '0100011'B,
|
|
spare1 := '0'B,
|
|
mobileIdentityLV := ts_MI_TMSI_LV(valueof(tmsi))
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
template MobileIdentityTLV ts_MI_IMEISV_TLV(hexstring imeisv) := {
|
|
elementIdentifier := '0100011'B,
|
|
spare1 := '0'B,
|
|
mobileIdentityLV := ts_MI_IMEISV_LV(imeisv)
|
|
}
|
|
|
|
private function f_enc_IMSI_L3(hexstring digits) return IMSI_L3 {
|
|
var IMSI_L3 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_L3(hexstring digits) return IMEI_L3 {
|
|
var IMEI_L3 l3;
|
|
var integer len := lengthof(digits);
|
|
/* IMEI_L3 is always 15 digits. That is actually a 14 digit IMEI + a Luhn checksum digit (see
|
|
* libosmocore/include/osmocom/gsm/protocol/gsm_23_003.h)
|
|
*
|
|
* Here, we must not make the oddevenIndicator depend on the 'digits' parameter, because:
|
|
* - The IMEI_L3 template assumes always 15 digits.
|
|
* - The 'digits' parameter, however, may also contain less digits, 14 in the case of
|
|
* f_gen_imei().
|
|
* - The IMEI_L3 template will then fill up with zeros to make 15 digits.
|
|
* Hence oddevenIndicator must always indicate 'odd' == '1'B.
|
|
*
|
|
* FIXME: if the caller passes less than 15 digits, the Luhn checksum digit then ends up zero == most probably
|
|
* wrong.
|
|
*/
|
|
l3.oddevenIndicator := '1'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;
|
|
}
|
|
|
|
/* send template for Mobile Identity (IMSI) */
|
|
template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
mobileIdentityV := {
|
|
typeOfIdentity := '001'B,
|
|
oddEvenInd_identity := {
|
|
imsi := f_enc_IMSI_L3(imsi_digits)
|
|
}
|
|
}
|
|
}
|
|
|
|
/* send template for Mobile Identity (IMEI) */
|
|
template (value) MobileIdentityLV ts_MI_IMEI_LV(hexstring imei_digits) := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
mobileIdentityV := {
|
|
typeOfIdentity := '010'B,
|
|
oddEvenInd_identity := {
|
|
imei := f_enc_IMEI_L3(imei_digits)
|
|
}
|
|
}
|
|
}
|
|
|
|
/* send template for Mobile Identity (IMEISV) */
|
|
template (value) MobileIdentityLV ts_MI_IMEISV_LV(hexstring imei_digits) := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
mobileIdentityV := {
|
|
typeOfIdentity := '011'B,
|
|
oddEvenInd_identity := {
|
|
imei_sv := f_enc_IMEI_SV(imei_digits)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* Send template for Classmark 2 */
|
|
template (value) MobileStationClassmark2_LV ts_CM2 := {
|
|
lengthIndicator := 0,
|
|
rf_PowerCapability := '000'B,
|
|
a5_1 := '0'B,
|
|
esind := '1'B,
|
|
revisionLevel := '10'B,
|
|
spare1_1 := '0'B,
|
|
mobileStationClassmark2_oct4 := {
|
|
fc := '1'B,
|
|
vgcs := '0'B,
|
|
vbs := '0'B,
|
|
sm_Capability := '1'B,
|
|
ss_ScreenIndicator := '01'B,
|
|
ps_Capability := '1'B,
|
|
spare2_1 := '0'B
|
|
},
|
|
mobileStationClassmark2_oct5 := {
|
|
a5_2 := '0'B,
|
|
a5_3 := '1'B,
|
|
cmsp := '0'B,
|
|
solsa := '0'B,
|
|
ucs2 := '0'B,
|
|
lcsva_cap := '0'B,
|
|
spare5_7 :='0'B,
|
|
cm3 := '0'B
|
|
}
|
|
};
|
|
|
|
template LocationUpdatingType LU_Type_Normal := {
|
|
lut := '00'B,
|
|
spare1_1 := '0'B,
|
|
fop := '0'B
|
|
};
|
|
|
|
template LocationUpdatingType LU_Type_Periodic := {
|
|
lut := '01'B,
|
|
spare1_1 := '0'B,
|
|
fop := '0'B
|
|
};
|
|
|
|
template LocationUpdatingType LU_Type_IMSI_Attach := {
|
|
lut := '10'B,
|
|
spare1_1 := '0'B,
|
|
fop := '0'B
|
|
};
|
|
|
|
/* Send template for LOCATION UPDATING REQUEST */
|
|
template PDU_ML3_MS_NW ts_LU_REQ(template LocationUpdatingType lu_type, MobileIdentityLV mi_lv,
|
|
OCT3 mcc_mnc := '123456'O) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
locationUpdateRequest := {
|
|
messageType := '000000'B, /* overwritten */
|
|
nsd := '00'B,
|
|
locationUpdatingType := lu_type,
|
|
cipheringKeySequenceNumber := { '000'B, '0'B },
|
|
locationAreaIdentification := {
|
|
mcc_mnc := mcc_mnc,
|
|
lac := '172A'O
|
|
},
|
|
mobileStationClassmark1 := ts_CM1,
|
|
mobileIdentityLV := mi_lv,
|
|
classmarkInformationType2_forUMTS := omit,
|
|
additionalUpdateParameterTV := omit,
|
|
deviceProperties := omit,
|
|
mS_NetworkFeatureSupport := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS ts_LU_ACCEPT(template MobileIdentityTLV mi_tlv := omit) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
locationUpdateAccept := {
|
|
messageType := '000000'B, /* overwritten */
|
|
nsd := '00'B,
|
|
locationAreaIdentification := {
|
|
mcc_mnc := '123456'O,
|
|
lac := '172A'O
|
|
},
|
|
mobileIdentityTLV := mi_tlv,
|
|
followOnProceed := omit,
|
|
cTS_Permission := omit,
|
|
equivalentPLMNs := omit,
|
|
emergencyNumberList := omit,
|
|
perMS_T3212 := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Send template for CM SERVICE REQUEST */
|
|
template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(CmServiceType serv_type, MobileIdentityLV mi_lv) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
cMServiceRequest := {
|
|
messageType := '000000'B, /* overwritten */
|
|
nsd := '00'B,
|
|
cm_ServiceType := int2bit(enum2int(serv_type), 4),
|
|
cipheringKeySequenceNumber := { '000'B, '0'B },
|
|
mobileStationClassmark2 := ts_CM2,
|
|
mobileIdentity := mi_lv,
|
|
priorityLevel := omit,
|
|
additionalUpdateParameterTV := omit,
|
|
deviceProperties := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) CipheringKeySequenceNumberV ts_CKSN(integer key_seq) := {
|
|
keySequence := int2bit(key_seq, 3),
|
|
spare := '0'B
|
|
}
|
|
|
|
/* Send template for CM RE-ESTABLISH REQUEST */
|
|
template (value) PDU_ML3_MS_NW ts_CM_REEST_REQ(integer cksn, MobileIdentityLV mi_lv) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
cMReEstablReq := {
|
|
messageType := '101000'B, /* overwritten */
|
|
nsd := '00'B,
|
|
cipheringKeySequenceNumber := ts_CKSN(cksn),
|
|
spare := '0000'B,
|
|
mobileStationClassmark2 := ts_CM2,
|
|
mobileIdentityLV := mi_lv,
|
|
locationAreaIdentification := omit,
|
|
deviceProperties := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_MT_simple(template BIT4 discr := ?) := {
|
|
discriminator := discr,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := ?
|
|
}
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_CM_SERV_ACC := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
cMServiceAccept := {
|
|
messageType := '100001'B,
|
|
nsd := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_CM_SERV_REJ(template OCT1 rej_cause := ?) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
cMServiceReject := {
|
|
messageType := '100010'B,
|
|
nsd := ?,
|
|
rejectCause := rej_cause,
|
|
t3246_Value := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_PAGING_REQ1(template MobileIdentityLV mi1 := ?,
|
|
template MobileIdentityTLV mi2 := *) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
pagingReq_Type1 := {
|
|
messageType := '00100001'B,
|
|
pageMode := ?,
|
|
channelNeeded := ?,
|
|
mobileIdentity1 := mi1,
|
|
mobileIdentity2 := mi2,
|
|
p1RestOctets := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_PAGING_REQ2(template TMSIP_TMSI_V mi1 := ?,
|
|
template TMSIP_TMSI_V mi2 := ?,
|
|
template MobileIdentityTLV mi3 := *) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
pagingReq_Type2 := {
|
|
messageType := '00100010'B,
|
|
pageMode := ?,
|
|
channelNeeded := ?,
|
|
mobileIdentity1 := mi1,
|
|
mobileIdentity2 := mi2,
|
|
mobileIdentity3 := mi3,
|
|
p2RestOctets := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_PAGING_REQ3(template TMSIP_TMSI_V mi1 := ?,
|
|
template TMSIP_TMSI_V mi2 := ?,
|
|
template TMSIP_TMSI_V mi3 := ?,
|
|
template TMSIP_TMSI_V mi4 := ?) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
pagingReq_Type3 := {
|
|
messageType := '00100100'B,
|
|
pageMode := ?,
|
|
channelNeeded := ?,
|
|
mobileIdentity1 := mi1,
|
|
mobileIdentity2 := mi2,
|
|
mobileIdentity3 := mi3,
|
|
mobileIdentity4 := mi4,
|
|
p3RestOctets := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Send template for PAGING RESPONSE */
|
|
template (value) PDU_ML3_MS_NW ts_PAG_RESP(MobileIdentityLV mi_lv) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
pagingResponse := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
cipheringKeySequenceNumber := { '000'B, '0'B },
|
|
spare1_4 := '0000'B,
|
|
mobileStationClassmark := ts_CM2,
|
|
mobileIdentity := mi_lv,
|
|
additionalUpdateParameters := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_ModeModifyAck(ChannelDescription2_V desc, ChannelMode_V mode) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
channelModeModifyAck := {
|
|
messageType := '00010111'B,
|
|
channelDescription := desc,
|
|
channelMode := mode,
|
|
extendedTSCSet := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_NW_MS ts_RRM_CiphModeCmd(BIT3 alg_id) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
cipheringModeCommand := {
|
|
messageType := '00110101'B,
|
|
cipherModeSetting := {
|
|
sC := '1'B,
|
|
algorithmIdentifier := alg_id
|
|
},
|
|
cipherModeResponse := {
|
|
cR := '0'B,
|
|
spare := '000'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_CiphModeCompl := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
cipheringModeComplete := {
|
|
messageType := '00110010'B,
|
|
mobileEquipmentIdentity := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_AssignmentComplete(OCT1 cause) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
assignmentComplete := {
|
|
messageType := '00101001'B,
|
|
rR_Cause := {
|
|
valuePart := cause
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_AssignmentFailure(OCT1 cause) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
assignmentFailure := {
|
|
messageType := '00101111'B,
|
|
rR_Cause := {
|
|
valuePart := cause
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_HandoverFailure(OCT1 cause) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
handoverFailure := {
|
|
messageType := '00101000'B,
|
|
rRCause := {
|
|
valuePart := cause
|
|
},
|
|
pSCause := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_HandoverComplete(OCT1 cause) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
handoverComplete := {
|
|
messageType := '00101100'B,
|
|
rRCause := {
|
|
valuePart := cause
|
|
},
|
|
mobileObsservedTimeDiff := omit,
|
|
mobileTimeDifferenceHyperframe := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (present) PDU_ML3_NW_MS tr_RR_APP_INFO(template (present) BIT4 apdu_id,
|
|
template (present) octetstring data,
|
|
template (present) APDU_Flags_V flags := ?) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
applicationInformation := {
|
|
messageType := '00111000'B,
|
|
aPDU_ID := apdu_id,
|
|
aPDU_Flags := flags,
|
|
aPDU_Data := {
|
|
lengthIndicator := ?,
|
|
aPDU_DataValue := data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_NW_MS ts_RR_HandoverCommand := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
handoverCommand := {
|
|
messageType := '00101011'B,
|
|
cellDescription := {
|
|
bcc := '001'B,
|
|
ncc := '010'B,
|
|
BCCHArfcn_HighPart := '11'B,
|
|
BCCHArfcn_LowPart := '04'O
|
|
},
|
|
channelDescription2 := {
|
|
timeslotNumber := '110'B,
|
|
channelTypeandTDMAOffset := '00001'B,
|
|
octet3 := '00'O,
|
|
octet4 := '09'O
|
|
},
|
|
handoverReference := {
|
|
handoverReferenceValue := '00'O
|
|
},
|
|
powerCommandAndAccesstype := {
|
|
powerlevel := '00000'B,
|
|
fPC_EP := '0'B,
|
|
ePC_Mode := '0'B,
|
|
aTC := '0'B
|
|
},
|
|
synchronizationIndication := omit,
|
|
frequencyShortListAfterTime := omit,
|
|
frequencyListAfterTime := omit,
|
|
cellChannelDescription := omit,
|
|
multislotAllocation := omit,
|
|
modeOfChannelSet1 := omit,
|
|
modeOfChannelSet2 := omit,
|
|
modeOfChannelSet3 := omit,
|
|
modeOfChannelSet4 := omit,
|
|
modeOfChannelSet5 := omit,
|
|
modeOfChannelSet6 := omit,
|
|
modeOfChannelSet7 := omit,
|
|
modeOfChannelSet8 := omit,
|
|
descrOf2ndCh_at := omit,
|
|
modeOf2ndChannel := omit,
|
|
frequencyChannelSequence_at := omit,
|
|
mobileAllocation_at := omit,
|
|
startingTime := omit,
|
|
timeDifference := omit,
|
|
timingAdvance := omit,
|
|
frequencyShortListBeforeTime := omit,
|
|
frequencyListBeforeTime := omit,
|
|
descrOf1stCh_bt := omit,
|
|
descrOf2ndCh_bt := omit,
|
|
frequencyChannelSequence_bt := omit,
|
|
mobileAllocation_bt := omit,
|
|
cipherModeSetting := omit,
|
|
vGCS_TargetModeIndication := omit,
|
|
multiRateConfiguration := omit,
|
|
dynamicARFCN_Mapping := omit,
|
|
vGCS_Ciphering_Parameters := omit,
|
|
dedicatedServiceInformation := omit,
|
|
pLMNIndex := omit,
|
|
extendedTSCSet_afterTime := omit,
|
|
extendedTSCSet_beforeTime := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_RR_HandoverCommand := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
handoverCommand := {
|
|
messageType := '00101011'B,
|
|
cellDescription := ?,
|
|
channelDescription2 := ?,
|
|
handoverReference := ?,
|
|
powerCommandAndAccesstype := ?,
|
|
synchronizationIndication := *,
|
|
frequencyShortListAfterTime := *,
|
|
frequencyListAfterTime := *,
|
|
cellChannelDescription := *,
|
|
multislotAllocation := *,
|
|
modeOfChannelSet1 := *,
|
|
modeOfChannelSet2 := *,
|
|
modeOfChannelSet3 := *,
|
|
modeOfChannelSet4 := *,
|
|
modeOfChannelSet5 := *,
|
|
modeOfChannelSet6 := *,
|
|
modeOfChannelSet7 := *,
|
|
modeOfChannelSet8 := *,
|
|
descrOf2ndCh_at := *,
|
|
modeOf2ndChannel := *,
|
|
frequencyChannelSequence_at := *,
|
|
mobileAllocation_at := *,
|
|
startingTime := *,
|
|
timeDifference := *,
|
|
timingAdvance := *,
|
|
frequencyShortListBeforeTime := *,
|
|
frequencyListBeforeTime := *,
|
|
descrOf1stCh_bt := *,
|
|
descrOf2ndCh_bt := *,
|
|
frequencyChannelSequence_bt := *,
|
|
mobileAllocation_bt := *,
|
|
cipherModeSetting := *,
|
|
vGCS_TargetModeIndication := *,
|
|
multiRateConfiguration := *,
|
|
dynamicARFCN_Mapping := *,
|
|
vGCS_Ciphering_Parameters := *,
|
|
dedicatedServiceInformation := *,
|
|
pLMNIndex := *,
|
|
extendedTSCSet_afterTime := *,
|
|
extendedTSCSet_beforeTime := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function ts_CM3_TLV(template (omit) OCTN cm3) return template MobileStationClassmark3_TLV {
|
|
if (not isvalue(cm3)) {
|
|
return omit;
|
|
}
|
|
var template MobileStationClassmark3_TLV ret := {
|
|
elementIdentifier := '20'O,
|
|
lengthIndicator := 0, /* overwritten */
|
|
valuePart := cm3
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_CM_CHG(MobileStationClassmark2_LV cm2,
|
|
template (omit) MobileStationClassmark3_TLV cm3 := omit) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
classmarkChange := {
|
|
messageType := '00010110'B,
|
|
mobileStationClassmark2 := cm2,
|
|
mobileStationClassmark3 := cm3
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_RRM_CM_ENQUIRY := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
classmarkEnquiry := {
|
|
messageType := '00010011'B,
|
|
classmarkEnquiryMask := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_UL_REL(OCT1 cause) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
uplinkRelease := {
|
|
messageType := '00001110'B,
|
|
rR_Cause := {
|
|
valuePart := cause
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW tr_RRM_RR_STATUS(template OCT1 cause := ?) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
rR_Status := {
|
|
messageType := '00010010'B,
|
|
rR_Cause := {
|
|
valuePart := cause
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_RRM_RR_RELEASE(template OCT1 cause := ?) := {
|
|
discriminator := '0110'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
channelRelease := {
|
|
messageType := '00001101'B,
|
|
rRCause := {
|
|
valuePart := cause
|
|
},
|
|
bARange := *,
|
|
groupChannelDescription := *,
|
|
groupCipherKeyNumber := *,
|
|
gPRSResumption := *,
|
|
bAListPref := *,
|
|
uTRANFrequencyList := *,
|
|
cellChannelDescr := *,
|
|
cellSelectionIndicator := *,
|
|
enhanced_DTM_CS_Release_Indication := *,
|
|
vGCS_Ciphering_Parameters := *,
|
|
group_Channel_Description_2 := *,
|
|
talkerIdentity := *,
|
|
talkerPriorityStatus := *,
|
|
vGCS_AMR_Configuration := *,
|
|
individual_Priorities := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_RRM_RR_RELEASE_CSFB(template OCT1 cause := ?) modifies tr_RRM_RR_RELEASE := {
|
|
msgs := {
|
|
rrm := {
|
|
channelRelease := {
|
|
cellSelectionIndicator := {
|
|
elementIdentifier := '77'O,
|
|
lengthIndicator := ?,
|
|
cellSelectionIndicatorValue := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO := {
|
|
discriminator := '0000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := ?
|
|
}
|
|
|
|
template LocationUpdatingType ts_ML3_IE_LuType := {
|
|
lut := ?,
|
|
spare1_1 := '0'B,
|
|
fop := '0'B
|
|
}
|
|
|
|
template LocationUpdatingType ts_ML3_IE_LuType_Normal modifies ts_ML3_IE_LuType := {
|
|
lut := '00'B
|
|
}
|
|
|
|
template LocationUpdatingType ts_ML3_IE_LuType_Periodic modifies ts_ML3_IE_LuType := {
|
|
lut := '01'B
|
|
}
|
|
|
|
template LocationUpdatingType ts_ML3_IE_LuType_Attach modifies ts_ML3_IE_LuType := {
|
|
lut := '10'B
|
|
}
|
|
|
|
template CipheringKeySequenceNumberV ts_ML3_IE_CKSN(integer cksn) := {
|
|
keySequence := int2bit(cksn, 3),
|
|
spare := '0'B
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_LU_Req(LocationUpdatingType lu_type, LocationAreaIdentification_V lai,
|
|
MobileIdentityLV mi, MobileStationClassmark1_V cm1)
|
|
modifies ts_ML3_MO := {
|
|
msgs := {
|
|
mm := {
|
|
locationUpdateRequest := {
|
|
messageType := '001000'B,
|
|
nsd := '00'B, /* ? */
|
|
locationUpdatingType := lu_type,
|
|
cipheringKeySequenceNumber := ts_ML3_IE_CKSN(0),
|
|
locationAreaIdentification := lai,
|
|
mobileStationClassmark1 := cm1,
|
|
mobileIdentityLV := mi,
|
|
classmarkInformationType2_forUMTS := omit,
|
|
additionalUpdateParameterTV := omit,
|
|
deviceProperties := omit,
|
|
mS_NetworkFeatureSupport := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_TmsiRealloc_Cmpl modifies ts_ML3_MO := {
|
|
msgs := {
|
|
mm := {
|
|
tmsiReallocComplete := {
|
|
messageType := '011011'B,
|
|
nsd := '00'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_LU_Acc := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
locationUpdateAccept := {
|
|
messageType := '000010'B,
|
|
nsd := '00'B,
|
|
locationAreaIdentification := ?,
|
|
mobileIdentityTLV := *,
|
|
followOnProceed := *,
|
|
cTS_Permission := *,
|
|
equivalentPLMNs := *,
|
|
emergencyNumberList := *,
|
|
perMS_T3212 := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_LU_Rej(template OCT1 cause := ?) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
locationUpdateReject := {
|
|
messageType := '000100'B,
|
|
nsd := '00'B,
|
|
rejectCause := cause,
|
|
t3246_Value := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
identityRequest := {
|
|
messageType := '011000'B,
|
|
nsd := '00'B,
|
|
identityType := f_id_type_or_any(id_type),
|
|
spare1_5 := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp(MobileIdentityLV mi) modifies ts_ML3_MO := {
|
|
msgs := {
|
|
mm := {
|
|
identityResponse := {
|
|
messageType := '011001'B,
|
|
nsd := '00'B,
|
|
mobileIdentityLV := mi,
|
|
p_TMSI_TypeTV := omit,
|
|
routingAreaIdentification2TLV := omit,
|
|
p_TMSISignature2TLV := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp_IMSI(hexstring imsi) :=
|
|
ts_ML3_MO_MM_ID_Rsp(valueof(ts_MI_IMSI_LV(imsi)));
|
|
template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp_IMEI(hexstring imei) :=
|
|
ts_ML3_MO_MM_ID_Rsp(valueof(ts_MI_IMEI_LV(imei)));
|
|
|
|
|
|
template (value) MobileStationClassmark1_V ts_CM1(BIT1 a5_1_unavail := '0'B, BIT2 rev := '10'B, BIT1 esind := '1'B) := {
|
|
rf_PowerCapability := '010'B,
|
|
a5_1 := a5_1_unavail,
|
|
esind := esind,
|
|
revisionLevel := rev,
|
|
spare1_1 := '0'B
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_MM_IMSI_DET_Ind(MobileIdentityLV mi,
|
|
template MobileStationClassmark1_V cm1 := ts_CM1)
|
|
modifies ts_ML3_MO := {
|
|
msgs := {
|
|
mm := {
|
|
imsiDetachIndication := {
|
|
messageType := '000001'B,
|
|
nsd := '00'B,
|
|
mobileStationClassmark1 := cm1,
|
|
mobileIdentityLV := mi
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := -
|
|
}
|
|
|
|
template (value) CalledPartyBCD_Number ts_Called(hexstring digits) := {
|
|
elementIdentifier := '5E'O,
|
|
lengthIndicator := 0, /* overwritten */
|
|
numberingPlanIdentification := '0000'B,
|
|
typeOfNumber := '000'B, /* unknown */
|
|
ext1 := '0'B,
|
|
digits := digits
|
|
}
|
|
|
|
template CalledPartyBCD_Number tr_Called(template hexstring digits) := {
|
|
elementIdentifier := '5E'O,
|
|
lengthIndicator := ?,
|
|
numberingPlanIdentification := ?,
|
|
typeOfNumber := ?,
|
|
ext1 := ?,
|
|
digits := digits
|
|
}
|
|
|
|
private function f_pad_digits(hexstring digits) return hexstring {
|
|
if (lengthof(digits) mod 2 != 0) {
|
|
/* Add trailing nibble of 1-bit padding, like the CallingPartyBCD_Number encoder would do.
|
|
* Otherwise our template won't match the data received (see OS#2930). */
|
|
return digits & 'F'H;
|
|
}
|
|
return digits;
|
|
}
|
|
|
|
template CallingPartyBCD_Number tr_Calling(template hexstring digits) := {
|
|
elementIdentifier := '5C'O,
|
|
lengthIndicator := ?,
|
|
oct3 := ?,
|
|
digits := f_pad_digits(valueof(digits))
|
|
}
|
|
|
|
type integer SpeechVer;
|
|
|
|
template (value) Speech_AuxiliarySpeech ts_SpeechAux(SpeechVer ver, BIT1 suffix) := {
|
|
speechVersionIndication := int2bit(ver-1,3) & suffix,
|
|
spare1_1 := '0'B,
|
|
cTM_or_Spare := '0'B,
|
|
coding := '0'B,
|
|
extension_octet_3a_3b := '0'B
|
|
}
|
|
|
|
template (value) Speech_AuxiliarySpeech ts_SpeechAuxFR(SpeechVer ver) := ts_SpeechAux(ver, '0'B);
|
|
template (value) Speech_AuxiliarySpeech ts_SpeechAuxHR(SpeechVer ver) := ts_SpeechAux(ver, '1'B);
|
|
|
|
template (value) BearerCapability_TLV ts_Bcap_voice := {
|
|
elementIdentifier := '04'O,
|
|
lengthIndicator := 0, /* overwritten */
|
|
octet3 := {
|
|
informationTransferCapability := '000'B,
|
|
transferMode := '0'B,
|
|
codingStandard := '0'B,
|
|
radioChannelRequirement := '11'B, /* FR preferred */
|
|
extension_octet_3 := '0'B, /* overwritten */
|
|
speech_aux_3a_3b := {
|
|
valueof(ts_SpeechAuxHR(3)),
|
|
valueof(ts_SpeechAuxFR(3)),
|
|
valueof(ts_SpeechAuxFR(2)),
|
|
valueof(ts_SpeechAuxFR(1)),
|
|
valueof(ts_SpeechAuxHR(1))
|
|
}
|
|
},
|
|
octet4 := omit,
|
|
octet5 := omit,
|
|
octet6 := omit,
|
|
octet7 := omit
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_SETUP(integer tid, hexstring called, template BearerCapability_TLV bcap := ts_Bcap_voice) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
setup_MS_NW := {
|
|
messageType := '000101'B,
|
|
nsd := '00'B,
|
|
bcRepeatIndicator := omit,
|
|
bearerCapability1 := bcap,
|
|
bearerCapability2 := omit,
|
|
facility := omit,
|
|
callingPartySubAddress := omit,
|
|
calledPartyBCD_Number := ts_Called(called),
|
|
calledPartySubAddress := omit,
|
|
llc_RepeatIndicator := omit,
|
|
lowLayerCompatibility1 := omit,
|
|
lowLayerCompatibility2 := omit,
|
|
hlc_RepeatIndicator := omit,
|
|
highLayerCompatibility1 := omit,
|
|
highLayerCompatibility2 := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit,
|
|
clir_Suppression := omit,
|
|
clir_Invocation := omit,
|
|
cC_Capabilities := omit,
|
|
facility_ccbs1 := omit,
|
|
facility_ccbs2 := omit,
|
|
streamIdentifier := omit,
|
|
supportedCodecs := omit,
|
|
redial := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_EMERG_SETUP(integer tid, template BearerCapability_TLV bcap := ts_Bcap_voice) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
emergencySetup := {
|
|
messageType := '001110'B,
|
|
nsd := '00'B,
|
|
bearerCapability := bcap,
|
|
streamIdentifier := omit,
|
|
supportedCodecs := omit,
|
|
emergencyCategory := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_CALL_PROC(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ?,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
callProceeding := {
|
|
messageType := '000010'B,
|
|
nsd := '00'B,
|
|
repeatIndicator := *,
|
|
bearerCapability1 := *,
|
|
bearerCapability2 := *,
|
|
facility := *,
|
|
progressIndicator := *,
|
|
priorityGranted := *,
|
|
networkCCCapabilities := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_ALERTING(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ?,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
alerting_NW_MS := {
|
|
messageType := '000001'B,
|
|
nsd := '00'B,
|
|
facility := *,
|
|
progressIndicator := *,
|
|
user_user := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_ALERTING(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
alerting_MS_NW := {
|
|
messageType := '000001'B,
|
|
nsd := '00'B,
|
|
facility := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MT_CC_ALERTING(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
alerting_MS_NW := {
|
|
messageType := '000001'B,
|
|
nsd := '00'B,
|
|
facility := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_CONNECT(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
connect_MS_NW := {
|
|
messageType := '000111'B,
|
|
nsd := '00'B,
|
|
facility := omit,
|
|
connectedSubAddress := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit,
|
|
streamIdentifier := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_CONNECT(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
connect_NW_MS := {
|
|
messageType := '000111'B,
|
|
nsd := '00'B,
|
|
facility := *,
|
|
progressIndicator := *,
|
|
connectedNumber := *,
|
|
connectedSubAddress := *,
|
|
user_user := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_CONNECT_ACK(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
connectAck := {
|
|
messageType := '001111'B,
|
|
nsd := '00'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_START_DTMF(integer tid, charstring number) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
startDTMF := {
|
|
messageType := '110101'B,
|
|
nsd := '00'B,
|
|
keypadFacility := {
|
|
elementIdentifier := '2C'O,
|
|
keypadInformation := int2bit(char2int(number), 7),
|
|
spare_1 := '0'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_DISC(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ?,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
disconnect_NW_MS := {
|
|
messageType := '100101'B,
|
|
nsd := '00'B,
|
|
cause := ?,
|
|
facility := *,
|
|
progressIndicator := *,
|
|
user_user := *,
|
|
allowedActions := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_RELEASE(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ?,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
release_NW_MS := {
|
|
messageType := '101101'B,
|
|
nsd := '00'B,
|
|
cause := ?,
|
|
secondCause := *,
|
|
facility := *,
|
|
user_user := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_RELEASE(integer tid, BIT1 tid_remote, BIT7 cause) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := tid_remote,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
release_MS_NW := {
|
|
messageType := '101101'B,
|
|
nsd := '00'B,
|
|
cause := ts_ML3_Cause(cause),
|
|
secondCause := omit,
|
|
facility := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid, BIT1 tid_remote := '0'B) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := tid_remote,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
releaseComplete_MS_NW := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := omit,
|
|
facility := omit,
|
|
user_user := omit,
|
|
ss_VersionIndicator := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_REL_COMPL(integer tid) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ?,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
releaseComplete_NW_MS := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := *,
|
|
facility := *,
|
|
user_user := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_MM_AUTH_REQ(template OCT16 rand := ?) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
authenticationRequest := {
|
|
messageType := '010010'B,
|
|
nsd := '00'B,
|
|
cipheringKeySequenceNumber := ?,
|
|
spare2_4 := ?,
|
|
authenticationParRAND := rand,
|
|
authenticationParAUTN := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_MM_AUTH_REQ_3G(template OCT16 rand := ?, template OCT16 autn) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
authenticationRequest := {
|
|
messageType := '010010'B,
|
|
nsd := '00'B,
|
|
cipheringKeySequenceNumber := ?,
|
|
spare2_4 := ?,
|
|
authenticationParRAND := rand,
|
|
authenticationParAUTN := {
|
|
elementIdentifier := '20'O,
|
|
lengthIndicator := ?,
|
|
autnValue := autn
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MT_MM_AUTH_RESP_2G(OCT4 sres) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
authenticationResponse := {
|
|
messageType := '010100'B,
|
|
nsd := '00'B,
|
|
authenticationParSRES := sres,
|
|
authenticationParSRESext := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MT_MM_AUTH_RESP_3G(OCT4 sres, octetstring res) := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
authenticationResponse := {
|
|
messageType := '010100'B,
|
|
nsd := '00'B,
|
|
authenticationParSRES := sres,
|
|
authenticationParSRESext := {
|
|
elementIdentifier := '21'O,
|
|
lengthIndicator := 0, /* overwritten */
|
|
valueField := res
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_MS_NW ts_ML3_MO_CC_CALL_CONF(integer tid,
|
|
template BearerCapability_TLV bcap := omit) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_REPL, /* response from destination */
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
callConfirmed := {
|
|
messageType := '001000'B,
|
|
nsd := '00'B,
|
|
repeatIndicator := omit,
|
|
bearerCapability1 := bcap,
|
|
bearerCapability2 := omit,
|
|
cause := omit,
|
|
cC_Capabilities := omit,
|
|
streamIdentifier := omit,
|
|
supportedCodecs := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_CC_SETUP(integer tid, template hexstring called := *,
|
|
template hexstring calling := *,
|
|
template BearerCapability_TLV bcap := *) := {
|
|
discriminator := '0011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := c_TIF_ORIG, /* from originator */
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
cc := {
|
|
setup_NW_MS := {
|
|
messageType := '000101'B,
|
|
nsd := '00'B,
|
|
bcRepeatIndicator := *,
|
|
bearerCapability1 := bcap,
|
|
bearerCapability2 := *,
|
|
facility := *,
|
|
progressIndicator := *,
|
|
signal := *,
|
|
callingPartyBCD_Number := tr_Calling(calling) ifpresent,
|
|
callingPartySubAddress := *,
|
|
calledPartyBCD_Number := tr_Called(called) ifpresent,
|
|
calledPartySubAddress := *,
|
|
redirectingPartyBCDNumber := *,
|
|
redirectingPartySubaddress := *,
|
|
llc_RepeatIndicator := *,
|
|
lowLayerCompatibility1 := *,
|
|
lowLayerCompatibility2 := *,
|
|
hlc_RepeatIndicator := *,
|
|
highLayerCompatibility1 := *,
|
|
highLayerCompatibility2 := *,
|
|
user_user := *,
|
|
priority := *,
|
|
alert := *,
|
|
networkCCCapabilities := *,
|
|
causeofNoCli := *,
|
|
backupBearerCapacity := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/***********************************************************************
|
|
* Supplementary Services
|
|
***********************************************************************/
|
|
|
|
private template (value) Facility_TLV ts_FacTLV(OCTN facility) := {
|
|
elementIdentifier := '1C'O,
|
|
lengthIndicator := lengthof(facility),
|
|
facilityInformation := facility
|
|
}
|
|
private template Facility_TLV tr_FacTLV(template OCTN facility) := {
|
|
elementIdentifier := '1C'O,
|
|
lengthIndicator := ?,
|
|
facilityInformation := facility
|
|
}
|
|
|
|
private template (value) Facility_LV ts_FacLV(OCTN facility) := {
|
|
lengthIndicator := lengthof(facility),
|
|
facilityInformation := facility
|
|
}
|
|
private template Facility_LV tr_FacLV(template OCTN facility) := {
|
|
lengthIndicator := ?,
|
|
facilityInformation := facility
|
|
}
|
|
|
|
private function f_facility_or_omit(template (omit) OCTN facility)
|
|
return template (omit) Facility_TLV {
|
|
if (istemplatekind(facility, "omit")) {
|
|
return omit;
|
|
} else {
|
|
return ts_FacTLV(valueof(facility));
|
|
}
|
|
}
|
|
private function f_facility_or_wc(template OCTN facility)
|
|
return template Facility_TLV {
|
|
if (istemplatekind(facility, "*")) {
|
|
return *;
|
|
} else if (istemplatekind(facility, "?")) {
|
|
return ?;
|
|
} else if (istemplatekind(facility, "omit")) {
|
|
return omit;
|
|
} else {
|
|
return tr_FacTLV(facility);
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_SS_REGISTER(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
OCTN facility,
|
|
template (omit) SS_VersionIndicator ss_ver := omit
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
register := {
|
|
messageType := '111011'B,
|
|
nsd := '00'B,
|
|
facility := ts_FacTLV(facility),
|
|
ss_version := ss_ver
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_MS_NW tr_ML3_MO_SS_REGISTER(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template OCTN facility,
|
|
template SS_VersionIndicator ss_ver := omit
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
register := {
|
|
messageType := '111011'B,
|
|
nsd := '00'B,
|
|
facility := tr_FacTLV(facility),
|
|
ss_version := ss_ver
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_NW_MS ts_ML3_MT_SS_REGISTER(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
register := {
|
|
messageType := '111011'B,
|
|
nsd := '00'B,
|
|
facility := ts_FacTLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_NW_MS tr_ML3_MT_SS_REGISTER(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
register := {
|
|
messageType := '111011'B,
|
|
nsd := '00'B,
|
|
facility := tr_FacTLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_SS_FACILITY(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
facility := {
|
|
messageType := '111010'B,
|
|
nsd := '00'B,
|
|
facility := ts_FacLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_MS_NW tr_ML3_MO_SS_FACILITY(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
facility := {
|
|
messageType := '111010'B,
|
|
nsd := '00'B,
|
|
facility := tr_FacLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_NW_MS ts_ML3_MT_SS_FACILITY(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
facility := {
|
|
messageType := '111010'B,
|
|
nsd := '00'B,
|
|
facility := ts_FacLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_NW_MS tr_ML3_MT_SS_FACILITY(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template OCTN facility
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
facility := {
|
|
messageType := '111010'B,
|
|
nsd := '00'B,
|
|
facility := tr_FacLV(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_SS_RELEASE_COMPLETE(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
template (omit) ML3_Cause_TLV cause := omit,
|
|
template (omit) OCTN facility := omit
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
releaseComplete_MS_NW := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := cause,
|
|
facility := f_facility_or_omit(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_MS_NW tr_ML3_MO_SS_RELEASE_COMPLETE(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template ML3_Cause_TLV cause := *,
|
|
template OCTN facility := *
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
releaseComplete_MS_NW := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := cause,
|
|
facility := f_facility_or_wc(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_NW_MS ts_ML3_MT_SS_RELEASE_COMPLETE(
|
|
uint3_t tid, BIT1 ti_flag,
|
|
template (omit) ML3_Cause_TLV cause := omit,
|
|
template (omit) OCTN facility := omit
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
releaseComplete_NW_MS := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := cause,
|
|
facility := f_facility_or_omit(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
template PDU_ML3_NW_MS tr_ML3_MT_SS_RELEASE_COMPLETE(
|
|
template uint3_t tid, template BIT1 ti_flag,
|
|
template ML3_Cause_TLV cause := *,
|
|
template OCTN facility := *
|
|
) := {
|
|
discriminator := '1011'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
ss := {
|
|
releaseComplete_NW_MS := {
|
|
messageType := '101010'B,
|
|
nsd := '00'B,
|
|
cause := cause,
|
|
facility := f_facility_or_wc(facility)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/***********************************************************************
|
|
* GPRS Mobility Management
|
|
***********************************************************************/
|
|
|
|
template (value) MSNetworkCapabilityV ts_GMM_MsNetCapV := {
|
|
gea1bit := '1'B,
|
|
smCapabilitiesviaDedicatedChannels := '1'B,
|
|
smCapabilitiesviaGPRSChannels := '0'B,
|
|
ucs2Support := '1'B,
|
|
ssScreeningIndicator := '01'B,
|
|
solSACapability := omit,
|
|
revisionLevelIndicatior := omit,
|
|
pFCFeatureMode := omit,
|
|
extendedGEAbits := omit,
|
|
lcsVAcapability := omit,
|
|
pSInterRATHOtoUTRANIuModeCapability := omit,
|
|
pSInterRATHOtoEUTRANS1ModeCapability := omit,
|
|
eMMCombinedProceduresCapability := omit,
|
|
iSRSupport := omit,
|
|
sRVCCtoGERANUTRANCapability := omit,
|
|
ePCCapability := omit,
|
|
nFCapability := omit,
|
|
gERANNertworkSharingCapability := omit,
|
|
spare_octets := omit
|
|
};
|
|
|
|
template (value) MSNetworkCapabilityLV ts_GMM_MsNetCapLV := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
msNetworkCapabilityV := ts_GMM_MsNetCapV
|
|
};
|
|
|
|
type enumerated GprsAttachType {
|
|
GPRS_ATT_T_GPRS,
|
|
GPRS_ATT_T_GPRS_IMSI_COMBINED
|
|
};
|
|
|
|
function ts_GMM_AttachType(boolean combined := false, boolean follow_on_pending := false)
|
|
return AttachTypeV {
|
|
var AttachTypeV att;
|
|
if (combined) {
|
|
att.attachType := '011'B;
|
|
} else {
|
|
att.attachType := '001'B;
|
|
}
|
|
att.for_l3 := bool2bit(combined);
|
|
return att;
|
|
}
|
|
|
|
type enumerated GprsUpdateType {
|
|
GPRS_UPD_T_RA ('000'B),
|
|
GPRS_UPD_T_RA_LA_COMBINED ('001'B),
|
|
GPRS_UPD_T_RA_LA_COMBINED_IMSI_ATT ('010'B),
|
|
GPRS_UPD_T_PERIODIC ('011'B)
|
|
};
|
|
|
|
/* 10.5.5.18 Update Type */
|
|
template UpdateTypeV ts_GMM_UpdateType(GprsUpdateType upd_t, boolean combined := false,
|
|
boolean follow_on_pending := false) := {
|
|
valueField := int2bit(enum2int(upd_t), 3),
|
|
for_l3 := bool2bit(combined)
|
|
}
|
|
|
|
template (value) DRXParameterV ts_DrxParameterV := {
|
|
splitPGCycleCode := '00'O, /* no DRX */
|
|
nonDRXTimer := '000'B, /* no non-DRX mode */
|
|
splitOnCCCH := '0'B, /* not supported */
|
|
cnSpecificDRXCycleLength := '0000'B /* SI value used */
|
|
};
|
|
|
|
private function f_presence_bit_MultislotCap_GPRS(template (omit) MultislotCap_GPRS mscap_gprs) return BIT1 {
|
|
if (istemplatekind(mscap_gprs, "omit")) {
|
|
return '0'B;
|
|
}
|
|
return '1'B;
|
|
}
|
|
private function f_presence_bit_MultislotCap_EGPRS(template (omit) MultislotCap_EGPRS mscap_egprs) return BIT1 {
|
|
if (istemplatekind(mscap_egprs, "omit")) {
|
|
return '0'B;
|
|
}
|
|
return '1'B;
|
|
}
|
|
template (value) MSRACapabilityValuesRecord ts_RaCapRec(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS mscap_gprs := omit, template (omit) MultislotCap_EGPRS mscap_egprs := omit) := {
|
|
mSRACapabilityValues := {
|
|
mSRACapabilityValuesExclude1111 := {
|
|
accessTechnType := att, /* E-GSM */
|
|
accessCapabilities := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
accessCapabilities := {
|
|
rfPowerCapability := '001'B, /* FIXME */
|
|
presenceBitA5 := '0'B,
|
|
a5bits := omit,
|
|
esind := '1'B,
|
|
psbit := '0'B,
|
|
vgcs := '0'B,
|
|
vbs := '0'B,
|
|
presenceBitMultislot := '1'B,
|
|
multislotcap := {
|
|
presenceBitHscsd := '0'B,
|
|
hscsdmultislotclass := omit,
|
|
presenceBitGprs := f_presence_bit_MultislotCap_GPRS(mscap_gprs),
|
|
gprsmultislot := mscap_gprs,
|
|
presenceBitSms := '0'B,
|
|
multislotCap_SMS := omit,
|
|
multislotCapAdditionsAfterRel97 := {
|
|
presenceBitEcsdmulti := '0'B,
|
|
ecsdmultislotclass := omit,
|
|
presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS(mscap_egprs),
|
|
multislotCap_EGPRS := mscap_egprs,
|
|
presenceBitDtmGprsmulti := '0'B,
|
|
multislotCapdtmgprsmultislotsubclass := omit
|
|
}
|
|
},
|
|
accessCapAdditionsAfterRel97 := omit
|
|
},
|
|
spare_bits := omit
|
|
}
|
|
}
|
|
},
|
|
presenceBitMSRACap := '0'B
|
|
};
|
|
|
|
template (value) MSRadioAccessCapabilityLV ts_MS_RaCapa := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
msRadioAccessCapabilityV := {
|
|
ts_RaCapRec('0001'B) /* E-GSM */
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN
|
|
ts_GMM_ATTACH_REQ(MobileIdentityLV mi_lv, RoutingAreaIdentificationV old_ra,
|
|
boolean combined := false, boolean follow_on_pending := false,
|
|
template (omit) MobileStationClassmark2_TLV cm2_tlv,
|
|
template (omit) MobileStationClassmark3_TLV cm3_tlv
|
|
) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
attachRequest := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
msNetworkCapability := ts_GMM_MsNetCapLV,
|
|
attachType := valueof(ts_GMM_AttachType(combined, follow_on_pending)),
|
|
gprsCKSN := { '111'B, '0'B },
|
|
drxParam := ts_DrxParameterV,
|
|
mobileIdentity := mi_lv,
|
|
oldRoutingAreaID := old_ra,
|
|
msRACap := ts_MS_RaCapa,
|
|
ptmsiSignature := omit, /* TODO */
|
|
reqGPRStimer := omit,
|
|
tmsiStatus := omit,
|
|
pC_LCSCapability := omit,
|
|
mobileStationClassmark2 := cm2_tlv,
|
|
mobileStationClassmark3 := cm3_tlv,
|
|
supportedCodecs := omit,
|
|
uENetworkCapability := omit,
|
|
additionalMobileIdentity := omit,
|
|
routingAreaIdentification2 := omit,
|
|
voiceDomainandUEsUsageSetting := omit,
|
|
deviceProperties := omit,
|
|
p_TMSI_Type := omit,
|
|
mS_NetworkFeatureSupport := omit,
|
|
oldLocationAreaIdentification := omit,
|
|
additionalUpdateType := omit,
|
|
tMSIBasedNRIcontainer := omit,
|
|
t3324 := omit,
|
|
t3312_ExtendedValue := omit,
|
|
extendedDRXParameters := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private function tr_MI_TMSI_TLV(template OCT4 tmsi) return template MobileIdentityTLV {
|
|
if (istemplatekind(tmsi, "*")) {
|
|
return *;
|
|
} else if (istemplatekind(tmsi, "?")) {
|
|
return ?;
|
|
} else {
|
|
var template MobileIdentityTLV mi := {
|
|
elementIdentifier := '0011000'B,
|
|
spare1 := '0'B,
|
|
mobileIdentityLV := {
|
|
lengthIndicator := 4,
|
|
mobileIdentityV := {
|
|
typeOfIdentity := '100'B,
|
|
oddEvenInd_identity := {
|
|
tmsi_ptmsi := {
|
|
oddevenIndicator := '1'B,
|
|
fillerDigit := '1111'B,
|
|
octets := tmsi
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
return mi;
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_ATTACH_ACCEPT(template BIT3 res := ?,
|
|
template RoutingAreaIdentificationV ra := ?,
|
|
template OCT4 ptmsi := *) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
attachAccept := {
|
|
messageType := '00000010'B,
|
|
attachResult := { res, ? },
|
|
forceToStandby := ?,
|
|
updateTimer := ?,
|
|
radioPriority := ?,
|
|
radioPriorityTOM8 := ?,
|
|
routingAreaIdentification := ra,
|
|
ptmsiSignature := *,
|
|
readyTimer := *,
|
|
allocatedPTMSI := tr_MI_TMSI_TLV(ptmsi),
|
|
msIdentity := *,
|
|
gmmCause := *,
|
|
t3302 := *,
|
|
cellNotification := *,
|
|
equivalentPLMNs := *,
|
|
networkFeatureSupport := *,
|
|
emergencyNumberList := *,
|
|
requestedMSInformation := *,
|
|
t3319 := *,
|
|
t3323 := *,
|
|
t3312_ExtendedValue := *,
|
|
additionalNetworkFeatureSupport := *,
|
|
t3324 := *,
|
|
extendedDRXParameters := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_ATTACH_REJECT(template OCT1 cause) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
attachReject := {
|
|
messageType := '00000100'B,
|
|
gmmCause := {
|
|
causeValue := cause
|
|
},
|
|
t3302 := *,
|
|
t3346 := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_ATTACH_COMPL := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
attachComplete := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
interRATHandoverInformation := omit,
|
|
eUTRANinterRATHandoverInformation := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN
|
|
ts_GMM_RAU_REQ(MobileIdentityLV mi_lv, GprsUpdateType upd_type,
|
|
RoutingAreaIdentificationV old_ra,
|
|
boolean follow_on_pending := false,
|
|
template (omit) MobileStationClassmark2_TLV cm2_tlv,
|
|
template (omit) MobileStationClassmark3_TLV cm3_tlv,
|
|
template (omit) OCT4 p_tmsi := omit
|
|
) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
routingAreaUpdateRequest := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
updateType := ts_GMM_UpdateType(upd_type, follow_on_pending),
|
|
gprsCKSN := { '111'B, '0'B },
|
|
oldRoutingAreaId := old_ra,
|
|
msRACap := ts_MS_RaCapa,
|
|
oldPTMSISignature := omit, /* TODO */
|
|
readyTimerValue := omit,
|
|
drxParameter := omit,
|
|
tmsiStatus := omit,
|
|
ptmsi := ts_MI_TMSI_TLV(p_tmsi),
|
|
mSNetworkCapability := omit,
|
|
pdpContextStatus := omit, /* TODO */
|
|
pC_LCSCapability := omit,
|
|
mBMS_ContextStatus := omit,
|
|
uENetworkCapability := omit,
|
|
additionalMobileIdentity := omit,
|
|
oldRoutingAreaIdentification2 := omit,
|
|
mobileStationClassmark2 := cm2_tlv,
|
|
mobileStationClassmark3 := cm3_tlv,
|
|
supportedCodecs := omit,
|
|
voiceDomainUEUsageSetting := omit,
|
|
p_TMSI_Type := omit,
|
|
deviceProperties := omit,
|
|
mS_NetworkFeatureSupport := omit,
|
|
oldLocationAreaIdentification := omit,
|
|
additionalUpdateType := omit,
|
|
tMSIBasedNRIcontainer := omit,
|
|
t3324 := omit,
|
|
t3312_ExtendedValue := omit,
|
|
extendedDRXParameters := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_RAU_REJECT(template OCT1 cause := ?) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
routingAreaUpdateReject := {
|
|
messageType := '00001011'B,
|
|
gmmCause := {
|
|
causeValue := cause
|
|
},
|
|
forceToStandby := ?,
|
|
spare := '0000'B,
|
|
t3302 := *,
|
|
t3346 := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_RAU_ACCEPT(template BIT3 res := ?,
|
|
template RoutingAreaIdentificationV ra := ?,
|
|
template OCT4 ptmsi := *) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
routingAreaUpdateAccept := {
|
|
messageType := '00001001'B,
|
|
forceToStandby := ?,
|
|
updateResult := { res, ? },
|
|
raUpdateTimer := ?,
|
|
routingAreaId := ra,
|
|
ptmsiSignature := *,
|
|
allocatedPTMSI := tr_MI_TMSI_TLV(ptmsi),
|
|
msIdentity := *,
|
|
receiveNPDUNumbers := *,
|
|
readyTimer := *,
|
|
gmmCause := *,
|
|
t3302 := *,
|
|
cellNotification := *,
|
|
equivalentPLMNs := *,
|
|
pdpContextStatus := *,
|
|
networkFeatureSupport := *,
|
|
emergencyNumberList := *,
|
|
mBMS_ContextStatus := *,
|
|
requestedMSInformation := *,
|
|
t3319 := *,
|
|
t3323 := *,
|
|
t3312_ExtendedValue := *,
|
|
additionalNetworkFeatureSupport := *,
|
|
t3324 := *,
|
|
extendedDRXParameters := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_RAU_COMPL := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
routingAreaUpdateComplete := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
receiveNPDUNumbers := omit,
|
|
interRATHandoverInformation := omit,
|
|
eUTRANinterRATHandoverInformation := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_PTMSI_REALL_COMPL := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
p_TMSIReallocationComplete := {
|
|
messageType := '00000000'B /* overwritten */
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_AUTH_CIPH_COMPL(ACReferenceNumberV ref, OCT4 res) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
authenticationAndCipheringResponse := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
acReferenceNumber := ref,
|
|
spare := '0000'B,
|
|
authenticationParResp := {
|
|
elementIdentifier := '22'O,
|
|
valueField := res
|
|
},
|
|
imeisv := omit,
|
|
authenticationRespParExt := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_ID_REQ(template BIT3 id_type := ?) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
identityRequest := {
|
|
messageType := '00010101'B,
|
|
identityType := { id_type, '0'B },
|
|
forceToStandby := ?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_ID_RESP(MobileIdentityLV mi_lv) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
identityResponse := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
mobileIdentity := mi_lv
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_AUTH_REQ(template OCT16 rand := ?, template BIT3 ciph_alg := ?) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
authenticationAndCipheringRequest := {
|
|
messageType := '00010010'B,
|
|
cipheringAlgorithm := { ciph_alg, '0'B },
|
|
imeisvRequest := ?,
|
|
forceToStandby := ?,
|
|
acReferenceNumber := ?,
|
|
authenticationParameterRAND := {
|
|
elementIdentifier := '21'O,
|
|
randValue := rand
|
|
},
|
|
cipheringKeySequenceNumber := *,
|
|
authenticationParameterAUTN := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_AUTH_RESP_2G(BIT4 ac_ref, OCT4 sres) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
authenticationAndCipheringResponse := {
|
|
messageType := '00010011'B,
|
|
acReferenceNumber := { valueField := ac_ref },
|
|
spare := '0000'B,
|
|
authenticationParResp := {
|
|
elementIdentifier := '22'O,
|
|
valueField := sres
|
|
},
|
|
imeisv := omit,
|
|
authenticationRespParExt := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_MS_SGSN ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(octetstring auts) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
authenticationAndCipheringFailure := {
|
|
messageType := '00011100'B,
|
|
gmmCause := {
|
|
causeValue := '15'O /* GMM_CAUSE_SYNC_FAIL 10.5.3.2.2 */
|
|
},
|
|
authenticationFailureParam := {
|
|
elementIdentifier := '30'O,
|
|
lengthIndicator := 14,
|
|
valueField := auts
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
const BIT3 c_GMM_DTT_MO_GPRS := '001'B;
|
|
const BIT3 c_GMM_DTT_MO_IMSI := '010'B;
|
|
const BIT3 c_GMM_DTT_MO_GPRS_IMSI_COMBINED := '011'B;
|
|
|
|
const BIT3 c_GMM_DTT_MT_REATTACH_REQUIRED := '001'B;
|
|
const BIT3 c_GMM_DTT_MT_REATTACH_NOT_REQUIRED := '010'B;
|
|
const BIT3 c_GMM_DTT_MT_IMSI_DETACH := '011'B;
|
|
|
|
template (value) DetachTypeV ts_GMM_DetType(BIT3 dtt, boolean power_off := false) := {
|
|
detachType := dtt,
|
|
powerOffFlag := bool2bit(power_off)
|
|
}
|
|
|
|
function ts_PtmsiSigTV(template (omit) OCT3 val) return template (omit) P_TMSISignatureTV {
|
|
var template (omit) P_TMSISignatureTV ret;
|
|
if (istemplatekind(val, "omit")) {
|
|
return omit;
|
|
} else {
|
|
ret := {
|
|
elementIdentifier := '19'O,
|
|
valueField := valueof(val)
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
function ts_PtmsiSigTLV(template (omit) OCT3 val) return template (omit) P_TMSISignature2TLV {
|
|
var template (omit) P_TMSISignature2TLV ret;
|
|
if (istemplatekind(val, "omit")) {
|
|
return omit;
|
|
} else {
|
|
ret := {
|
|
elementIdentifier := '19'O,
|
|
lengthIndicator := 3,
|
|
valueField := valueof(val)
|
|
}
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_GMM_DET_REQ_MO(BIT3 dtt := c_GMM_DTT_MO_GPRS,
|
|
boolean power_off := false,
|
|
template (omit) OCT4 p_tmsi := omit,
|
|
template (omit) OCT3 p_tmsi_sig := omit) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
detachRequest_MS_SGSN := {
|
|
messageType := '00000000'B, /* overwritten */
|
|
detachType := valueof(ts_GMM_DetType(dtt, power_off)),
|
|
spare := '0000'B,
|
|
ptmsi := ts_MI_TMSI_TLV(p_tmsi),
|
|
ptmsiSignature := ts_PtmsiSigTLV(p_tmsi_sig)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_DET_ACCEPT_MT := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
detachAccept_SGSN_MS := {
|
|
messageType := '00000110'B,
|
|
forceToStandby := ?,
|
|
spare := '0000'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_GMM_DET_REQ_MT(
|
|
template BIT3 dtt := *,
|
|
template BIT3 forceToStandby := ?,
|
|
template OCT1 cause := *) := {
|
|
discriminator := '1000'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
detachRequest_SGSN_MS := {
|
|
messageType := '00000101'B,
|
|
detachType := { dtt, ? },
|
|
forceToStandby := { forceToStandby, '0'B },
|
|
gmmCause := {
|
|
elementIdentifier := '25'O,
|
|
causeValue := { cause }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_MS_SGSN ts_GMM_DET_ACCEPT_MO := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
gprs_mm := {
|
|
detachAccept_MS_SGSN := {
|
|
messageType := '00000000'B
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
function ts_TearDownIndicatorTV(in template (omit) boolean ind)
|
|
return template (omit) TearDownIndicatorTV {
|
|
if (istemplatekind(ind, "omit")) {
|
|
return omit;
|
|
} else {
|
|
var template (omit) TearDownIndicatorTV ret := {
|
|
tearDownIndicatorV := {
|
|
tdi_flag := bool2bit(valueof(ind)),
|
|
spare := '000'B
|
|
},
|
|
elementIdentifier := '1001'B
|
|
}
|
|
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 := c_TIF_ORIG,
|
|
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 := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
activatePDPContextReject := {
|
|
messageType := '01000011'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 := c_TIF_REPL,
|
|
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 := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_SM_DEACT_PDP_REQ_MO(BIT3 tid, OCT1 cause,
|
|
template (omit) boolean tdown := omit,
|
|
template (omit) ProtocolConfigOptionsV pco := omit
|
|
) := {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextRequest := {
|
|
messageType := '01000110'B,
|
|
smCause := cause,
|
|
tearDownIndicator := ts_TearDownIndicatorTV(tdown),
|
|
protocolConfigOpts := ts_PcoTLV(pco),
|
|
mBMSprotocolConfigOptions := omit,
|
|
t3396 := omit,
|
|
wLANOffloadIndication := omit,
|
|
nBIFOM_Container := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_SGSN_MS ts_SM_DEACT_PDP_REQ_MT(BIT3 tid, OCT1 cause,
|
|
template (omit) boolean tdown := omit,
|
|
template (omit) ProtocolConfigOptionsV pco := omit
|
|
) := {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextRequest := {
|
|
messageType := '01000110'B,
|
|
smCause := cause,
|
|
tearDownIndicator := ts_TearDownIndicatorTV(tdown),
|
|
protocolConfigOpts := ts_PcoTLV(pco),
|
|
mBMSprotocolConfigOptions := omit,
|
|
t3396 := omit,
|
|
wLANOffloadIndication := omit,
|
|
nBIFOM_Container := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_SM_DEACT_PDP_REQ_MT(template BIT3 tid, template OCT1 cause,
|
|
template (omit) boolean tdown := omit,
|
|
template (omit) ProtocolConfigOptionsV pco := omit
|
|
) := {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextRequest := {
|
|
messageType := '01000110'B,
|
|
smCause := cause,
|
|
tearDownIndicator := ts_TearDownIndicatorTV(tdown),
|
|
protocolConfigOpts := ts_PcoTLV(pco),
|
|
mBMSprotocolConfigOptions := *,
|
|
t3396 := *,
|
|
wLANOffloadIndication := *,
|
|
nBIFOM_Container := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_SGSN_MS tr_SM_DEACT_PDP_ACCEPT_MT(template BIT3 tid := ?)
|
|
:= {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_REPL,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextAccept := {
|
|
messageType := '01000111'B,
|
|
protocolConfigOpts := *,
|
|
mBMSprotocolConfigOptions := *,
|
|
nBIFOM_Container := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template PDU_L3_MS_SGSN tr_SM_DEACT_PDP_ACCEPT_MO(template BIT3 tid := ?)
|
|
:= {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextAccept := {
|
|
messageType := '01000111'B,
|
|
protocolConfigOpts := *,
|
|
mBMSprotocolConfigOptions := *,
|
|
nBIFOM_Container := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_L3_MS_SGSN ts_SM_DEACT_PDP_ACCEPT_MO(BIT3 tid)
|
|
:= {
|
|
discriminator := '1010'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := tid,
|
|
tiFlag := c_TIF_ORIG,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
gprs_sm := {
|
|
deactivatePDPContextAccept := {
|
|
messageType := '01000111'B,
|
|
protocolConfigOpts := omit,
|
|
mBMSprotocolConfigOptions := omit,
|
|
nBIFOM_Container := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
var integer pad_len := suffix_len - lengthof(suffix_ch);
|
|
|
|
return prefix & int2hex(0, pad_len) & str2hex(suffix_ch);
|
|
}
|
|
|
|
function f_gen_imei(integer suffix) return hexstring {
|
|
return f_concat_pad(14, '49999'H, suffix);
|
|
}
|
|
|
|
function f_gen_imsi(integer suffix) return hexstring {
|
|
return f_concat_pad(15, '26242'H, suffix);
|
|
}
|
|
|
|
function f_gen_msisdn(integer suffix) return hexstring {
|
|
return f_concat_pad(12, '49123'H, suffix);
|
|
}
|
|
|
|
external function enc_MobileIdentityLV(in MobileIdentityLV si) return octetstring
|
|
with { extension "prototype(convert) encode(RAW)" };
|
|
|
|
external function dec_MobileIdentityV(in octetstring mi) return MobileIdentityV
|
|
with { extension "prototype(convert) decode(RAW)" };
|
|
|
|
|
|
|
|
/* SMS TPDU Layer */
|
|
|
|
template (value) TPDU_RP_DATA_MS_SGSN ts_SMS_SUBMIT(OCT1 msg_ref, template (value) TP_DA dst_addr,
|
|
template (value) OCT1 pid, template (value) OCT1 dcs,
|
|
integer length_ind, octetstring user_data) := {
|
|
sMS_SUBMIT := {
|
|
tP_MTI := '01'B, /* SUBMIT */
|
|
tP_RD := '1'B, /* reject duplicates */
|
|
tP_VPF := '00'B, /* not present */
|
|
tP_SRR := '0'B, /* no status report requested */
|
|
tP_UDHI := '0'B, /* no user data header in UD */
|
|
tP_RP := '0'B, /* no reply path */
|
|
tP_MR := msg_ref,
|
|
tP_DA := dst_addr,
|
|
tP_PID := pid,
|
|
tP_DCS := dcs,
|
|
tP_VP := omit,
|
|
tP_UDL_UD := {
|
|
tP_LengthIndicator := length_ind,
|
|
tP_UD := user_data
|
|
}
|
|
}
|
|
}
|
|
|
|
template TPDU_RP_DATA_SGSN_MS tr_SMS_DELIVER(template TP_OA src_addr := ?,
|
|
template octetstring user_data := ?,
|
|
template OCT1 pid := ?, template OCT1 dcs := ?,
|
|
template BIT1 mms := ?
|
|
) := {
|
|
sMS_DELIVER := {
|
|
tP_MTI := '00'B, /* DELIVER */
|
|
tP_MMS := mms, /* more messages to send */
|
|
tP_LP := ?, /* ?!? */
|
|
tP_Spare := '0'B,
|
|
tP_SRI := '0'B, /* status report indication */
|
|
tP_UDHI := '0'B, /* no user data header in UD */
|
|
tP_RP := '0'B, /* no reply path */
|
|
tP_OA := src_addr,
|
|
tP_PID := pid,
|
|
tP_DCS := dcs,
|
|
tP_SCTS := ?,
|
|
tP_UDL_UD := {
|
|
tP_LengthIndicator := ?,
|
|
tP_UD := user_data
|
|
}
|
|
}
|
|
}
|
|
|
|
/* RP Layer */
|
|
|
|
private function ts_RpOrig(template (omit) RP_NumberingPlan_and_NumberDigits rp_orig)
|
|
return RP_OriginatorAddressLV {
|
|
var RP_OriginatorAddressLV ret;
|
|
if (istemplatekind(rp_orig, "omit")) {
|
|
ret := { 0, omit };
|
|
} else {
|
|
ret := { 0, valueof(rp_orig) };
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
private function ts_RpDst(template (omit) RP_NumberingPlan_and_NumberDigits rp_dst)
|
|
return RP_DestinationAddressLV {
|
|
var RP_DestinationAddressLV ret;
|
|
if (istemplatekind(rp_dst, "omit")) {
|
|
ret := { 0, omit };
|
|
} else {
|
|
ret := { 0, valueof(rp_dst) };
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template (value) RPDU_MS_SGSN ts_RP_DATA_MO(OCT1 msg_ref,
|
|
template (omit) RP_NumberingPlan_and_NumberDigits rp_orig,
|
|
template (omit) RP_NumberingPlan_and_NumberDigits rp_dst,
|
|
template (value) TPDU_RP_DATA_MS_SGSN tpdu) := {
|
|
rP_DATA_MS_SGSN := {
|
|
rP_MTI := '000'B,
|
|
rP_Spare := '00000'B,
|
|
rP_MessageReference := msg_ref,
|
|
rP_OriginatorAddress := ts_RpOrig(rp_orig),
|
|
rP_DestinationAddress := ts_RpDst(rp_dst),
|
|
rP_User_Data := {
|
|
rP_LengthIndicator := 0, /* overwritten */
|
|
rP_TPDU := tpdu
|
|
}
|
|
}
|
|
}
|
|
|
|
template RPDU_SGSN_MS tr_RP_DATA_MT(template OCT1 msg_ref,
|
|
template RP_NumberingPlan_and_NumberDigits rp_orig,
|
|
template RP_NumberingPlan_and_NumberDigits rp_dst,
|
|
template TPDU_RP_DATA_SGSN_MS tpdu) := {
|
|
rP_DATA_SGSN_MS := {
|
|
rP_MTI := '001'B,
|
|
rP_Spare := '00000'B,
|
|
rP_MessageReference := msg_ref,
|
|
rP_OriginatorAddress := { ?, rp_orig },
|
|
rP_DestinationAddress := { ?, rp_dst },
|
|
rP_User_Data := {
|
|
rP_LengthIndicator := ?,
|
|
rP_TPDU := tpdu
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
template (value) RPDU_MS_SGSN ts_RP_ACK_MO(OCT1 msg_ref) := {
|
|
rP_ACK_MS_SGSN := {
|
|
rP_MTI := '010'B,
|
|
rP_Spare := '00000'B,
|
|
rP_MessageReference := msg_ref,
|
|
rP_User_Data := omit /* FIXME: report */
|
|
}
|
|
}
|
|
|
|
template RPDU_SGSN_MS tr_RP_ACK_MT(template OCT1 msg_ref) := {
|
|
rP_ACK_SGSN_MS := {
|
|
rP_MTI := '011'B,
|
|
rP_Spare := '00000'B,
|
|
rP_MessageReference := msg_ref,
|
|
rP_User_Data := omit /* FIXME: report */
|
|
}
|
|
}
|
|
|
|
template (value) RPDU_MS_SGSN ts_RP_ERROR_MO(OCT1 msg_ref, uint7_t cause) := {
|
|
rP_ERROR_MS_SGSN := {
|
|
rP_MTI := '100'B,
|
|
rP_Spare := '00000'B,
|
|
rP_Message_Reference := msg_ref,
|
|
rP_CauseLV := {
|
|
rP_LengthIndicator := 0, /* overwritten */
|
|
rP_CauseV := {
|
|
causeValue := int2bit(cause, 7),
|
|
ext := '0'B
|
|
},
|
|
rP_diagnisticField := omit
|
|
},
|
|
rP_User_Data := omit /* FIXME: report */
|
|
}
|
|
}
|
|
|
|
private function f_cause_or_wc(template uint7_t cause) return template BIT7 {
|
|
if (istemplatekind(cause, "?")) {
|
|
return ?;
|
|
} else if (istemplatekind(cause, "*")) {
|
|
return *;
|
|
} else {
|
|
return int2bit(valueof(cause), 7);
|
|
}
|
|
}
|
|
|
|
template RPDU_SGSN_MS tr_RP_ERROR_MT(template OCT1 msg_ref, template uint7_t cause) := {
|
|
rP_ERROR_SGSN_MS := {
|
|
rP_MTI := '101'B,
|
|
rP_Spare := '00000'B,
|
|
rP_Message_Reference := msg_ref,
|
|
rP_CauseLV := {
|
|
rP_LengthIndicator := ?,
|
|
rP_CauseV := {
|
|
causeValue := f_cause_or_wc(cause),
|
|
ext := '0'B
|
|
},
|
|
rP_diagnisticField := omit
|
|
},
|
|
rP_User_Data := omit /* FIXME: report */
|
|
}
|
|
}
|
|
|
|
|
|
template (value) RPDU_MS_SGSN ts_RP_SMMA_MO(OCT1 msg_ref) := {
|
|
rP_SMMA := {
|
|
rP_MTI := '110'B,
|
|
rP_Spare := '00000'B,
|
|
rP_MessageReference := msg_ref
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/* CP Layer */
|
|
|
|
template (value) L3_SMS_MS_SGSN ts_CP_DATA_MO(template (value) RPDU_MS_SGSN rpdu) := {
|
|
cP_DATA := {
|
|
cP_messageType := '00000001'B,
|
|
cP_User_Data := {
|
|
lengthIndicator := 0, /* overwritten */
|
|
cP_RPDU := rpdu
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) L3_SMS_MS_SGSN ts_CP_ACK_MO := {
|
|
cP_ACK := {
|
|
cP_messageType := '00000100'B
|
|
}
|
|
}
|
|
|
|
template (value) L3_SMS_MS_SGSN ts_CP_ERROR_MO(OCT1 cause) := {
|
|
cP_ERROR := {
|
|
cP_messageType := '00010000'B,
|
|
cP_Cause := {
|
|
causeValue := cause
|
|
}
|
|
}
|
|
}
|
|
|
|
template L3_SMS_SGSN_MS tr_CP_DATA_MT(template RPDU_SGSN_MS rpdu) := {
|
|
cP_DATA := {
|
|
cP_messageType := '00000001'B,
|
|
cP_User_Data := {
|
|
lengthIndicator := ?,
|
|
cP_RPDU := rpdu
|
|
}
|
|
}
|
|
}
|
|
|
|
template L3_SMS_SGSN_MS tr_CP_ACK_MT := {
|
|
cP_ACK := {
|
|
cP_messageType := '00000100'B
|
|
}
|
|
}
|
|
|
|
template L3_SMS_SGSN_MS tr_CP_ERROR_MT(template OCT1 cause) := {
|
|
cP_ERROR := {
|
|
cP_messageType := '00010000'B,
|
|
cP_Cause := {
|
|
causeValue := cause
|
|
}
|
|
}
|
|
}
|
|
|
|
/* L3 Wrapper */
|
|
|
|
template (value) PDU_ML3_MS_NW ts_ML3_MO_SMS(uint3_t tid, BIT1 ti_flag,
|
|
template (value) L3_SMS_MS_SGSN sms_mo) := {
|
|
discriminator := '1001'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := int2bit(tid, 3),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
sms := sms_mo
|
|
}
|
|
}
|
|
|
|
private function f_tid_or_wc(template uint3_t tid) return template BIT3 {
|
|
var template BIT3 ret;
|
|
if (istemplatekind(tid, "*")) {
|
|
return *;
|
|
} else if (istemplatekind(tid, "?")) {
|
|
return ?;
|
|
} else {
|
|
return int2bit(valueof(tid), 3);
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_SMS(template uint3_t tid, template BIT1 ti_flag,
|
|
template L3_SMS_SGSN_MS sms_mt) := {
|
|
discriminator := '1001'B,
|
|
tiOrSkip := {
|
|
transactionId := {
|
|
tio := f_tid_or_wc(tid),
|
|
tiFlag := ti_flag,
|
|
tIExtension := omit
|
|
}
|
|
},
|
|
msgs := {
|
|
sms := sms_mt
|
|
}
|
|
}
|
|
|
|
template PDU_ML3_NW_MS tr_ML3_MT_MM_Info := {
|
|
discriminator := '0101'B,
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
mm := {
|
|
mMInformation := {
|
|
messageType := '110010'B,
|
|
nsd := '00'B,
|
|
fullNetworkName := *,
|
|
shortNetworkName := *,
|
|
localtimeZone := *,
|
|
univTime := *,
|
|
lSAIdentity := *,
|
|
networkDST := *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_ML3_MS_NW ts_RRM_GprsSuspReq(template (value) OCT4 tlli,
|
|
template (value) RoutingAreaIdentificationV rai,
|
|
template (value) OCT1 cause) := {
|
|
discriminator := '0000'B, /* overwritten */
|
|
tiOrSkip := {
|
|
skipIndicator := '0000'B
|
|
},
|
|
msgs := {
|
|
rrm := {
|
|
gPRS_suspensionRequest := {
|
|
messageType := '00110100'B,
|
|
tLLI := tlli,
|
|
routingAreaIdentification := rai,
|
|
suspensionCause := cause,
|
|
service_Support := omit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|