]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
more changes to support tcp sm as flyweight/singleton, delete redundant typecasts...
authordavis mcpherson <davis.mcpherson@gmail.com>
Fri, 1 Apr 2016 19:58:39 +0000 (15:58 -0400)
committerdavis mcpherson <davis.mcpherson@gmail.com>
Mon, 25 Apr 2016 18:28:22 +0000 (14:28 -0400)
use packet helper functions to determine packet direction (client or server)

74 files changed:
src/actions/act_react.cc
src/detection/fp_detect.cc
src/filters/rate_filter.cc
src/filters/sfrf.h
src/ips_options/ips_flow.cc
src/loggers/alert_csv.cc
src/network_inspectors/port_scan/ps_detect.cc
src/protocols/packet.h
src/protocols/packet_manager.cc
src/service_inspectors/dce_rpc/dce_common.h
src/service_inspectors/dce_rpc/dce_tcp.h
src/service_inspectors/dnp3/dnp3.cc
src/service_inspectors/dns/dns.cc
src/service_inspectors/ftp_telnet/ftp.cc
src/service_inspectors/ftp_telnet/ftpp_si.cc
src/service_inspectors/ftp_telnet/telnet.cc
src/service_inspectors/http_inspect/hi_main.cc
src/service_inspectors/http_inspect/hi_si.cc
src/service_inspectors/imap/imap.cc
src/service_inspectors/modbus/modbus_decode.cc
src/service_inspectors/nhttp_inspect/nhttp_inspect.cc
src/service_inspectors/pop/pop.cc
src/service_inspectors/rpc_decode/rpc_decode.cc
src/service_inspectors/smtp/smtp.cc
src/service_inspectors/ssh/ssh.cc
src/service_inspectors/ssl/ssl_inspector.cc
src/service_inspectors/wizard/wizard.cc
src/stream/ip/ip_session.cc
src/stream/libtcp/tcp_segment_descriptor.h
src/stream/libtcp/tcp_state_handler.cc
src/stream/libtcp/tcp_state_handler.h
src/stream/libtcp/tcp_state_machine.cc
src/stream/libtcp/tcp_state_machine.h
src/stream/libtcp/tcp_stream_session.cc
src/stream/libtcp/tcp_stream_tracker.cc
src/stream/libtcp/tcp_stream_tracker.h
src/stream/stream_api.cc
src/stream/tcp/CMakeLists.txt
src/stream/tcp/Makefile.am
src/stream/tcp/tcp_debug_trace.h
src/stream/tcp/tcp_normalizers.cc
src/stream/tcp/tcp_reassembler.cc
src/stream/tcp/tcp_session.cc
src/stream/tcp/tcp_session.h
src/stream/tcp/tcp_state_close_wait.cc
src/stream/tcp/tcp_state_close_wait.h
src/stream/tcp/tcp_state_closed.cc
src/stream/tcp/tcp_state_closed.h
src/stream/tcp/tcp_state_closing.cc
src/stream/tcp/tcp_state_closing.h
src/stream/tcp/tcp_state_established.cc
src/stream/tcp/tcp_state_established.h
src/stream/tcp/tcp_state_fin_wait1.cc
src/stream/tcp/tcp_state_fin_wait1.h
src/stream/tcp/tcp_state_fin_wait2.cc
src/stream/tcp/tcp_state_fin_wait2.h
src/stream/tcp/tcp_state_last_ack.cc
src/stream/tcp/tcp_state_last_ack.h
src/stream/tcp/tcp_state_listen.cc
src/stream/tcp/tcp_state_listen.h
src/stream/tcp/tcp_state_none.cc
src/stream/tcp/tcp_state_none.h
src/stream/tcp/tcp_state_syn_recv.cc
src/stream/tcp/tcp_state_syn_recv.h
src/stream/tcp/tcp_state_syn_sent.cc
src/stream/tcp/tcp_state_syn_sent.h
src/stream/tcp/tcp_state_time_wait.cc
src/stream/tcp/tcp_state_time_wait.h
src/stream/tcp/tcp_stream_state_machine.cc [new file with mode: 0644]
src/stream/tcp/tcp_stream_state_machine.h [new file with mode: 0644]
src/stream/tcp/tcp_tracker.cc
src/stream/tcp/tcp_tracker.h
src/stream/udp/udp_session.cc
src/stream/user/user_session.cc

