/* session event callback routine: traces opening / closing sessions; sets the callbacks */ static void session_event_handler( CapEnv* env, TcpSession* sess, char event ) { char buff[512]; switch( event ) { case DSSL_EVENT_NEW_SESSION: SessionToString(sess, buff); printf( "\n=> New Session: %s", buff ); SessionSetCallback( sess, data_callback_proc, error_callback_proc, NULL, sess ); SessionSetMissingPacketCallback( sess, missing_packet_callback, MISSING_PACKET_COUNT, MISSING_PACKET_TIMEOUT ); break; case DSSL_EVENT_SESSION_CLOSING: SessionToString(sess, buff); printf( "\n<= Session closing: %s", buff ); break; default: fprintf( stderr, "ERROR: Unknown session event code (%d)", (int)event ); break; } }
// Handles session startup and teardown static void session_event_handler(CapEnv* env, TcpSession* sess, char event) { char buff[512]; SessionToString(sess, buff); FakeSessionState* mySession; switch(event) { case DSSL_EVENT_NEW_SESSION: if (config.loglevel > 0) { if (config.daemon) syslog(LOG_INFO, "=> New Session: %s", buff); else fprintf(stderr, "\n=> New Session: %s", buff); } if( ( mySession = malloc( sizeof( FakeSessionState ) ) ) != NULL ) { if( init_fake_session_state( mySession ) != -1 ) { SessionSetCallback(sess, data_callback_proc, error_callback_proc, sess); sess->user_data = mySession; SessionSetMissingPacketCallback( sess, missing_packet_callback, MISSING_PACKET_COUNT, MISSING_PACKET_TIMEOUT ); } else { if (config.loglevel > 0) { if (config.daemon) syslog(LOG_INFO, "error: cannot init fake session: %s", buff); else fprintf(stderr, "Error: cannot init fake session: %s", buff); } } } else { if (config.loglevel > 0) { if (config.daemon) syslog(LOG_INFO, "error: cannot allocate memory for fake session: %s", buff); else fprintf(stderr, "Error: cannot allocate memory for fake session: %s", buff); } } break; case DSSL_EVENT_SESSION_CLOSING: if (config.loglevel > 0) { // Get stats struct pcap_stat myStats; pcap_stats(env->pcap_adapter, &myStats); if (config.daemon) syslog(LOG_INFO, "<= Session closing: %s\tpkts recv: %d pkts drop: %d", buff, myStats.ps_recv, myStats.ps_drop ); else fprintf(stderr, "\n<= Session closing: %s\tpkts recv: %d pkts drop: %d", buff, myStats.ps_recv, myStats.ps_drop ); } // Terminate session mySession = (FakeSessionState*)sess->user_data; if( mySession->handshakeSent ) sendEmptyTCPSegment( mySession->ln, sess, mySession->serverSeq, mySession->clientSeq, TH_RST | TH_ACK, ePacketDirFromServer ); // Clean up libnet and fake session object libnet_destroy( mySession->ln ); free( sess->user_data ); break; default: if (config.daemon) syslog(LOG_ERR, "unknown session event code (%d).", (int)event); else fprintf(stderr, "ERROR: Unknown session event code (%d).\n", (int)event); break; } }