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


/* 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 := '1111'B;
	} else {
		l3.oddevenIndicator := '0'B;
		l3.fillerDigit := omit;
	}
	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(BIT4 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 := serv_type,
				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
				}
			}
		}
	}
}


}