index 3c0efd9309bd344e54ac3bfc96fb41c8d2a4af41..90364e3dda9a9f988d776c5216b9544f281ed2f5 100644 (file)
@@ -149,7 +149,7 @@ void ReactAction::exec(Packet* p)
 
 void ReactAction::send(Packet* p)
 {
-    EncodeFlags df = (p->packet_flags & PKT_FROM_SERVER) ? ENC_FLAG_FWD : 0;
+    EncodeFlags df = (p->is_from_server()) ? ENC_FLAG_FWD : 0;
     EncodeFlags sent = config->buf_len;
 
     if ( p->packet_flags & PKT_STREAM_EST )
index 914ff8a0e3dd2e18d75434e9494abcad088c91f1..d81849cfdebadc61bf5516c18a8cf603f2d9deee 100644 (file)
@@ -1208,7 +1208,7 @@ static inline bool fpEvalHeaderSvc(Packet* p, OTNX_MATCH_DATA* omd, int proto)
 
     if (proto_ordinal > 0)
     {
-        if (p->packet_flags & PKT_FROM_SERVER) /* to cli */
+        if (p->is_from_server()) /* to cli */
         {
             DebugMessage(DEBUG_ATTRIBUTE, "pkt_from_server\n");
 
@@ -1216,7 +1216,7 @@ static inline bool fpEvalHeaderSvc(Packet* p, OTNX_MATCH_DATA* omd, int proto)
             file = snort_conf->sopgTable->get_port_group(proto, false, SNORT_PROTO_FILE);
         }
 
-        if (p->packet_flags & PKT_FROM_CLIENT) /* to srv */
+        if (p->is_from_client()) /* to srv */
         {
             DebugMessage(DEBUG_ATTRIBUTE, "pkt_from_client\n");
 
index cc30af331cdf6d48bebfbd09935c0f610f2fc95d..9138712c9995e9c52f34e59601b6bbc881982ec0 100644 (file)
@@ -147,7 +147,7 @@ int RateFilter_Test(
     {
         // at present stream connection events are the only internal
         // events and these require: src -> client, dst -> server.
-        if ( p->packet_flags & PKT_FROM_SERVER )
+        if ( p->is_from_server() )
         {
             return SFRF_TestThreshold(
                 snort_conf->rate_filter_config, gid, sid, dip, sip,
index 710e8a18f24f023bef9bf54b5b3dad3ff9fdb80f..1ded56a56c08d2a5a74ce7db35c70b94beb1b6be 100644 (file)
@@ -164,7 +164,7 @@ void SFRF_ShowObjects(RateFilterConfig*);
 
 inline void enable_internal_event(RateFilterConfig* config, uint32_t sid)
 {
-    if (config == NULL)
+    if (config == nullptr)
         return;
 
     config->internal_event_mask |= (1 << sid);
@@ -172,7 +172,7 @@ inline void enable_internal_event(RateFilterConfig* config, uint32_t sid)
 
 inline bool is_internal_event_enabled(RateFilterConfig* config, uint32_t sid)
 {
-    if (config == NULL)
+    if (config == nullptr)
         return false;
 
     return (config->internal_event_mask & (1 << sid));
index fe66347586caef8ed6f406676ffb8300bb3b760c..f542916ac61dbb6fc2efeb6bdec6ed71e1c70de1 100644 (file)
@@ -150,7 +150,7 @@ int FlowCheckOption::eval(Cursor&, Packet* p)
     if (fcd->from_client)
     {
         {
-            if (!p->from_client() && p->from_server())
+            if (!p->is_from_client() && p->is_from_server())
             {
                 // No match on from_client
                 return DETECTION_OPTION_NO_MATCH;
@@ -162,7 +162,7 @@ int FlowCheckOption::eval(Cursor&, Packet* p)
     if (fcd->from_server)
     {
         {
-            if (!p->from_server() && p->from_client())
+            if (!p->is_from_server() && p->is_from_client())
             {
                 // No match on from_server
                 return DETECTION_OPTION_NO_MATCH;
index 9c695314933f36699c34feba004c75402e0f895f..0a008379ab5f7f9dd0c5b871a89dcc5d147f6fb9 100644 (file)
@@ -83,9 +83,9 @@ static void ff_dir(Args& a)
 {
     const char* dir;
 
-    if ( a.pkt->packet_flags & PKT_FROM_CLIENT )
+    if ( a.pkt->is_from_client() )
         dir = "C2S";
-    else if ( a.pkt->packet_flags & PKT_FROM_SERVER )
+    else if ( a.pkt->is_from_server() )
         dir = "S2C";
     else
         dir = "UNK";
index 83e40fd99889ef5b80dc94366f5145949f1d085f..2fa78899f56977b720ed1b9ba9b20a4a98498d10 100644 (file)
@@ -305,7 +305,7 @@ int PortScan::ps_filter_ignore(PS_PKT* ps_pkt)
         /*
         if(!(p->ptrs.tcph->th_flags & TH_RST) &&
            !(p->packet_flags & (PKT_STREAM_EST)) &&
-            (p->packet_flags & PKT_FROM_SERVER))
+            (p->is_from_server()))
         {
             return 1;
         }
@@ -333,7 +333,7 @@ int PortScan::ps_filter_ignore(PS_PKT* ps_pkt)
     /*
     **  Check if the packet is reversed
     */
-    if ((p->packet_flags & PKT_FROM_SERVER))
+    if ((p->is_from_server()))
     {
         reverse_pkt = 1;
     }
@@ -822,7 +822,7 @@ int PortScan::ps_tracker_update_tcp(PS_PKT* ps_pkt, PS_TRACKER* scanner,
         /*
         **  RST packet on unestablished streams
         */
-        else if ((p->packet_flags & PKT_FROM_SERVER) &&
+        else if ((p->is_from_server()) &&
             (p->ptrs.tcph && (p->ptrs.tcph->th_flags & TH_RST)) &&
             (!(p->packet_flags & PKT_STREAM_EST) ||
             (session_flags & SSNFLAG_MIDSTREAM)))
@@ -846,7 +846,7 @@ int PortScan::ps_tracker_update_tcp(PS_PKT* ps_pkt, PS_TRACKER* scanner,
         **  That's why we use the sp, because that's the port that is
         **  open.
         */
-        else if ((p->packet_flags & PKT_FROM_SERVER) &&
+        else if ((p->is_from_server()) &&
             !(p->packet_flags & PKT_STREAM_EST))
         {
             if (scanned)
index 15d7327345761a44a7c384f61521e08bf4319297..d1ace00d8781ba4def2226ce1341e7996f20dfb3 100644 (file)
@@ -249,10 +249,10 @@ struct SO_PUBLIC Packet
         ptrs.reset();
     }
 
-    bool from_client()
+    bool is_from_client() const
     { return (packet_flags & PKT_FROM_CLIENT) != 0; }
 
-    bool from_server()
+    bool is_from_server() const
     { return (packet_flags & PKT_FROM_SERVER) != 0; }
 
     bool is_portscan()
index 42ab618582d4a36649f3f9c8dac3d660281e8149..273f65367519b55aae46bff3a93c472e9006cdd0 100644 (file)
@@ -383,7 +383,7 @@ static inline uint8_t GetTTL(const Packet* const p, bool forward)
     if ( !p->flow )
         return 0;
 
-    if ( p->packet_flags & PKT_FROM_CLIENT )
+    if ( p->is_from_client() )
         dir = forward ? FROM_CLIENT : FROM_SERVER;
     else
         dir = forward ? FROM_SERVER : FROM_CLIENT;
index 6e560249f4290adf5467385659a36926822f0d0a..cc45f694bd0233372f186e221b28ec7dae04054a 100644 (file)
@@ -279,12 +279,12 @@ inline uint16_t DCE2_GcMaxFragLen(dce2CommonProtoConf* config)
 
 inline int DCE2_SsnFromServer(Packet* p)
 {
-    return p->from_server();
+    return p->is_from_server();
 }
 
 inline int DCE2_SsnFromClient(Packet* p)
 {
-    return p->from_client();
+    return p->is_from_client();
 }
 
 inline DCE2_Policy DCE2_SsnGetPolicy(DCE2_SsnData* sd)
index c1375ddd8269f2209b01315fa004da76469a8c90..24f143723ca37c1433404bcd761d851eeb1a92cb 100644 (file)
@@ -102,7 +102,7 @@ inline bool DCE2_TcpAutodetect(Packet* p)
 
         if ((DceRpcCoVersMaj(co_hdr) == DCERPC_PROTO_MAJOR_VERS__5)
             && (DceRpcCoVersMin(co_hdr) == DCERPC_PROTO_MINOR_VERS__0)
-            && ((p->from_client()
+            && ((p->is_from_client()
             && DceRpcCoPduType(co_hdr) == DCERPC_PDU_TYPE__BIND)
             || (DCE2_SsnFromServer(p)
             && DceRpcCoPduType(co_hdr) == DCERPC_PDU_TYPE__BIND_ACK))
@@ -111,7 +111,7 @@ inline bool DCE2_TcpAutodetect(Packet* p)
             return true;
         }
     }
-    else if ((*p->data == DCERPC_PROTO_MAJOR_VERS__5) && p->from_client())
+    else if ((*p->data == DCERPC_PROTO_MAJOR_VERS__5) && p->is_from_client())
     {
         return true;
     }
index 8b1ef97b2b01f8b9cafb6c72348ac458a002798c..fd0f27ae69490a99d478a820b0bf3ed7a6bb8b65 100644 (file)
@@ -176,7 +176,7 @@ static void process_dnp3(dnp3ProtoConf& config, Packet* p)
     p->packet_flags |= PKT_ALLOW_MULTIPLE_DETECT;
 
     /* Set reassembly direction */
-    if (p->packet_flags & PKT_FROM_CLIENT)
+    if (p->is_from_client())
         dnp3_sess->direction = DNP3_CLIENT;
     else
         dnp3_sess->direction = DNP3_SERVER;
index f0e6d5f876f5ffbc479677cc3da9992041ab6993..cfad963644fcf1efe14d96ba54f1d234020664d9 100644 (file)
@@ -1049,7 +1049,7 @@ static void snort_dns(Packet* p)
     }
 
     // Get the direction of the packet.
-    bool from_server = ( (p->packet_flags & PKT_FROM_SERVER ) ? true : false );
+    bool from_server = ( (p->is_from_server() ) ? true : false );
 
 
     // Attempt to get a previously allocated DNS block.
index 2fcf023ee644af5e932fdadf5c7ffd2f4a040732..55cd2cfe244505516a6d5bde59225c3de91d013c 100644 (file)
@@ -164,11 +164,11 @@ static int snort_ftp(Packet* p)
                 }
                 else
                 {
-                    if ( p->packet_flags & PKT_FROM_SERVER )
+                    if ( p->is_from_server() )
                     {
                         iInspectMode = FTPP_SI_SERVER_MODE;
                     }
-                    else if ( p->packet_flags & PKT_FROM_CLIENT )
+                    else if ( p->is_from_client() )
                     {
                         iInspectMode = FTPP_SI_CLIENT_MODE;
                     }
index 11414f3d1be29b7124750166c9d06a28f17bb185..397459c4850f1a213242b2454c9b2e4cdc7d8b86 100644 (file)
@@ -223,8 +223,8 @@ static int FTPInitConf(
      * session, so we can still assume that the initial packet is the client
      * talking.
      */
-    iServerDip = (p->packet_flags & PKT_FROM_CLIENT);
-    iServerSip = (p->packet_flags & PKT_FROM_SERVER);
+    iServerDip = (p->is_from_client());
+    iServerSip = (p->is_from_server());
 
     /*
      * We default to the no FTP traffic case
@@ -501,11 +501,11 @@ int SetSiInput(FTPP_SI_INPUT* SiInput, Packet* p)
     {
         SiInput->pdir = FTPP_SI_NO_MODE;
     }
-    else if (p->packet_flags & PKT_FROM_SERVER)
+    else if (p->is_from_server())
     {
         SiInput->pdir = FTPP_SI_SERVER_MODE;
     }
-    else if (p->packet_flags & PKT_FROM_CLIENT)
+    else if (p->is_from_client())
     {
         SiInput->pdir = FTPP_SI_CLIENT_MODE;
     }
index 5a3db24278b1c653eab7eeb24c3db06590631094..812dedf17cef49606e8552ca8ca6e90b4cbe7336 100644 (file)
@@ -139,11 +139,11 @@ static int snort_telnet(TELNET_PROTO_CONF* GlobalConf, Packet* p)
                 }
                 else
                 {
-                    if ( p->packet_flags & PKT_FROM_SERVER )
+                    if ( p->is_from_server() )
                     {
                         iInspectMode = FTPP_SI_SERVER_MODE;
                     }
-                    else if ( p->packet_flags & PKT_FROM_CLIENT )
+                    else if ( p->is_from_client() )
                     {
                         iInspectMode = FTPP_SI_CLIENT_MODE;
                     }
index fa1813b1216c00698fc58947ccf20979ff51034b..38770ec22466173b7d20db3b1890b03e3d5e2ada 100644 (file)
@@ -374,11 +374,11 @@ static inline int SetSiInput(HI_SI_INPUT* SiInput, Packet* p)
     {
         SiInput->pdir = HI_SI_NO_MODE;
     }
-    else if (p->packet_flags & PKT_FROM_SERVER)
+    else if (p->is_from_server())
     {
         SiInput->pdir = HI_SI_SERVER_MODE;
     }
-    else if (p->packet_flags & PKT_FROM_CLIENT)
+    else if (p->is_from_client())
     {
         SiInput->pdir = HI_SI_CLIENT_MODE;
     }
index adf23b725769b31e66fea8505736f8080edd19ca..4f0ed3654e1b214c3c3873d2e618acd0e6c43205 100644 (file)
@@ -112,8 +112,8 @@ static int InitServerConf(HTTPINSPECT_CONF* GlobalConf,
     **  session, so we can still assume that the initial packet is the client
     **  talking.
     */
-    iServerSip = (p->packet_flags & PKT_FROM_SERVER);
-    iServerDip = (p->packet_flags & PKT_FROM_CLIENT);
+    iServerSip = (p->is_from_server());
+    iServerDip = (p->is_from_client());
 
     /*
     **  We default to the no HTTP traffic case
index 14304562647a29aa90a7fddae0f22113a079fe33..9c0c04f7f1c8fb10c76f51246a2f7c85b5dfa28a 100644 (file)
@@ -294,7 +294,7 @@ static int IMAP_Setup(Packet* p, IMAPData* ssn)
     int pkt_dir;
 
     /* Get the direction of the packet. */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
         pkt_dir = IMAP_PKT_FROM_SERVER;
     else
         pkt_dir = IMAP_PKT_FROM_CLIENT;
index 05db651ae5bf22b40c2263ea24acdb024ca6da0f..4dbe62e5cbf5ac0c6889eed1f147fada9196feee 100644 (file)
@@ -429,7 +429,7 @@ bool ModbusDecode(Packet* p)
 
     /* Read the Modbus payload and check lengths against the expected length for
        each function. */
-    if (p->packet_flags & PKT_FROM_CLIENT)
+    if (p->is_from_client())
         ModbusCheckRequestLengths(&mfd->ssn_data, p);
     else
         ModbusCheckResponseLengths(&mfd->ssn_data, p);
index 27d55119909279a1b269eb93d77829fe6244cf4a..2271c681b4f0deccef1a568cec0c51b3d467198d 100644 (file)
@@ -197,9 +197,9 @@ void NHttpInspect::clear(Packet* p)
 
     if (session_data == nullptr)
         return;
-    assert((p->packet_flags & PKT_FROM_CLIENT) || (p->packet_flags & PKT_FROM_SERVER));
-    assert(!((p->packet_flags & PKT_FROM_CLIENT) && (p->packet_flags & PKT_FROM_SERVER)));
-    SourceId source_id = (p->packet_flags & PKT_FROM_CLIENT) ? SRC_CLIENT : SRC_SERVER;
+    assert((p->is_from_client()) || (p->is_from_server()));
+    assert(!((p->is_from_client()) && (p->is_from_server())));
+    SourceId source_id = (p->is_from_client()) ? SRC_CLIENT : SRC_SERVER;
 
     if (session_data->transaction[source_id] == nullptr)
         return;
index eb77011cf144909659d258ff59912e089bc892d0..03074f37cdb33fe848d7a1e343cdc982ca7ff4c0 100644 (file)
@@ -251,7 +251,7 @@ static int POP_Setup(Packet* p, POPData* ssn)
     int pkt_dir;
 
     /* Get the direction of the packet. */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
         pkt_dir = POP_PKT_FROM_SERVER;
     else
         pkt_dir = POP_PKT_FROM_CLIENT;
index 205d3dc7db925ec9a68bb18af72d6d8a6ddb1e4b..7d2abc9b1c13d2f5dd3083ed698047c703eeef49 100644 (file)
@@ -999,7 +999,7 @@ void RpcDecode::eval(Packet* p)
     // If no 3 way, then the packet flags won't be set, so don't look at it
     // since we won't be able to determeine who's the client and who's the
     // server.
-    if ( !p->from_client() )
+    if ( !p->is_from_client() )
         return;
 
     RpcSsnData* rsdata = nullptr;
index e60f4824a978800334fa65dd2d989662fd309d6a..33c55e549a30f0eb8577db638cc181daf8f18793 100644 (file)
@@ -542,7 +542,7 @@ static int SMTP_Setup(Packet* p, SMTPData* ssn)
     int pkt_dir;
 
     /* Get the direction of the packet. */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
         pkt_dir = SMTP_PKT_FROM_SERVER;
     else
         pkt_dir = SMTP_PKT_FROM_CLIENT;
index f316a069d0031d786fcb59625b7dd7311ee03356..8d722e32eaf6496678a44000407d2c5c7a12e3f5 100644 (file)
@@ -190,7 +190,7 @@ static void snort_ssh(SSH_PROTO_CONF* config, Packet* p)
     uint32_t search_dir_keyinit;
 
     // Get the direction of the packet.
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
     {
         direction = SSH_DIR_FROM_SERVER;
         search_dir_ver = SSH_FLG_SERV_IDSTRING_SEEN;
index 84b4f4f2ff7f6b142da3bc9fe3c5aa1fcd2ce232..94993d3fdd2cbd969cc8ee02e8631a15467b4d82 100644 (file)
@@ -197,10 +197,10 @@ static inline uint32_t SSLPP_process_alert(
 
     /* Need to negate the application flags from the opposing side. */
 
-    if (packet->packet_flags & PKT_FROM_CLIENT)
+    if (packet->is_from_client())
         return ssn_flags & ~SSL_SAPP_FLAG;
 
-    else if (packet->packet_flags & PKT_FROM_SERVER)
+    else if (packet->is_from_server())
         return ssn_flags & ~SSL_CAPP_FLAG;
 
     return ssn_flags;
@@ -317,7 +317,7 @@ static void snort_ssl(SSL_PROTO_CONF* config, Packet* p)
 
     SSL_CLEAR_TEMPORARY_FLAGS(sd->ssn_flags);
 
-    uint8_t dir = (p->packet_flags & PKT_FROM_SERVER) ? 1 : 0;
+    uint8_t dir = (p->is_from_server()) ? 1 : 0;
     uint8_t index = (p->packet_flags & PKT_REBUILT_STREAM) ? 2 : 0;
 
     uint8_t heartbleed_type = 0;
index 57ebe277e269bd4e82e34d9fa4a10902359c5a7c..ea46f84bf1f4ffd6150c065e61f1a7e0dc77bc19 100644 (file)
@@ -188,7 +188,7 @@ void Wizard::eval(Packet* p)
         return;
 
     Wand wand;
-    reset(wand, false, p->packet_flags & PKT_FROM_CLIENT);
+    reset(wand, false, p->is_from_client());
 
     if ( cast_spell(wand, p->flow, p->data, p->dsize) )
         ++tstats.udp_hits;
index f374b870515c2cb1eae053519c0c950f72e03f2a..b312634b66407c080604f4c93f9e128897c304fe 100644 (file)
@@ -96,7 +96,7 @@ static inline void UpdateSession(Packet* p, Flow* lws)
 
     if ( !(lws->ssn_state.session_flags & SSNFLAG_ESTABLISHED) )
     {
-        if ( p->packet_flags & PKT_FROM_CLIENT )
+        if ( p->is_from_client() )
         {
             DebugMessage(DEBUG_STREAM_STATE,
                 "Stream: Updating on packet from client\n");
index 6c09e344296ae85a12e7fe858c700728f7a72cb5..921547c481d0fa18eab817bea68869b63d896302 100644 (file)
@@ -135,7 +135,7 @@ public:
 
     bool is_packet_from_server(void)
     {
-        return pkt->packet_flags & PKT_FROM_SERVER;
+        return pkt->is_from_server();
     }
 
     void slide_segment_in_rcv_window(int32_t offset)
index 68a4a15cecdfd7202eda8e65804e2c4157a8d91c..6bb8bbf50504e003607b0d0e5b3c6b1bd87d5d5a 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "stream_tcp_unit_test.h"
 #endif
 
-TcpStateHandler::TcpStateHandler(TcpStreamTracker::TcpState state, TcpStateMachine& tsm,
-    TcpStreamSession& ssn) : tsm(&tsm), tcp_state(state), session(ssn)
+TcpStateHandler::TcpStateHandler(TcpStreamTracker::TcpState state, TcpStateMachine& tsm)
+    : tsm(&tsm), tcp_state(state)
 {
     tsm.register_state_handler(state, *this);
 }
@@ -49,12 +49,12 @@ TcpStateHandler::~TcpStateHandler()
     // TODO Auto-generated destructor stub
 }
 
-bool TcpStateHandler::do_pre_sm_packet_actions(TcpSegmentDescriptor&)
+bool TcpStateHandler::do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&)
 {
     return true;
 }
 
-bool TcpStateHandler::do_post_sm_packet_actions(TcpSegmentDescriptor&)
+bool TcpStateHandler::do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&)
 {
     return true;
 }
index 7f62bf25394b850c08762e87f3c21c2880694be6..230f9e68695bd2e7a4d94f81aa488b6d4409f2e6 100644 (file)
@@ -24,7 +24,6 @@
 
 #include "protocols/tcp.h"
 #include "tcp_segment_descriptor.h"
-#include "tcp_stream_session.h"
 #include "tcp_stream_tracker.h"
 
 class TcpStateMachine;
@@ -32,7 +31,7 @@ class TcpStateMachine;
 class TcpStateHandler
 {
 public:
-    TcpStateHandler(TcpStreamTracker::TcpState, TcpStateMachine&, TcpStreamSession&);
+    TcpStateHandler(TcpStreamTracker::TcpState, TcpStateMachine&);
     virtual ~TcpStateHandler();
 
     virtual bool eval(TcpSegmentDescriptor&, TcpStreamTracker&);
@@ -62,8 +61,8 @@ public:
         this->tsm = tsm;
     }
 
-    virtual bool do_pre_sm_packet_actions(TcpSegmentDescriptor&);
-    virtual bool do_post_sm_packet_actions(TcpSegmentDescriptor&);
+    virtual bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&);
+    virtual bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&);
 
 protected:
     virtual bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&);
@@ -83,7 +82,6 @@ protected:
 
     const TcpStateMachine* tsm;
     TcpStreamTracker::TcpState tcp_state;
-    TcpStreamSession& session;
     TcpStreamTracker::TcpEvent tcp_event = TcpStreamTracker::TCP_MAX_EVENTS;
 };
 
index ad870b5bf9bf4b279bbf18157fb459fd3c68cf69..e1aebe6ed2d5077405b543443aebbe0f30754280 100644 (file)
@@ -48,14 +48,14 @@ bool TcpStateMachine::eval(TcpSegmentDescriptor& tsd, TcpStreamTracker& talker,
     TcpStreamTracker::TcpState tcp_state = talker.get_tcp_state( );
 
     talker.set_tcp_event(tsd);
-    if ( tcp_state_handlers[ tcp_state ]->do_pre_sm_packet_actions(tsd) )
+    if ( tcp_state_handlers[ tcp_state ]->do_pre_sm_packet_actions(tsd, talker) )
     {
         if ( tcp_state_handlers[ tcp_state ]->eval(tsd, talker) )
         {
             tcp_state = listener.get_tcp_state( );
             listener.set_tcp_event(tsd);
             tcp_state_handlers[ tcp_state ]->eval(tsd, listener);
-            tcp_state_handlers[ tcp_state ]->do_post_sm_packet_actions(tsd);
+            tcp_state_handlers[ tcp_state ]->do_post_sm_packet_actions(tsd, listener);
             return true;
         }
 
index 0c80ab107f4a0b3a30bd9adcf4a1a0390a1078cf..1ce9cad3cf5346cf1361f51fd5e9038260fd9fc2 100644 (file)
 class TcpStateMachine
 {
 public:
-    TcpStateMachine(void);
     virtual ~TcpStateMachine(void);
 
     virtual void register_state_handler(TcpStreamTracker::TcpState, TcpStateHandler&);
     virtual bool eval(TcpSegmentDescriptor&, TcpStreamTracker&, TcpStreamTracker&);
 
-private:
+protected:
+    TcpStateMachine(void);
 
     TcpStateHandler* tcp_state_handlers[ TcpStreamTracker::TCP_MAX_STATES ];
 };
index 9c9f05425621ba5ca3e5e11c75582cc672133cf9..5ac56203689559251a49729f1b9b2194cc8961b2 100644 (file)
@@ -349,7 +349,7 @@ void TcpStreamSession::SetPacketHeaderFoo(const Packet* p)
         egress_index = p->pkth->egress_index;
         egress_group = p->pkth->egress_group;
     }
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
     {
         ingress_index = p->pkth->ingress_index;
         ingress_group = p->pkth->ingress_group;
index 4aedcdbca493dbfc8de7cfc81438cbdc672aa556..f8d47e84e15977a21657a038e0e4d19e2dd5f129 100644 (file)
@@ -55,7 +55,7 @@ TcpStreamTracker::TcpEvent TcpStreamTracker::set_tcp_event(TcpSegmentDescriptor&
     bool talker;
     const tcp::TCPHdr* tcph = tsd.get_tcph();
 
-    if ( tsd.get_pkt()->packet_flags & PKT_FROM_CLIENT )
+    if ( tsd.get_pkt()->is_from_client() )
         talker = ( client_tracker ) ? true : false;
     else
         talker = ( client_tracker ) ? false : true;
index 693caba5edb11d396254d52674760b62e008d1df..7ffc8d16751f494cfa235dab9f2746fb6cde4fa4 100644 (file)
@@ -46,6 +46,7 @@ extern const char* tcp_event_names[];
 
 class TcpNormalizer;
 class TcpReassembler;
+class TcpSession;
 
 class TcpStreamTracker
 {
@@ -371,7 +372,6 @@ public:
     bool rst_pkt_sent = false;
 
 // FIXIT - make these non-public
-
 public:
     uint32_t r_nxt_ack = 0; /* next expected ack from remote side */
     uint32_t r_win_base = 0; /* remote side window base sequence number
@@ -380,6 +380,7 @@ public:
     StreamSplitter* splitter = nullptr;
     TcpNormalizer* normalizer = nullptr;
     TcpReassembler* reassembler = nullptr;
+    TcpSession* session = nullptr;
 
     uint32_t small_seg_count = 0;
     uint8_t alert_count = 0;
index 26d45a3ed1f57ae081ca3935ee14f5d711740791..2827ef59140d3ce59c936e03d6d8d8ea64110e2f 100644 (file)
@@ -560,7 +560,7 @@ static void active_response(Packet* p, Flow* lwssn)
 {
     uint8_t max = snort_conf->max_responses;
 
-    if ( p->packet_flags & PKT_FROM_CLIENT )
+    if ( p->is_from_client() )
         lwssn->session_state |= STREAM_STATE_DROP_CLIENT;
     else
         lwssn->session_state |= STREAM_STATE_DROP_SERVER;
@@ -587,15 +587,15 @@ bool Stream::blocked_session(Flow* flow, Packet* p)
         return false;
 
     if (
-        ((p->packet_flags & PKT_FROM_SERVER) &&
+        ((p->is_from_server()) &&
         (flow->ssn_state.session_flags & SSNFLAG_DROP_SERVER)) ||
 
-        ((p->packet_flags & PKT_FROM_CLIENT) &&
+        ((p->is_from_client()) &&
         (flow->ssn_state.session_flags & SSNFLAG_DROP_CLIENT)) )
     {
         DebugFormat(DEBUG_STREAM_STATE,
             "Blocking %s packet as session was blocked\n",
-            p->packet_flags & PKT_FROM_SERVER ?  "server" : "client");
+            p->is_from_server() ?  "server" : "client");
 
         DisableDetect();
         Active::drop_packet(p);
@@ -607,14 +607,14 @@ bool Stream::blocked_session(Flow* flow, Packet* p)
 
 bool Stream::ignored_session(Flow* flow, Packet* p)
 {
-    if (((p->packet_flags & PKT_FROM_SERVER) &&
+    if (((p->is_from_server()) &&
         (flow->ssn_state.ignore_direction & SSN_DIR_FROM_CLIENT)) ||
-        ((p->packet_flags & PKT_FROM_CLIENT) &&
+        ((p->is_from_client()) &&
         (flow->ssn_state.ignore_direction & SSN_DIR_FROM_SERVER)) )
     {
         DebugFormat(DEBUG_STREAM_STATE,
             "Stream Ignoring packet from %d. Session marked as ignore\n",
-            p->packet_flags & PKT_FROM_CLIENT ? "sender" : "responder");
+            p->is_from_client() ? "sender" : "responder");
 
         DisableInspection();
         return true;
index 11c54b5bf5d804e714a8c1304cf50585c3783150..aa96db558fe1d8eea37cda608421578d568414b6 100644 (file)
@@ -48,6 +48,8 @@ add_library( stream_tcp STATIC
     tcp_state_syn_recv.h
     tcp_state_syn_sent.h
     tcp_state_time_wait.h 
+    tcp_stream_state_machine.cc
+    tcp_stream_state_machine.h
     ips_stream_reassemble.cc
     ips_stream_size.cc
 )
index 1bb48368c7169c1ef1b4c658601258d45f4f4fc1..75324a255669f21dc9cd87578cc70561d4371495 100644 (file)
@@ -28,6 +28,8 @@ tcp_tracker.cc \
 tcp_tracker.h \
 tcp_session.cc \
 tcp_session.h \
+tcp_stream_state_machine.cc \
+tcp_stream_state_machine.h \
 tcp_state_closed.cc \
 tcp_state_close_wait.cc \
 tcp_state_closing.cc \
index 26349023ff571d01f0d74d49e61ad0e7aa6167bd..10cffcdf701e74da79896d61d7c64a352adab7cc 100644 (file)
@@ -113,7 +113,7 @@ inline void TraceTCP(const Packet* p, const Flow* lws, TcpSegmentDescriptor* tsd
     const char* cdir = "?", * sdir = "?";
     uint32_t txd = 0, rxd = 0;
 
-    if (p->packet_flags & PKT_FROM_SERVER)
+    if (p->is_from_server())
     {
         sdir = "SRV>";
         cdir = "CLI<";
@@ -121,7 +121,7 @@ inline void TraceTCP(const Packet* p, const Flow* lws, TcpSegmentDescriptor* tsd
         txd = srv->get_iss();
         rxd = srv->get_irs();
     }
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
     {
         sdir = "SRV<";
         cdir = "CLI>";
index 4c9929334306a7bc962597763fd23e2451630416..71f9548c44e7b736a828b0852051688e5311d61a 100644 (file)
@@ -23,6 +23,7 @@
 #include "tcp_module.h"
 #include "tcp_normalizers.h"
 
+
 class TcpNormalizerFirst : public TcpNormalizer
 {
 public:
@@ -191,77 +192,6 @@ public:
     int handle_repeated_syn(TcpSegmentDescriptor&) override;
 };
 
-TcpNormalizer* TcpNormalizerFactory::create(TcpSession* session, StreamPolicy os_policy,
-    TcpStreamTracker* tracker, TcpStreamTracker* peer)
-{
-    TcpNormalizer* normalizer;
-
-    switch (os_policy)
-    {
-    case StreamPolicy::OS_FIRST:
-        normalizer = new TcpNormalizerFirst(session, tracker);
-        break;
-
-    case StreamPolicy::OS_LAST:
-        normalizer = new TcpNormalizerLast(session, tracker);
-        break;
-
-    case StreamPolicy::OS_LINUX:
-        normalizer = new TcpNormalizerLinux(session, tracker);
-        break;
-
-    case StreamPolicy::OS_OLD_LINUX:
-        normalizer = new TcpNormalizerOldLinux(session, tracker);
-        break;
-
-    case StreamPolicy::OS_BSD:
-        normalizer = new TcpNormalizerBSD(session, tracker);
-        break;
-
-    case StreamPolicy::OS_MACOS:
-        normalizer = new TcpNormalizerMacOS(session, tracker);
-        break;
-
-    case StreamPolicy::OS_SOLARIS:
-        normalizer = new TcpNormalizerSolaris(session, tracker);
-        break;
-
-    case StreamPolicy::OS_IRIX:
-        normalizer = new TcpNormalizerIrix(session, tracker);
-        break;
-
-    case StreamPolicy::OS_HPUX11:
-        normalizer = new TcpNormalizerHpux11(session, tracker);
-        break;
-
-    case StreamPolicy::OS_HPUX10:
-        normalizer = new TcpNormalizerHpux10(session, tracker);
-        break;
-
-    case StreamPolicy::OS_WINDOWS:
-        normalizer = new TcpNormalizerWindows(session, tracker);
-        break;
-
-    case StreamPolicy::OS_WINDOWS2K3:
-        normalizer = new TcpNormalizerWindows2K3(session, tracker);
-        break;
-
-    case StreamPolicy::OS_VISTA:
-        normalizer = new TcpNormalizerVista(session, tracker);
-        break;
-
-    case StreamPolicy::OS_PROXY:
-        normalizer = new TcpNormalizerProxy(session, tracker);
-        break;
-
-    default:
-        normalizer = new TcpNormalizerBSD(session, tracker);
-        break;
-    }
-
-    normalizer->set_peer_tracker(peer);
-    return normalizer;
-}
 
 static inline int handle_repeated_syn_mswin(TcpStreamTracker* talker, TcpStreamTracker* listener,
     TcpSegmentDescriptor& tsd, TcpSession* session)
@@ -528,3 +458,75 @@ int TcpNormalizerProxy::handle_repeated_syn(TcpSegmentDescriptor&)
     return ACTION_NOTHING;
 }
 
+TcpNormalizer* TcpNormalizerFactory::create(TcpSession* session, StreamPolicy os_policy,
+    TcpStreamTracker* tracker, TcpStreamTracker* peer)
+{
+    TcpNormalizer* normalizer;
+
+    switch (os_policy)
+    {
+    case StreamPolicy::OS_FIRST:
+        normalizer = new TcpNormalizerFirst(session, tracker);
+        break;
+
+    case StreamPolicy::OS_LAST:
+        normalizer = new TcpNormalizerLast(session, tracker);
+        break;
+
+    case StreamPolicy::OS_LINUX:
+        normalizer = new TcpNormalizerLinux(session, tracker);
+        break;
+
+    case StreamPolicy::OS_OLD_LINUX:
+        normalizer = new TcpNormalizerOldLinux(session, tracker);
+        break;
+
+    case StreamPolicy::OS_BSD:
+        normalizer = new TcpNormalizerBSD(session, tracker);
+        break;
+
+    case StreamPolicy::OS_MACOS:
+        normalizer = new TcpNormalizerMacOS(session, tracker);
+        break;
+
+    case StreamPolicy::OS_SOLARIS:
+        normalizer = new TcpNormalizerSolaris(session, tracker);
+        break;
+
+    case StreamPolicy::OS_IRIX:
+        normalizer = new TcpNormalizerIrix(session, tracker);
+        break;
+
+    case StreamPolicy::OS_HPUX11:
+        normalizer = new TcpNormalizerHpux11(session, tracker);
+        break;
+
+    case StreamPolicy::OS_HPUX10:
+        normalizer = new TcpNormalizerHpux10(session, tracker);
+        break;
+
+    case StreamPolicy::OS_WINDOWS:
+        normalizer = new TcpNormalizerWindows(session, tracker);
+        break;
+
+    case StreamPolicy::OS_WINDOWS2K3:
+        normalizer = new TcpNormalizerWindows2K3(session, tracker);
+        break;
+
+    case StreamPolicy::OS_VISTA:
+        normalizer = new TcpNormalizerVista(session, tracker);
+        break;
+
+    case StreamPolicy::OS_PROXY:
+        normalizer = new TcpNormalizerProxy(session, tracker);
+        break;
+
+    default:
+        normalizer = new TcpNormalizerBSD(session, tracker);
+        break;
+    }
+
+    normalizer->set_peer_tracker(peer);
+    return normalizer;
+}
+
index 294da31df25752936044a5172a5a61dca5e0a511..9468bb2614c118a9b3654a102cafa49deadf4843 100644 (file)
@@ -623,7 +623,7 @@ void TcpReassembler::prep_s5_pkt(Flow* flow, Packet* p, uint32_t pkt_flags)
     else
     {
         // reverse
-        if (p->packet_flags & PKT_FROM_CLIENT)
+        if (p->is_from_client())
             s5_pkt->packet_flags |= PKT_FROM_SERVER;
         else
             s5_pkt->packet_flags |= PKT_FROM_CLIENT;
@@ -919,9 +919,9 @@ uint32_t TcpReassembler::get_reverse_packet_dir(const Packet* p)
      * is the ACK from the talker and we're flushing packets
      * that actually came from the listener.
      */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
         return PKT_FROM_CLIENT;
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
         return PKT_FROM_SERVER;
 
     return 0;
@@ -929,9 +929,9 @@ uint32_t TcpReassembler::get_reverse_packet_dir(const Packet* p)
 
 uint32_t TcpReassembler::get_forward_packet_dir(const Packet* p)
 {
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
         return PKT_FROM_SERVER;
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
         return PKT_FROM_CLIENT;
 
     return 0;
index b0d5bb8ed73120af18320796b8ac15ab9b3faf65..79e22344a156eb4e2e19f56fbd2d4f05cd310946 100644 (file)
 #include "tcp_module.h"
 #include "tcp_event_logger.h"
 #include "tcp_debug_trace.h"
-
-#include "tcp_state_none.h"
-#include "tcp_state_closed.h"
-#include "tcp_state_listen.h"
-#include "tcp_state_syn_sent.h"
-#include "tcp_state_syn_recv.h"
-#include "tcp_state_established.h"
-#include "tcp_state_close_wait.h"
-#include "tcp_state_closing.h"
-#include "tcp_state_fin_wait1.h"
-#include "tcp_state_fin_wait2.h"
-#include "tcp_state_last_ack.h"
-#include "tcp_state_time_wait.h"
-
 #include "tcp_normalizers.h"
 #include "tcp_reassemblers.h"
+#include "tcp_stream_state_machine.h"
 #include "tcp_session.h"
 
 DEBUG_WRAP(const char* t_name = NULL; const char* l_name = NULL; )
 
 TcpSession::TcpSession(Flow* flow) : TcpStreamSession(flow)
 {
-    client = new TcpTracker(true);
-    server = new TcpTracker(false);
-
-    // initialize stream tracker state machine...
-    new TcpStateNone(tsm, *this);
-    new TcpStateClosed(tsm, *this);
-    new TcpStateListen(tsm, *this);
-    new TcpStateSynSent(tsm, *this);
-    new TcpStateSynRecv(tsm, *this);
-    new TcpStateEstablished(tsm, *this);
-    new TcpStateFinWait1(tsm, *this);
-    new TcpStateFinWait2(tsm, *this);
-    new TcpStateClosing(tsm, *this);
-    new TcpStateCloseWait(tsm, *this);
-    new TcpStateLastAck(tsm, *this);
-    new TcpStateTimeWait(tsm, *this);
+    tsm = TcpStreamStateMachine::get_instance();
+    client = new TcpTracker(true, this);
+    server = new TcpTracker(false, this);
 }
 
 TcpSession::~TcpSession(void)
@@ -152,7 +126,7 @@ void TcpSession::restart(Packet* p)
 
     TcpStreamTracker* talker, * listener;
 
-    if (p->packet_flags & PKT_FROM_SERVER)
+    if (p->is_from_server())
     {
         talker = server;
         listener = client;
@@ -736,7 +710,7 @@ void TcpSession::check_for_session_hijack(TcpSegmentDescriptor& tsd)
 
             if ( t_hijack )
             {
-                if ( p->packet_flags & PKT_FROM_CLIENT )
+                if ( p->is_from_client() )
                     event_code |= EVENT_SESSION_HIJACK_CLIENT;
                 else
                     event_code |= EVENT_SESSION_HIJACK_SERVER;
@@ -744,7 +718,7 @@ void TcpSession::check_for_session_hijack(TcpSegmentDescriptor& tsd)
 
             if ( l_hijack )
             {
-                if ( p->packet_flags & PKT_FROM_CLIENT )
+                if ( p->is_from_client() )
                     event_code |= EVENT_SESSION_HIJACK_SERVER;
                 else
                     event_code |= EVENT_SESSION_HIJACK_CLIENT;
@@ -769,7 +743,7 @@ bool TcpSession::check_for_window_slam(TcpSegmentDescriptor& tsd)
         pkt_action_mask |= ACTION_BAD_PKT;
         return true;
     }
-    else if ((tsd.get_pkt()->packet_flags & PKT_FROM_CLIENT)
+    else if ((tsd.get_pkt()->is_from_client())
         && (tsd.get_seg_wnd() <= SLAM_MAX)
         && (tsd.get_seg_ack() == listener->get_iss() + 1)
         && !( tsd.get_tcph()->is_fin() | tsd.get_tcph()->is_rst() )
@@ -919,14 +893,14 @@ void TcpSession::flush_listener(Packet* p)
 
     /* figure out direction of this packet -- we should've already
      * looked at it, so the packet_flags are already set. */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
     {
         DebugMessage(DEBUG_STREAM_STATE, "Flushing listener on packet from server\n");
         listener = client;
         /* dir of flush is the data from the opposite side */
         dir = PKT_FROM_SERVER;
     }
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
     {
         DebugMessage(DEBUG_STREAM_STATE, "Flushing listener on packet from client\n");
         listener = server;
@@ -951,14 +925,14 @@ void TcpSession::flush_talker(Packet* p)
 
     /* figure out direction of this packet -- we should've already
      * looked at it, so the packet_flags are already set. */
-    if ( p->packet_flags & PKT_FROM_SERVER )
+    if ( p->is_from_server() )
     {
         DebugMessage(DEBUG_STREAM_STATE, "Flushing talker on packet from server\n");
         talker = server;
         /* dir of flush is the data from the opposite side */
         dir = PKT_FROM_CLIENT;
     }
-    else if ( p->packet_flags & PKT_FROM_CLIENT )
+    else if ( p->is_from_client() )
     {
         DebugMessage(DEBUG_STREAM_STATE, "Flushing talker on packet from client\n");
         talker = client;
@@ -1027,7 +1001,7 @@ void TcpSession::do_packet_analysis_post_checks(Packet* p)
 
         DebugFormat(DEBUG_STREAM_STATE,
             "Stream Ignoring packet from %d. Session marked as ignore\n",
-            p->packet_flags & PKT_FROM_SERVER ? "server" : "client");
+            p->is_from_server() ? "server" : "client");
     }
 }
 
@@ -1087,7 +1061,7 @@ bool TcpSession::do_packet_analysis_pre_checks(Packet* p, TcpSegmentDescriptor&
     pkt_action_mask = ACTION_NOTHING;
     tel.clear_tcp_events();
     // process thru state machine...talker first
-    if (p->packet_flags & PKT_FROM_CLIENT)
+    if (p->is_from_client())
     {
         update_session_on_client_packet(tsd);
         DEBUG_WRAP(t_name = "Server"; l_name = "Client");
@@ -1159,7 +1133,7 @@ int TcpSession::process(Packet* p)
     {
         Profile profile(s5TcpStatePerfStats);
 
-        if ( tsm.eval(tsd, *talker, *listener) )
+        if ( tsm->eval(tsd, *talker, *listener) )
         {
             do_packet_analysis_post_checks(p);
             S5TraceTCP(p, flow, &tsd, 0);
index c1c9109494b6a7f059e8936fc81fe1de918df500..cd033e56b223ef831ae62f19275117ab6e058b46 100644 (file)
@@ -35,9 +35,6 @@
 
 class TcpEventLogger;
 
-// FIXIT-L session tracking must be split from reassembly
-// into a separate module a la ip_session.cc and ip_defrag.cc
-// (of course defrag should also be cleaned up)
 class TcpSession : public TcpStreamSession
 {
 public:
@@ -93,7 +90,7 @@ private:
     void do_packet_analysis_post_checks(Packet*);
 
 
-    TcpStateMachine tsm;
+    TcpStateMachine* tsm;
 };
 
 #endif
index 84c815117aef52bd5f3b3093817ff6e92501b609..96eb85f0f813056e4244d03751de27618cf98b12 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateCloseWait::TcpStateCloseWait(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_CLOSE_WAIT, tsm, ssn)
+TcpStateCloseWait::TcpStateCloseWait(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_CLOSE_WAIT, tsm)
 {
 }
 
@@ -41,144 +41,121 @@ TcpStateCloseWait::~TcpStateCloseWait()
 {
 }
 
-bool TcpStateCloseWait::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
 
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
-    session.handle_data_segment(tsd);
+    trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_on_fin_sent(tsd);
     trk.set_tcp_state(TcpStreamTracker::TCP_LAST_ACK);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_GEQ(tsd.get_seg_seq(), trk.get_fin_final_seq() ) )
     {
         DebugMessage(DEBUG_STREAM_STATE, "FIN beyond previous, ignoring\n");
-        session.tel.set_tcp_event(EVENT_BAD_FIN);
+        trk.session->tel.set_tcp_event(EVENT_BAD_FIN);
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
     else
     {
         if ( !flow->two_way_traffic() )
             trk.set_tf_flags(TF_FORCE_FLUSH);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateCloseWait::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, true);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, true);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateCloseWait::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateCloseWait::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateCloseWait::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateCloseWait::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     return true;
 }
index 3d28aa076fbfca035749f5d4dd27615750b1876f..de99b24455dec5671cddac334811372fb4133a87 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateCloseWait : public TcpStateHandler
 {
 public:
-    TcpStateCloseWait(TcpStateMachine&, TcpSession&);
+    TcpStateCloseWait(TcpStateMachine&);
     virtual ~TcpStateCloseWait(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index c378e884a0e8991675f71a91f83370dee2c28673..b7426419f0ac4c0a0cd3cc09a8956687f2cda1fc 100644 (file)
@@ -32,8 +32,8 @@
 #include "stream/libtcp/stream_tcp_unit_test.h"
 #endif
 
-TcpStateClosed::TcpStateClosed(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_CLOSED, tsm, ssn)
+TcpStateClosed::TcpStateClosed(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_CLOSED, tsm)
 {
 }
 
@@ -45,7 +45,7 @@ bool TcpStateClosed::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& track
 {
     auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
@@ -55,7 +55,7 @@ bool TcpStateClosed::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& track
     auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
-    flow->set_expire(tsd.get_pkt(), session.config->session_timeout);
+    flow->set_expire(tsd.get_pkt(), trk.session->config->session_timeout);
 
     return default_state_action(tsd, trk);
 }
@@ -102,14 +102,14 @@ bool TcpStateClosed::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker&
     if ( flow->get_session_flags() & SSNFLAG_RESET )
     {
         if ( trk.is_rst_pkt_sent() )
-            session.tel.set_tcp_event(EVENT_DATA_AFTER_RESET);
+            trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RESET);
         else
-            session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+            trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
     }
     else
-        session.tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
+        trk.session->tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
 
-    session.mark_packet_for_drop(tsd);
+    trk.session->mark_packet_for_drop(tsd);
 
     return default_state_action(tsd, trk);
 }
@@ -141,9 +141,9 @@ bool TcpStateClosed::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& track
     if( tsd.get_seg_len() > 0 )
     {
         if ( trk.is_rst_pkt_sent() )
-            session.tel.set_tcp_event(EVENT_DATA_AFTER_RESET);
+            trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RESET);
         else
-            session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+            trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
     }
 
     return default_state_action(tsd, trk);
@@ -162,40 +162,40 @@ bool TcpStateClosed::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& track
 
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosed::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateClosed::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateClosed::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateClosed::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     if ( tcp_event != TcpStreamTracker::TCP_FIN_RECV_EVENT )
     {
-        TcpStreamTracker::TcpState talker_state = session.get_talker_state();
+        TcpStreamTracker::TcpState talker_state = trk.session->get_talker_state();
         Flow* flow = tsd.get_flow();
 
         if ( ( talker_state == TcpStreamTracker::TCP_TIME_WAIT ) || !flow->two_way_traffic() )
         {
             // The last ACK is a part of the session. Delete the session after processing is
             // complete.
-            session.clear_session(false, true, false, tsd.get_pkt() );
+            trk.session->clear_session(false, true, false, tsd.get_pkt() );
             flow->session_state |= STREAM_STATE_CLOSED;
-            session.set_pkt_action_flag(ACTION_LWSSN_CLOSED);
+            trk.session->set_pkt_action_flag(ACTION_LWSSN_CLOSED);
         }
     }
 
index 13c556433f51d1af09235e37f21cf69996ee842c..f95bf51f9d40104829c3545c24df88dec79414b3 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateClosed : public TcpStateHandler
 {
 public:
-    TcpStateClosed(TcpStateMachine&, TcpSession&);
+    TcpStateClosed(TcpStateMachine&);
     virtual ~TcpStateClosed(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 54e462137a22c4720fb34add8e81477fb977af8d..ab8020a9416198951d1a280664fdb2737b7fb977 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateClosing::TcpStateClosing(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_CLOSING, tsm, ssn)
+TcpStateClosing::TcpStateClosing(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_CLOSING, tsm)
 {
 }
 
@@ -41,53 +41,41 @@ TcpStateClosing::~TcpStateClosing()
 {
 }
 
-bool TcpStateClosing::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_GEQ(tsd.get_end_seq(), trk.r_nxt_ack) )
         trk.set_tcp_state(TcpStreamTracker::TCP_TIME_WAIT);
@@ -95,19 +83,15 @@ bool TcpStateClosing::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trac
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_GEQ(tsd.get_end_seq(), trk.r_nxt_ack) )
         trk.set_tcp_state(TcpStreamTracker::TCP_TIME_WAIT);
@@ -115,27 +99,24 @@ bool TcpStateClosing::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker&
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_GEQ(tsd.get_seg_seq(), trk.get_fin_final_seq() ) )
     {
         DebugMessage(DEBUG_STREAM_STATE, "FIN beyond previous, ignoring\n");
-        session.tel.set_tcp_event(EVENT_BAD_FIN);
+        trk.session->tel.set_tcp_event(EVENT_BAD_FIN);
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
 
     if ( !flow->two_way_traffic() )
@@ -147,40 +128,36 @@ bool TcpStateClosing::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trac
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateClosing::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, true);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, true);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateClosing::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateClosing::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateClosing::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateClosing::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     return true;
 }
index 7aa1821148b866346b41ff5cd4816e0b84f4b956..c63523b39c8944c567f0ea487e6b61e31e5e2378 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateClosing : public TcpStateHandler
 {
 public:
-    TcpStateClosing(TcpStateMachine&, TcpSession&);
+    TcpStateClosing(TcpStateMachine&);
     virtual ~TcpStateClosing(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 2d41bae4c1a4fabc29eca2cad1b78f3fb62210f5..77b2b02645bdfe9e09b37a198c3515e3623e8a31 100644 (file)
@@ -25,8 +25,8 @@
 #include "tcp_normalizer.h"
 #include "tcp_state_established.h"
 
-TcpStateEstablished::TcpStateEstablished(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_ESTABLISHED, tsm, ssn)
+TcpStateEstablished::TcpStateEstablished(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_ESTABLISHED, tsm)
 {
 }
 
@@ -34,152 +34,127 @@ TcpStateEstablished::~TcpStateEstablished()
 {
 }
 
-bool TcpStateEstablished::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt()) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt()) )
     {
-        session.update_session_on_syn_ack( );
+        trk.session->update_session_on_syn_ack( );
     }
 
     if ( trk.is_server_tracker() )
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
-    session.handle_data_segment(tsd);
+    trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_on_fin_sent(tsd);
-    session.eof_handle(tsd.get_pkt());
+    trk.session->eof_handle(tsd.get_pkt());
     trk.set_tcp_state(TcpStreamTracker::TCP_FIN_WAIT1);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( tsd.get_seg_len() > 0 )
     {
-        session.handle_data_segment(tsd);
+        trk.session->handle_data_segment(tsd);
         trk.flush_data_on_fin_recv(tsd);
     }
     trk.update_on_fin_recv(tsd);
-    session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+    trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
     trk.set_tcp_state(TcpStreamTracker::TCP_CLOSE_WAIT);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateEstablished::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateEstablished::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateEstablished::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateEstablished::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateEstablished::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     return true;
 }
index 8261ca663302891f803c4f72f9f153e43e4f5bec..b57900fcce6a3974540ce244df6ef0a19c74e7cc 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateEstablished : public TcpStateHandler
 {
 public:
-    TcpStateEstablished(TcpStateMachine&, TcpSession&);
+    TcpStateEstablished(TcpStateMachine&);
     virtual ~TcpStateEstablished(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 1f920d262c479ddcb0da133d076c9d81598a4465..67c4192fac08944d3c94a92ec4372c16ca45c4d1 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateFinWait1::TcpStateFinWait1(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_FIN_WAIT1, tsm, ssn)
+TcpStateFinWait1::TcpStateFinWait1(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_FIN_WAIT1, tsm)
 {
 }
 
@@ -41,97 +41,78 @@ TcpStateFinWait1::~TcpStateFinWait1()
 {
 }
 
-bool TcpStateFinWait1::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     check_for_window_slam(tsd, trk);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( check_for_window_slam(tsd, trk) )
     {
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
     trk.update_tracker_ack_recv(tsd);
@@ -141,7 +122,7 @@ bool TcpStateFinWait1::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tra
     {
         //session.handle_fin_recv_in_fw1(tsd);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
 
         if ( !flow->two_way_traffic() )
             trk.set_tf_flags(TF_FORCE_FLUSH);
@@ -152,31 +133,27 @@ bool TcpStateFinWait1::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tra
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait1::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait1::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, true);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, true);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
@@ -191,12 +168,12 @@ bool TcpStateFinWait1::check_for_window_slam(TcpSegmentDescriptor& tsd, TcpStrea
         if ( (trk.normalizer->get_os_policy() == StreamPolicy::OS_WINDOWS)
             && (tsd.get_seg_wnd() == 0))
         {
-            session.tel.set_tcp_event(EVENT_WINDOW_SLAM);
+            trk.session->tel.set_tcp_event(EVENT_WINDOW_SLAM);
             inc_tcp_discards();
 
             if (trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK))
             {
-                session.set_pkt_action_flag(ACTION_BAD_PKT);
+                trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
                 return false;
             }
         }
@@ -207,15 +184,15 @@ bool TcpStateFinWait1::check_for_window_slam(TcpSegmentDescriptor& tsd, TcpStrea
     return true;
 }
 
-bool TcpStateFinWait1::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateFinWait1::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateFinWait1::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateFinWait1::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
     return true;
 }
 
index 1f026625b5f2c0141bf6b06617b6a629b32bc58f..feaf0b7a9243ec1e452bdf853785a3994038608e 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateFinWait1 : public TcpStateHandler
 {
 public:
-    TcpStateFinWait1(TcpStateMachine&, TcpSession&);
+    TcpStateFinWait1(TcpStateMachine&);
     virtual ~TcpStateFinWait1(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
 private:
     bool check_for_window_slam(TcpSegmentDescriptor&, TcpStreamTracker&);
index 08a915304c1698c087064911a66f1088afe9de05..cb75a85c26d7ed9ddb4e16008dd454976ac4dd06 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateFinWait2::TcpStateFinWait2(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_FIN_WAIT2, tsm, ssn)
+TcpStateFinWait2::TcpStateFinWait2(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_FIN_WAIT2, tsm)
 {
 }
 
@@ -41,61 +41,49 @@ TcpStateFinWait2::~TcpStateFinWait2()
 {
 }
 
-bool TcpStateFinWait2::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( SEQ_GT(tsd.get_seg_ack(), trk.get_snd_nxt() ) )
     {
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.tel.set_tcp_event(EVENT_BAD_ACK);
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->tel.set_tcp_event(EVENT_BAD_ACK);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
     else
         trk.update_tracker_ack_recv(tsd);
@@ -103,54 +91,47 @@ bool TcpStateFinWait2::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tra
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
     // data on a segment when we shouldn't be sending data any more alert!
-    session.tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
-    session.mark_packet_for_drop(tsd);
+    trk.session->tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
+    trk.session->mark_packet_for_drop(tsd);
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( SEQ_GT(tsd.get_seg_ack(), trk.get_snd_nxt() ) )
     {
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.tel.set_tcp_event(EVENT_BAD_ACK);
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->tel.set_tcp_event(EVENT_BAD_ACK);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
     else
     {
         trk.update_tracker_ack_recv(tsd);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
     trk.update_tracker_ack_recv(tsd);
     trk.update_on_fin_recv(tsd);
 
     if ( tsd.get_seg_len() > 0 )
-        session.handle_data_segment(tsd);
+        trk.session->handle_data_segment(tsd);
 
     if ( !flow->two_way_traffic() )
         trk.set_tf_flags(TF_FORCE_FLUSH);
@@ -160,40 +141,36 @@ bool TcpStateFinWait2::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tra
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateFinWait2::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, true);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, true);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateFinWait2::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateFinWait2::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateFinWait2::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateFinWait2::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
     return true;
 }
 
index 41e17324e42ae3a31cca4af58aa0f2efc737d78f..ef5695c0e47ca4a4bc893496c4cb62fc3fa4a50d 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateFinWait2 : public TcpStateHandler
 {
 public:
-    TcpStateFinWait2(TcpStateMachine&, TcpSession&);
+    TcpStateFinWait2(TcpStateMachine&);
     virtual ~TcpStateFinWait2(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 4c565827a855d1b1e1146a0b385dc402e8c82be8..31c683841da5f97bcb6b5ff1e441e78211794cd0 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateLastAck::TcpStateLastAck(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_LAST_ACK, tsm, ssn)
+TcpStateLastAck::TcpStateLastAck(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_LAST_ACK, tsm)
 {
 }
 
@@ -41,53 +41,41 @@ TcpStateLastAck::~TcpStateLastAck()
 {
 }
 
-bool TcpStateLastAck::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_EQ(tsd.get_seg_ack(), trk.get_snd_nxt() ) )
         trk.set_tcp_state(TcpStreamTracker::TCP_CLOSED);
@@ -95,19 +83,15 @@ bool TcpStateLastAck::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trac
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_EQ(tsd.get_seg_ack(), trk.get_snd_nxt() ) )
         trk.set_tcp_state(TcpStreamTracker::TCP_CLOSED);
@@ -115,18 +99,15 @@ bool TcpStateLastAck::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker&
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     Flow* flow = tsd.get_flow();
 
     trk.update_tracker_ack_recv(tsd);
@@ -139,49 +120,45 @@ bool TcpStateLastAck::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trac
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateLastAck::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateLastAck::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateLastAck::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateLastAck::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateLastAck::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
-    if ( ( session.get_listener_state() == TcpStreamTracker::TCP_CLOSED ) &&
+    if ( ( trk.session->get_listener_state() == TcpStreamTracker::TCP_CLOSED ) &&
         ( tcp_event != TcpStreamTracker::TCP_FIN_RECV_EVENT ) )
     {
-        TcpStreamTracker::TcpState talker_state = session.get_talker_state();
+        TcpStreamTracker::TcpState talker_state = trk.session->get_talker_state();
         Flow* flow = tsd.get_flow();
 
         if ( ( talker_state == TcpStreamTracker::TCP_TIME_WAIT )
@@ -189,9 +166,9 @@ bool TcpStateLastAck::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
         {
             // The last ACK is a part of the session. Delete the session after processing is
             // complete.
-            session.clear_session(false, true, false, tsd.get_pkt() );
+            trk.session->clear_session(false, true, false, tsd.get_pkt() );
             flow->session_state |= STREAM_STATE_CLOSED;
-            session.set_pkt_action_flag(ACTION_LWSSN_CLOSED);
+            trk.session->set_pkt_action_flag(ACTION_LWSSN_CLOSED);
         }
     }
 
index 7cef7243d95449507302d6ab47e3628f3f00752f..c5bc6bc133cb4dec500c23b5f62d2d3baf39cbe7 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateLastAck : public TcpStateHandler
 {
 public:
-    TcpStateLastAck(TcpStateMachine&, TcpSession&);
+    TcpStateLastAck(TcpStateMachine&);
     virtual ~TcpStateLastAck(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 9eb3860e877e4de5c6299b6714b495be753ebaf1..2085379f7b0a3fdbdf10dedf48f3b6368641719b 100644 (file)
@@ -25,8 +25,8 @@
 #include "tcp_normalizer.h"
 #include "tcp_state_listen.h"
 
-TcpStateListen::TcpStateListen(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_LISTEN, tsm, ssn)
+TcpStateListen::TcpStateListen(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_LISTEN, tsm)
 {
 }
 
@@ -34,80 +34,71 @@ TcpStateListen::~TcpStateListen()
 {
 }
 
-bool TcpStateListen::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->require_3whs() || tsd.has_wscale() || ( tsd.get_seg_len() > 0 ) )
+    if ( trk.session->config->require_3whs() || tsd.has_wscale() || ( tsd.get_seg_len() > 0 ) )
     {
         // FIXIT - do we need this check? only server goes into Listen state...
-        if ( tsd.get_pkt()->packet_flags & PKT_FROM_SERVER )
-            session.tel.set_tcp_event(EVENT_4WHS);
+        if ( tsd.get_pkt()->is_from_server() )
+            trk.session->tel.set_tcp_event(EVENT_4WHS);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.init_on_syn_recv(tsd);
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
-    session.set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
+    trk.session->set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
     if ( tsd.get_seg_len() > 0 )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     flow->session_state |= ( STREAM_STATE_SYN | STREAM_STATE_SYN_ACK );
 
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         trk.init_on_synack_sent(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
-        session.init_new_tcp_session(tsd);
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
+        trk.session->init_new_tcp_session(tsd);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( !session.config->require_3whs() || session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( !trk.session->config->require_3whs() || trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         trk.init_on_synack_recv(tsd);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
-        ( tsd.get_seg_len() > 0 ) ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() )
+            && ( tsd.has_wscale() || ( tsd.get_seg_len() > 0 ) ) )
     {
         Flow* flow = tsd.get_flow();
 
@@ -116,47 +107,43 @@ bool TcpStateListen::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& track
         flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_SYN_ACK |
             STREAM_STATE_ESTABLISHED );
         trk.init_on_3whs_ack_sent(tsd);
-        session.init_new_tcp_session(tsd);
-        session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+        trk.session->init_new_tcp_session(tsd);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
-        ( tsd.get_seg_len() > 0 ) ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() )
+            && ( tsd.has_wscale() || ( tsd.get_seg_len() > 0 ) ) )
     {
         Flow* flow = tsd.get_flow();
 
         if ( !tsd.get_tcph()->is_rst() && ( flow->session_state & STREAM_STATE_SYN_ACK ) )
         {
             trk.init_on_3whs_ack_recv(tsd);
-            trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+            trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
         }
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         Flow* flow = tsd.get_flow();
 
@@ -164,91 +151,81 @@ bool TcpStateListen::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker&
         flow->set_session_flags(SSNFLAG_MIDSTREAM);
 
         trk.init_on_data_seg_sent(tsd);
-        session.init_new_tcp_session(tsd);
+        trk.session->init_new_tcp_session(tsd);
 
         if ( flow->session_state & STREAM_STATE_ESTABLISHED )
-            session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+            trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         Flow* flow = tsd.get_flow();
 
         flow->session_state |= STREAM_STATE_MIDSTREAM;
         flow->set_session_flags(SSNFLAG_MIDSTREAM);
         trk.init_on_data_seg_recv(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
-        session.handle_data_segment(tsd);
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
+        trk.session->handle_data_segment(tsd);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         // FIXIT - handle this
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateListen::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateListen::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.normalizer->trim_rst_payload(tsd);
 
     return default_state_action(tsd, trk);
index a430d8ab13945f648e158d918866917b22badd09..fe86fbe5a3fec78adb792aa2b8c48f46aa14ba14 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateListen : public TcpStateHandler
 {
 public:
-    TcpStateListen(TcpStateMachine&, TcpSession&);
+    TcpStateListen(TcpStateMachine&);
     virtual ~TcpStateListen(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
index 2fcf37942c52fc42b104bc28a3b9e8fcc380abe5..b14e6ab0d526264174d32556eb6b7ba97822edad 100644 (file)
@@ -32,8 +32,8 @@
 #include "stream/libtcp/stream_tcp_unit_test.h"
 #endif
 
-TcpStateNone::TcpStateNone(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_STATE_NONE, tsm, ssn)
+TcpStateNone::TcpStateNone(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_STATE_NONE, tsm)
 {
 }
 
@@ -41,74 +41,66 @@ TcpStateNone::~TcpStateNone()
 {
 }
 
-bool TcpStateNone::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     flow->ssn_state.direction = FROM_CLIENT;
 
     flow->session_state |= STREAM_STATE_SYN;
     trk.init_on_syn_sent(tsd);
-    session.init_new_tcp_session(tsd);
+    trk.session->init_new_tcp_session(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     // FIXIT - syn received on undefined client, figure this out and do the right thing
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
-    if ( !session.config->require_3whs() || session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( !trk.session->config->require_3whs() || trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         flow->session_state |= ( STREAM_STATE_SYN | STREAM_STATE_SYN_ACK );
         trk.init_on_synack_sent(tsd);
-        session.init_new_tcp_session(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+        trk.session->init_new_tcp_session(tsd);
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         trk.init_on_synack_recv(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
         ( tsd.get_seg_len() > 0 ) ) )
     {
         Flow* flow = tsd.get_flow();
@@ -118,23 +110,21 @@ bool TcpStateNone::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker
         flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_SYN_ACK |
             STREAM_STATE_ESTABLISHED );
         trk.init_on_3whs_ack_sent(tsd);
-        session.init_new_tcp_session(tsd);
-        session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+        trk.session->init_new_tcp_session(tsd);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) && ( tsd.has_wscale() ||
         ( tsd.get_seg_len() > 0 ) ) )
     {
         Flow* flow = tsd.get_flow();
@@ -142,23 +132,21 @@ bool TcpStateNone::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker
         if ( !tsd.get_tcph()->is_rst() && ( flow->session_state & STREAM_STATE_SYN_ACK ) )
         {
             trk.init_on_3whs_ack_recv(tsd);
-            trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+            trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
         }
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         Flow* flow = tsd.get_flow();
 
@@ -166,25 +154,23 @@ bool TcpStateNone::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tr
         flow->set_session_flags(SSNFLAG_MIDSTREAM);
 
         trk.init_on_data_seg_sent(tsd);
-        session.init_new_tcp_session(tsd);
+        trk.session->init_new_tcp_session(tsd);
 
         if ( flow->session_state & STREAM_STATE_ESTABLISHED )
-            session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+            trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         Flow* flow = tsd.get_flow();
 
@@ -192,57 +178,51 @@ bool TcpStateNone::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tr
         flow->set_session_flags(SSNFLAG_MIDSTREAM);
 
         trk.init_on_data_seg_recv(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
-        session.handle_data_segment(tsd);
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
+        trk.session->handle_data_segment(tsd);
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         // FIXIT - handle this
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         // FIXIT - handle this
     }
-    else if ( session.config->require_3whs() )
+    else if ( trk.session->config->require_3whs() )
     {
-        session.generate_no_3whs_event();
+        trk.session->generate_no_3whs_event();
         return false;
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt() ) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt() ) )
     {
         // FIXIT - handle this
     }
@@ -250,19 +230,17 @@ bool TcpStateNone::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateNone::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateNone::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     return default_state_action(tsd, trk);
index d139021d25802d495eba163da5724a19bc33af9c..945107055e623043bb606291d90153fe517de0aa 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateNone : public TcpStateHandler
 {
 public:
-    TcpStateNone(TcpStateMachine&, TcpSession&);
+    TcpStateNone(TcpStateMachine&);
     virtual ~TcpStateNone(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
index 5ca34d4576a6a09ff9aa6abec27bf76d7b6d744b..a3a96bff039eb0d3ad51d630e5cc3358359acef7 100644 (file)
@@ -28,8 +28,8 @@ using namespace std;
 #include "tcp_normalizer.h"
 #include "tcp_state_syn_recv.h"
 
-TcpStateSynRecv::TcpStateSynRecv(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_SYN_RECV, tsm, ssn)
+TcpStateSynRecv::TcpStateSynRecv(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_SYN_RECV, tsm)
 {
 }
 
@@ -37,174 +37,153 @@ TcpStateSynRecv::~TcpStateSynRecv()
 {
 }
 
-bool TcpStateSynRecv::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     trk.finish_server_init(tsd);
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
-    session.update_timestamp_tracking(tsd);
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
+    trk.session->update_timestamp_tracking(tsd);
     if ( tsd.get_tcph()->are_flags_set(TH_ECE) &&
         ( flow->get_session_flags() & SSNFLAG_ECN_CLIENT_QUERY ) )
         flow->set_session_flags(SSNFLAG_ECN_SERVER_REPLY);
 
-    if ( tsd.get_pkt()->packet_flags & PKT_FROM_SERVER )
+    if ( tsd.get_pkt()->is_from_server() )
     {
         flow->set_session_flags(SSNFLAG_SEEN_SERVER);
-        session.tel.set_tcp_event(EVENT_4WHS);
+        trk.session->tel.set_tcp_event(EVENT_4WHS);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     // FIXIT - verify ack being sent is valid...
     trk.finish_server_init(tsd);
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     flow->session_state |= STREAM_STATE_SYN_ACK;
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.is_ack_valid(tsd.get_seg_ack() ) )
     {
         Flow* flow = tsd.get_flow();
 
         trk.update_tracker_ack_recv(tsd);
-        trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+        trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
         flow->set_session_flags(SSNFLAG_ESTABLISHED);
         flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_ESTABLISHED );
-        session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
         trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
         if ( tsd.get_seg_len() )
-            session.handle_data_on_syn(tsd);
+            trk.session->handle_data_on_syn(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    if ( session.config->midstream_allowed(tsd.get_pkt()) )
+    if ( trk.session->config->midstream_allowed(tsd.get_pkt()) )
     {
-        session.update_session_on_ack( );
+        trk.session->update_session_on_ack( );
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.is_ack_valid(tsd.get_seg_ack() ) )
     {
         Flow* flow = tsd.get_flow();
 
         trk.update_tracker_ack_recv(tsd);
-        session.set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
+        trk.session->set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
         tsd.get_pkt()->packet_flags |= PKT_STREAM_TWH;
         flow->set_session_flags(SSNFLAG_ESTABLISHED);
         flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_ESTABLISHED );
-        session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
         trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
         else
-            session.check_for_window_slam(tsd);
+            trk.session->check_for_window_slam(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.is_ack_valid(tsd.get_seg_ack() ) )
     {
         trk.update_tracker_ack_recv(tsd);
         tsd.get_pkt()->packet_flags |= PKT_STREAM_TWH;
-        session.set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
-        session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+        trk.session->set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
         trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
         if ( tsd.get_seg_len() > 0 )
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     if ( tsd.get_tcph()->is_ack() )
     {
         Flow* flow = tsd.get_flow();
 
         trk.update_tracker_ack_recv(tsd);
-        session.set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
+        trk.session->set_pkt_action_flag(trk.normalizer->handle_paws(tsd) );
         flow->session_state |= STREAM_STATE_ACK;
         if ( tsd.get_seg_len() > 0 )
         {
-            session.handle_data_segment(tsd);
+            trk.session->handle_data_segment(tsd);
             trk.flush_data_on_fin_recv(tsd);
         }
 
         trk.update_on_fin_recv(tsd);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
         trk.set_tcp_state(TcpStreamTracker::TCP_CLOSE_WAIT);
     }
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynRecv::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.normalizer->trim_rst_payload(tsd);
     if ( trk.normalizer->validate_rst(tsd) )
     {
@@ -219,19 +198,19 @@ bool TcpStateSynRecv::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trac
         DebugMessage(DEBUG_STREAM_STATE, "Received RST with bad sequence number\n");
         inc_tcp_discards();
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynRecv::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateSynRecv::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.check_for_window_slam(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     return true;
 }
index 0f6177a2c47c2934f846e347fff982fe0e525257..4b12f1958be69db293ffe188046687f4340639af 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateSynRecv : public TcpStateHandler
 {
 public:
-    TcpStateSynRecv(TcpStateMachine&, TcpSession&);
+    TcpStateSynRecv(TcpStateMachine&);
     virtual ~TcpStateSynRecv(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,7 +45,7 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
index 41a0188c4861cf5ab31cec3632871612be673460..09324b9c4c51f8430f07bdc8d42a908a9b24646b 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateSynSent::TcpStateSynSent(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_SYN_SENT, tsm, ssn)
+TcpStateSynSent::TcpStateSynSent(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_SYN_SENT, tsm)
 {
 }
 
@@ -41,143 +41,121 @@ TcpStateSynSent::~TcpStateSynSent()
 {
 }
 
-bool TcpStateSynSent::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.finish_client_init(tsd);
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
     trk.set_tcp_state(TcpStreamTracker::TCP_SYN_RECV);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_3whs_ack(tsd) )
     {
-        session.update_timestamp_tracking(tsd);
+        trk.session->update_timestamp_tracking(tsd);
         if ( tsd.get_seg_len() )
-            session.handle_data_on_syn(tsd);
+            trk.session->handle_data_on_syn(tsd);
     }
     else
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     // FIXIT - verify ack being sent is valid...
     trk.update_tracker_ack_sent(tsd);
     flow->set_session_flags(SSNFLAG_ESTABLISHED);
     flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_ESTABLISHED );
-    session.update_timestamp_tracking(tsd);
-    session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+    trk.session->update_timestamp_tracking(tsd);
+    trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( tsd.get_seg_len() > 0 )
-        session.handle_data_segment(tsd);
+        trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     Flow* flow = tsd.get_flow();
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
     // FIXIT - verify ack being sent is valid...
     trk.update_tracker_ack_sent(tsd);
     flow->set_session_flags(SSNFLAG_ESTABLISHED);
     flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_ESTABLISHED );
-    session.update_timestamp_tracking(tsd);
-    session.update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
+    trk.session->update_timestamp_tracking(tsd);
+    trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
     trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.handle_data_segment(tsd);
+    trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( tsd.get_seg_len() > 0 )
-        session.handle_data_segment(tsd);
+        trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateSynSent::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateSynSent::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
index fd4f4bd1481f52f58f85878dbf1cba9b5811619a..c8308a670a96f698c345abe79f49274f53380cb4 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateSynSent : public TcpStateHandler
 {
 public:
-    TcpStateSynSent(TcpStateMachine&, TcpSession&);
+    TcpStateSynSent(TcpStateMachine&);
     virtual ~TcpStateSynSent(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
index 80573adbe28435662616d12d28477a3b882874b3..0fe380c9301d88182d17c401726caedca85ba1c4 100644 (file)
@@ -32,8 +32,8 @@ using namespace std;
 #include "catch/catch.hpp"
 #endif
 
-TcpStateTimeWait::TcpStateTimeWait(TcpStateMachine& tsm, TcpSession& ssn) :
-    TcpStateHandler(TcpStreamTracker::TCP_TIME_WAIT, tsm, ssn)
+TcpStateTimeWait::TcpStateTimeWait(TcpStateMachine& tsm) :
+    TcpStateHandler(TcpStreamTracker::TCP_TIME_WAIT, tsm)
 {
 }
 
@@ -41,139 +41,118 @@ TcpStateTimeWait::~TcpStateTimeWait()
 {
 }
 
-bool TcpStateTimeWait::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
-    session.check_for_repeated_syn(tsd);
+    trk.session->check_for_repeated_syn(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
-{
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
 
-    trk.normalizer->ecn_tracker(tsd.get_tcph(), session.config->require_3whs() );
+
+bool TcpStateTimeWait::syn_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
+{
+    trk.normalizer->ecn_tracker(tsd.get_tcph(), trk.session->config->require_3whs() );
     if ( tsd.get_seg_len() )
-        session.handle_data_on_syn(tsd);
+        trk.session->handle_data_on_syn(tsd);
 
     return true;
 }
 
-bool TcpStateTimeWait::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::syn_ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::syn_ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_sent(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
     // data on a segment when we shouldn't be sending data any more alert!
-    session.tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
-    session.mark_packet_for_drop(tsd);
+    trk.session->tel.set_tcp_event(EVENT_DATA_ON_CLOSED);
+    trk.session->mark_packet_for_drop(tsd);
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     trk.update_tracker_ack_recv(tsd);
     if ( SEQ_GEQ(tsd.get_seg_seq(), trk.get_fin_final_seq() ) )
     {
         DebugMessage(DEBUG_STREAM_STATE, "FIN beyond previous, ignoring\n");
-        session.tel.set_tcp_event(EVENT_BAD_FIN);
+        trk.session->tel.set_tcp_event(EVENT_BAD_FIN);
         trk.normalizer->packet_dropper(tsd, NORM_TCP_BLOCK);
-        session.set_pkt_action_flag(ACTION_BAD_PKT);
+        trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
     else if ( tsd.get_seg_len() > 0 )
-        session.handle_data_segment(tsd);
+        trk.session->handle_data_segment(tsd);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::rst_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tracker)
+bool TcpStateTimeWait::rst_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    auto& trk = static_cast< TcpStreamTracker& >( tracker );
-
     if ( trk.update_on_rst_recv(tsd) )
     {
-        session.update_session_on_rst(tsd, false);
-        session.update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
-        session.set_pkt_action_flag(ACTION_RST);
+        trk.session->update_session_on_rst(tsd, false);
+        trk.session->update_perf_base_state(TcpStreamTracker::TCP_CLOSING);
+        trk.session->set_pkt_action_flag(ACTION_RST);
     }
     else
     {
-        session.tel.set_tcp_event(EVENT_BAD_RST);
+        trk.session->tel.set_tcp_event(EVENT_BAD_RST);
     }
 
     // FIXIT - might be good to create alert specific to RST with data
     if ( tsd.get_seg_len() > 0 )
-        session.tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+        trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
 
     return default_state_action(tsd, trk);
 }
 
-bool TcpStateTimeWait::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateTimeWait::do_pre_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    return session.validate_packet_established_session(tsd);
+    return trk.session->validate_packet_established_session(tsd);
 }
 
-bool TcpStateTimeWait::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
+bool TcpStateTimeWait::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    session.update_paws_timestamps(tsd);
-    session.check_for_window_slam(tsd);
+    trk.session->update_paws_timestamps(tsd);
+    trk.session->check_for_window_slam(tsd);
 
     if ( tcp_event != TcpStreamTracker::TCP_FIN_RECV_EVENT )
     {
-        TcpStreamTracker::TcpState talker_state = session.get_talker_state();
+        TcpStreamTracker::TcpState talker_state = trk.session->get_talker_state();
         Flow* flow = tsd.get_flow();
 
         if ( ( talker_state == TcpStreamTracker::TCP_TIME_WAIT )
@@ -181,9 +160,9 @@ bool TcpStateTimeWait::do_post_sm_packet_actions(TcpSegmentDescriptor& tsd)
         {
             // The last ACK is a part of the session. Delete the session after processing is
             // complete.
-            session.clear_session(false, true, false, tsd.get_pkt() );
+            trk.session->clear_session(false, true, false, tsd.get_pkt() );
             flow->session_state |= STREAM_STATE_CLOSED;
-            session.set_pkt_action_flag(ACTION_LWSSN_CLOSED);
+            trk.session->set_pkt_action_flag(ACTION_LWSSN_CLOSED);
         }
     }
     return true;
index 67a0f40026a597cfd9073e85a94a2d90346101a6..d69b7f5444e800372bd72831ebe57a2b48688da2 100644 (file)
@@ -29,7 +29,7 @@ class TcpSession;
 class TcpStateTimeWait : public TcpStateHandler
 {
 public:
-    TcpStateTimeWait(TcpStateMachine&, TcpSession&);
+    TcpStateTimeWait(TcpStateMachine&);
     virtual ~TcpStateTimeWait(void);
 
     bool syn_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
@@ -45,8 +45,8 @@ public:
     bool rst_sent(TcpSegmentDescriptor&, TcpStreamTracker&) override;
     bool rst_recv(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 
-    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&) override;
-    bool do_post_sm_packet_actions(TcpSegmentDescriptor&) override;
+    bool do_pre_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
+    bool do_post_sm_packet_actions(TcpSegmentDescriptor&, TcpStreamTracker&) override;
 };
 
 #endif
diff --git a/src/stream/tcp/tcp_stream_state_machine.cc b/src/stream/tcp/tcp_stream_state_machine.cc
new file mode 100644 (file)
index 0000000..d83eb00
--- /dev/null
@@ -0,0 +1,63 @@
+//--------------------------------------------------------------------------
+// Copyright (C) 2015-2015 Cisco and/or its affiliates. All rights reserved.
+//
+// This program 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.  You may not use, modify or distribute
+// this program under any other version of the GNU General Public License.
+//
+// This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//--------------------------------------------------------------------------
+
+// tcp_stream_state_machine.cc author davis mcpherson <davmcphe@@cisco.com>
+// Created on: Apr 1, 2016
+
+#include "tcp_state_none.h"
+#include "tcp_state_closed.h"
+#include "tcp_state_listen.h"
+#include "tcp_state_syn_sent.h"
+#include "tcp_state_syn_recv.h"
+#include "tcp_state_established.h"
+#include "tcp_state_close_wait.h"
+#include "tcp_state_closing.h"
+#include "tcp_state_fin_wait1.h"
+#include "tcp_state_fin_wait2.h"
+#include "tcp_state_last_ack.h"
+#include "tcp_state_time_wait.h"
+
+#include "tcp_stream_state_machine.h"
+
+TcpStreamStateMachine::TcpStreamStateMachine()
+{
+    // TODO Auto-generated destructor stub
+}
+
+TcpStreamStateMachine::~TcpStreamStateMachine()
+{
+    // TODO Auto-generated destructor stub
+}
+
+void TcpStreamStateMachine::initialize_tsm(void)
+{
+    // initialize stream tracker state machine with handler for each state...
+    new TcpStateNone(*this);
+    new TcpStateClosed(*this);
+    new TcpStateListen(*this);
+    new TcpStateSynSent(*this);
+    new TcpStateSynRecv(*this);
+    new TcpStateEstablished(*this);
+    new TcpStateFinWait1(*this);
+    new TcpStateFinWait2(*this);
+    new TcpStateClosing(*this);
+    new TcpStateCloseWait(*this);
+    new TcpStateLastAck(*this);
+    new TcpStateTimeWait(*this);
+}
+
diff --git a/src/stream/tcp/tcp_stream_state_machine.h b/src/stream/tcp/tcp_stream_state_machine.h
new file mode 100644 (file)
index 0000000..80ad311
--- /dev/null
@@ -0,0 +1,52 @@
+//--------------------------------------------------------------------------
+// Copyright (C) 2015-2015 Cisco and/or its affiliates. All rights reserved.
+//
+// This program 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.  You may not use, modify or distribute
+// this program under any other version of the GNU General Public License.
+//
+// This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//--------------------------------------------------------------------------
+
+// tcp_stream_state_machine.h author davis mcpherson <davmcphe@@cisco.com>
+// Created on: Apr 1, 2016
+
+#ifndef TCP_STREAM_STATE_MACHINE_H_
+#define TCP_STREAM_STATE_MACHINE_H_
+
+#include "stream/libtcp/tcp_state_machine.h"
+
+class TcpStreamStateMachine: public TcpStateMachine
+{
+public:
+    virtual ~TcpStreamStateMachine();
+
+
+    static TcpStateMachine* get_instance( void )
+    {
+        static TcpStreamStateMachine* tsm = nullptr;
+
+        if( !tsm )
+        {
+            tsm = new TcpStreamStateMachine;
+            tsm->initialize_tsm();
+        }
+
+        return tsm;
+    }
+
+private:
+    TcpStreamStateMachine();
+    void initialize_tsm(void);
+
+};
+#endif
+
index 7ea12a7a9895a69d18f45ad5bbaddfa2d21e03da..5dd36a2b4455487340361c7b31b708dc10b31650 100644 (file)
 #include "tcp_module.h"
 #include "tcp_normalizers.h"
 #include "tcp_reassemblers.h"
+#include "tcp_session.h"
 
-TcpTracker::TcpTracker(bool client) :
+TcpTracker::TcpTracker(bool client, TcpSession* ssn) :
     TcpStreamTracker(client)
 {
+    session = ssn;
 }
 
 TcpTracker::~TcpTracker(void)
@@ -74,10 +76,10 @@ void TcpTracker::init_flush_policy(void)
 {
     if ( splitter == nullptr )
         flush_policy = STREAM_FLPOLICY_IGNORE;
-    else if ( !normalizer->is_tcp_ips_enabled() )
-        flush_policy = STREAM_FLPOLICY_ON_ACK;
-    else
+    else if ( normalizer->is_tcp_ips_enabled() )
         flush_policy = STREAM_FLPOLICY_ON_DATA;
+    else
+        flush_policy = STREAM_FLPOLICY_ON_ACK;
 }
 
 void TcpTracker::set_splitter(StreamSplitter* ss)
index f6a07912cb31907d200b1744321d40983c3e8283..1ea90969403da3748a8553cbc27085f3309bb005 100644 (file)
 
 class TcpNormalizer;
 class TcpReassembler;
+class TcpSession;
 
 class TcpTracker : public TcpStreamTracker
 {
 public:
-    TcpTracker(bool);
+    TcpTracker(bool, TcpSession*);
     virtual ~TcpTracker(void);
 
     void init_tcp_state(void) override;
index 2da86179771cc3e4ddf2403186012b2ba7c40095..e096d674cbf05ffc7cadd9f96258f20540fafb87 100644 (file)
@@ -80,7 +80,7 @@ static int ProcessUdp(
         return 0;
 
     /* if both seen, mark established */
-    if (p->packet_flags & PKT_FROM_SERVER)
+    if (p->is_from_server())
     {
         DebugMessage(DEBUG_STREAM_STATE,
             "Stream: Updating on packet from responder\n");
index 7698af677565590953946b0eea55379db79ad434..ccbcef7cad230427bb6443dac140f6dd6c2eae07 100644 (file)
@@ -380,7 +380,7 @@ void UserSession::update(Packet* p, Flow* flow)
 
     if ( !(flow->ssn_state.session_flags & SSNFLAG_ESTABLISHED) )
     {
-        if ( p->packet_flags & PKT_FROM_CLIENT )
+        if ( p->is_from_client() )
             flow->ssn_state.session_flags |= SSNFLAG_SEEN_CLIENT;
         else
             flow->ssn_state.session_flags |= SSNFLAG_SEEN_SERVER;
@@ -400,7 +400,7 @@ void UserSession::update(Packet* p, Flow* flow)
 
 void UserSession::restart(Packet* p)
 {
-    bool c2s = p->packet_flags & PKT_FROM_CLIENT;
+    bool c2s = p->is_from_client();
     UserTracker& ut = c2s ? server : client;
     std::list<UserSegment*>::iterator it;
     ut.total = 0;
@@ -483,7 +483,7 @@ int UserSession::process(Packet* p)
 
     update(p, flow);
 
-    UserTracker& ut = p->from_client() ? server : client;
+    UserTracker& ut = p->is_from_client() ? server : client;
 
     if ( p->ptrs.decode_flags & DECODE_SOF or !ut.splitter )
         start(p, flow);