module L3_Templates {

/* L3 Templates, building on top of MobileL3*_Types from Ericsson.
 *
 * (C) 2017 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.
 */

import from General_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;


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)
}


/* send template fro 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
			}
		}
	}
}

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);
	if (len rem 2 == 1) {	/* modulo remainder */
		l3.oddevenIndicator := '1'B;
	} else {
		l3.oddevenIndicator := '0'B;
	}
	l3.digits := digits;
	return l3;
}

/* send template fro Mobile Identity (IMSI) */
template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
	lengthIndicator := 0, /* overwritten */
	mobileIdentityV := {
		typeOfIdentity := '000'B, /* overwritten */
		oddEvenInd_identity := {
			imsi := f_enc_IMSI_L3(imsi_digits)
		}
	}
}

/* send template fro Mobile Identity (IMEI) */
template (value) MobileIdentityLV ts_MI_IMEI_LV(hexstring imei_digits) := {
	lengthIndicator := 0, /* overwritten */
	mobileIdentityV := {
		typeOfIdentity := '000'B, /* overwritten */
		oddEvenInd_identity := {
			imei := f_enc_IMEI_L3(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 := omit,
	mobileStationClassmark2_oct5 := 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 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 := *
			}
		}
	}
}

/* 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_MS_NW ts_RRM_CiphModeCompl := {
	discriminator := '0000'B, /* overwritten */
	tiOrSkip := {
		skipIndicator := '0000'B
	},
	msgs := {
		rrm := {
			cipheringModeComplete := {
				messageType := '00110010'B,
				mobileEquipmentIdentity := omit
			}
		}
	}
}


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 := *
			}
		}
	}
}

template PDU_ML3_NW_MS tr_ML3_MT_MM_ID_Req(template BIT3 id_type := ?) := {
	discriminator := '0101'B,
	tiOrSkip := {
		skipIndicator := '0000'B
	},
	msgs := {
		mm := {
			identityRequest := {
				messageType := '011000'B,
				nsd := '00'B,
				identityType := 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) := {
	rf_PowerCapability := '010'B,
	a5_1 := a5_1_unavail,
	esind := '1'B,
	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 := '000'B,
			tiFlag := '0'B,
			tIExtension := omit
		}
	}
}

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 (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 := omit
	},
	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 := '0'B,
			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 := '0'B,
			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_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_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 (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
				}
			}
		}
	}
}


}
