gprs_gb: Add NS CodecPort + Emulation; Add NS selftests
diff --git a/gprs_gb/BSSGP_Helper.cc b/gprs_gb/BSSGP_Helper.cc
index 4665dcd..376cade 100644
--- a/gprs_gb/BSSGP_Helper.cc
+++ b/gprs_gb/BSSGP_Helper.cc
@@ -169,6 +169,8 @@
return prefix + compact_tlv_part(tlv_part_in);
}
+#define NS_PDUT_NS_UNITDATA 0x00
+
/* expand all the variable-length "length" fields of a NS message (Osmocom TvLV) into statlc TL16V format */
OCTETSTRING f__NS__expand__len(OCTETSTRING const &in)
{
@@ -177,6 +179,9 @@
uint8_t pdu_type = in_ptr[0];
uint8_t static_hdr_len = 1;
+ if (pdu_type == NS_PDUT_NS_UNITDATA)
+ return in;
+
if (in_len < static_hdr_len)
TTCN_error("NS message is shorter (%u bytes) than minimum header length (%u bytes) for msg_type 0x%02x",
in_len, static_hdr_len, pdu_type);
@@ -195,6 +200,9 @@
uint8_t pdu_type = in_ptr[0];
uint8_t static_hdr_len = 1;
+ if (pdu_type == NS_PDUT_NS_UNITDATA)
+ return in;
+
if (in_len < static_hdr_len)
TTCN_error("NS message is shorter (%u bytes) than minimum header length (%u bytes) for msg_type 0x%02x",
in_len, static_hdr_len, pdu_type);
diff --git a/gprs_gb/NS_CodecPort.ttcn b/gprs_gb/NS_CodecPort.ttcn
new file mode 100644
index 0000000..735a91f
--- /dev/null
+++ b/gprs_gb/NS_CodecPort.ttcn
@@ -0,0 +1,55 @@
+module NS_CodecPort {
+
+ import from IPL4asp_PortType all;
+ import from IPL4asp_Types all;
+ import from BSSGP_Helper_Functions all;
+ import from NS_Types all;
+
+ type record NS_RecvFrom {
+ ConnectionId connId,
+ HostName remName,
+ PortNumber remPort,
+ HostName locName,
+ PortNumber locPort,
+ NsPdu msg
+ }
+
+ template NS_RecvFrom t_NS_RecvFrom(template NsPdu pdu) := {
+ connId := ?,
+ remName := ?,
+ remPort := ?,
+ locName := ?,
+ locPort := ?,
+ msg := pdu
+ };
+
+ type record NS_Send {
+ ConnectionId connId,
+ NsPdu msg
+ }
+
+ private function IPL4_to_NS_RecvFrom(in ASP_RecvFrom pin, out NS_RecvFrom pout) {
+ pout.connId := pin.connId;
+ pout.remName := pin.remName;
+ pout.remPort := pin.remPort;
+ pout.locName := pin.locName;
+ pout.locPort := pin.locPort;
+ pout.msg := dec_NsPdu(f_NS_expand_len(pin.msg));
+ } with { extension "prototype(fast)" };
+
+ private function NS_to_IPL4_Send(in NS_Send pin, out ASP_SendTo pout) {
+ pout.connId := pin.connId;
+ pout.proto := { udp := {} };
+ pout.msg := f_NS_compact_len(enc_NsPdu(pin.msg));
+ } with { extension "prototype(fast)" };
+
+ type port NS_CODEC_PT message {
+ out NS_Send;
+ in NS_RecvFrom,
+ ASP_Event;
+ } with { extension "user IPL4asp_PT
+ out(NS_Send -> ASP_SendTo: function(NS_to_IPL4_Send))
+ in(ASP_RecvFrom -> NS_RecvFrom: function(IPL4_to_NS_RecvFrom);
+ ASP_Event -> ASP_Event: simple)"
+ }
+}
diff --git a/gprs_gb/NS_CodecPort_CtrlFunct.ttcn b/gprs_gb/NS_CodecPort_CtrlFunct.ttcn
new file mode 100644
index 0000000..cc77dda
--- /dev/null
+++ b/gprs_gb/NS_CodecPort_CtrlFunct.ttcn
@@ -0,0 +1,44 @@
+module NS_CodecPort_CtrlFunct {
+
+ import from NS_CodecPort all;
+ import from IPL4asp_Types all;
+
+ external function f_IPL4_listen(
+ inout NS_CODEC_PT portRef,
+ in HostName locName,
+ in PortNumber locPort,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_connect(
+ inout NS_CODEC_PT portRef,
+ in HostName remName,
+ in PortNumber remPort,
+ in HostName locName,
+ in PortNumber locPort,
+ in ConnectionId connId,
+ in ProtoTuple proto,
+ in OptionList options := {}
+ ) return Result;
+
+ external function f_IPL4_close(
+ inout NS_CODEC_PT portRef,
+ in ConnectionId id,
+ in ProtoTuple proto := { unspecified := {} }
+ ) return Result;
+
+ external function f_IPL4_setUserData(
+ inout NS_CODEC_PT portRef,
+ in ConnectionId id,
+ in UserData userData
+ ) return Result;
+
+ external function f_IPL4_getUserData(
+ inout NS_CODEC_PT portRef,
+ in ConnectionId id,
+ out UserData userData
+ ) return Result;
+
+}
+
diff --git a/gprs_gb/NS_CodecPort_CtrlFunctDef.cc b/gprs_gb/NS_CodecPort_CtrlFunctDef.cc
new file mode 100644
index 0000000..a6da7ac
--- /dev/null
+++ b/gprs_gb/NS_CodecPort_CtrlFunctDef.cc
@@ -0,0 +1,56 @@
+#include "IPL4asp_PortType.hh"
+#include "NS_CodecPort.hh"
+#include "IPL4asp_PT.hh"
+
+namespace NS__CodecPort__CtrlFunct {
+
+ IPL4asp__Types::Result f__IPL4__listen(
+ NS__CodecPort::NS__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__connect(
+ NS__CodecPort::NS__CODEC__PT& portRef,
+ const IPL4asp__Types::HostName& remName,
+ const IPL4asp__Types::PortNumber& remPort,
+ const IPL4asp__Types::HostName& locName,
+ const IPL4asp__Types::PortNumber& locPort,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto,
+ const IPL4asp__Types::OptionList& options)
+ {
+ return f__IPL4__PROVIDER__connect(portRef, remName, remPort,
+ locName, locPort, connId, proto, options);
+ }
+
+ IPL4asp__Types::Result f__IPL4__close(
+ NS__CodecPort::NS__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::ProtoTuple& proto)
+ {
+ return f__IPL4__PROVIDER__close(portRef, connId, proto);
+ }
+
+ IPL4asp__Types::Result f__IPL4__setUserData(
+ NS__CodecPort::NS__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ const IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);
+ }
+
+ IPL4asp__Types::Result f__IPL4__getUserData(
+ NS__CodecPort::NS__CODEC__PT& portRef,
+ const IPL4asp__Types::ConnectionId& connId,
+ IPL4asp__Types::UserData& userData)
+ {
+ return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);
+ }
+
+}
+
diff --git a/gprs_gb/NS_Emulation.ttcn b/gprs_gb/NS_Emulation.ttcn
new file mode 100644
index 0000000..7abd7f9
--- /dev/null
+++ b/gprs_gb/NS_Emulation.ttcn
@@ -0,0 +1,157 @@
+module NS_Emulation {
+ import from NS_Types all;
+ import from BSSGP_Types all;
+ import from NS_CodecPort all;
+ import from NS_CodecPort_CtrlFunct all;
+ //import from IPL4asp_PortType all;
+ import from IPL4asp_Types all;
+
+ type record NsUnitdataRequest {
+ BssgpBvci bvci,
+ Nsei nsei,
+ octetstring sdu
+ }
+
+ type record NsUnitdataIndication {
+ BssgpBvci bvci,
+ Nsei nsei,
+ octetstring sdu
+ }
+
+ type enumerated NseState {
+ NSE_S_BLOCKED,
+ NSE_S_ALIVE,
+ NSE_S_RESET
+ };
+
+ /* port from our (internal) point of view */
+ type port NS_SP_PT message {
+ in NsUnitdataRequest;
+ out NsUnitdataIndication,
+ ASP_Event;
+ } with { extension "internal" };
+
+ /* port from the user point of view */
+ type port NS_PT message {
+ in ASP_Event,
+ NsUnitdataIndication;
+ out NsUnitdataRequest;
+ } with { extension "internal" };
+
+ function NSStart() runs on NS_CT {
+ f_init();
+ f_ScanEvents();
+ }
+
+ private function f_init() runs on NS_CT {
+ f_IPL4_connect(NSCP, remote_ip, remote_udp_port, local_ip, local_udp_port, 0, { udp := {}});
+ }
+
+ type component NS_CT {
+ /* UDP port towards the bottom (IUT) */
+ port NS_CODEC_PT NSCP;
+ /* NS-User SAP towards the user */
+ port NS_SP_PT NS_SP;
+
+ var NseState state;
+ var ConnectionId conn_id;
+ }
+
+ modulepar {
+ PortNumber local_udp_port := 23001;
+ charstring local_ip := "127.0.0.1";
+ PortNumber remote_udp_port := 23000;
+ charstring remote_ip := "127.0.0.1";
+ };
+
+ template NsTLV t_NS_IE_CAUSE(template NsCause cause) := {
+ iei := NS_IEI_CAUSE,
+ len := 1,
+ u := { cause := cause }
+ };
+
+ template NsTLV t_NS_IE_NSVCI(template Nsvci nsvci) := {
+ iei := NS_IEI_NSVCI,
+ len := 2,
+ u := { nsvci := nsvci }
+ }
+
+ template NsTLV t_NS_IE_NSEI(template Nsvci nsei) := {
+ iei := NS_IEI_NSEI,
+ len := 2,
+ u := { nsei := nsei }
+ }
+
+ template NsPdu t_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
+ pdu_type := NS_PDUT_NS_RESET,
+ u := {
+ other := {
+ tlvs := { t_NS_IE_CAUSE(cause), t_NS_IE_NSVCI(nsvci), t_NS_IE_NSEI(nsei) }
+ }
+ }
+ };
+
+ template NsPdu t_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
+ pdu_type := NS_PDUT_NS_RESET,
+ u := {
+ other := {
+ tlvs := { t_NS_IE_NSVCI(nsvci), t_NS_IE_NSEI(nsei) }
+ }
+ }
+ };
+
+ template NsPdu t_NS_SIMPLE(template NsPduType pdut) := { pdu_type := pdut, u := { other := { tlvs := {} } } };
+ template NsPdu t_NS_ALIVE := t_NS_SIMPLE(NS_PDUT_NS_ALIVE);
+ template NsPdu t_NS_ALIVE_ACK := t_NS_SIMPLE(NS_PDUT_NS_ALIVE_ACK);
+ template NsPdu t_NS_UNBLOCK := t_NS_SIMPLE(NS_PDUT_NS_UNBLOCK);
+ template NsPdu t_NS_UNBLOCK_ACK := t_NS_SIMPLE(NS_PDUT_NS_UNBLOCK_ACK);
+ template NsPdu t_NS_BLOCK := t_NS_SIMPLE(NS_PDUT_NS_BLOCK);
+ template NsPdu t_NS_BLOCK_ACK := t_NS_SIMPLE(NS_PDUT_NS_BLOCK_ACK);
+
+ template NS_Send t_NS_Send(template ConnectionId connId, template NsPdu msg) := {
+ connId := connId,
+ msg := msg
+ }
+
+ private function f_ScanEvents() runs on NS_CT {
+ var NsUnitdataRequest ud_req;
+ var NS_RecvFrom rf;
+ var ASP_Event evt;
+
+ while (true) {
+
+ if (state == NSE_S_BLOCKED) {
+ alt {
+ [] NSCP.receive(t_NS_RecvFrom(t_NS_BLOCK)) -> value rf {
+ NSCP.send(t_NS_Send(conn_id, t_NS_BLOCK_ACK));
+ }
+ [] NSCP.receive(t_NS_RecvFrom(t_NS_UNBLOCK)) -> value rf {
+ NSCP.send(t_NS_Send(conn_id, t_NS_UNBLOCK_ACK));
+ state := NSE_S_ALIVE;
+ }
+ [] NSCP.receive(ASP_Event:?) -> value evt { NS_SP.send(evt); }
+ }
+ } else if (state == NSE_S_ALIVE) {
+ alt {
+ [] NSCP.receive(t_NS_RecvFrom(t_NS_BLOCK)) -> value rf {
+ NSCP.send(t_NS_Send(conn_id, t_NS_BLOCK_ACK));
+ state := NSE_S_BLOCKED;
+ }
+ [] NSCP.receive(t_NS_RecvFrom(t_NS_UNBLOCK)) -> value rf {
+ NSCP.send(t_NS_Send(conn_id, t_NS_UNBLOCK_ACK));
+ }
+ [] NS_SP.receive(NsUnitdataRequest:?) -> value ud_req {
+ //NSCP.send(t_NS_Send(
+ }
+ [] NSCP.receive(ASP_Event:?) -> value evt { NS_SP.send(evt); }
+ }
+ } else if (state == NSE_S_RESET) {
+ alt {
+ [] NSCP.receive(ASP_Event:?) -> value evt { NS_SP.send(evt); }
+ }
+ }
+
+
+ }
+ }
+}
diff --git a/gprs_gb/NS_Types.ttcn b/gprs_gb/NS_Types.ttcn
index ee2444d..bd04a66 100644
--- a/gprs_gb/NS_Types.ttcn
+++ b/gprs_gb/NS_Types.ttcn
@@ -57,6 +57,15 @@
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;
@@ -90,11 +99,29 @@
type record of NsTLV NsTLVs;
- type record NsPdu {
- NsPduType pdu_type,
+ 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
diff --git a/gprs_gb/Test.ttcn b/gprs_gb/Test.ttcn
index 33d43bf..8939cad 100644
--- a/gprs_gb/Test.ttcn
+++ b/gprs_gb/Test.ttcn
@@ -2,15 +2,16 @@
import from BSSGP_Helper_Functions all;
import from BSSGP_Types all;
+ import from NS_Types all;
type component dummy_CT {
}
- function f_assert_prepr(in octetstring a, in octetstring b) {
- log ("Input: ", a);
- log ("Expected: ", b);
+ function f_bssgp_assert_prepr(in octetstring a, in octetstring b) {
+ log("BSSGP Input: ", a);
+ log("BSSGP Expected: ", b);
var octetstring a_preprocessed := f_BSSGP_expand_len(a);
- log ("Preprocessed: ", a_preprocessed);
+ log("BSSGP Preprocessed: ", a_preprocessed);
if (a_preprocessed != b) {
setverdict(fail);
@@ -19,15 +20,15 @@
}
}
- function f_dec_and_log(in octetstring inp) {
- log("Input: ", inp);
+ function f_bssgp_dec_and_log(in octetstring inp) {
+ log("BSSGP Input: ", inp);
var octetstring inp_p := f_BSSGP_expand_len(inp);
- log ("Preprocessed: ", inp_p);
+ log("BSSGP Preprocessed: ", inp_p);
var BssgpPdu dec := dec_BssgpPdu(inp_p);
- log("Decoded: ", dec);
+ log("BSSGP Decoded: ", dec);
}
- testcase TC_selftest() runs on dummy_CT {
+ testcase TC_selftest_bssgp() runs on dummy_CT {
const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;
const octetstring c_bvc_reset_q := '2204820000078100'O;
const octetstring c_status_pcu := '4107810515882204820000078103'O;
@@ -45,35 +46,75 @@
const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;
/* single byte length to two byte length */
- f_assert_prepr('04058101'O, '0405000101'O);
- f_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
+ f_bssgp_assert_prepr('04058101'O, '0405000101'O);
+ f_bssgp_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
/* two byte length to two byte length */
- f_assert_prepr('0405000101'O, '0405000101'O);
+ f_bssgp_assert_prepr('0405000101'O, '0405000101'O);
/* special case: DL-UD + UL-UD */
- f_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
- f_assert_prepr('01aabbccddeeffaa29822342'O, '01aabbccddeeffaa2900022342'O);
+ f_bssgp_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
+ f_bssgp_assert_prepr('01aabbccddeeffaa29822342'O, '01aabbccddeeffaa2900022342'O);
/* multiple TLVs */
- f_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
- f_assert_prepr('230080'O, '23000000'O);
+ f_bssgp_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
+ f_bssgp_assert_prepr('230080'O, '23000000'O);
- f_dec_and_log(c_bvc_reset_pcu);
- f_dec_and_log(c_bvc_reset_q);
- f_dec_and_log(c_status_pcu);
- f_dec_and_log(c_reset_ack_q);
- f_dec_and_log(c_reset_ack_pcu);
- f_dec_and_log(c_unblock_pcu);
- f_dec_and_log(c_unblock_ack_q);
- f_dec_and_log(c_fc_bvc_pcu);
- f_dec_and_log(c_fc_bvc_ack_q);
- f_dec_and_log(c_gmm_mo_att_req);
- f_dec_and_log(c_gmm_mt_ac_req);
- f_dec_and_log(c_gmm_mo_ac_resp);
- f_dec_and_log(c_gmm_mt_att_acc);
- f_dec_and_log(c_gmm_mt_det_req);
- f_dec_and_log(c_gmm_mo_att_cpl);
+ f_bssgp_dec_and_log(c_bvc_reset_pcu);
+ f_bssgp_dec_and_log(c_bvc_reset_q);
+ f_bssgp_dec_and_log(c_status_pcu);
+ f_bssgp_dec_and_log(c_reset_ack_q);
+ f_bssgp_dec_and_log(c_reset_ack_pcu);
+ f_bssgp_dec_and_log(c_unblock_pcu);
+ f_bssgp_dec_and_log(c_unblock_ack_q);
+ f_bssgp_dec_and_log(c_fc_bvc_pcu);
+ f_bssgp_dec_and_log(c_fc_bvc_ack_q);
+ f_bssgp_dec_and_log(c_gmm_mo_att_req);
+ f_bssgp_dec_and_log(c_gmm_mt_ac_req);
+ f_bssgp_dec_and_log(c_gmm_mo_ac_resp);
+ f_bssgp_dec_and_log(c_gmm_mt_att_acc);
+ f_bssgp_dec_and_log(c_gmm_mt_det_req);
+ f_bssgp_dec_and_log(c_gmm_mo_att_cpl);
+ }
+
+ function f_ns_assert_prepr(in octetstring a, in octetstring b) {
+ log("NS Input: ", a);
+ log("NS Expected: ", b);
+ var octetstring a_preprocessed := f_NS_expand_len(a);
+ log("NS Preprocessed: ", a_preprocessed);
+
+ if (a_preprocessed != b) {
+ setverdict(fail);
+ } else {
+ setverdict(pass);
+ }
+ }
+
+ function f_ns_dec_and_log(in octetstring inp) {
+ log("NS Input: ", inp);
+ var octetstring inp_p := f_NS_expand_len(inp);
+ log("NS Preprocessed: ", inp_p);
+ var NsPdu dec := dec_NsPdu(inp_p);
+ log("NS Decoded: ", dec);
+ }
+
+ testcase TC_selftest_ns() runs on dummy_CT {
+ const octetstring c_ns_reset_pcu := '000000c4271e813d'O;
+
+ /* single byte length to two byte length */
+ f_ns_assert_prepr('04058101'O, '0405000101'O);
+ f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
+ /* two byte length to two byte length */
+ f_ns_assert_prepr('0405000101'O, '0405000101'O);
+ /* special case: NS-UNITDATA */
+ f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
+ /* multiple TLVs */
+ f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
+ /* zero-length */
+ f_ns_assert_prepr('230080'O, '23000000'O);
+
+ f_ns_dec_and_log(c_ns_reset_pcu);
}
control {
- execute(TC_selftest());
+ execute(TC_selftest_bssgp());
+ execute(TC_selftest_ns());
}
};
diff --git a/gprs_gb/gen_links.sh b/gprs_gb/gen_links.sh
index e8aa176..c2e76dc 100755
--- a/gprs_gb/gen_links.sh
+++ b/gprs_gb/gen_links.sh
@@ -15,6 +15,18 @@
#FILES="UD_PT.cc UD_PT.hh UD_PortType.ttcn UD_Types.ttcn"
#gen_links $DIR $FILES
+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src
+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCConversion.hh TCCInterface.cc TCCInterface_ip.h"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src
+FILES="Socket_API_Definitions.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src
+FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttcn IPL4asp_Types.ttcn IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"
+gen_links $DIR $FILES
+
DIR=../library
diff --git a/gprs_gb/regen_makefile.sh b/gprs_gb/regen_makefile.sh
index 9a9abb8..984174a 100755
--- a/gprs_gb/regen_makefile.sh
+++ b/gprs_gb/regen_makefile.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-FILES="*.ttcn BSSGP_Helper.cc"
+FILES="*.ttcn BSSGP_Helper.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc"
ttcn3_makefilegen -f Test.ttcn $FILES
sed -i -e 's/# TTCN3_DIR = /TTCN3_DIR = \/usr/' Makefile