Initial commit
diff --git a/doc/NS_v7.3.0_CNL113578_FS.pdf b/doc/NS_v7.3.0_CNL113578_FS.pdf
new file mode 100644
index 0000000..0f5ea5f
--- /dev/null
+++ b/doc/NS_v7.3.0_CNL113578_FS.pdf
Binary files differ
diff --git a/doc/NS_v7.3.0_CNL113578_UG.pdf b/doc/NS_v7.3.0_CNL113578_UG.pdf
new file mode 100644
index 0000000..c818f1a
--- /dev/null
+++ b/doc/NS_v7.3.0_CNL113578_UG.pdf
Binary files differ
diff --git a/doc/NS_v7.3_PRI.pdf b/doc/NS_v7.3_PRI.pdf
new file mode 100644
index 0000000..ae5248d
--- /dev/null
+++ b/doc/NS_v7.3_PRI.pdf
Binary files differ
diff --git a/src/NS_Types.ttcn b/src/NS_Types.ttcn
new file mode 100644
index 0000000..4424e10
--- /dev/null
+++ b/src/NS_Types.ttcn
@@ -0,0 +1,464 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+// File: NS_Types.ttcn
+// Rev: R2A
+// Prodnr: CNL 113 578
+// Updated: 2008-01-22
+// Contact: http://ttcn.ericsson.se
+// Reference: 3GPP TS 48.016 7.3.0
+
+module NS_Types
+{ // beginning of module
+
+// This module contains the Base Station System (BSS) Serving GPRS Support
+// Node (SGSN) interface Network Sevice protocol
+// 48.016 v7.3.0 with attributes for RAW encoding/decoding.
+//
+
+// History:
+// ********
+
+import from General_Types all;
+
+external function enc_PDU_NS(in PDU_NS pdu) return octetstring
+with { extension "prototype(convert)"
+ extension "encode(RAW)"
+ }
+
+external function dec_PDU_NS(in octetstring stream) return PDU_NS
+with { extension "prototype(convert)"
+ extension "decode(RAW)"
+ }
+
+type record CauseNS
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+OCT1 cause
+} with {
+ variant (lengthIndicator) "LENGTHTO (cause)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record NS_VCI
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+OCT2 nS_VCI
+} with {
+ variant (lengthIndicator) "LENGTHTO (nS_VCI)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record NS_PDU
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+octetstring ns_PDU
+} with {
+ variant (lengthIndicator) "LENGTHTO (ns_PDU)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record BVCI_NS
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+OCT2 bVCI
+} with {
+ variant (lengthIndicator) "LENGTHTO (bVCI)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record ListofIP4Elements
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+IP4_Elements iP4_Elements
+} with {
+ variant (lengthIndicator) "LENGTHTO (iP4_Elements)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record IP4_Element
+{
+OCT4 ipAddress,
+OCT2 uDP_Port,
+OCT1 signallingWeight,
+OCT1 dataWeight
+}
+
+type record of IP4_Element IP4_Elements;
+
+type record ListofIP6Elements
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+IP6_Elements iP6_Elements
+} with {
+ variant (lengthIndicator) "LENGTHTO (iP6_Elements)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record IP6_Element
+{
+OCT16 ipAddress,
+OCT2 uDP_Port,
+OCT1 signallingWeight,
+OCT1 dataWeight
+}
+
+type record of IP6_Element IP6_Elements;
+
+type record IP_Address_NS
+{
+OCT1 iEI,
+OCT1 addressType,
+IPAddress ipAddress
+}with {
+ variant (ipAddress) "CROSSTAG
+ (
+ ip4Address, addressType = '01'O;
+ ip6Address, addressType = '02'O;
+ )"
+};
+
+type union IPAddress
+{
+OCT4 ip4Address,
+OCT16 ip6Address
+}
+
+type record EndFlag
+{
+BIT1 eBIT,
+BIT7 spare
+}
+
+type record ResetFlag
+{
+OCT1 iEI,
+BIT1 resetBIT,
+BIT7 spare
+}
+
+type record MaxNumberOfNSVCs
+{
+OCT1 iEI,
+OCT2 maxNumberOfNSVCs
+}
+
+type record NumberOfIP_Endpoints
+{
+OCT1 iEI,
+OCT2 numberOfIP_Endpoints
+}
+
+
+type record NSEI_NS
+{
+OCT1 iEI,
+BIT1 ext,
+LIN1_2 lengthIndicator,
+OCT2 nSEI
+} with {
+ variant (lengthIndicator) "LENGTHTO (nSEI)";
+ variant (lengthIndicator) "CROSSTAG( length1, ext = '1'B;
+ length2, ext = '0'B;)";
+ variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ }
+
+type record NS_SDU_ControlBits
+{
+BIT1 rBit,
+BIT1 cBit,
+BIT6 spare
+}
+
+//same type def as LIN2_2a in BSSGP but named differently
+type union LIN1_2
+{
+integer length1,
+integer length2
+} with {
+ variant (length1) "FIELDLENGTH(7)";
+ variant (length2) "FIELDLENGTH(15)";
+ variant (length2) "BYTEORDER(last)";
+ variant (length1,length2) "FIELDORDER(msb)"
+ }
+
+
+// PDUs ************************************************************
+
+
+type record PDU_NS_Alive
+{
+OCT1 nsPduType
+}
+
+type record PDU_NS_Alive_Ack
+{
+OCT1 nsPduType
+}
+
+type record PDU_NS_Block
+{
+OCT1 nsPduType,
+CauseNS causeNS, //TLV
+NS_VCI nS_VCI //TLV
+}
+
+type record PDU_NS_Block_Ack
+{
+OCT1 nsPduType,
+NS_VCI nS_VCI //TLV
+}
+
+type record PDU_NS_Reset
+{
+OCT1 nsPduType,
+CauseNS causeNS, //TLV
+NS_VCI nS_VCI, //TLV
+NSEI_NS nSEI_NS //TLV
+}
+
+type record PDU_NS_Reset_Ack
+{
+OCT1 nsPduType,
+NS_VCI nS_VCI, //TLV
+NSEI_NS nSEI_NS //TLV
+}
+
+type record PDU_NS_Status
+{
+OCT1 nsPduType,
+CauseNS causeNS, //TLV
+NS_VCI nS_VCI optional, //TLV
+NS_PDU nS_PDU optional, //TLV
+BVCI_NS bVCI_NS optional, //TLV
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant "TAG (
+ nS_VCI, iEI = '01'O;
+ nS_PDU, iEI = '02'O;
+ bVCI_NS, iEI = '03'O;
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+type record PDU_NS_Unblock
+{
+OCT1 nsPduType
+}
+
+type record PDU_NS_Unblock_Ack
+{
+OCT1 nsPduType
+}
+
+type record PDU_NS_Unitdata
+{
+OCT1 nsPduType,
+NS_SDU_ControlBits nS_SDU_ControlBits, //V
+OCT2 bVCI, //V
+octetstring nS_SDU //V
+// decoder interprets all octets after the
+// first 4 octets as NS SDU
+}
+
+type record PDU_SNS_Ack
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+integer transactionID, //V
+CauseNS causeNS optional, //TLV
+IP_Address_NS iP_Address_NS optional, //TV
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant (transactionID) "FIELDLENGTH(8)";
+ variant "TAG (
+ causeNS, iEI = '00'O;
+ iP_Address_NS, iEI = '0B'O;
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+type record PDU_SNS_Add
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+integer transactionID, //V
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant (transactionID) "FIELDLENGTH(8)";
+ variant "TAG (
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+type record PDU_SNS_ChangeWeight
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+integer transactionID, //V
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant (transactionID) "FIELDLENGTH(8)";
+ variant "TAG (
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+type record PDU_SNS_Config
+{
+OCT1 nsPduType,
+EndFlag endFlag, //V
+NSEI_NS nSEI_NS, //TLV
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant "TAG (
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+
+
+type record PDU_SNS_Config_Ack
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+CauseNS causeNS optional //TLV
+} with {
+ variant "TAG (causeNS, iEI = '00'O;)"
+}
+
+
+
+type record PDU_SNS_Delete
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+integer transactionID, //V
+IP_Address_NS iP_Address_NS optional, //TV
+ListofIP4Elements listofIP4Elements optional, //TLV
+ListofIP6Elements listofIP6Elements optional //TLV
+} with {
+ variant (transactionID) "FIELDLENGTH(8)";
+ variant "TAG (
+ iP_Address_NS, iEI = '0B'O;
+ listofIP4Elements, iEI = '05'O;
+ listofIP6Elements, iEI = '06'O
+ )"
+}
+
+type record PDU_SNS_Size
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS, //TLV
+ResetFlag resetFlag, //TV
+MaxNumberOfNSVCs maxNumberOfNSVCs, //TV
+NumberOfIP_Endpoints numberOfIP4_Endpoints optional, //TV
+NumberOfIP_Endpoints numberOfIP6_Endpoints optional //TV
+} with {
+ variant "TAG (
+ numberOfIP4_Endpoints, iEI = '08'O;
+ numberOfIP6_Endpoints, iEI = '09'O;
+ )"
+}
+
+
+type record PDU_SNS_Size_Ack
+{
+OCT1 nsPduType,
+NSEI_NS nSEI_NS,
+CauseNS causeNS optional //TLV
+} with {
+ variant "TAG (causeNS, iEI = '00'O;)"
+}
+
+
+
+type union PDU_NS
+{
+
+PDU_NS_Alive pDU_NS_Alive,
+PDU_NS_Alive_Ack pDU_NS_Alive_Ack,
+PDU_NS_Block pDU_NS_Block,
+PDU_NS_Block_Ack pDU_NS_Block_Ack,
+PDU_NS_Reset pDU_NS_Reset,
+PDU_NS_Reset_Ack pDU_NS_Reset_Ack,
+PDU_NS_Status pDU_NS_Status,
+PDU_NS_Unblock pDU_NS_Unblock,
+PDU_NS_Unblock_Ack pDU_NS_Unblock_Ack,
+PDU_NS_Unitdata pDU_NS_Unitdata,
+PDU_SNS_Ack pDU_SNS_Ack,
+PDU_SNS_Add pDU_SNS_Add,
+PDU_SNS_ChangeWeight pDU_SNS_ChangeWeight,
+PDU_SNS_Config pDU_SNS_Config,
+PDU_SNS_Config_Ack pDU_SNS_Config_Ack,
+PDU_SNS_Delete pDU_SNS_Delete,
+PDU_SNS_Size pDU_SNS_Size,
+PDU_SNS_Size_Ack pDU_SNS_Size_Ack
+
+} with { variant "TAG (
+
+ pDU_NS_Alive, nsPduType ='0A'O;
+ pDU_NS_Alive_Ack, nsPduType ='0B'O;
+ pDU_NS_Block, nsPduType ='04'O;
+ pDU_NS_Block_Ack, nsPduType ='05'O;
+ pDU_NS_Reset, nsPduType ='02'O;
+ pDU_NS_Reset_Ack, nsPduType ='03'O;
+ pDU_NS_Status, nsPduType ='08'O;
+ pDU_NS_Unblock, nsPduType ='06'O;
+ pDU_NS_Unblock_Ack, nsPduType ='07'O;
+ pDU_NS_Unitdata, nsPduType ='00'O;
+ pDU_SNS_Ack, nsPduType ='0C'O;
+ pDU_SNS_Add, nsPduType ='0D'O;
+ pDU_SNS_ChangeWeight, nsPduType ='0E'O;
+ pDU_SNS_Config, nsPduType ='0F'O;
+ pDU_SNS_Config_Ack, nsPduType ='10'O;
+ pDU_SNS_Delete, nsPduType ='11'O;
+ pDU_SNS_Size, nsPduType ='12'O;
+ pDU_SNS_Size_Ack, nsPduType ='13'O
+
+ )"
+}
+
+
+}with{ encode "RAW"} // end of module