1 //--------------------------------------------------------------------------
2 // Copyright (C) 2015-2021 Cisco and/or its affiliates. All rights reserved.
3 //
4 // This program is free software; you can redistribute it and/or modify it
5 // under the terms of the GNU General Public License Version 2 as published
6 // by the Free Software Foundation. You may not use, modify or distribute
7 // this program under any other version of the GNU General Public License.
8 //
9 // This program is distributed in the hope that it will be useful, but
10 // WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License along
15 // with this program; if not, write to the Free Software Foundation, Inc.,
16 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 //--------------------------------------------------------------------------
18
19 // tcp_state_handler.cc author davis mcpherson <davmcphe@cisco.com>
20 // Created on: Jun 24, 2015
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include "tcp_state_handler.h"
27
28 #include <iostream>
29
30 #include "tcp_state_machine.h"
31
32 #ifdef UNIT_TEST
33 #include "catch/snort_catch.h"
34 #endif
35
36 using namespace std;
37
TcpStateHandler(TcpStreamTracker::TcpState state,TcpStateMachine & tsm)38 TcpStateHandler::TcpStateHandler(TcpStreamTracker::TcpState state, TcpStateMachine& tsm)
39 { tsm.register_state_handler(state, *this); }
40
do_pre_sm_packet_actions(TcpSegmentDescriptor &,TcpStreamTracker &)41 bool TcpStateHandler::do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&)
42 { return true; }
43
do_post_sm_packet_actions(TcpSegmentDescriptor &,TcpStreamTracker &)44 bool TcpStateHandler::do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&)
45 { return true; }
46
eval(TcpSegmentDescriptor & tsd,TcpStreamTracker & tracker)47 bool TcpStateHandler::eval(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
48 {
49 switch ( tracker.get_tcp_event() )
50 {
51 case TcpStreamTracker::TCP_SYN_SENT_EVENT:
52 return syn_sent(tsd, tracker);
53
54 case TcpStreamTracker::TCP_SYN_RECV_EVENT:
55 return syn_recv(tsd, tracker);
56
57 case TcpStreamTracker::TCP_SYN_ACK_SENT_EVENT:
58 return syn_ack_sent(tsd, tracker);
59
60 case TcpStreamTracker::TCP_SYN_ACK_RECV_EVENT:
61 return syn_ack_recv(tsd, tracker);
62
63 case TcpStreamTracker::TCP_ACK_SENT_EVENT:
64 return ack_sent(tsd, tracker);
65
66 case TcpStreamTracker::TCP_ACK_RECV_EVENT:
67 return ack_recv(tsd, tracker);
68
69 case TcpStreamTracker::TCP_DATA_SEG_SENT_EVENT:
70 return data_seg_sent(tsd, tracker);
71
72 case TcpStreamTracker::TCP_DATA_SEG_RECV_EVENT:
73 return data_seg_recv(tsd, tracker);
74
75 case TcpStreamTracker::TCP_FIN_SENT_EVENT:
76 return fin_sent(tsd, tracker);
77
78 case TcpStreamTracker::TCP_FIN_RECV_EVENT:
79 return fin_recv(tsd, tracker);
80
81 case TcpStreamTracker::TCP_RST_SENT_EVENT:
82 return rst_sent(tsd, tracker);
83
84 case TcpStreamTracker::TCP_RST_RECV_EVENT:
85 return rst_recv(tsd, tracker);
86
87 case TcpStreamTracker::TCP_NO_FLAGS_EVENT:
88 return no_flags(tsd, tracker);
89
90 default:
91 break;
92 }
93
94 assert(false);
95 return false;
96 }
97
98