module DIAMETER_ts29_273_Templates {

/* (C) 2023 by sysmocom s.f.m.c. GmbH <info@sysmocom.de
 * 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
 *
 * Templates for AVPs and messages for TS 29.273
 */

import from General_Types all;
import from DIAMETER_Types all;
import from DIAMETER_Templates all;
import from DIAMETER_rfc5447_Templates all;
import from Osmocom_Types all;
import from Misc_Helpers all;

/* 3GPP TS 29.273 Section 8.2 */
const uint32_t c_DIAMETER_3GPP_SWx_AID := 16777265;
/* 3GPP TS 29.273 Section 9 */
const uint32_t c_DIAMETER_3GPP_S6b_AID := 16777272;

/* 5.2.3.3 MIP6-Feature-Vector bits */
const uint64_t DIA_TS29_373_MIP6_Feature_Vector_PMIP6_SUPPORTED := 		hex2int('0000010000000000'H);
const uint64_t DIA_TS29_373_MIP6_Feature_Vector_ASSIGN_LOCAL_IP := 		hex2int('0000080000000000'H);
const uint64_t DIA_TS29_373_MIP6_Feature_Vector_MIP4_SUPPORTED := 		hex2int('0000100000000000'H);
const uint64_t DIA_TS29_373_MIP6_Feature_Vector_OPTIMIZED_IDLE_MODE_MOBILITY := hex2int('0000200000000000'H);
const uint64_t DIA_TS29_373_MIP6_Feature_Vector_GTPv2_SUPPORTED := 		hex2int('0000400000000000'H);

/*******************************
 * SWx 3GPP TS 29.273 section 8
 *******************************/

/* SIP-Auth-Data-Item , 3GPP TS 29.273 8.2.3.9 */
template (present) GenericAVP tr_AVP_3GPP_SIPAuthDataItem(template (present) uint32_t num := ?) := {
	avp := {
		avp_header := tr_DIA_Hdr_3GPP(c_AVP_Code_CxDx_3GPP_SIP_Auth_Data_Item),
		avp_data := {
			avp_CxDx_3GPP_SIP_Auth_Data_Item := superset(
				//tr_AVP_3GPP_SIPItemNumber(num), /* Optional */
				tr_AVP_3GPP_SIPAuthScheme(?)//, /* Optional */
				//tr_AVP_3GPP_SIPAuthenticate(?), /* Optional */
				//tr_AVP_3GPP_SIPAuthorization(?), /* Optional */
				//tr_AVP_3GPP_SIPAuthContext(?), /* Optional */
				//tr_AVP_3GPP_ConfidentialityKey(?), /* Optional */
				//tr_AVP_3GPP_IntegrityKey(?) /* Optional */
				/* TODO:
				[ SIP-Digest-Authenticate ]
				[ Framed-IP-Address ]
				[ Framed-IPv6-Prefix ]
				[ Framed-Interface-Id ]
				[ Line-Identifier ]
				*[AVP]
				*/
			)
		}
	}
}
template (value) GenericAVP ts_AVP_3GPP_SIPAuthDataItem(uint32_t num, OCT16 rand, OCT16 ik, OCT16 ck, OCT16 autn, OCT14 auts) := {
	avp := {
		avp_header := ts_DIA_Hdr_3GPP(c_AVP_Code_CxDx_3GPP_SIP_Auth_Data_Item),
		avp_data := {
			avp_CxDx_3GPP_SIP_Auth_Data_Item := {
				ts_AVP_3GPP_SIPItemNumber(num),
				ts_AVP_3GPP_SIPAuthScheme(char2oct("Digest-AKAv1-MD5")),
				ts_AVP_3GPP_SIPAuthenticate(rand & autn),
				ts_AVP_3GPP_SIPAuthorization(rand & auts),
				ts_AVP_3GPP_SIPAuthContext(char2oct("foobar")),
				ts_AVP_3GPP_ConfidentialityKey(ck),
				ts_AVP_3GPP_IntegrityKey(ik)
				/* TODO:
				[ SIP-Digest-Authenticate ]
				[ Framed-IP-Address ]
				[ Framed-IPv6-Prefix ]
				[ Framed-Interface-Id ]
				[ Line-Identifier ]
				*[AVP]
				*/
			}
		}
	}
}

/* Multimedia-Auth-Request, 3GPP TS 29.273 8.2.2.1 Authentication Procedure */
template (present) PDU_DIAMETER
tr_DIA_SWx_MAR(template (present) hexstring imsi := ?,
	       template (present) octetstring sess_id := ?,
	       template (present) charstring orig_host :=  ?,
	       template (present) charstring orig_realm := ?,
	       template (present) charstring dest_realm := ?,
	       template (present) UINT32 hbh_id := ?,
	       template (present) UINT32 ete_id := ?) :=
	tr_DIAMETER(flags := '1???????'B,
		    cmd_code := Multimedia_Auth,
		    app_id := int2oct(c_DIAMETER_3GPP_SWx_AID, 4),
		    hbh_id := hbh_id, ete_id := ete_id,
		    avps := superset(
			tr_AVP_SessionId(sess_id),
			tr_AVP_VendorSpecAppId(?, ?),
			tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
			tr_AVP_OriginHost(orig_host),
			tr_AVP_OriginRealm(orig_realm),
			tr_AVP_DestinationRealm(dest_realm),
			tr_AVP_UserNameImsi(imsi),
			tr_AVP_3GPP_SIPAuthDataItem(?),
			tr_AVP_3GPP_SIPNumAuthDataItems(?)
	));

/* Multimedia-Auth-Answer, 3GPP TS 29.273 8.2.2.1 Authentication Procedure */
template (value) PDU_DIAMETER
ts_DIA_SWx_MAA(template (value) hexstring imsi,
	       template (value) GenericAVP sip_auth_data_item,
	       template (value) uint32_t vendor_app_id := c_DIAMETER_3GPP_SWx_AID,
	       template (value) octetstring sess_id := c_def_sess_id,
	       template (value) charstring orig_host := "hss.localdomain",
	       template (value) charstring orig_realm := "localdomain",
	       template (value) UINT32 hbh_id := '00000000'O,
	       template (value) UINT32 ete_id := '00000000'O) :=
	ts_DIAMETER(flags := '01000000'B,
		    cmd_code := Multimedia_Auth,
		    app_id := int2oct(c_DIAMETER_3GPP_SWx_AID, 4),
		    hbh_id := hbh_id,
		    ete_id := ete_id,
		    avps := {
			ts_AVP_SessionId(sess_id),
			ts_AVP_VendorSpecAppId(vendor_id_3GPP, valueof(vendor_app_id)),
			ts_AVP_ResultCode(DIAMETER_SUCCESS),
			ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
			ts_AVP_OriginHost(orig_host),
			ts_AVP_OriginRealm(orig_realm),
			ts_AVP_UserNameImsi(valueof(imsi)),
			sip_auth_data_item,
			ts_AVP_3GPP_SIPNumAuthDataItems(1)
	});

/* Server-Assignment-Request,
 * 3GPP TS 29.273 8.1.2.2.2 UE/PDN Registration/DeRegistration Notification
 * 3GPP TS 29.273 8.2.2.3 Non-3GPP IP Access Registration Procedure */
template (present) PDU_DIAMETER
tr_DIA_SWx_SAR(template (present) hexstring imsi := ?,
	       template (present) octetstring sess_id := ?,
	       template (present) charstring orig_host :=  ?,
	       template (present) charstring orig_realm := ?,
	       template (present) charstring dest_realm := ?,
	       template (present) UINT32 hbh_id := ?,
	       template (present) UINT32 ete_id := ?,
	       template (present) CxDx_3GPP_Server_Assignment_Type server_ass_type := ?,
	       template (present) charstring service_selection := ?) :=
	tr_DIAMETER(flags := '1???????'B,
		    cmd_code := Server_Assignment,
		    app_id := int2oct(c_DIAMETER_3GPP_SWx_AID, 4),
		    hbh_id := hbh_id, ete_id := ete_id,
		    avps := superset(
			tr_AVP_SessionId(sess_id),
			tr_AVP_VendorSpecAppId(?, ?),
			tr_AVP_AuthSessionState(NO_STATE_MAINTAINED),
			tr_AVP_OriginHost(orig_host),
			tr_AVP_OriginRealm(orig_realm),
			tr_AVP_DestinationRealm(dest_realm),
			tr_AVP_UserNameImsi(imsi),
			tr_AVP_3GPP_ServerAssignmentType(server_ass_type),
			tr_AVP_ServiceSelection(service_selection)
	));

/* Server-Assignment-Answer,
 * 3GPP TS 29.273 8.1.2.2.2 UE/PDN Registration/DeRegistration Notification
 * 3GPP TS 29.273 8.2.2.3 Non-3GPP IP Access Registration Procedure */
template (value) PDU_DIAMETER
ts_DIA_SWx_SAA(template (value) hexstring imsi,
	       template (value) uint32_t vendor_app_id := c_DIAMETER_3GPP_SWx_AID,
	       template (value) octetstring sess_id := c_def_sess_id,
	       template (value) charstring orig_host := "hss.localdomain",
	       template (value) charstring orig_realm := "localdomain",
	       template (value) UINT32 hbh_id := '00000000'O,
	       template (value) UINT32 ete_id := '00000000'O) :=
	ts_DIAMETER(flags := '01000000'B,
		    cmd_code := Server_Assignment,
		    app_id := int2oct(c_DIAMETER_3GPP_SWx_AID, 4),
		    hbh_id := hbh_id,
		    ete_id := ete_id,
		    avps := {
			ts_AVP_SessionId(sess_id),
			ts_AVP_VendorSpecAppId(vendor_id_3GPP, valueof(vendor_app_id)),
			ts_AVP_ResultCode(DIAMETER_SUCCESS),
			ts_AVP_AuthSessionState(NO_STATE_MAINTAINED),
			ts_AVP_OriginHost(orig_host),
			ts_AVP_OriginRealm(orig_realm),
			ts_AVP_UserNameImsi(valueof(imsi))
			/* TODO:
			 * [ Non-3GPP-User-Data ]
			 * [ 3GPP-AAA-Server-Name ]
			 * [ OC-Supported-Features ]
			 * [ OC-OLR ] ]
			 * *[ Load ]
			 * *[ Supported-Features ]
			 */
	});

/*******************************
 * S6b 3GPP TS 29.273 section 9
 *******************************/

