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) charstring username_nai,
	       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_UserName(char2oct(valueof(username_nai))),
			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 */
	));

}
