//
// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation.
// All rights reserved.
// 
// Redistribution and use of this software in source and binary
// forms, with or without modification, are permitted provided that
// the following conditions and disclaimer are agreed and accepted
// by the user:
// 
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in
//    the documentation and/or other materials provided with
//    the distribution.
// 
// 3. Neither the names of the copyrighters, the name of the project
//    which is related to this software (hereinafter referred to as
//    "project") nor the names of the contributors may be used to
//    endorse or promote products derived from this software without
//    specific prior written permission.
// 
// 4. No merchantable use may be permitted without prior written
//    notification to the copyrighters.
// 
// 5. The copyrighters, the project and the contributors may prohibit
//    the use of this software at any time.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING
// BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE
// COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation.
// All rights reserved.
// 
// Redistribution and use of this software in source and binary
// forms, with or without modification, are permitted provided that
// the following conditions and disclaimer are agreed and accepted
// by the user:
// 
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in
//    the documentation and/or other materials provided with
//    the distribution.
// 
// 3. Neither the names of the copyrighters, the name of the project
//    which is related to this software (hereinafter referred to as
//    "project") nor the names of the contributors may be used to
//    endorse or promote products derived from this software without
//    specific prior written permission.
// 
// 4. No merchantable use may be permitted without prior written
//    notification to the copyrighters.
// 
// 5. The copyrighters, the project and the contributors may prohibit
//    the use of this software at any time.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING
// BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE
// COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// $Name: V6PC_P1_1_3_3 $
//
// $TAHI: ct/spec/FH_InvalidLength.def,v 1.6 2004/04/02 03:47:50 kenta Exp $
//

#include "./ID.def"

//======================================================================
// ICMP echo request (for simple test)
//======================================================================

FEM_icmp6_echo_request(
	echo_request,
	_HETHER_tn2nut,
	{
		_SRC(tnv6());
		_DST(nutv6());
	},
	{
		payload = echo_data1024;
	}
)

//
// ICMP echo reply
//

FEM_icmp6_echo_reply(
	echo_reply,
	_HETHER_nut2tn,
	{
		_SRC(nutv6());
		_DST(tnv6());
	},
	{
		payload = echo_data1024;
	}
)

//
// ICMP echo request (1st fragment)
//

FEM_hdr_ipv6_exth(
	echo_request_1st,
	_HETHER_tn2nut,
	{
		_SRC(tnv6());
		_DST(nutv6());
	},
	{
		header = _HDR_IPV6_NAME(echo_request_1st);
		exthdr = frag_1st;
		upper = payload_1st;
	}
)

//
// ICMP echo request (2nd fragment)
//

FEM_hdr_ipv6_exth(
	echo_request_2nd,
	_HETHER_tn2nut,
	{
		_SRC(tnv6());
		_DST(nutv6());
	},
	{
		header = _HDR_IPV6_NAME(echo_request_2nd);
		exthdr = frag_2nd;
		upper = payload_2nd;
	}
)

Hdr_Fragment frag_1st {
	NextHeader = 58;
	FragmentOffset = 0;
	MFlag = 1;
	Identification = FRAG_ID;
}

Hdr_Fragment frag_2nd {
	NextHeader = 58;	// ignored
	FragmentOffset = 65;	// 520/8
	MFlag = 0;
	Identification = FRAG_ID;
}

Payload payload_1st {
	data = substr(_PACKET_IPV6_NAME(echo_request), 40, 519);
}

Payload payload_2nd {
	data = substr(_PACKET_IPV6_NAME(echo_request), 559, 513);
}

//
// ICMP Error
//

FEM_icmp6_parameter_problem(
	icmperr,
	_HETHER_nut2tn,
	{
		_SRC(nutv6());
		_DST(tnv6());
	},
	{
		Code = 0;	// erroneous header field encounted
		Pointer = 4;	// Pointer to Payload Length
		payload = any;
//		payload = err;
	}
)

Payload err {
	data = right(_PACKET_IPV6_NAME(echo_request_1st), 0);
}

//----------------------------------------------------------------------
// Neighbor Solicitation and Neighbor Advertisement
//----------------------------------------------------------------------

