module NS_Types {
	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from BSSGP_Types all;

	/* TS 48.016 10.3.7 */
	type enumerated NsPduType {
		NS_PDUT_NS_UNITDATA	('00000000'B),
		NS_PDUT_NS_RESET	('00000010'B),
		NS_PDUT_NS_RESET_ACK	('00000011'B),
		NS_PDUT_NS_BLOCK	('00000100'B),
		NS_PDUT_NS_BLOCK_ACK	('00000101'B),
		NS_PDUT_NS_UNBLOCK	('00000110'B),
		NS_PDUT_NS_UNBLOCK_ACK	('00000111'B),
		NS_PDUT_NS_STATUS	('00001000'B),
		NS_PDUT_NS_ALIVE	('00001010'B),
		NS_PDUT_NS_ALIVE_ACK	('00001011'B)
		/* FIXME: SNS */
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3 */
	type enumerated NsIEI {
		NS_IEI_CAUSE		('00000000'B),
		NS_IEI_NSVCI		('00000001'B),
		NS_IEI_NS_PDU		('00000010'B),
		NS_IEI_BVCI		('00000011'B),
		NS_IEI_NSEI		('00000100'B),
		NS_IEI_LIST_IPv4	('00000101'B),
		NS_IEI_LIST_IPv6	('00000110'B),
		NS_IEI_MAX_NUM_NSVC	('00000111'B),
		NS_IEI_NUM_IPv4_EP	('00001000'B),
		NS_IEI_NUM_IPv6_EP	('00001001'B),
		NS_IEI_RESET_FLAG	('00001010'B),
		NS_IEI_IP_ADDRESS	('00001011'B)
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3.2 */
	type enumerated NsCause {
		NS_CAUSE_TRANSIT_NETWORK_FAILURE		('00000000'B),
		NS_CAUSE_OM_INTERVENTION			('00000001'B),
		NS_CAUSE_EQUIPMENT_FAILURE			('00000010'B),
		NS_CAUSE_NSVC_BLOCKED				('00000011'B),
		NS_CAUSE_NSVC_UNKNOWN				('00000100'B),
		NS_CAUSE_BVCI_UNKNOWN_AT_NSE			('00000101'B),
		NS_CAUSE_SEMANTICALLY_INCORRECT_PDU		('00001000'B),
		NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE	('00001010'B),
		NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED		('00001011'B),
		NS_CAUSE_INVALID_ESSENTIAL_IE			('00001100'B),
		NS_CAUSE_MISSING_ESSENTIAL_IE			('00001101'B),
		NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS		('00001110'B),
		NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS		('00001111'B),
		NS_CAUSE_INVALID_NR_OF_NSVCS			('00010000'B),
		NS_CAUSE_INVALID_WEIGHTS			('00010001'B),
		NS_CAUSE_UNKNOWN_IP_ENDPOINT			('00010010'B),
		NS_CAUSE_UNKNOWN_IP_ADDRESS			('00010011'B),
		NS_CAUSE_IP_TEST_FAILEDA			('00010100'B)
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3.9 */
	type record NsSduControlBits {
		BIT6	spare,
		boolean c,
		boolean r
	} with { variant (c) "FIELDLENGTH(1)"
		 variant (r) "FIELDLENGTH(1)"
	};

	type uint16_t Nsvci;
	type uint16_t Nsei;

	type union NsIeUnion {
		BssgpBvci		bvci,		/* 10.3.1 */
		NsCause			cause,		/* 10.3.2 */
		uint16_t		max_num_nsvc,	/* 10.3.2e */
		uint16_t		num_ipv4_ep,	/* 10.3.2f */
		uint16_t		num_ipv6_ep,	/* 10.3.2g */
		Nsvci			nsvci,		/* 10.3.5 */
		Nsei			nsei,		/* 10.3.6 */
		octetstring 		other
	};

	type record NsTLV {
		NsIEI		iei,
		uint16_t	len,
		NsIeUnion	u
	} with {
		variant (u) "CROSSTAG(
				bvci, 			iei = NS_IEI_BVCI;
				cause,			iei = NS_IEI_CAUSE;
				max_num_nsvc,		iei = NS_IEI_MAX_NUM_NSVC;
				num_ipv4_ep,		iei = NS_IEI_NUM_IPv4_EP;
				num_ipv6_ep,		iei = NS_IEI_NUM_IPv6_EP;
				nsvci,			iei = NS_IEI_NSVCI;
				nsei,			iei = NS_IEI_NSEI;
				other,			OTHERWISE)"
		variant (len) "LENGTHTO(u)"
	};

	type record of NsTLV NsTLVs;

	type record NsPduUnitdata {
		NsSduControlBits	control_bits,
		BssgpBvci		bvci,
		octetstring		sdu
	} with { variant "" };

	type record NsPduOther {
		NsTLVs		tlvs optional
	} with { variant "" };

	type union NsPduUnion {
		NsPduUnitdata	unitdata,
		NsPduOther	other
	} with { variant "" };

	type record NsPdu {
		NsPduType	pdu_type,
		NsPduUnion	u
	} with { variant (u) "CROSSTAG(
				unitdata,		pdu_type = NS_PDUT_NS_UNITDATA;
				other,			OTHERWISE)"
	};

	external function enc_NsPdu(in NsPdu pdu) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_NsPdu(in octetstring stream) return NsPdu
		with { extension "prototype(convert) decode(RAW)" };

} with { encode "RAW" };
