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