// SCTP Conformance Test Suite Implementation
// (C) Copyright Fujitsu Ltd. 2008, 2009
//
// This file is part of the SCTP Conformance Test Suite implementation.
//
// The SCTP Conformance Test Suite implementation is free software;
// you can redistribute it and/or modify it under the terms of
// the GNU General Public License version 2 as published by
// the Free Software Foundation.
//
// The SCTP Conformance Test Suite implementation is distributed in the
// hope that it will be useful, but WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with GNU CC; see the file COPYING.  If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
//
// Please send any bug reports or fixes you make to the
// email address(es):
//    networktest sctp <networktest-sctp@lists.sourceforge.net>
//
// Or submit a bug report through the following website:
//    http://networktest.sourceforge.net/
//
// Written or modified by:
//    Hiroaki Kago <linuxsctp-kg@ml.css.fujitsu.com>
//    Wei Yongjun <yjwei@cn.fujitsu.com>
//
// Any bugs reported given to us we will try to fix... any fixes shared will
// be incorporated into the next SCTP release.
//

#include "../common/STD_PKT_COMMON.def"

#ifndef SNDTSN
#define SNDTSN	INITTSN
#endif
#ifndef SACK
#define SACK	0
#endif

#if ENABLE_IPV6
#define DATA_SIZE	1432
#else
#define DATA_SIZE	1452
#endif

#define DATA_SEGMENT_SEND(_pNAME, _pINDEX, _pSEQ) \
PKG_SCTP_SHORT_SEND( \
	sctp_chunk_data_##_pNAME, \
	{ \
		chunk = chunk_data_##_pNAME; \
	} \
) \
CHUNK_DATA chunk_data_##_pNAME { \
	UFlag = 0; \
	BFlag = 1; \
	EFlag = 1; \
	TSN = SNDTSN; \
	Identifier = 0; \
	SequenceNumber = _pSEQ; \
	Protocol = 0; \
	payload = data##_pNAME; \
} \
Payload data##_pNAME { \
	data = repeat(_pINDEX, DATA_SIZE); \
} \
PKG_SCTP_SHORT_RECV( \
	sctp_chunk_sack_##_pNAME, \
	{ \
		chunk = chunk_sack_##_pNAME; \
	} \
) \
\
CHUNK_SACK chunk_sack_##_pNAME { \
	ACK = SNDTSN; \
	AdvRecvWindow = any; \
	NumOfGapAck = 0; \
	NumOfDupTSN = 0; \
}

#define DATA_SEGMENT_RECV(_pNAME, _pINDEX, _pSEQ) \
PKG_SCTP_SHORT_RECV( \
	sctp_chunk_data_##_pNAME, \
	{ \
		chunk = chunk_data_##_pNAME; \
	} \
) \
CHUNK_DATA chunk_data_##_pNAME { \
	UFlag = any; \
	BFlag = 1; \
	EFlag = 1; \
	TSN = SACK; \
	Identifier = any; \
	SequenceNumber = any; \
	Protocol = 0; \
	payload = data##_pNAME; \
} \
Payload data##_pNAME { \
	data = repeat(_pINDEX, DATA_SIZE); \
} \
PKG_SCTP_SHORT_SEND( \
	sctp_chunk_sack_##_pNAME, \
	{ \
		chunk = chunk_sack_##_pNAME; \
	} \
) \
\
CHUNK_SACK chunk_sack_##_pNAME { \
	ACK = SACK; \
	AdvRecvWindow = ARWND; \
	NumOfGapAck = 0; \
	NumOfDupTSN = 0; \
}

//_pNAME, _pINDEX, _pSEQ
// a1 -> a2 -> b1 -> b2
DATA_SEGMENT_SEND(a1, 1, 0)
DATA_SEGMENT_SEND(a2, 2, 1)
DATA_SEGMENT_SEND(a3, 3, 2)
DATA_SEGMENT_SEND(a4, 4, 3)

DATA_SEGMENT_RECV(r1, 1, 0)
DATA_SEGMENT_RECV(r2, 2, 1)
DATA_SEGMENT_RECV(r3, 3, 2)
DATA_SEGMENT_RECV(r4, 4, 3)