 /* TS 29.273 9.2.2.5.1 AA-Request (AAR) */
template (value) PDU_DIAMETER
ts_DIA_S6b_AAR(template (value) hexstring imsi,
	       template (value) MIPv6_NONE_MIP6_Feature_Vector mip6_feat_vec,
	       template (value) charstring apn,
	       template (value) octetstring sess_id := c_def_sess_id,
	       template (value) charstring orig_host := "pgw.localdomain",
	       template (value) charstring orig_realm := "localdomain",
	       template (value) charstring dest_realm := "localdomain",
	       template (value) UINT32 hbh_id := '00000000'O,
	       template (value) UINT32 ete_id := '00000000'O) :=
	ts_DIAMETER(flags := '11000000'B,
		    cmd_code := Authorize_Authenticate,
		    app_id := int2oct(c_DIAMETER_3GPP_S6b_AID, 4),
		    hbh_id := hbh_id,
		    ete_id := ete_id,
		    avps := {
			ts_AVP_SessionId(sess_id),
			/* Optional: DRMP, */
			ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_S6b_AID, 4)),
			ts_AVP_OriginHost(orig_host),
			ts_AVP_OriginRealm(orig_realm),
			ts_AVP_DestinationRealm(dest_realm),
			ts_AVP_AuthRequestType(AUTHORIZE_ONLY),
			ts_AVP_UserNameImsi(valueof(imsi)),
			ts_AVP_MIP6FeatureVector(mip6_feat_vec),
			ts_AVP_ServiceSelection(valueof(apn))
			/* TODO: Lots other optional */
	});

