suricata
stream-tcp-util.c
Go to the documentation of this file.
1 /* Copyright (C) 2007-2011 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  *
23  * Helper functions for the stream engine.
24  */
25 
26 #include "suricata-common.h"
27 
28 #include "stream-tcp-reassemble.h"
29 #include "stream-tcp-inline.h"
30 #include "stream-tcp.h"
31 #include "stream-tcp-util.h"
32 
33 #include "util-memcmp.h"
34 #include "util-print.h"
35 
36 #include "util-unittest.h"
37 #include "util-unittest-helper.h"
38 #include "ippair.h"
39 
40 #ifdef UNITTESTS
41 
42 /* unittest helper functions */
43 
45 {
46  StreamTcpInitConfig(true);
47  IPPairInitConfig(true);
48  *ra_ctx = StreamTcpReassembleInitThreadCtx(NULL);
49 }
50 
52 {
55  StreamTcpFreeConfig(true);
57 }
58 
61 }
62 
64 {
65  memset(ssn, 0x00, sizeof(TcpSession));
66 
68  ssn->client.sb = x;
69  ssn->server.sb = x;
70 }
71 
73 {
77  memset(ssn, 0x00, sizeof(TcpSession));
78 }
79 
80 void StreamTcpUTSetupStream(TcpStream *s, uint32_t isn)
81 {
82  memset(s, 0x00, sizeof(TcpStream));
83 
84  s->isn = isn;
86  s->base_seq = isn+1;
87 
89  s->sb = x;
90 }
91 
93 {
95 }
96 
97 /** \brief wrapper for StreamTcpReassembleHandleSegmentHandleData */
98 int StreamTcpUTAddPayload(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpSession *ssn, TcpStream *stream, uint32_t seq, uint8_t *payload, uint16_t len)
99 {
100  Packet *p = UTHBuildPacketReal(payload, len, IPPROTO_TCP, "1.1.1.1", "2.2.2.2", 1024, 80);
101  if (p == NULL) {
102  return -1;
103  }
104  p->l4.hdrs.tcph->th_seq = htonl(seq);
105  p->l4.hdrs.tcph->th_ack = htonl(31);
106 
107  if (StreamTcpReassembleHandleSegmentHandleData(tv, ra_ctx, ssn, stream, p) < 0)
108  return -1;
109 
110  UTHFreePacket(p);
111  return 0;
112 }
113 
114 int StreamTcpUTAddSegmentWithPayload(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpStream *stream, uint32_t seq, uint8_t *payload, uint16_t len)
115 {
116  TcpSegment *s = StreamTcpGetSegment(tv, ra_ctx);
117  if (s == NULL) {
118  return -1;
119  }
120 
121  s->seq = seq;
122  TCP_SEG_LEN(s) = len;
123 
124  Packet *p = UTHBuildPacketReal(payload, len, IPPROTO_TCP, "1.1.1.1", "2.2.2.2", 1024, 80);
125  if (p == NULL) {
126  return -1;
127  }
128  p->l4.hdrs.tcph->th_seq = htonl(seq);
129 
130  if (StreamTcpReassembleInsertSegment(tv, ra_ctx, stream, s, p, p->payload, p->payload_len) < 0)
131  return -1;
132 
133  UTHFreePacket(p);
134  return 0;
135 }
136 
137 int StreamTcpUTAddSegmentWithByte(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpStream *stream, uint32_t seq, uint8_t byte, uint16_t len)
138 {
139  TcpSegment *s = StreamTcpGetSegment(tv, ra_ctx);
140  if (s == NULL) {
141  return -1;
142  }
143 
144  s->seq = seq;
145  TCP_SEG_LEN(s) = len;
146  uint8_t buf[len];
147  memset(buf, byte, len);
148 
149  Packet *p = UTHBuildPacketReal(buf, len, IPPROTO_TCP, "1.1.1.1", "2.2.2.2", 1024, 80);
150  if (p == NULL) {
151  return -1;
152  }
153  p->l4.hdrs.tcph->th_seq = htonl(seq);
154 
155  if (StreamTcpReassembleInsertSegment(tv, ra_ctx, stream, s, p, p->payload, p->payload_len) < 0)
156  return -1;
157  UTHFreePacket(p);
158  return 0;
159 }
160 
161 /* tests */
162 
163 static int StreamTcpUtilTest01(void)
164 {
165  int ret = 0;
166  TcpReassemblyThreadCtx *ra_ctx = NULL;
167 
168  StreamTcpUTInit(&ra_ctx);
169 
170  if (ra_ctx == NULL) {
171  printf("ra_ctx is NULL: ");
172  goto end;
173  }
174 
175  ret = 1;
176 end:
177  StreamTcpUTDeinit(ra_ctx);
178  return ret;
179 }
180 
181 
182 static int StreamTcpUtilStreamTest01(void)
183 {
184  TcpReassemblyThreadCtx *ra_ctx = NULL;
185  TcpStream stream;
186  ThreadVars tv;
187  memset(&tv, 0x00, sizeof(tv));
188 
189  StreamTcpUTInit(&ra_ctx);
190  StreamTcpUTSetupStream(&stream, 1);
191 
192  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 2, 'A', 5) == -1);
193  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 7, 'B', 5) == -1);
194  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 12, 'C', 5) == -1);
195 
196  TcpSegment *seg = RB_MIN(TCPSEG, &stream.seg_tree);
197  FAIL_IF_NULL(seg);
198  FAIL_IF(seg->seq != 2);
199 
200  seg = TCPSEG_RB_NEXT(seg);
201  FAIL_IF_NULL(seg);
202  FAIL_IF(seg->seq != 7);
203 
204  seg = TCPSEG_RB_NEXT(seg);
205  FAIL_IF_NULL(seg);
206  FAIL_IF(seg->seq != 12);
207 
208  StreamTcpUTClearStream(&stream);
209  StreamTcpUTDeinit(ra_ctx);
210  PASS;
211 }
212 
213 static int StreamTcpUtilStreamTest02(void)
214 {
215  TcpReassemblyThreadCtx *ra_ctx = NULL;
216  TcpStream stream;
217  ThreadVars tv;
218  memset(&tv, 0x00, sizeof(tv));
219 
220  StreamTcpUTInit(&ra_ctx);
221  StreamTcpUTSetupStream(&stream, 1);
222 
223  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 7, 'B', 5) == -1);
224  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 12, 'C', 5) == -1);
225  FAIL_IF(StreamTcpUTAddSegmentWithByte(&tv, ra_ctx, &stream, 2, 'A', 5) == -1);
226 
227  TcpSegment *seg = RB_MIN(TCPSEG, &stream.seg_tree);
228  FAIL_IF_NULL(seg);
229  FAIL_IF(seg->seq != 2);
230 
231  seg = TCPSEG_RB_NEXT(seg);
232  FAIL_IF_NULL(seg);
233  FAIL_IF(seg->seq != 7);
234 
235  seg = TCPSEG_RB_NEXT(seg);
236  FAIL_IF_NULL(seg);
237  FAIL_IF(seg->seq != 12);
238 
239  StreamTcpUTClearStream(&stream);
240  StreamTcpUTDeinit(ra_ctx);
241  PASS;
242 }
243 
244 #endif
245 
247 {
248 #ifdef UNITTESTS
249  UtRegisterTest("StreamTcpUtilTest01", StreamTcpUtilTest01);
250  UtRegisterTest("StreamTcpUtilStreamTest01", StreamTcpUtilStreamTest01);
251  UtRegisterTest("StreamTcpUtilStreamTest02", StreamTcpUtilStreamTest02);
252 #endif /* UNITTESTS */
253 }
254 
StreamTcpUTAddPayload
int StreamTcpUTAddPayload(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpSession *ssn, TcpStream *stream, uint32_t seq, uint8_t *payload, uint16_t len)
wrapper for StreamTcpReassembleHandleSegmentHandleData
Definition: stream-tcp-util.c:98
TcpStream_
Definition: stream-tcp-private.h:106
len
uint8_t len
Definition: app-layer-dnp3.h:2
ippair.h
StreamTcpUTDeinit
void StreamTcpUTDeinit(TcpReassemblyThreadCtx *ra_ctx)
Definition: stream-tcp-util.c:51
FAIL_IF_NULL
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
Definition: util-unittest.h:89
TcpStream_::isn
uint32_t isn
Definition: stream-tcp-private.h:113
StreamTcpGetSegment
TcpSegment * StreamTcpGetSegment(ThreadVars *tv, TcpReassemblyThreadCtx *)
get a segment from the pool
Definition: stream-tcp-reassemble.c:2120
IPPairInitConfig
void IPPairInitConfig(bool quiet)
initialize the configuration
Definition: ippair.c:162
TCP_SEG_LEN
#define TCP_SEG_LEN(seg)
Definition: stream-tcp-private.h:94
stream-tcp-inline.h
StreamTcpUTClearStream
void StreamTcpUTClearStream(TcpStream *s)
Definition: stream-tcp-util.c:92
stream-tcp.h
UtRegisterTest
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
Definition: util-unittest.c:103
TcpStream_::seg_tree
struct TCPSEG seg_tree
Definition: stream-tcp-private.h:136
seq
uint32_t seq
Definition: stream-tcp-private.h:2
Packet_::payload
uint8_t * payload
Definition: decode.h:605
TcpStreamCnf_::flags
uint8_t flags
Definition: stream-tcp.h:65
StreamTcpUtilRegisterTests
void StreamTcpUtilRegisterTests(void)
Definition: stream-tcp-util.c:246
RB_MIN
#define RB_MIN(name, x)
Definition: tree.h:778
stream-tcp-reassemble.h
TcpSegment::seq
uint32_t seq
Definition: stream-tcp-private.h:75
StreamTcpStreamCleanup
void StreamTcpStreamCleanup(TcpStream *stream)
Definition: stream-tcp.c:308
stream_config
TcpStreamCnf stream_config
Definition: stream-tcp.c:227
UTHBuildPacketReal
Packet * UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len, uint8_t ipproto, const char *src, const char *dst, uint16_t sport, uint16_t dport)
UTHBuildPacketReal is a function that create tcp/udp packets for unittests specifying ip and port sou...
Definition: util-unittest-helper.c:260
StreamTcpUTInitInline
void StreamTcpUTInitInline(void)
Definition: stream-tcp-util.c:59
Packet_::payload_len
uint16_t payload_len
Definition: decode.h:606
util-unittest.h
util-unittest-helper.h
TCPHdr_::th_ack
uint32_t th_ack
Definition: decode-tcp.h:153
util-memcmp.h
IPPairShutdown
void IPPairShutdown(void)
shutdown the flow engine
Definition: ippair.c:290
StreamTcpReassembleInitThreadCtx
TcpReassemblyThreadCtx * StreamTcpReassembleInitThreadCtx(ThreadVars *tv)
Definition: stream-tcp-reassemble.c:557
StreamTcpUTInit
void StreamTcpUTInit(TcpReassemblyThreadCtx **ra_ctx)
Definition: stream-tcp-util.c:44
StreamTcpInitConfig
void StreamTcpInitConfig(bool)
To initialize the stream global configuration data.
Definition: stream-tcp.c:496
PASS
#define PASS
Pass the test.
Definition: util-unittest.h:105
TCPHdr_::th_seq
uint32_t th_seq
Definition: decode-tcp.h:152
util-print.h
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:58
StreamTcpUTSetupStream
void StreamTcpUTSetupStream(TcpStream *s, uint32_t isn)
Definition: stream-tcp-util.c:80
TcpSegment
Definition: stream-tcp-private.h:72
Packet_
Definition: decode.h:501
Packet_::l4
struct PacketL4 l4
Definition: decode.h:601
StreamTcpReassembleFreeThreadCtx
void StreamTcpReassembleFreeThreadCtx(TcpReassemblyThreadCtx *ra_ctx)
Definition: stream-tcp-reassemble.c:596
STREAMING_BUFFER_INITIALIZER
#define STREAMING_BUFFER_INITIALIZER
Definition: util-streaming-buffer.h:137
StreamingBuffer_
Definition: util-streaming-buffer.h:108
StreamTcpReassembleHandleSegmentHandleData
int StreamTcpReassembleHandleSegmentHandleData(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpSession *ssn, TcpStream *stream, Packet *p)
Insert a TCP packet data into the stream reassembly engine.
Definition: stream-tcp-reassemble.c:746
StreamTcpUTClearSession
void StreamTcpUTClearSession(TcpSession *ssn)
Definition: stream-tcp-util.c:72
FAIL_IF
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
Definition: util-unittest.h:71
StreamTcpFreeConfig
void StreamTcpFreeConfig(bool quiet)
Definition: stream-tcp.c:867
STREAMTCP_SET_RA_BASE_SEQ
#define STREAMTCP_SET_RA_BASE_SEQ(stream, seq)
Definition: stream-tcp-private.h:264
suricata-common.h
StreamTcpReassembleInsertSegment
int StreamTcpReassembleInsertSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpStream *stream, TcpSegment *seg, Packet *p, uint8_t *pkt_data, uint16_t pkt_datalen)
Definition: stream-tcp-list.c:634
TcpStream_::base_seq
uint32_t base_seq
Definition: stream-tcp-private.h:124
TcpStream_::sb
StreamingBuffer sb
Definition: stream-tcp-private.h:135
TcpSession_::client
TcpStream client
Definition: stream-tcp-private.h:297
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:32
StreamTcpUTAddSegmentWithPayload
int StreamTcpUTAddSegmentWithPayload(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpStream *stream, uint32_t seq, uint8_t *payload, uint16_t len)
Definition: stream-tcp-util.c:114
PacketL4::L4Hdrs::tcph
TCPHdr * tcph
Definition: decode.h:469
StreamTcpUTSetupSession
void StreamTcpUTSetupSession(TcpSession *ssn)
Definition: stream-tcp-util.c:63
TcpSession_::server
TcpStream server
Definition: stream-tcp-private.h:296
UTHFreePacket
void UTHFreePacket(Packet *p)
UTHFreePacket: function to release the allocated data from UTHBuildPacket and the packet itself.
Definition: util-unittest-helper.c:473
StreamTcpUTAddSegmentWithByte
int StreamTcpUTAddSegmentWithByte(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpStream *stream, uint32_t seq, uint8_t byte, uint16_t len)
Definition: stream-tcp-util.c:137
StreamTcpSessionCleanup
void StreamTcpSessionCleanup(TcpSession *ssn)
Session cleanup function. Does not free the ssn.
Definition: stream-tcp.c:335
stream-tcp-util.h
PacketL4::hdrs
union PacketL4::L4Hdrs hdrs
TcpReassemblyThreadCtx_
Definition: stream-tcp-reassemble.h:61
TcpSession_
Definition: stream-tcp-private.h:283
STREAMTCP_INIT_FLAG_INLINE
#define STREAMTCP_INIT_FLAG_INLINE
Definition: stream-tcp.h:41