FEM_icmp6_ns(
	ns,
	_HETHER_nut2tnsolnode,
	{
		_SRC(oneof(nutv6(),nut2v6(_GLOBAL0_UCAST_PRFX,_GLOBAL0_UCAST_PRFXLEN,"Link0")));
		_DST(_IPV6_SOLNODE_MCAST(tnv6()));
		HopLimit = 255;
	},
	{
		TargetAddress = tnv6();
		option = _SLLOPT_nut;
	}
)

FEM_icmp6_na(
	na,
	_HETHER_tn2nut,
	{
		_SRC(tnv6());
		_DST(nutv6());
		HopLimit = 255;
	},
	{
		SFlag = 1;
		OFlag = 1;
		TargetAddress = tnv6();
		option = _TLLOPT_tn;
	}
)

//
// unicast_ns
//
// - Unicast Neighbor Solicitation
//
//////////////////////////////////////////////////////////////////////

FEM_icmp6_ns(
	unicast_ns,
	_HETHER_nut2tn,
	{
		_SRC(oneof(nutv6(), nut2v6(_GLOBAL0_UCAST_PRFX, _GLOBAL0_UCAST_PRFXLEN, "Link0")));
		_DST(tnv6());
		HopLimit = 255;
	},
	{
		TargetAddress = tnv6();
		option = _SLLOPT_nut;
	}
)

//
// unicast_ns_wsll
//
// - Unicast Neighbor Solicitation without SLL option
//
//////////////////////////////////////////////////////////////////////

FEM_icmp6_ns(
	unicast_ns_wsll,
	_HETHER_nut2tn,
	{
		_SRC(oneof(nutv6(), nut2v6(_GLOBAL0_UCAST_PRFX, _GLOBAL0_UCAST_PRFXLEN, "Link0")));
		_DST(tnv6());
		HopLimit = 255;
	},
	{
		TargetAddress = tnv6();
	}
)

//----------------------------------------------------------------------
// Payload Data
//----------------------------------------------------------------------

Payload echo_data1024 {
	data = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
	data = {0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
	data = {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};
	data = {0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
	data = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};
	data = {0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f};
	data = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
	data = {0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
	data = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
	data = {0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
	data = {0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
	data = {0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
	data = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
	data = {0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
	data = {0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
	data = {0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
	data = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
	data = {0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};
	data = {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
	data = {0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
	data = {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7};
	data = {0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf};
	data = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7};
	data = {0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf};
	data = {0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};
	data = {0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf};
	data = {0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7};
	data = {0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf};
	data = {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7};
	data = {0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
	data = {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
	data = {0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

	data = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
	data = {0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
	data = {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};
	data = {0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
	data = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};
	data = {0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f};
	data = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
	data = {0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
	data = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
	data = {0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
	data = {0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
	data = {0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
	data = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
	data = {0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
	data = {0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
	data = {0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
	data = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
	data = {0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};
	data = {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
	data = {0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
	data = {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7};
	data = {0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf};
	data = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7};
	data = {0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf};
	data = {0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};
	data = {0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf};
	data = {0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7};
	data = {0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf};
	data = {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7};
	data = {0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
	data = {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
	data = {0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

	data = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
	data = {0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
	data = {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};
	data = {0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
	data = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};
	data = {0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f};
	data = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
	data = {0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
	data = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
	data = {0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
	data = {0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
	data = {0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
	data = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
	data = {0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
	data = {0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
	data = {0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
	data = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
	data = {0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};
	data = {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
	data = {0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
	data = {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7};
	data = {0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf};
	data = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7};
	data = {0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf};
	data = {0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};
	data = {0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf};
	data = {0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7};
	data = {0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf};
	data = {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7};
	data = {0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
	data = {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
	data = {0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

	data = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
	data = {0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
	data = {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};
	data = {0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};
	data = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};
	data = {0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f};
	data = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
	data = {0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
	data = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
	data = {0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
	data = {0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57};
	data = {0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};
	data = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67};
	data = {0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f};
	data = {0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77};
	data = {0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f};
	data = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
	data = {0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};
	data = {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
	data = {0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
	data = {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7};
	data = {0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf};
	data = {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7};
	data = {0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf};
	data = {0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7};
	data = {0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf};
	data = {0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7};
	data = {0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf};
	data = {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7};
	data = {0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef};
	data = {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
	data = {0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
}