/* TS 29.273 9.2.2.2.2 AA-Answer (AAA) */
template (present) PDU_DIAMETER
tr_DIA_S6b_AAA(template (present) octetstring sess_id := ?,
	       template (present) charstring orig_host :=  ?,
	       template (present) charstring orig_realm := ?,
	       template (present) charstring dest_realm := ?,
	       template (present) UINT32 hbh_id := ?,
	       template (present) UINT32 ete_id := ?,
	       template (present) CxDx_3GPP_Server_Assignment_Type server_ass_type := ?,
	       template (present) charstring service_selection := ?) :=
	tr_DIAMETER(flags := '0???????'B,
		    cmd_code := Authorize_Authenticate,
		    app_id := int2oct(c_DIAMETER_3GPP_S6b_AID, 4),
		    hbh_id := hbh_id, ete_id := ete_id,
		    avps := superset(
			tr_AVP_SessionId(sess_id),
			/* Optional: DRMP, */
			tr_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_S6b_AID, 4)),
			tr_AVP_AuthRequestType(AUTHORIZE_ONLY),
			tr_AVP_ResultCode(DIAMETER_SUCCESS),
			tr_AVP_OriginHost(orig_host),
			tr_AVP_OriginRealm(orig_realm)
	));

 /* TS 29.273 9.2.2.3.1 Session-Termination-Request (STR) Command,
  * Table 9.1.2.3.1/1: S6b Session Termination Request (STR), based on RFC 6733 8.4.1 */
