///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:               NDP_Types.ttcn
//  Rev:                R1B
//  Prodnr:             CNL 113 632
//  Updated:            2009-02-25
//  Contact:            http://ttcn.ericsson.se
//  Reference:          RFC 4861

module NDP_Types {

import from General_Types all;

external function  f_enc_PDU_NDP(
in PDU_NDP pdu,
in OCT16 srcaddr := '00000000000000000000000000000000'O, 
in OCT16 dstaddr := '00000000000000000000000000000000'O
) return octetstring

external function f_dec_PDU_NDP(in octetstring stream) return PDU_NDP
with { extension "prototype(convert)" extension "decode(RAW)" }

external function f_NDP_verify_checksum(
in octetstring data,
in OCT16 srcaddr := '00000000000000000000000000000000'O, 
in OCT16 dstaddr := '00000000000000000000000000000000'O
) return boolean

//NDP Options================================
type record SourceLinkLayerAddress
{
 INT1           optionType(1),
 INT1           lengthField, //encoder calculates(units of 8 bytes), use dummy value 
 octetstring    linkLayerAddrValue   
}with{ 
  variant "PRESENCE (optionType = 1)"
  variant (lengthField) "LENGTHTO (optionType,lengthField,linkLayerAddrValue)";
  variant (lengthField) "UNIT (64)"; 
  variant (linkLayerAddrValue) "PADDING(64)";
} 

type record TargetLinkLayerAddress
{
 INT1           optionType(2),
 INT1           lengthField, //encoder calculates(units of 8 bytes), use dummy value 
 octetstring    linkLayerAddrValue    
}with{ 
  variant "PRESENCE (optionType = 2)"
  variant (lengthField) "LENGTHTO (optionType,lengthField,linkLayerAddrValue)";
  variant (lengthField) "UNIT (64)"; 
  variant (linkLayerAddrValue) "PADDING(64)";
} 

type record PrefixInformation
{
 INT1           optionType(3),
 INT1           lengthField(4), 
 INT1           prefixLength,
 BIT6           reserved1, //0
 BIT1           aBit,
 BIT1           lBit,
 integer        validLifetime (0..4294967295),
 integer        preferredLifetime (0..4294967295),
 OCT4           reserved2,  //0
 OCT16          prefix
} with {
  variant "PRESENCE (optionType = 3)" 
  variant (validLifetime)  "FIELDLENGTH(32)";
  variant (validLifetime)  "BYTEORDER(last)";  
  variant (preferredLifetime)   "FIELDLENGTH(32)";
  variant (preferredLifetime)   "BYTEORDER(last)";   
}

type record RedirectedHeader
{
 INT1           optionType(4),
 INT1           lengthField,  //encoder calculates(units of 8 bytes), use dummy value 
 OCT6           reserved,  //0
 octetstring    iP_HeaderandData
}with{ 
  variant "PRESENCE (optionType = 4)"
  variant (lengthField) "LENGTHTO (optionType,lengthField,reserved,iP_HeaderandData)";
  variant (lengthField) "UNIT (64)"; 
  variant (iP_HeaderandData) "PADDING(64)";
} 

type record MTU
{
 INT1           optionType(5),
 INT1           lengthField(1),
 OCT2           reserved,  //0
 integer        mTU_Value (0..4294967295)
} with { 
  variant "PRESENCE (optionType = 5)"
  variant (mTU_Value)  "FIELDLENGTH(32)";
  variant (mTU_Value)  "BYTEORDER(last)";  
}

type set of RSM_Option RSM_Options; 

type union RSM_Option
{
  SourceLinkLayerAddress    sourceLinkLayerAddress 
};

type set of RAM_Option RAM_Options;

type union RAM_Option 
{
  SourceLinkLayerAddress     sourceLinkLayerAddress,
  MTU                        mTU,
  PrefixInformation          prefixInformation  
};

type set of NSM_Option NSM_Options;

type union NSM_Option
{
  SourceLinkLayerAddress     sourceLinkLayerAddress
};

type set of NAM_Option NAM_Options;

type union NAM_Option
{
  TargetLinkLayerAddress     targetLinkLayerAddress
}

type set of REM_Option REM_Options

type union REM_Option
{
  TargetLinkLayerAddress     targetLinkLayerAddress,
  RedirectedHeader           redirectedHeader
}

// NDP Messages======================================

//RFC 4861 4.1
type record NDP_RouterSolicitation
{
 INT1              typeField (133),
 INT1              code(0),
 OCT2              checksum, // ICMPv6 checksum
 OCT4              reserved,
 RSM_Options       rSM_Options optional
}with {  
  variant "PRESENCE (typeField = 133)"; 
};

//RFC 4861 4.2
type record NDP_RouterAdvertisement
{
 INT1              typeField (134), 
 INT1              code(0), 
 OCT2              checksum, // ICMPv6 checksum 
 INT1              curHopLimit, 
 BIT6              reserved,
 BIT1              oBit,
 BIT1              mBit,
 integer           routerLifetime (0..65535),
 integer           reachableTime (0..4294967295),
 integer           retransTimer (0..4294967295),
 RAM_Options       rAM_Options  optional   
} with { 
  variant "PRESENCE (typeField = 134)"; 
  variant (routerLifetime) "FIELDLENGTH(16)";
  variant (routerLifetime) "BYTEORDER(last)";
  variant (reachableTime)  "FIELDLENGTH(32)";
  variant (reachableTime)  "BYTEORDER(last)";  
  variant (retransTimer)   "FIELDLENGTH(32)";
  variant (retransTimer)   "BYTEORDER(last)";   
};
     
//RFC 4861 4.3 
type record NDP_NeighborSolicitation
{
 INT1              typeField (135),  
 INT1              code(0),  
 OCT2              checksum, // ICMPv6 checksum  
 OCT4              reserved, 
 OCT16             targetAddress,
 NSM_Options       nSM_Options optional   
} with {  
  variant "PRESENCE (typeField = 135)"; 
};

//RFC 4861 4.4 
type record NDP_NeighborAdvertisement
{
 INT1              typeField (136),  
 INT1              code(0), 
 OCT2              checksum, // ICMPv6 checksum  
 BIT5              reserved1,
 BIT1              oBit,
 BIT1              sBit,
 BIT1              rBit,
 OCT3              reserved2,
 OCT16             targetAddress, 
 NAM_Options       nAM_Options optional   
} with {  
  variant "PRESENCE (typeField = 136)"; 
};

//RFC 4861 4.5
type record NDP_Redirect
{
 INT1              typeField (137),  
 INT1              code(0), 
 OCT2              checksum, // ICMPv6 checksum  
 OCT4              reserved,
 OCT16             targetAddress,  
 OCT16             destinationAddress,  
 REM_Options       rEM_Options optional
} with {  
  variant "PRESENCE (typeField = 137)"; 
};

type union PDU_NDP
{
 NDP_RouterSolicitation       routerSolicitation,
 NDP_RouterAdvertisement      routerAdvertisement,
 NDP_NeighborSolicitation     neighborSolicitation,
 NDP_NeighborAdvertisement    neighborAdvertisement,
 NDP_Redirect                 redirect
} with { variant""}


} with{ encode "RAW"} 
