Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Titan » Default as Omit not working in TTCN 3 test cases(Compiling 3gpp lte TTCN-3 test cases)
icon4.gif  Default as Omit not working in TTCN 3 test cases [message #1714488] Fri, 13 November 2015 07:26 Go to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi,

I am trying to build 3gpp's TTCN-3 test cases using titan.
In these test cases, parameters having default values are passed as omit. This generates an error that "Omit values are not allowed in this context".
In Titan preferences --> Titan actions, there is a check box present "Default as omit". The problem is that this check is not working and I am getting the same error even with this check box checked.

Can you please help me in this regard?

PS: This error occurs at lots of place and its not possible to correct this manually.


Thanks,
Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1714575 is a reply to message #1714488] Fri, 13 November 2015 16:11 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,


you need to add a -d compiler flag in the Makefile


# Flags for the TTCN-3 and ASN.1 compiler:
COMPILER_FLAGS = -L  -d


(see compiler -h for other options)

In Eclipse, this probably should be set before generating the Makefile; I'll investigate though.

Best regards

Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1714583 is a reply to message #1714488] Fri, 13 November 2015 17:03 Go to previous messageGo to next message
Gyorgy Rethy is currently offline Gyorgy RethyFriend
Messages: 31
Registered: April 2015
Member
Hi Muhammad,

Actually, the -d compiler switch and the related Eclipse setting are related to ASN.1 SEQUENCE/SET fields with DEFAULT values. If the field is not present in the TTCN-3 value/tempate Titan can either insert the ASN.1 default value or "really" omit the field at encoding.

Titan supports both omit as formal parameters' default value and passing omit to formal parameters with default value. But, according to the standard, the formal parameter shall be at least of "template(omit)" kind.

Could you include a concrete example from the code you are having a trouble with?

BR, Gyorgy

[Updated on: Fri, 13 November 2015 17:21]

Report message to a moderator

Re: Default as Omit not working in TTCN 3 test cases [message #1714701 is a reply to message #1714583] Mon, 16 November 2015 06:34 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi,

Thanks for your quick help.
-d compiler switch is not working.
I am setting the -d compiler switch on project creation and also sets it in windows--> Preferences --> Titan Preferences --> Titan actions (Default as omit checked).
I have also checked that its present in make file from the time of its creation:
# Flags for the TTCN-3 and ASN.1 compiler:
COMPILER_FLAGS = -dlL


Here is an example from the 3gpp test cases:

"sttdIndicator" is passed as omit in following code:

template (value) RL_Setup_FDD_PhysicalChannelInfo_Type cs_SS_E_AGCH_Info_FDD :=
{ /* @status APPROVED */
e_AGCHInfo := {
r8 := {
e_AGCHInfo := cs_E_AGCH_Info_FDD_r8,
tti := f_Get_EDCH_TTI_Value(),
e_AGCH_PowerOffset := tsc_E_AGCH_PowerOffset,
e_RNTI_Primary := tsc_E_RNTI,
e_RNTI_Secondary := omit,
ss_DTX_Info := omit,
initialServingGrantValue := omit,
sttdIndicator := omit
}
}
};

This parameter is defined here and have a default value of false:

r8 SEQUENCE {
e-AGCHInfo E-AGCH-Information-r8,
tti E-DCH-TTI,
e-AGCH-PowerOffset INTEGER (0..255),
-- Range and Step are FFS (25.433, 9.2.2.13If)
-- Offset relative to P-CPICH
e-RNTI-Primary E-RNTI OPTIONAL,
e-RNTI-Secondary E-RNTI OPTIONAL,
ss-DTX-Info DRX-Info OPTIONAL,
initialServingGrantValue INTEGER (0..37) OPTIONAL,
sttdIndicator BOOLEAN DEFAULT FALSE -- @sic R5-120613 sic@
},

Text of error is "'omit' value is not allowed in this context"

Please help me in identifying the problem.

Thanks,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1714803 is a reply to message #1714701] Mon, 16 November 2015 19:46 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

would it be possible to upload the whole code?

Best regards

Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1714827 is a reply to message #1714803] Tue, 17 November 2015 05:52 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

I have attached the complete work space with project. I am using latest release of titan source code along with latest titan eclipse plugin. Latest eclipse luna for C++ is used. Please let me know if you need anything else.

Thanks,
Muhammad
Re: Default as Omit not working in TTCN 3 test cases [message #1714841 is a reply to message #1714827] Tue, 17 November 2015 08:04 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

I have made two compilations, one with

# Flags for the TTCN-3 and ASN.1 compiler:
COMPILER_FLAGS = -L -l -d  -M -w  (see comp1.txt) 


and one with

# Flags for the TTCN-3 and ASN.1 compiler:
COMPILER_FLAGS = -L -l -M -w   (without -d , see comp2.txt)


As you can see,

error: `omit' value is not allowed in this context


appears only in comp2.txt , so -d works as expected.
There are other errors that will have to be cleared one by one before you
can continue.


One more thing: you are working with radio protocols, and most of the time, due to scarcity of radio resources, these use PER-encoding; Titan does not have a native PER codec; for a workaround , pls. see the previous post

https://www.eclipse.org/forums/index.php/t/1070344/


Best regards

Elemer
  • Attachment: comp1.txt
    (Size: 106.01KB, Downloaded 330 times)
  • Attachment: comp2.txt
    (Size: 485.86KB, Downloaded 173 times)
Re: Default as Omit not working in TTCN 3 test cases [message #1715010 is a reply to message #1714841] Wed, 18 November 2015 13:14 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,
Thanks a lot for your help. I am now able to remove these omit errors.
Can you please elaborate that which changes are required for compiling these test cases using PER encoding. I would be very thankful to your for this act of kindness

Thanks,
Muhammad
Re: Default as Omit not working in TTCN 3 test cases [message #1715037 is a reply to message #1715010] Wed, 18 November 2015 17:01 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

Titan does not have a native PER-codec, so it has to rely on an external solution.

The workflow we use is as follows:
-for the sending (encoding ) direction:
1. first the structure (template, variable ) is encoded in BER and passed to the external 3rd party ASN.1 compiler
2. The external compiler decodes the BER and re-encodes it into PER
-for the receiving (decoding) direction:
1. the PER -coded message is received, decoded and re-encoded in BER
2.Titan decodes the BER into the corresponding structure


From the users' point of view , these two steps appear as one function call for encoding and one for decoding, so all this complexity is not visible.

The external ASN.1 compiler can be:
-the open source asn1c (https://lionet.info/asn1c/compiler.html) , which has the disadvantage that has limitations in processing the ASN.1 code
-a commercial compiler , such as OSS Nokalva's

So to find out if asn1c is an alternative for you , please try to compile your ASN.1 code with asn1c ; if this is successful, than you can use it to generate the PER-codecs;
if not , then you will have to buy and use a commercial alternative.

For details, please see the previous post:

https://www.eclipse.org/forums/index.php/t/1070344/

The example described there , and the attached code can be used for any of the above alternatives, with the appropriate modifications.


Best regards

Elemer





Re: Default as Omit not working in TTCN 3 test cases [message #1715231 is a reply to message #1715037] Fri, 20 November 2015 12:24 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks a lot for your kind help.

Best Regards,
Muhammad
Re: Default as Omit not working in TTCN 3 test cases [message #1715714 is a reply to message #1715231] Wed, 25 November 2015 12:22 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

I am able to remove most of the errors present in the project. I understand that titan supports only BER encoding and I have to implement PER externally.
I need your help to resolve following issues:
1- Unknown encoding types
Unknown encoding 'DHCPv4-Codec'
Unknown encoding 'DNS-Codec'
Unknown encoding 'DRB Types'
Unknown encoding 'ICMPv6-Codec'
Unknown encoding 'NAS Types'
Unknown encoding 'SMS Types'
Unknown encoding 'SIP-Codec'
Unknown encoding 'SDPCodec'

I was wondering if there is a way to import these codec types in titan? or I have to write them my self. Are there any coding rules for that? Please explain the process .

2- No coding rule specified for type '@module name'
Coding rules are missing in ASN as well as ttcn modules. How to specify the coding rule in asn files?
Re: Default as Omit not working in TTCN 3 test cases [message #1715721 is a reply to message #1715714] Wed, 25 November 2015 13:26 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,


let me start with #2:
For ASN.1 files, the simple answer is that you can't and you don't ; if you have a type TYPE1 declared in an ASN.1 file, to encode it , you need to declare an external function that does the encoding/decoding, be that BER (which is autogenerated) or PER (which has to be implemented externally).

Titan will ignore encoding instructions attached to modules, or will throw an error, so those will have to be commented out.

For TTCN files, it's different. TTCN code can have several types of encoding rules, RAW (binary) , TEXT (ascii) , and XER (XML). I think we can safely ignore XML here.
TTCN files can have a 'with { encoding "RAW"}' or 'with {encoding "TEXT "} ' final instruction , but, besides that, the code has to be decorated with detailed instructions of how the structures have to be encoded.

For RAW, please see the 4-part series about the binary RAW encoder of Titan in this forum; for TEXT , see the reference guide.

Now, about #1: your encoding instructions are not standard (as theses are not standardized) but are coming from a tool different from Titan; Titan will not acknowledge these ; instead they will have to be replaced with Titan's native codecs;
Many of the protocol modules listed here (DHCPv4, DNS, ICMPv6, SIP etc. ) appear as part of the Titan toolbox, see https://github.com/eclipse/titan.core, protocol modules.
Even if you don't use them directly, they might be a source of inspiration regarding how the RAW ( DHCP, ICMP) or TEXT (SIP) codecs have to be declared and defined.

In case you have these codecs from the other tool in say C++ code, they can be re-used as external functions, you are not locked in into Titan's native codecs.
However the encoding references are not valid and have to be changed to function references.

Please read through the indicated material , that should clarify the details.


Best regards

Elemer

















Re: Default as Omit not working in TTCN 3 test cases [message #1715778 is a reply to message #1715721] Thu, 26 November 2015 07:47 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi,

Thanks for your prompt response. I have gone thorough the materials you indicated.
I was wondering on how to use protocol modules present in titan toolbox(e.g. ICMPv6) ? as simple copying files from this package and pasting it in src folder and renaming the encoder "string" seems not to work.
Similarly importing this project into same workspace, results in failure. The error is
It was not possible to load the imported project file: 'file:/D:/Titan%20Setup/titan.ProtocolModules.ICMPv6-master/COMMON/ProtocolModules_Common.tpd'
imported by: 'file:/D:/Titan%20Setup/titan.ProtocolModules.ICMPv6-master/titan.ProtocolModules.ICMPv6-master/ICMPv6_CNL113631.tpd'


Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1715784 is a reply to message #1715778] Thu, 26 November 2015 08:57 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

I believe we should proceed carefully:
-the first thing you want to check is if the 'ready-made' Titan protocol module has the revision you need; typically the reference documentation is indicated in the document header
( for ICMPv6 is "RFC 4443 , RFC 4861" ), but the attached documentation will give you more detail

-if this is OK, you can add the src files to your project ; I would advise not to take any shortcuts in the beginning and simply copy the src file into your project then add them to the Makefile
( for ICMPv6 , this means two files, ICMPv6_Types.ttcn, and ICMPv6_EncDec.cc );

-now comes the tricky part : you have to identify in your code the places where ICMPv6 is used, possibly change or add import statement wherever necessary, to import the content from ICMPv6_Types.ttcn;
and also you have to identify places in the code where encoding/decoding is activated and insert references to the imported enc/dec functions f_enc_PDU_ICMPv6, f_dec_PDU_ICMPv6;
this (depending on the implementation) may appear implicitly in your code , or it may be part of the test port , so it may not be visible from the TTCN-3 code; if it's the latter, you may want to refer the codecs from your test port


I hope this makes it more clearer ; I know it's quite complicated, but please take a look on the projects I have published in this forum for more clarity


Best regards

Elemer









Re: Default as Omit not working in TTCN 3 test cases [message #1716011 is a reply to message #1715784] Mon, 30 November 2015 14:18 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for your very helpful response. While I was going through the examples you have point out (specifically DNS example, https://github.com/eclipse/titan.core). I have came across that it is very similar to mine ( with the exception of names). Here is the DNS_TypeDefs.ttcn
module DNS_TypeDefs {

  import from CommonDefs all;
  
  const B4_Type tsc_DNSOPCODE_QUERY  := '0000'B;
  const B4_Type tsc_DNSOPCODE_IQUERY := '0001'B;
  const B4_Type tsc_DNSOPCODE_STATUS := '0010'B;


  const B4_Type tsc_DNSRCODE_NoError        := '0000'B;
  const B4_Type tsc_DNSRCODE_FormatError    := '0001'B;
  const B4_Type tsc_DNSRCODE_ServerFailure  := '0010'B;
  const B4_Type tsc_DNSRCODE_NameError      := '0011'B;
  const B4_Type tsc_DNSRCODE_NotImplemented := '0100'B;
  const B4_Type tsc_DNSRCODE_Refused        := '0101'B;


  const O2_Type tsc_DNSTYPE_A     := '0001'O;
  const O2_Type tsc_DNSTYPE_NS    := '0002'O;
  const O2_Type tsc_DNSTYPE_MD    := '0003'O;
  const O2_Type tsc_DNSTYPE_MF    := '0004'O;
  const O2_Type tsc_DNSTYPE_CNAME := '0005'O;
  const O2_Type tsc_DNSTYPE_SOA   := '0006'O;
  const O2_Type tsc_DNSTYPE_MB    := '0007'O;
  const O2_Type tsc_DNSTYPE_MG    := '0008'O;
  const O2_Type tsc_DNSTYPE_MR    := '0009'O;
  const O2_Type tsc_DNSTYPE_NULL  := '000A'O;
  const O2_Type tsc_DNSTYPE_WKS   := '000B'O;
  const O2_Type tsc_DNSTYPE_PTR   := '000C'O;
  const O2_Type tsc_DNSTYPE_HINFO := '000D'O;
  const O2_Type tsc_DNSTYPE_MINFO := '000E'O;
  const O2_Type tsc_DNSTYPE_MX    := '000F'O;
  const O2_Type tsc_DNSTYPE_TXT   := '0010'O;
                                   
  const O2_Type tsc_DNSTYPE_AAAA  := '001C'O;      // IPv6 address, RFC 3596
  const O2_Type tsc_DNSTYPE_SRV   := '0021'O;      // Server selection, RFC 2782
  const O2_Type tsc_DNSTYPE_NAPTR := '0023'O;       // Naming Authority Pointer, RFC 3403
  
  const O2_Type tsc_DNSTYPE_AXFR  := '00FC'O;      // RFC 1035 RFC 3.2.3
  const O2_Type tsc_DNSTYPE_MAILB := '00FD'O;
  const O2_Type tsc_DNSTYPE_MAILA := '00FE'O;
  const O2_Type tsc_DNSTYPE_ALL   := '00FF'O;
  
  const O2_Type tsc_DNSCLASS_IN   := '0001'O;

  type record DNSMessage { // RFC 1035 clause 4
    DNS_Header dnsHeader,
    DNS_Questions questions optional,
    DNS_RRs answer optional,
    DNS_RRs authority optional,
    DNS_RRs additional optional
  };
  
  type record DNS_Header {      // RFC 1035 clause 4.1.1
    O2_Type id,
    B1_Type qr,                 // 0 message is a query, 1 message is a response
    B4_Type opcode,             // 0 QUERY, 1 IQUERY, 2 STATUS, 3-15 reserved
    B1_Type aa,                 // Authoritative Answer
    B1_Type tc,                 // Truncation
    B1_Type rd,                 // Recursion desired
    B1_Type ra,                 // Recursion available
    B3_Type z,                  // reserved, must be 0 in all queries and responses
    B4_Type rcode,              // Response code
    UInt16_Type qdcount,        // number of entries in the question section
    UInt16_Type ancount,        // number of RRs in the answer section
    UInt16_Type nscount,        // number of RRs in the auth. records section
    UInt16_Type arcount         // number of RRs in the additional records section
  };

  type record of DNS_Question DNS_Questions;
  
  type record DNS_Question {    // RFC 1035 clause 4.1.2
    octetstring qname,
    O2_Type qtype,
    O2_Type qclass
  };

  type record of DNS_RR DNS_RRs;
  
  type record DNS_RR {          // RFC 1035 clause 4.1.3
    octetstring name,
    O2_Type     rrtype,
    O2_Type     class,
    UInt32_Type ttl,
    UInt16_Type rdlength,
    DNS_RDATAu  rdata   // union of different types
  };


  type union DNS_RDATAu {
    DNS_A_RR            a,      // RFC 1035 clause 3.4.1, A 32 bit Internet Address
/*     DNS_PTR_RR          ptr,    // RFC 1035 clause 3.3.12 */
/*     DNS_NAPTR_RR        naptr,  // RFC 3403 clause 4.1 */
    DNS_AAAA_RR         aaaa    // RFC 3596
/*     DNS_SRV_RR          srv     // RFC 2782 */
  };

/*   type record DNS_PTR_RR {      //  RFC 1035 clause 3.3.12 */
/*     charstring  ptrdname */
/*   }; */
  
/*   type record DNS_NAPTR_RR {    //  RFC 3403 clause 4.1 */
/*     UInt16_Type         order, */
/*     UInt16_Type         preference, */
/*     charstring          flags optional, */
/*     charstring          services optional, */
/*     charstring          dnrr_regexp optional, */
/*     charstring          replacement optional */
/*   }; */

  type record DNS_AAAA_RR {     //  RFC 3596 clause 2.2
    O16_Type            ipv6addr
  };

  type record DNS_A_RR {        // RFC 1035 clause 3.4.1, A 32 bit Internet Address
    O4_Type             ipv4addr
  };

/*   type record DNS_SRV_RR {      // RFC 2782 (but where exactly is the format specification?) */
/*     UInt16_Type         priority, */
/*     UInt16_Type         weight, */
/*     UInt16_Type         srvport, */
/*     charstring          target */
/*   }; */

} with {encode "DNS-Codec"}

I was having following error in line 57 (type record DNSMessage)
Unknown encoding 'DNS-Codec'


Since this field (with {encode "DNS-Codec"}) is optional and not present in DNS example, so I removed it.

Now I am having following error in line 57 (type record DNSMessage)

No coding rule specified for type '@DNS_TypeDefs.DNSMessage'


All of the parameters in this file are properly defined similar to your example. I am including some of the types as an example, define in CommonDefs.ttcn
  type bitstring                B1_Type        length(1);
  type bitstring                B2_Type        length(2);
  type bitstring                B3_Type        length(3);
  type bitstring                B4_Type        length(4);
type B128_Type                B128_Key_Type;      /* 128 bit security key */
  type B256_Type                B256_Key_Type;      /* 256 bit security key */

  type octetstring              O1_Type         length(1);
  type octetstring              O2_Type         length(2);
  type octetstring              O3_Type         length(3);
  type octetstring              O4_Type         length(4);
  type octetstring              O5_Type         length(5);
  type octetstring              O16_Type        length(16);
  type integer  UInt_Type    (0 .. infinity);
  type integer  UInt8_Type   (0 .. tsc_UInt8Max);
  type integer  UInt16_Type  (0 .. tsc_UInt16Max);


Regarding encoding decoding DNS message, both of them are defined in other modules copied below.
  function f_DomainName_Encode(charstring p_DomainName) return octetstring
  {
    var CharStringList_Type v_LabelList := f_StringSplit(p_DomainName, {"."});
    return f_DomainName_EncodeLabels(v_LabelList);
  }

  function fl_DomainName_Decode(octetstring p_OctetString) return charstring
  {
    var CharStringList_Type v_LableList := {}
    var integer i := 0;
    var integer k := 0;
    var integer v_StringLength := lengthof(p_OctetString);
    var integer v_LableLength;
    var octetstring v_EncodedLable;

    while (true) {
      v_LableLength := oct2int(p_OctetString[i]);
      i := i + 1;
      if ((v_LableLength > 0) and (i + v_LableLength < v_StringLength)) {
        v_EncodedLable := substr(p_OctetString, i, v_LableLength);
        i := i + v_LableLength;
        v_LableList[k] := oct2char(v_EncodedLable);
        k := k + 1;
      } else {
        break;
      }
    }
    return f_StringJoin(v_LableList, ".");
  }


Can you please point out what I am missing here? since all the definitions are there, similar to DNS example. The only difference is that some fields are declared as bit fields in my code while as int16 or so in example, which must be ok as this encoding/decoding is not standard.

Your help in this regard would be highly appreciated.

Thanks and Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716017 is a reply to message #1716011] Mon, 30 November 2015 15:36 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

this is a good example as I'm not sure I have elaborated this option before:

-The DNS protocol module in github does not use any of Titan's native codecs (RAW or TEXT or otherwise) but a custom handwritten codec.
This is always possible, one can simply exchange internal codecs to custom ones by simply writing the corresponding external functions.


The top-level PDU (protocol data unit) is PDU_DNS:

  type record PDU_DNS {
    DnsHeader             header,
    QResourceRecords      queries,
    ResourceRecords       answers,
    ResourceRecords       nameServerRecords,
    ResourceRecords       additionalRecords
  }


(In your example , this is called DNSMessage:


type record DNSMessage { // RFC 1035 clause 4
    DNS_Header dnsHeader,
    DNS_Questions questions optional,
    DNS_RRs answer optional,
    DNS_RRs authority optional,
    DNS_RRs additional optional
  };
  




)



the corresponding codec functions are declared as external functions:

external function enc_PDU_DNS( 
  in PDU_DNS msg,
  in boolean doCompression,
  in boolean autoLengthCalc) return octetstring;

external function dec_PDU_DNS( in octetstring stream ) return PDU_DNS;




and they terminate in DNS_EncDec.cc:

PDU__DNS dec__PDU__DNS(const OCTETSTRING& stream)
{
  int stream_length = stream.lengthof(), i;
  const unsigned char *p_stream = stream;
  const unsigned char *stream_start = p_stream;
  PDU__DNS msg;

:
:
}



OCTETSTRING enc__PDU__DNS(const PDU__DNS& msg,
                          const BOOLEAN& doCompression,
                          const BOOLEAN& autoLengthCalc)
{
  TTCN_Buffer stream;
  unsigned char *p_stream = NULL;
  int i;

:
:
}



the first one takes as input an octetstring and returns a PDU_DNS structure (decoding);
the second one takes as input a structure, and returns an octetstring
(there are additional fucntions for conecrting/encoding domain name etc., but these two are the main ones)



In your example I don't see the corresponding codec functions that would accept DNSMessage as input and return octetstring (encoding) and the opposite, accepts octetstring and returns DNSMessage(decoding) ;

and this is the exact meaning of the message:

No coding rule specified for type '@DNS_TypeDefs.DNSMessage'


Your TTCN-3 implementation probably hides encoding/decoding somewhere , maybe in the test port , and the encoding/decoding is triggered
by the with {encode "DNS-Codec"} extension; this indicates to the TTCN-3 implementation how these messages are to be encoded, but the exact details are not visible from the TTCN-3 code.


What you need to do is to write these functions in analogy with the example in github



P.S. It is not common for us to use custom functions, usually we rely on the RAW codec , as in ICMPv6 for instance(https://github.com/eclipse/titan.ProtocolModules.ICMPv6).


I hope this brings some clarity

Best regards

Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1716019 is a reply to message #1716017] Mon, 30 November 2015 15:42 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

one more thing: If I remember correctly, the reason we did not use RAW, but a custom codec is that DNS is one of our oldest protocol modules, and we did not have RAW in place at that time;

but RAW can be used equally well.


Best regards

Elemer

Re: Default as Omit not working in TTCN 3 test cases [message #1716077 is a reply to message #1716019] Tue, 01 December 2015 06:04 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for your kind help. I have tried to define the external function in ttcn and edit the .cc file to match the declarations. But the error remains the same. Please see the attached files.

Thanks,
Uzair

[Updated on: Tue, 01 December 2015 08:03]

Report message to a moderator

Re: Default as Omit not working in TTCN 3 test cases [message #1716078 is a reply to message #1716077] Tue, 01 December 2015 06:12 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Another thing is that the following function is doing encoding by creating an instance of DNS message and encoding its value, wouldn't that work?:
function f_DNS_GetEncodedResponse(octetstring p_Request,
                                    PDN_Index_Type p_PdnIndex) return octetstring
  {
    var DNS_AddressResolutionTable_Type v_DNS_AddressResolutionTable := f_DNS_AddressResolutionTable(p_PdnIndex);
    var bitstring v_Bitstring := oct2bit(p_Request);
    var octetstring v_Response := ''O;
    var DNSMessage v_DNSQuery;
    var DNS_Question v_DNS_Question;
    var template (value) DNSMessage v_DNS_Response;
    var template (value) DNS_RRs v_DNS_RRs := {}

    if (decvalue(v_Bitstring, v_DNSQuery) != 0) {
      f_ErrorLog(__FILE__, __LINE__, "Cannot decode DNS query (skipped)");
      return v_Response;
    }
    if (not match(v_DNSQuery, cr_DNS_Query)) {
      f_ErrorLog(__FILE__, __LINE__, "Invalid/unexpected DNS query");
      return v_Response;
    }
    if (v_DNSQuery.dnsHeader.qdcount > 1) {
      f_ErrorLog(__FILE__, __LINE__, "multiple DNS questions not supported yet in the same query");
      return v_Response;
    }
    v_DNS_Question := v_DNSQuery.questions[0];
    if (not match(v_DNS_Question, cr_DNS_Question)) {
      f_ErrorLog(__FILE__, __LINE__, "Invalid/unexpected DNS question");
      return v_Response;
    }

    v_DNS_RRs := fl_DNS_Answer(v_DNS_Question, v_DNS_AddressResolutionTable);
    if (lengthof(v_DNS_RRs) > 0) {
      v_DNS_Response := cs_DNS_Reponse(v_DNSQuery, v_DNS_RRs);
      v_Response := bit2oct(encvalue(v_DNS_Response));
    }
    return v_Response;
  }


Thanks,
Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716094 is a reply to message #1716078] Tue, 01 December 2015 09:40 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,


you need to adapt the code with respect to your declarations;

for instance:



module DNS_TypeDefs {


  external function enc_PDU_DNS( 
  in DNSMessage msg,
  in boolean doCompression,
  in boolean autoLengthCalc) return octetstring;

  external function dec_PDU_DNS( in octetstring stream ) return DNSMessage;
  
  import from CommonDefs all;
  

  
  const B4_Type tsc_DNSOPCODE_QUERY  := '0000'B;
  const B4_Type tsc_DNSOPCODE_IQUERY := '0001'B;
  const B4_Type tsc_DNSOPCODE_STATUS := '0010'B;
:
:
etc.


is OK, although enc_DNSMessage , dec_DNSMessage would be more appropriate names for the functions.


In DNS_EncDec.cc


#include "DNS_Type.hh"

has to be changed to:

#include "DNS_TypeDefs.hh" as it has to connect to DNS_TypeDefs

With this change, if I compile , I get :


make                                                                
make: Warning: File `DNS_TypeDefs.ttcn' has modification time 1.8e+03 s in the future                                          
/proj/TTCN/Releases/TTCNv3_daily_LMWP3.1/bin/compiler -L  \                                                                    
        CommonDefs.ttcn DNS_TypeDefs.ttcn  - DNS_TypeDefs.ttcn                                                                 
Notify: Parsing TTCN-3 module `CommonDefs.ttcn'...                                                                             
Notify: Parsing TTCN-3 module `DNS_TypeDefs.ttcn'...                                                                           
Notify: Checking modules...                                                                                                    
Notify: Generating code...                                                                                                     
Notify: None of the files needed update.                                                                                       
touch compile                                                                                                                  
g++  -c -DLINUX -I/proj/TTCN/Releases/TTCNv3_daily_LMWP3.1/include -Wall   -o DNS_EncDec.o DNS_EncDec.cc                       
DNS_EncDec.cc:83: error: 'ResourceRecord' has not been declared                                                                
DNS_EncDec.cc:120: error: expected ',' or '...' before '&' token                                                               
DNS_EncDec.cc:121: error: ISO C++ forbids declaration of 'ResourceRecord' with no type                                         
DNS_EncDec.cc: In function 'DNS__TypeDefs::DNSMessage DNS__TypeDefs::dec__PDU__DNS(const OCTETSTRING&)':                       
DNS_EncDec.cc:145: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'header'                                       
DNS_EncDec.cc:155: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'queries'                                      
DNS_EncDec.cc:156: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'answers'                                      
DNS_EncDec.cc:157: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'nameServerRecords'                            
DNS_EncDec.cc:158: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'additionalRecords'                            
DNS_EncDec.cc:161: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'header'                                       
DNS_EncDec.cc:162: error: 'QResourceRecord' was not declared in this scope                                                     
DNS_EncDec.cc:162: error: expected `;' before 'rec'                                                                            
DNS_EncDec.cc:164: error: 'rec' was not declared in this scope                                                                 
DNS_EncDec.cc:171: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'queries'                                      
DNS_EncDec.cc:181: error: 'class DNS__TypeDefs::DNSMessage' has no member named 'header'                                       
DNS_EncDec.cc:182: error: 'ResourceRecord' was not declared in this scope                                                      
DNS_EncDec.cc:182: error: expected `;' before 'rr'                                              
:
:
etc.



and most of the errors are there because of the invalid references to the structures from the DNS types in github:

 type record PDU_DNS {
    DnsHeader             header,
    QResourceRecords      queries,
    ResourceRecords       answers,
    ResourceRecords       nameServerRecords,
    ResourceRecords       additionalRecords
  }


but your structures are different:

 type record DNSMessage { // RFC 1035 clause 4
    DNS_Header dnsHeader,
    DNS_Questions questions optional,
    DNS_RRs answer optional,
    DNS_RRs authority optional,
    DNS_RRs additional optional
  };



and DNSMessage indeed has no field, header, queries etc. as the field names are different;

so I'm afraid it is not enough to mechanically substitute the names , one has also to understand what the code is doing .


As for your question regarding f_DNS_GetEncodedResponse

decoding is done here:

 if (decvalue(v_Bitstring, v_DNSQuery) != 0) {


and decvalue is only invoking the codec function itself which is not apparent in the code.


So in summary: you are on the right track , but you will have to rewrite the DSN_EncDec.cc to match the details of your declarations in DNS_TypeDefs.ttcn.


I hope this helps

Best regards

Elemer



Re: Default as Omit not working in TTCN 3 test cases [message #1716113 is a reply to message #1716094] Tue, 01 December 2015 11:48 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi,

Thanks alot for your help. The problem is my compiler is not able to generate .hh file. Partial log of compilation is copied below.

.
.
.
      ../src/36523-3-c30_TTCN3_LTE/Common/EUTRA_Defs/EUTRA_RRC_ASN1_Definitions.asn:5570: error: No coding rule specified for type '@EUTRA-RRC-ASN1-Definitions.UE-EUTRA-Capability-v9a0-IEs'
Notify: Errors found in the input modules. Code will not be generated.
Creating dependency file for ../src/36523-3-c30_TTCN3_LTE/Common/IP_PTC/DNS_EncDec.cc
../src/36523-3-c30_TTCN3_LTE/Common/IP_PTC/DNS_EncDec.cc:25:27: fatal error: DNS_TypeDefs.hh: No such file or directory
 #include "DNS_TypeDefs.hh"
                           ^
compilation terminated.


Best Regards,
Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716116 is a reply to message #1716113] Tue, 01 December 2015 11:58 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

could you please describe exactly what you are doing?

Can you give me all command you use , starting with makefilegen?

Best regards

Elemer

Re: Default as Omit not working in TTCN 3 test cases [message #1716117 is a reply to message #1716116] Tue, 01 December 2015 12:01 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
One thing I can suggest is that you don' try to compile everything at once; try to break it down on part and compile them separately , and then add them together etc.

For instance DNS_TypeDefs.ttcn and CommonDefs.ttcn and DNS_EncDec.cc should be compileable on their own; you don't need EUTRA_RRC_ASN1_Definitions.asn for that.


BR Elemer



Re: Default as Omit not working in TTCN 3 test cases [message #1716239 is a reply to message #1716117] Wed, 02 December 2015 12:08 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Your advice for compilation in steps is working great. Now instead of writing C++ function for DNS messages, I am trying to use RAW encoder of titan. I have modified the code, which now compiles successfully and generates C++ code. I want you to have a look at the attached file 'DNS_TypeDefs.ttcn', if i am going in right direction.
I have some other questions regarding the use of attributes. In section 4.23 of referenceguide, it says:
Quote:

Compound types have at least one variant attribute. When a compound type is only used internally or it is never RAW encoded/decoded then the attribute variant has to be omitted

1-Can you please explain this point that what does it mean by at lease one variant attribute?
2- Does specifying only the field length of basic elements like ipv4addr is enough information for the encoder to encode the data?
3- What I have done is to specify the FIELDLENGTH of all the basic types while they were already defined in CommonDefs.ttcn like:
  type octetstring              O16_Type        length(16);

or these definition are too implicit for the compiler?
4- When I define the variant for one attribute like 'FIELDLENGTH ', does titan applies the default values for other attributes like 'BITORDER'?

I would be very thankful for your kind help.

Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716255 is a reply to message #1716239] Wed, 02 December 2015 14:00 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

yes, you are going in the right direction. As I mentioned, the only reason we did not use the RAW codec for DNS was that at the time it was not ready.

And now , your questions:
1. If you want a compound type (set , record, union) etc. to be encoded with RAW, you need at least one variant attribute, even if empty:

type record Something0
{
:
}

will not be encoded, but
type record Something1
{
}
with { variant  "" } 


will be encoded (using the applicable defaults)


2 and 3. No, it's not sufficient to have length info only ; the length information is used by the compiler to verify during compilation (or runtime) , but the codec needs a separate FIELDLENGTH instruction:

type octetstring OCT14 length(14) with { variant "FIELDLENGTH(14)" };



please check in https://github.com/eclipse/titan.ProtocolModules.COMMON/tree/master/src
General_Types.ttcn and general_typedefs.ttcn; they will give you a pretty good idea how to encode simple types.

4. Yes, once the codec is triggered, all applicable defaults will apply.




It may seem cumbersome at first , but if you have the codec instructions in place, Titan will generate automatically the encoding-decoding functions; please be aware though that in the original encoding function:
in DNSMessage msg,
  in boolean doCompression,
  in boolean autoLengthCalc) return octetstring;


I see booleans that trigger compression and automatic calculation of length; RAW can do auto legnth calculation, but compression, if wanted, has to be dealt with separately.

What we usually do to verify the RAW codec is to create sample templates we encode, and then decode, and also sample binary messages ( in this case you can listen to some DNS traffic with wireshark and save some messages) which we decode.


I hope this helps


Best regards

Elemer



Re: Default as Omit not working in TTCN 3 test cases [message #1716259 is a reply to message #1716255] Wed, 02 December 2015 14:25 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks a lot for your help. I will see if compression or auto length calculation is required. I hope that I can similarly define encoding for other encoders.

Can you please guide me the process for enforcing BER encoding for ASN.1 related messages. I am having two type of errors related to that. First one is the encoding of the top modules like
DL-CCCH-Message ::= SEQUENCE {
	message					DL-CCCH-MessageType
}


The second type is where encoding is missing for some basic or inner modules e.g.
-- Late non critical extensions
SystemInformationBlockType1-v8h0-IEs ::=	SEQUENCE {
	multiBandInfoList					MultiBandInfoList		OPTIONAL,	-- Need OR
	nonCriticalExtension				SystemInformationBlockType1-v9e0-IEs	OPTIONAL
}

which is used in:
SystemInformationBlockType1-v890-IEs::=	SEQUENCE {
	lateNonCriticalExtension			OCTET STRING (CONTAINING SystemInformationBlockType1-v8h0-IEs)			OPTIONAL,
	nonCriticalExtension				SystemInformationBlockType1-v920-IEs	OPTIONAL
}


Thanks and Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716267 is a reply to message #1716259] Wed, 02 December 2015 15:28 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
HI Muhammad,


I'm afraid there might be a problem here:

I could be wrong , but as far as I remember DL-CCCH-Message is part of the RRC protocol , which is not BER encoded, but PER encoded , which is fundamentally different;
Titan does not have a native PER -codec; an alternative solution using a 3rd part codec is described in:

https://www.eclipse.org/forums/index.php/t/1070344/


You will have to verify if asn1c (http://lionet.info/asn1c/blog/) compiles your ASN.1 code ; if this is successful, then you can assemble a PER -codec based on asn1c;

else, you will have to purchase a PER codec from a commercial ASN.1 compiler.

So please, first of all check if asn1c can be used; if yes, then follow the procedure described in the above forum post.



Best regards

Elemer




Re: Default as Omit not working in TTCN 3 test cases [message #1716462 is a reply to message #1716267] Fri, 04 December 2015 06:05 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for your kind help. I am able to compile asn code successfully using asn1c. It generates files for decoding, encoding and header files.
I was going through the example of CAM protocol in the above mentioned link (https://www.eclipse.org/forums/index.php/t/1070344/). The C source and header files are not being referenced by any of ttcn or .cc files. Even if you remove all of them the code compiles successfully using only files (Cam.asn, ITS_Container.asn, CAM_EnDec.cc, CAM_Types.ttcn and CAM_Types_Test.ttcn). What I can understand is that external function definition present in CAM_TYPES.ttcn points to the source code present in CAM_EnDec.cc file, which encodes/decodes ASN types like any manual written coding scheme like DNS example, we discussed above. Where will be the role of files generated by asn1c?
What I can't understand is how can I use the function/files generated by asn1c to specify encoder decoder functions in ttcn source? Can I write a ttcn3 file containing the defintions of all the external functions ( genearted by asn1c for each element of asn file) and then import from this file, where ever this asn file is imported? Can you please explain the process.

Thanking you!

Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716467 is a reply to message #1716462] Fri, 04 December 2015 08:35 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

I will walk you through the logic using CAM as example:

- first you have to compile the ASN.1 files with the gen-PER option to make sure PER codecs are generated:

asn1c gen-PER CAM.asn ITS_Container.asn


-asn1c generates a heap of files based on ASN.1, one for each type ; I guess you could put them in one big file, but at least you should put them in a separate directory to avoid messiness

-the top level PDU we want to encode/decode is CAM (CAM_PDU_Descriptions.asn):

CAM ::= SEQUENCE {
	header	ItsPduHeader,
	cam	CoopAwareness

}


-the external functions are declared in CAM_Types.ttcn :

module CAM_Types
{
  import from CAM_PDU_Descriptions language "ASN.1:1997" all;
  import from ITS_Container language "ASN.1:1997" all;
  
  external function enc_CAM_PDU( in CAM pdu) return octetstring;
  external function dec_CAM_PDU( in octetstring stream) return CAM;
  
}


- the definition of these functions is in CAM_EncDec.cc

let's see how these are connected :

I) Encoding direction : enc_CAM_PDU is called

 OCTETSTRING enc__CAM__PDU(const CAM__PDU__Descriptions::CAM& pdu)
{ 
:

first, a BER encoding is done with Titan's native BER codec:

 pdu.encode(CAM__PDU__Descriptions::CAM_descr_,TTCN_buf,TTCN_EncDec::CT_BER,BER_ENCODE_DER); 
 



then this is decoded by asn1c:

  rval = ber_decode(0, &asn_DEF_CAM, (void **)&cam, value, length); 


( the referred function ber_decode is defined in ber_decoder.c, ber_decoder.h generated by asn1c


  asn_dec_rval_t
ber_decode(asn_codec_ctx_t *opt_codec_ctx,
	asn_TYPE_descriptor_t *type_descriptor,
	void **struct_ptr, const void *ptr, size_t size) { 
	:
	:
	

)

then the resulting structure is re-encoded in PER

 erv = uper_encode(&asn_DEF_CAM, cam, write_out, NULL);


(the referred uper_encode is defined in per_encoder.c, per_encoder.h generated by asn1c

asn_enc_rval_t
uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) {
	return uper_encode_internal(td, 0, sptr, cb, app_key);
}
 

)



and this octetstring is returned as result

II) decoding direction

dec_CAM_PDU is called , definition is in CAM_EncDec.cc:

CAM__PDU__Descriptions::CAM dec__CAM__PDU(const OCTETSTRING& stream)
{ 
:
:

the incoming octetstring is per-decoded

 rval = uper_decode_complete(NULL, &asn_DEF_CAM, (void **)&cam, res, res_size); 


(the referred uper_decode_complete is defined in per_decoder.c, per_decoder.h generated by asn1c


asn_dec_rval_t
uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { 
:



)

then re-encoded in BER :
 erv = der_encode(&asn_DEF_CAM, cam, write_out, NULL);


der_encode is defined in der_encoder.c, der_encoder.h generated by asn1c


Note: DER and BER are producing equivalent encodings
)


and finally decoded by Titan's native BER :

ret_cam.decode(CAM__PDU__Descriptions::CAM_descr_,TTCN_buf,TTCN_EncDec::CT_BER,BER_ACCEPT_ALL);
 



which is returned as result.




Note 1: as asn1c generates C code, some tweaking is needed case-by -case to make it acceptable for g++;

I can't help you here, as it is case by case, but the examples given in the forum post should give you a hint; else, please involve someone
with extensive C/C++ knowledge.


Note 2. The reason why you managed to compile without apparently involving the asn1c-generated files is probably that you did not run make clean and the
object files generated previously were still there. After major changes, it's always a good idea to run a make clean.



Best regards
Elemer

Re: Default as Omit not working in TTCN 3 test cases [message #1716675 is a reply to message #1716467] Mon, 07 December 2015 13:08 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks a lot for the overview. The problem I am facing is that compiler is not compiling CAM_EncDec.cc file in Cam protocol example. No error is indicated if I add some incorrect syntax.
Similar is the case with my project. So as a result its not accepting the encoding/decoding I am define like you explained above.

Is there a specific compiler setting to compile .cc files ? .cc file is in the same directory and I have tried refreshing the project. I am using latest titan compiler and plugging in windows environment.

Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716683 is a reply to message #1716675] Mon, 07 December 2015 13:55 Go to previous messageGo to next message
Gyorgy Rethy is currently offline Gyorgy RethyFriend
Messages: 31
Registered: April 2015
Member
Hi Muhammad,
is CAM_EncDec.cc added to your Makefile? It should be at
USER_SOURCES =

If not, and you are using Eclipse, you should add CAM_EncDec.cc to your sources and re-build the project. But even in this case please check if the file is included into the generated Makefile.
Or add it manually, if you compile from command line and the file is missing in the Makefile.

BR, Gyorgy
Re: Default as Omit not working in TTCN 3 test cases [message #1716692 is a reply to message #1716683] Mon, 07 December 2015 14:43 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

I don't know what you mean by:"compiler is not compiling CAM_EncDec.cc file in Cam protocol example" How do you know that ? Is there any error indication? If yes, what?

-please leave aside the plug-ins for the moment and start using them only when you are familiar with the command line

-download the attachment CAM_CNL_113_xxx.tgz

and decompress it to a folder say CAM

-change directories:
-cd CAM/bin

-run install script
../install.script


-run make

make 


and send me the output generated

BR Elemer




Re: Default as Omit not working in TTCN 3 test cases [message #1716706 is a reply to message #1716692] Mon, 07 December 2015 16:13 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,
I don't have the access to my work system right now, so I will be able to post logs tomorrow.
Let me explain a little more.
As I told earlier, even after removing .c and .h files from the project (and running make clean ) the project compiles successfully. I tried putting some erroneous statements in CAM_EncDec.cc like
ssafsdfdasf = 12234234
2342342
uoiujlkj

and it still compiles successfully with no errors. So that's the reason I think that compiler is not compiling the CAM_EncDec.cc file.
I am using windows based enviroment and the procedure I use is as follows:
Make an empty titan project using eclipse UI
Extract the contents of the CAM_CNL_113_xxx.tgz to the same folder
Manually replace the make file with the extracted one.
make clean and then compile the project.

I will follow the procedure you indicated tomorrow and post the logs.

Thanks a lot for your kind help.

Best Regards,
Muhammad Uzair


Re: Default as Omit not working in TTCN 3 test cases [message #1716711 is a reply to message #1716706] Mon, 07 December 2015 16:37 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

thank you ; pls. post all actions and commands you execute and all responses displayed so I can figure out what's wrong;
Preferably use command line only and not the plug-ins.

BTW I have made the following experiment:

I have removed from the Makefile all .c and .h files generated by asn1c and tried to compile ;

the result was:

make
/home/james00/titan.core/Install/bin/compiler -L  \
	CAM_Types.ttcn CAM_Types_Test.ttcn  CAM.asn ITS_Container.asn - CAM_Types.ttcn CAM_Types_Test.ttcn CAM.asn ITS_Container.asn
Notify: Parsing TTCN-3 module `CAM_Types.ttcn'...
Notify: Parsing TTCN-3 module `CAM_Types_Test.ttcn'...
Notify: Parsing ASN.1 module `CAM.asn'...
Notify: Parsing ASN.1 module `ITS_Container.asn'...
ITS_Container.asn:9: warning: Missing IMPORTS clause is interpreted as `IMPORTS ;' (import nothing) instead of importing all symbols from all modules.
Notify: Checking modules...
Notify: Generating code...
Notify: File `CAM_PDU_Descriptions.hh' was generated.
Notify: File `CAM_PDU_Descriptions.cc' was generated.
Notify: File `CAM_Types.hh' was generated.
Notify: File `CAM_Types.cc' was generated.
Notify: File `CAM_Types_Test.hh' was generated.
Notify: File `CAM_Types_Test.cc' was generated.
Notify: File `ITS_Container.hh' was generated.
Notify: File `ITS_Container.cc' was generated.
Notify: 8 files were updated.
touch compile
g++  -c -DLINUX -I/home/james00/titan.core/Install/include -I. -Wall   -o CAM_Types.o CAM_Types.cc
g++  -c -DLINUX -I/home/james00/titan.core/Install/include -I. -Wall   -o CAM_PDU_Descriptions.o CAM_PDU_Descriptions.cc
g++  -c -DLINUX -I/home/james00/titan.core/Install/include -I. -Wall   -o ITS_Container.o ITS_Container.cc
g++  -c -DLINUX -I/home/james00/titan.core/Install/include -I. -Wall   -o CAM_Types_Test.o CAM_Types_Test.cc
g++  -c -DLINUX -I/home/james00/titan.core/Install/include -I. -Wall   -o CAM_EncDec.o CAM_EncDec.cc
CAM_EncDec.cc:21:17: fatal error: CAM.h: No such file or directory
 #include "CAM.h"
                 ^
compilation terminated.
make: *** [CAM_EncDec.o] Error 1



as it should be.


BR Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1716808 is a reply to message #1716711] Tue, 08 December 2015 11:01 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Compilation using command line is failing due to some unknown reason. Can you please have a look at the attached log to see whats the issue. "titanver" exists at the specified location. While compiling using GUI, it uses the same file with no errors (log file for GUI is also attached)

I have followed the steps except, changing the platform to WIN32

Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716958 is a reply to message #1716808] Wed, 09 December 2015 10:06 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,


you environment variables in Cygwin are not set correctly;

please send me the output of the following commands:

printenv | grep TTCN
printenv | grep PATH


My first recommendation is that you should use some kind of Linux instead of Cygwin, for several reasons:
-firstly, it's simpler to configure the environment
-secondly, very soon you will run into memory problems under Cygwin; I see that you need to compile UTRAN/RRC etc. protocols which are intensely consuming memory

Next, as I mentioned, try not to use the plug-ins in the beginning; the plug-ins are building upon the compiler/executor so that part shoudl be well understood and functioning perfectly before you move to the plug-ins.



Best regards

Elemer








Re: Default as Omit not working in TTCN 3 test cases [message #1716971 is a reply to message #1716808] Wed, 09 December 2015 11:00 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,
I was able to resolve the issue, compilation was terminated due to other errors and the erroneous statements, I put were not executed.

Thanks,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716972 is a reply to message #1716971] Wed, 09 December 2015 11:12 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

I have another issues. During code generation, titan includes the file for test port header at the end of .hh file.
and during dependency file creation, it searches for the files and generates a fatal error like
In file included from UpperTesterSystemCmds.hh:19:0,
                 from UpperTesterSystemCmds.cc:11:
UpperTesterCommon.hh:791:28: fatal error: MTC_System_Ut.hh: No such file or directory
 #include "MTC_System_Ut.hh"
                            ^
compilation terminated.


Can you please help me in identifying the issue?
I have attached the complete log.

Thanks,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1716975 is a reply to message #1716972] Wed, 09 December 2015 11:48 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

yes, as you said, Titan is looking for the external code where the test ports are defined;

you can disable this error temporarily by making Titan believe that the test port is internal, for example:


        type port UpperTesterPort message {
            out                  UtInitialize, UtBtpTrigger;
            in                     UtInitializeResult, UtBtpTriggerResult, UtBtpEventInd;
       } with  {extension "internal"} 



Of course , this is not the final remedy, the test port will have to be added sooner or later; the ETSI Upper tester port sends messages over UDP so here the UDP port can be reused ( I will show you how), but other test ports can be more problematic.


Best regards

Elemer


Re: Default as Omit not working in TTCN 3 test cases [message #1716993 is a reply to message #1716975] Wed, 09 December 2015 13:54 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for your kind help. I have now marked all the ports internal and will be waiting for the procedure of using existing ports.
I am now having an error which does not make sense. The error is:
../src/36523-3-c30_TTCN3_LTE/Common/IP_PTC/IP_PTC_HTTP_Handler.ttcn: In function 'alt_status IP__PTC__HTTP__Handler::a__IP__HTTP__Handler_instance(IP__PTC__HTTP__Handler::HTTP__Info__Type&)':
../src/36523-3-c30_TTCN3_LTE/Common/IP_PTC/IP_PTC_HTTP_Handler.ttcn:120:54: error: 'class OPTIONAL<IP__ASP__TypeDefs::IP__SocketList__Type>' has no member named 'n_elem'
         p_HttpInfo.ConnectionList[i] := valueof(v_XcapConnectionByRef);   // a_TcpServer_AcceptConnection 'returns' a valid connection i.e. v_ServerConnectionByRef will never be omit
                                                      ^
../src/36523-3-c30_TTCN3_LTE/Common/IP_PTC/IP_PTC_HTTP_Handler.ttcn:121:52: error: 'class OPTIONAL<IP__ASP__TypeDefs::IP__SocketList__Type>' has no member named 'n_elem'
       }
                                                    ^
Makefile:170: recipe for target 'IP_PTC_HTTP_Handler.o' failed


IP_SocketList_Type does not have any member name n_elmen and its not accessed either. Can you please see if the error is due to ports marked internal and an advice on how to get rid of it.
I have also attached the complete console log.

Thanking you,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1717003 is a reply to message #1716993] Wed, 09 December 2015 14:54 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

please do a "make archive" and send me the created compressed file ( it will me created in a folder /backup)

Best regards
Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1717148 is a reply to message #1717003] Thu, 10 December 2015 09:43 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks a lot for your help. I was able to resolve the error by removing the block of code. It was needed any way. Please explain the process of using the existing ports.

Thanks,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1717181 is a reply to message #1717148] Thu, 10 December 2015 14:35 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,


the first thing you will have to do is understand how your protocols are layered and how TTCN-3 is connected to the SUT.

I will assume for simplicity that all you protocols are transported over IP/Ethernet although this might not be the case.

The test ports that can be used are: TCP, UDP, IP, or LANL2 (Ethernet).
This means that you can connect to the TCP , UDP or IP layer of the IP/ETH stack or directly to Layer 2.
But of course , most of your protocols will not connect directly to any of these layers; but let's assume the simple scenario when this applies. The Upper tester messages for instance are simple structures transmitted over UDP. But all the TTCN-3 code offers is an UpperTester port, something like this:

        type port UpperTesterPort message {
            out 
                UtInitialize;
            in 
                UtInitializeResult;
        }


so somehow this port has to connect to the underlying UDP and the Upper Tester message structures in the sending direction (UtInitialize) will have to result in UDP messages, and in receiving direction , we have to extract
UtInitializeResult from the UDP frame and send it to the TTCN-3 code.

Luckily the Titan feature called dual-faced ports is exactly what we need. This permits mapping of messages from a northern interface(UpperTester messages) to a southern interface (UDP).
In our case UDP has the following set of messages:

 type port UDPasp_PT message
  {
    inout ASP_UDP;
    inout ASP_UDP_message;
    out   ASP_UDP_open;
    out   ASP_UDP_close;
    in    ASP_UDP_open_result;
  } with { extension "provider" }



So the outwards UtInitialize message will have to be mapped to an ASP_UDP_message (we will assume the port is used in advanced mode, see documentation). Incoming ASP_UDP_message will have to be decoded into an UtInitializeResult; (the _open,_close, _open_result messages we can neglect for the time being) .


And this is how this can be done:

group portDefinitions {
    
        /**
         * @desc Upper Tester port
         */
        type port UpperTesterPort message {
            out 
                UtInitialize;
            in 
                UtInitializeResult;
        } with { extension "user UDPasp_PT 
				out (
					UtInitialize -> ASP_UDP_message: function(enc_UtInitialize);
					)
				in(
					ASP_UDP_message		-> UtInitializeResult: function(dec_UtInitializeResult_message)
				)"
		} // end UpperTesterPort
        
    } // end portDefinitions
	


When UtInitialize is received on the northern interface , a function enc_UtInitilaize is called.


this function looks something like this:

//------------------------------------------------------------------------------
function enc_UtInitialize (in UtInitialize par_utinit)  return ASP_UDP_message
//------------------------------------------------------------------------------
{

var PDU_UtPrimitives v_PDU_UtPrimitives;
v_PDU_UtPrimitives.primitive.utInitialize := par_utinit;
v_PDU_UtPrimitives.messageType := '00'O; 
 
var ASP_UDP_message v_udp_msg;

v_udp_msg.data := f_enc_PDU_UtPrimitives(v_PDU_UtPrimitives);
v_udp_msg.remote_addr := tsp_udp_remote_addr;
v_udp_msg.remote_port := tsp_udp_remote_port;
v_udp_msg.id := omit;

return v_udp_msg;

} with { extension "prototype(convert)" }



It's input is a UtInitialize and it's output is an ASP_UDP_message which will be sent by the UDP port.


In the receiving direction a function dec_UtInitializeResult will be used:

//-----------------------------------------------------------------------------
function dec_UtInitializeResult (in ASP_UDP par_msg, out UtInitializeResult v_UtInitializeResult)  return integer
//------------------------------------------------------------------------------
{

var PDU_UtPrimitives v_PDU_UtPrimitives := f_dec_PDU_UtPrimitives(par_msg.data);
v_UtInitializeResult := v_PDU_UtPrimitives.primitive.utInitializeResult;

if (v_PDU_UtPrimitives.messageType == '01'O) {
	return 0;
} else {
	return 1;
}

} with { extension "prototype(backtrack)" }






and so on.

More details can be found in the reference guide 4.22.1 Dual faced ports

and in the examples I have posted in this forum.

https://www.eclipse.org/forums/index.php/t/1072614/
https://www.eclipse.org/forums/index.php/t/1068184/
https://www.eclipse.org/forums/index.php/t/1068359/


For other ports, we will have to examine case by case;
If the protocol is not transported over TCP-UDP-SCTP/IP/ETH but som other stack , we will have to find some appropriate replacement.





Best regards

Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1717372 is a reply to message #1716958] Sat, 12 December 2015 10:46 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for your kind help. I will be working on ports stuff next week.

Regarding your earlier message above (message #1716958), you have asked me about the output of the following commands.
Quote:

printenv | grep TTCN
printenv | grep PATH

I somehow missed to reply to your post, here is the output:
uzah@PK-LHR-DT-UZAH ~
$ printenv | grep TTCN
TTCN3_DIR=C:\cygwin64\home\titan\Install

uzah@PK-LHR-DT-UZAH ~
$ printenv | grep PATH
HOMEPATH=\Users\uzah
MANPATH=C:\cygwin64\home\titan\Install\man
ORIGINAL_PATH=/cygdrive/c/ProgramData/Oracle/Java/javapath:/cygdrive/c/u-blox/de                                         pot/3.1:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/Sys                                         tem32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/c/Progr                                         am Files (x86)/Microsoft SQL Server/100/Tools/Binn:/cygdrive/c/Program Files/Mic                                         rosoft SQL Server/100/Tools/Binn:/cygdrive/c/Program Files/Microsoft SQL Server/                                         100/DTS/Binn:/cygdrive/c/Program Files (x86)/Microsoft SQL Server/90/Tools/binn:                                         /cygdrive/c/Program Files (x86)/Anite/Shared Components:/cygdrive/c/Program File                                         s/Anite/Shared Components:/cygdrive/c/Program Files (x86)/Anite/LogViewer:/cygdr                                         ive/c/Program Files (x86)/Anite/LogViewer/ALV2:/usr/bin:/home/titan/Install/bin:                                         /cygdrive/c/Program Files/Perforce:/cygdrive/c/Program Files (x86)/Skype/Phone:/                                         home/titan/Install
PATH=/usr/local/bin:/usr/bin:/cygdrive/c/ProgramData/Oracle/Java/javapath:/cygdr                                         ive/c/u-blox/depot/3.1:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdriv                                         e/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/c                                         ygdrive/c/Program Files (x86)/Microsoft SQL Server/100/Tools/Binn:/cygdrive/c/Pr                                         ogram Files/Microsoft SQL Server/100/Tools/Binn:/cygdrive/c/Program Files/Micros                                         oft SQL Server/100/DTS/Binn:/cygdrive/c/Program Files (x86)/Microsoft SQL Server                                         /90/Tools/binn:/cygdrive/c/Program Files (x86)/Anite/Shared Components:/cygdrive                                         /c/Program Files/Anite/Shared Components:/cygdrive/c/Program Files (x86)/Anite/L                                         ogViewer:/cygdrive/c/Program Files (x86)/Anite/LogViewer/ALV2:/usr/bin:/home/tit                                         an/Install/bin:/cygdrive/c/Program Files/Perforce:/cygdrive/c/Program Files (x86                                         )/Skype/Phone:/home/titan/Install
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
INFOPATH=/usr/local/info:/usr/share/info:/usr/info


Can you see which of the enviroment variables, I am missing. Also I think I should move to linux instead of cygwin as per your suggestion. Compilation on windows is consuming almost all of the memory (16GB) and output is not generated for some ASN files even if process continues for 10-13 hours (e.g. UTRAN_RRC_ASN1_Definitions.cc). Can you suggest a better variant of linux for that?

Best Regards,
Muhammad Uzair
Re: Default as Omit not working in TTCN 3 test cases [message #1717376 is a reply to message #1717372] Sat, 12 December 2015 11:27 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

your PATH variable should contain the path to Titan binaries

C:\cygwin64\home\titan\Install\bin

and you should also have a variable LD_LIBRARY_PATH which points to C:\cygwin64\home\titan\Install\lib

Please check these video tutorials that were created not by us but by another user, they explain thoroughly installation and usage on Cygwin:

https://www.youtube.com/watch?v=6CKxOhZt7Gg
https://www.youtube.com/watch?v=hso34ReEiP8


Please also re-generate your Makefile to contain the switch -U type; when using this, Titan will split the generated files for types in several pieces, so it should compile more quickly. Don't expect miracles though, it will still take hours.

Linux is more efficient in using memory as you can imagine; any mainstream flavor, Ubuntu, SuSe, RedHat will do. It's also easier to setup Titan on Linux, you only need to set the three environmental variables TTCN3_DIR, PATH, LD_LIBRARY_PATH and nothing else.

You may also want to check Murli Sharma's post:
https://www.eclipse.org/forums/index.php/t/1072021/
he is doing something similar and we already managed to solve his similar problems.

Best regards

Elemer



Re: Default as Omit not working in TTCN 3 test cases [message #1717560 is a reply to message #1714488] Mon, 14 December 2015 19:28 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks a lot for you kind help.
I am trying to setup titan over linux. I am using centos 5.1, so I downloaded RHEL 5 binaries (Titan 5.4.0 binary for 64 bit RedHat 5), as it should run without any modification.

I followed the steps mentioned in your videohttps://www.youtube.com/watch?v=T__msvMhhHQ
and setup all the enviromental variables. I am still getting an error "cannot find -lcrypto" when I try to build the CAM protocol example. I have attached the complete log with echoing my environmental variables.

Can you please have a look at the log and see what's the issue.

Thanks and Best Regards,
Muhammad Uzair
  • Attachment: logfile.txt
    (Size: 24.41KB, Downloaded 158 times)
Re: Default as Omit not working in TTCN 3 test cases [message #1717562 is a reply to message #1717560] Mon, 14 December 2015 20:09 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

Titan cannot find the crypto libraries of openssl which are needed for instance for big integer handling;
$(EXECUTABLE): $(OBJECTS)
	if $(CXX) $(LDFLAGS) -o $@ $(OBJECTS) \
	-L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \
	-L$(OPENSSL_DIR)/lib -lcrypto \
	-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \
	then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi  



from your logfile it can be seen that this is executed as:

       -L/home/uzah/TTCN3/lib -lttcn3 \
        -L/home/uzah/TTCN3/lib -lcrypto \
        -L/home/uzah/TTCN3/lib -lxml2 -lpthread -lrt; \


so OPENSSL_DIR and XML_DIR are all set to /home/uzah/TTCN3 which is wrong.

The fault is caused by this line :
	-L$(OPENSSL_DIR)/lib -lcrypto \ 


Simplest thing you can do is add the following line to Makefile

OPENSSL_DIR = /usr

# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32)
PLATFORM = LINUX

If your OpenSSL is installed , it's probably in /usr


and see if it works;

If it does not , pls find where your openSSL is installed and enter the right value.

Similarly, if you want to use XML, you will have to add the correct XML_DIR.


If you install Titan from a pre-built binary then in the installation instructions it is explained how these libraries have to be installed and these variables set; if you build for yourself from source code, these settings are to be present in Makefile.personal, see README.linux


Pls let me know if this helped

Best regards

Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1717565 is a reply to message #1717562] Mon, 14 December 2015 20:23 Go to previous messageGo to next message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

let me add that you can also set OPENSSL_DIR as an environment variable

export OPENSSL_DIR=/usr

or
setenv OPENSSL_DIR /usr

depending on shell

BR Elemer
Re: Default as Omit not working in TTCN 3 test cases [message #1717869 is a reply to message #1717565] Thu, 17 December 2015 13:21 Go to previous messageGo to next message
Muhammad Uzair is currently offline Muhammad UzairFriend
Messages: 35
Registered: November 2015
Member
Hi Elemer,

Thanks for the help.
Just for the record
Installing following packages solve the problem "cannot find -lcrypto"
zlib-devel krb5-devel libcom_err-devel pam-devel libxml2-devel openssl-devel pam-devel libxslt-devel libselinux-devel
Re: Default as Omit not working in TTCN 3 test cases [message #1717873 is a reply to message #1717869] Thu, 17 December 2015 13:29 Go to previous message
Elemer Lelik is currently offline Elemer LelikFriend
Messages: 1120
Registered: January 2015
Senior Member
Hi Muhammad,

yes, I'd say it's probably openssl-devel which brings in crypto libraries.
libxml2-devel is also needed if you will work with XML.

Best regards

Elemer




Previous Topic:Titan and TTCN-3 security application
Next Topic:Testing SUT written in JAVA/C++
Goto Forum:
  


Current Time: Fri Mar 29 15:33:17 GMT 2024

Powered by FUDForum. Page generated in 0.05997 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top