template (value) PDU_DIAMETER
ts_DIA_S6b_STR(template (value) hexstring imsi,
	       template (value) BASE_NONE_Termination_Cause term_cause := DIAMETER_LOGOUT,
	       template (value) octetstring sess_id := c_def_sess_id,
	       template (value) charstring orig_host := "pgw.localdomain",
	       template (value) charstring orig_realm := "localdomain",
	       template (value) charstring dest_realm := "localdomain",
	       template (value) UINT32 hbh_id := '00000000'O,
	       template (value) UINT32 ete_id := '00000000'O) :=
	ts_DIAMETER(flags := '11000000'B,
		    cmd_code := Session_Termination,
		    app_id := int2oct(c_DIAMETER_3GPP_S6b_AID, 4),
		    hbh_id := hbh_id,
		    ete_id := ete_id,
		    avps := {
			ts_AVP_SessionId(sess_id),
			/* Optional: DRMP */
			ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_S6b_AID, 4)),
			ts_AVP_OriginHost(orig_host),
			ts_AVP_OriginRealm(orig_realm),
			ts_AVP_DestinationRealm(dest_realm),
			ts_AVP_TerminationCause(term_cause),
			ts_AVP_UserNameImsi(valueof(imsi))
			/* Optional: OC-Supported-Features */
	});

/* TS 29.273 9.2.2.3.2 Session-Termination-Answer (STA) Command,
 * Table 9.1.2.3.1/2: S6b Session Termination Answer (STA), based on RFC 6733 8.4.2 */
template (present) PDU_DIAMETER
tr_DIA_S6b_STA(template (present) DIAMETER_Resultcode res_code := ?,
	       template (present) octetstring sess_id := ?,
	       template (present) charstring orig_host :=  ?,
	       template (present) charstring orig_realm := ?,
	       template (present) charstring dest_realm := ?,
	       template (present) UINT32 hbh_id := ?,
	       template (present) UINT32 ete_id := ?) :=
	tr_DIAMETER(flags := '0???????'B,
		    cmd_code := Session_Termination,
		    app_id := int2oct(c_DIAMETER_3GPP_S6b_AID, 4),
		    hbh_id := hbh_id, ete_id := ete_id,
		    avps := superset(
			tr_AVP_SessionId(sess_id),
			/* Optional: DRMP */
			tr_AVP_ResultCode(res_code),
			tr_AVP_OriginHost(orig_host),
			tr_AVP_OriginRealm(orig_realm)
			/* Lots other Optional */
	));

}
