summaryrefslogtreecommitdiff
path: root/package/nmap/extra/sctp.h
blob: 2c24bfb53376c42fc73fa31f1eeea79a69f957ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * Stream Control Transmission Protocol (RFC 2960).
 *
 * Copyright (c) 2008 Daniel Roethlisberger <daniel@roe.ch>
 * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
 *
 */

#ifndef SCTP_H
#define SCTP_H

#define SCTP_HDR_LEN	12

struct sctp_hdr {
	uint16_t	sh_sport;	/* source port */
	uint16_t	sh_dport;	/* destination port */
	uint32_t	sh_vtag;	/* sctp verification tag */
	uint32_t	sh_sum;		/* sctp checksum */
};

#define SCTP_PORT_MAX	65535

#define sctp_pack_hdr(hdr, sport, dport, vtag) do {		\
	struct sctp_hdr *sctp_pack_p = (struct sctp_hdr *)(hdr);	\
	sctp_pack_p->sh_sport = htons(sport);			\
	sctp_pack_p->sh_dport = htons(dport);			\
	sctp_pack_p->sh_vtag = htonl(vtag);			\
} while (0)

struct sctp_chunkhdr {
	uint8_t		sch_type;	/* chunk type */
	uint8_t		sch_flags;	/* chunk flags */
	uint16_t	sch_length;	/* chunk length */
};

/* chunk types */
#define SCTP_DATA		0x00
#define SCTP_INIT		0x01
#define SCTP_INIT_ACK		0x02
#define SCTP_SACK		0x03
#define SCTP_HEARTBEAT		0x04
#define SCTP_HEARTBEAT_ACK	0x05
#define SCTP_ABORT		0x06
#define SCTP_SHUTDOWN		0x07
#define SCTP_SHUTDOWN_ACK	0x08
#define SCTP_ERROR		0x09
#define SCTP_COOKIE_ECHO	0x0a
#define SCTP_COOKIE_ACK		0x0b
#define SCTP_ECNE		0x0c
#define SCTP_CWR		0x0d
#define SCTP_SHUTDOWN_COMPLETE	0x0e
#define SCTP_AUTH		0x0f	/* RFC 4895 */
#define SCTP_ASCONF_ACK		0x80	/* RFC 5061 */
#define SCTP_PKTDROP		0x81	/* draft-stewart-sctp-pktdrprep-08 */
#define SCTP_PAD		0x84	/* RFC 4820 */
#define SCTP_FORWARD_TSN	0xc0	/* RFC 3758 */
#define SCTP_ASCONF		0xc1	/* RFC 5061 */

/* chunk types bitmask flags */
#define SCTP_TYPEFLAG_REPORT	1
#define SCTP_TYPEFLAG_SKIP	2

#define sctp_pack_chunkhdr(hdr, type, flags, length) do {	\
	struct sctp_chunkhdr *sctp_pack_chp = (struct sctp_chunkhdr *)(hdr);\
	sctp_pack_chp->sch_type = type;				\
	sctp_pack_chp->sch_flags = flags;			\
	sctp_pack_chp->sch_length = htons(length);		\
} while (0)

struct sctp_chunkhdr_init {
	struct sctp_chunkhdr chunkhdr;

	int32_t		schi_itag;	/* Initiate Tag */
	int32_t		schi_arwnd;	/* Advertised Receiver Window Credit */
	int16_t		schi_nos;	/* Number of Outbound Streams */
	int16_t		schi_nis;	/* Number of Inbound Streams */
	int32_t		schi_itsn;	/* Initial TSN */
};

#define sctp_pack_chunkhdr_init(hdr, type, flags, length, itag, \
				arwnd, nos, nis, itsn) do {	\
	struct sctp_chunkhdr_init *sctp_pack_chip = (struct sctp_chunkhdr_init *)(hdr);\
	sctp_pack_chunkhdr(sctp_pack_chip, type, flags, length);\
	sctp_pack_chip->schi_itag = htonl(itag);		\
	sctp_pack_chip->schi_arwnd = htonl(arwnd);		\
	sctp_pack_chip->schi_nos = htons(nos);			\
	sctp_pack_chip->schi_nis = htons(nis);			\
	sctp_pack_chip->schi_itsn = htonl(itsn);		\
} while (0)

/*
 * COOKIE ECHO chunk
 */
struct sctp_chunkhdr_cookie_echo {
	struct sctp_chunkhdr chunkhdr;

	/* empty */
};

#define sctp_pack_chunkhdr_cookie_echo(hdr, type, flags, length) do {	\
	struct sctp_chunkhdr_cookie_echo *sctp_pack_chip =		\
			(struct sctp_chunkhdr_cookie_echo *)(hdr);	\
	sctp_pack_chunkhdr(sctp_pack_chip, type, flags, length);	\
} while (0)

#endif /* SCTP_H */