Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

TCP_Contents Class Reference

#include <TCP_Contents.h>

Inheritance diagram for TCP_Contents:

Inheritance graph
[legend]
Collaboration diagram for TCP_Contents:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TCP_Contents (TCP_Endpoint *endp, int stop_on_gap=0)
virtual ~TCP_Contents ()
int DataSent (double t, int seq, int len, const u_char *data)
void AckReceived (int seq)
void CheckEOF ()
int HasUndeliveredData () const
int DataPending () const
void MatchUndeliveredData ()
int DataSeq () const
virtual void Deliver (double t, int seq, int len, u_char *data)
virtual void Undelivered (int seq, int len)
int SkippingDeliveries () const
void SetSkipDeliveries (int should_skip)
void SetContentsFile (BroFile *f)
TCP_EndpointEndpoint ()
const TCP_EndpointEndpoint () const
TCP_ConnectionConn ()
const TCP_ConnectionConn () const
int IsOrig () const
bool Serialize (Serializer *s) const

Static Public Member Functions

TCP_ContentsUnserialize (Serializer *ser)

Protected Member Functions

 TCP_Contents ()

Protected Attributes

TCP_Endpointendp
TCP_Reassemblert_reassem
unsigned int skip_deliveries:1
unsigned int stop_on_gap:1
unsigned int did_EOF:1

Constructor & Destructor Documentation

TCP_Contents::TCP_Contents TCP_Endpoint endp,
int  stop_on_gap = 0
 

Definition at line 245 of file TCP_Contents.cc.

References TCP_Endpoint::AddContentsProcessor(), did_EOF, skip_deliveries, TCP_Endpoint::src_addr, stop_on_gap, and t_reassem.

00247         {
00248         endp = arg_endp;
00249         endp->AddContentsProcessor(this);
00250         t_reassem = new TCP_Reassembler(this, endp->src_addr);
00251         skip_deliveries = 0;
00252         stop_on_gap = arg_stop_on_gap;
00253         did_EOF = 0;
00254         }

TCP_Contents::~TCP_Contents  )  [virtual]
 

Definition at line 256 of file TCP_Contents.cc.

References t_reassem, and Unref().

00257         {
00258         Unref(t_reassem);
00259         }

TCP_Contents::TCP_Contents  )  [inline, protected]
 

Definition at line 102 of file TCP_Contents.h.

00102 {}


Member Function Documentation

void TCP_Contents::AckReceived int  seq  ) 
 

Definition at line 292 of file TCP_Contents.cc.

References CheckEOF(), Conn(), Connection::Event(), TCP_Endpoint::FIN_cnt, TCP_Endpoint::FIN_seq, TCP_Endpoint::peer, reading_live, Connection::Skipping(), SkippingDeliveries(), TCP_Endpoint::state, t_reassem, TCP_PARTIAL, and Reassembler::TrimToSeq().

Referenced by TCP_Endpoint::AckReceived().

00293         {
00294         if ( endp->FIN_cnt > 0 && seq >= endp->FIN_seq )
00295                 // TrimToSeq: FIN_seq - 1
00296                 seq = endp->FIN_seq - 1;
00297 
00298         if ( ! SkippingDeliveries() && ! Conn()->Skipping() &&
00299              ! t_reassem->TrimToSeq(seq) &&
00300              reading_live && endp->state != TCP_PARTIAL && endp->peer->state != TCP_PARTIAL )
00301                 // Only generate these events when reading live; from
00302                 // a trace file, the hole might exist because the
00303                 // file was trimmed while writing it.
00304                 Conn()->Event(ack_above_hole);
00305 
00306         // Check EOF here because t_reassem->LastReassemSeq() may have
00307         // changed after calling TrimToSeq().
00308         CheckEOF();
00309         }

void TCP_Contents::CheckEOF  ) 
 

Definition at line 311 of file TCP_Contents.cc.

References Conn(), did_EOF, TCP_Connection::EndpointEOF(), TCP_Endpoint::FIN_cnt, Reassembler::LastReassemSeq(), TCP_Endpoint::LastSeq(), skip_deliveries, Connection::Skipping(), TCP_Endpoint::StartSeq(), TCP_Endpoint::state, t_reassem, TCP_CLOSED, and TCP_RESET.

Referenced by AckReceived(), and TCP_Endpoint::CheckEOF().

00312         {
00313         if ( ! did_EOF &&
00314              (endp->FIN_cnt > 0 || endp->state == TCP_CLOSED || endp->state == TCP_RESET) &&
00315              (Conn()->Skipping() || skip_deliveries ||
00316               endp->StartSeq() + t_reassem->LastReassemSeq() >= endp->LastSeq() - 1) )
00317                 {
00318                 // We've now delivered all of the data.
00319                 did_EOF = 1;
00320                 Conn()->EndpointEOF(this);
00321                 }
00322         }

const TCP_Connection* TCP_Contents::Conn  )  const [inline]
 

Definition at line 94 of file TCP_Contents.h.

References TCP_Endpoint::Conn().

00094 { return endp->Conn(); }

TCP_Connection* TCP_Contents::Conn  )  [inline]
 

Definition at line 93 of file TCP_Contents.h.

References TCP_Endpoint::Conn().

Referenced by AckReceived(), RloginEndpoint::AsRloginConn(), TCP_NVT::AuthenticationAccepted(), TCP_NVT::AuthenticationRejected(), TelnetOption::BadOption(), TCP_NVT::BadOptionTermination(), RloginEndpoint::BadProlog(), TCP_Reassembler::BlockInserted(), CheckEOF(), TCP_ContentLine::CheckNUL(), TCP_ContentLine::Deliver(), Deliver(), TCP_Contents_RPC::Deliver(), TCP_Contents_NetbiosSSN::Deliver(), TCP_Contents_DNS::Deliver(), TCP_Contents_DCE_RPC::DeliverPDU(), RloginEndpoint::DoDeliver(), TCP_NVT::DoDeliver(), TCP_ContentLine::DoDeliverOnce(), HTTP_Endpoint::DoDeliverOnce(), TCP_ContentLine::ExcessiveLine(), TelnetOption::InconsistentOption(), TCP_Reassembler::MatchUndelivered(), TCP_Reassembler::Overlap(), TelnetEnvironmentOption::RecvSubOption(), TCP_NVT::SetEncrypting(), TCP_NVT::SetTerminal(), X509_Cert::sslCertificateError(), X509_Cert::sslCertificateEvent(), Undelivered(), TCP_Reassembler::Undelivered(), and X509_Cert::verify().

00093 { return endp->Conn(); }

int TCP_Contents::DataPending  )  const
 

Definition at line 342 of file TCP_Contents.cc.

References DataSeq(), Endpoint(), TCP_Endpoint::HasUndeliveredData(), TCP_Endpoint::LastSeq(), TCP_Endpoint::peer, TCP_Endpoint::StartSeq(), TCP_Endpoint::state, TCP_RESET, and uint32.

Referenced by TCP_Endpoint::DataPending().

00343         {
00344         uint32 delivered_seq = Endpoint()->StartSeq() + DataSeq();
00345 
00346         // We've delivered everything if we're up to the penultimate
00347         // sequence number (since a FIN consumes an octet in the
00348         // sequence space), or right at it (because a RST does not).
00349         if ( delivered_seq != Endpoint()->LastSeq() - 1 &&
00350              delivered_seq != Endpoint()->LastSeq() )
00351                 return 1;
00352 
00353         // If we've sent RST, then we can't send ACKs any more.
00354         if ( Endpoint()->state != TCP_RESET &&
00355              Endpoint()->peer->HasUndeliveredData() )
00356                 return 1;
00357 
00358         return 0;
00359         }

int TCP_Contents::DataSent double  t,
int  seq,
int  len,
const u_char *  data
 

Definition at line 261 of file TCP_Contents.cc.

References TCP_Endpoint::AckSeq(), Reassembler::NewBlock(), skip_deliveries, TCP_Endpoint::StartSeq(), and t_reassem.

Referenced by TCP_Endpoint::DataSent().

00263         {
00264         if ( skip_deliveries )
00265                 return 0;
00266 
00267         int ack = endp->AckSeq() - endp->StartSeq();
00268         int upper_seq = seq + len;
00269 
00270         if ( seq < ack )
00271                 {
00272                 if ( upper_seq <= ack )
00273                         // We've already delivered this and it's been acked.
00274                         return 0;
00275 
00276                 // We've seen an ack for part of this packet, but not the
00277                 // whole thing.  This can happen when, for example, a previous
00278                 // packet held [a, a+b) and this packet holds [a, a+c) for c>b
00279                 // (which some TCP's will do when retransmitting).  Trim the
00280                 // packet to just the unacked data.
00281                 int amount_acked = ack - seq;
00282                 seq += amount_acked;
00283                 data += amount_acked;
00284                 len -= amount_acked;
00285                 }
00286 
00287         t_reassem->NewBlock(t, seq, len, data);
00288 
00289         return 1;
00290         }

int TCP_Contents::DataSeq  )  const [inline]
 

Definition at line 79 of file TCP_Contents.h.

References Reassembler::LastReassemSeq(), and t_reassem.

Referenced by DataPending().

00079 { return t_reassem->LastReassemSeq(); }

void TCP_Contents::Deliver double  t,
int  seq,
int  len,
u_char *  data
[virtual]
 

Reimplemented in TCP_Contents_DCE_RPC, TCP_Contents_DNS, TCP_Contents_NetbiosSSN, TCP_Contents_RPC, SSL_ProxyEndpoint, and TCP_ContentLine.

Definition at line 324 of file TCP_Contents.cc.

References Conn(), and TCP_Connection::Deliver().

Referenced by TCP_Reassembler::BlockInserted().

00325         {
00326         Conn()->Deliver(endp, t, seq, len, data);
00327         }

const TCP_Endpoint* TCP_Contents::Endpoint  )  const [inline]
 

Definition at line 91 of file TCP_Contents.h.

00091 { return endp; }

TCP_Endpoint* TCP_Contents::Endpoint  )  [inline]
 

Definition at line 90 of file TCP_Contents.h.

Referenced by SSL_RecordBuilder::addSegment(), SSL_Interpreter::analyzeCertificate(), SSL_RecordBuilder::analyzeSSLRecordFormat(), TCP_Reassembler::BlockInserted(), SSL_RecordBuilder::computeExpectedSize(), DataPending(), SSL_ProxyEndpoint::Deliver(), SSL_ProxyEndpoint::DoDeliver(), TCP_Connection::EndpointEOF(), SSH_Conn::NewLine(), IdentConn::NewLine(), SSL_ConnectionProxy::NewSSLRecord(), TCP_Reassembler::Overlap(), X509_Cert::sslCertificateEvent(), and TCP_Reassembler::Undelivered().

00090 { return endp; }

int TCP_Contents::HasUndeliveredData  )  const [inline]
 

Definition at line 76 of file TCP_Contents.h.

References Reassembler::HasBlocks(), and t_reassem.

Referenced by TCP_Endpoint::HasUndeliveredData().

00076 { return t_reassem->HasBlocks(); }

int TCP_Contents::IsOrig  )  const [inline]
 

Definition at line 96 of file TCP_Contents.h.

References TCP_Endpoint::IsOrig().

Referenced by LoginConn::AuthenticationDialog(), TCP_Reassembler::BlockInserted(), TCP_Contents_RPC::Deliver(), TCP_Contents_NetbiosSSN::Deliver(), TCP_Contents_DNS::Deliver(), HTTP_Message::DeliverEntityData(), TCP_Contents_DCE_RPC::DeliverPDU(), RloginEndpoint::DoDeliver(), HTTP_Endpoint::DoDeliverOnce(), HTTP_Message::Done(), HTTP_Conn::EndpointEOF(), TCP_Contents_NetbiosSSN::Flush(), TCP_Contents_DNS::Flush(), HTTP_Message::HTTP_Message(), TCP_Reassembler::MatchUndelivered(), SSH_Conn::NewLine(), LoginConn::NewLine(), IdentConn::NewLine(), HTTP_Conn::NewLine(), FTP_Conn::NewLine(), FingerConn::NewLine(), TelnetEnvironmentOption::RecvSubOption(), RloginEndpoint::RloginEndpoint(), X509_Cert::sslCertificateEvent(), and HTTP_Message::SubmitHeader().

00096 { return endp->IsOrig(); }

void TCP_Contents::MatchUndeliveredData  )  [inline]
 

Definition at line 78 of file TCP_Contents.h.

References TCP_Reassembler::MatchUndelivered(), and t_reassem.

Referenced by TCP_Endpoint::MatchUndeliveredData().

bool TCP_Contents::Serialize Serializer s  )  const
 

Definition at line 368 of file TCP_Contents.cc.

References SerialObj::Serialize().

00369         {
00370         SerialInfo serial;
00371         return SerialObj::Serialize(s, &serial, true);
00372         }

void TCP_Contents::SetContentsFile BroFile f  ) 
 

Definition at line 361 of file TCP_Contents.cc.

References TCP_Reassembler::SetContentsFile(), and t_reassem.

Referenced by TCP_Endpoint::AddContentsProcessor(), and TCP_Endpoint::SetContentsFile().

00362         {
00363         t_reassem->SetContentsFile(f);
00364         }

void TCP_Contents::SetSkipDeliveries int  should_skip  )  [inline]
 

Definition at line 85 of file TCP_Contents.h.

References skip_deliveries.

Referenced by SSH_Conn::NewLine(), Undelivered(), and HTTP_Conn::Undelivered().

00086                 { skip_deliveries = should_skip; }

int TCP_Contents::SkippingDeliveries  )  const [inline]
 

Definition at line 84 of file TCP_Contents.h.

References skip_deliveries.

Referenced by AckReceived().

00084 { return skip_deliveries; }

void TCP_Contents::Undelivered int  seq,
int  len
[virtual]
 

Definition at line 329 of file TCP_Contents.cc.

References Conn(), SetSkipDeliveries(), stop_on_gap, and TCP_Connection::Undelivered().

Referenced by TCP_Reassembler::Undelivered().

00330         {
00331         if ( stop_on_gap )
00332                 // No more data will be sent to the reassembler via
00333                 // DataSent, and thus no data will be delivered. Note
00334                 // that it is safe to stop right here because all the data
00335                 // before seq that exists in the trace must have already
00336                 // appeared.
00337                 SetSkipDeliveries(1);
00338 
00339         Conn()->Undelivered(endp, seq, len);
00340         }

TCP_Contents * TCP_Contents::Unserialize Serializer ser  )  [static]
 

Definition at line 374 of file TCP_Contents.cc.

References SER_TCP_CONTENTS, and SerialObj::Unserialize().

00375         {
00376         return (TCP_Contents*) SerialObj::Unserialize(s, SER_TCP_CONTENTS, true);
00377         }


Member Data Documentation

unsigned int TCP_Contents::did_EOF [protected]
 

Definition at line 110 of file TCP_Contents.h.

Referenced by CheckEOF(), and TCP_Contents().

TCP_Endpoint* TCP_Contents::endp [protected]
 

Definition at line 106 of file TCP_Contents.h.

unsigned int TCP_Contents::skip_deliveries [protected]
 

Definition at line 108 of file TCP_Contents.h.

Referenced by CheckEOF(), DataSent(), SetSkipDeliveries(), SkippingDeliveries(), and TCP_Contents().

unsigned int TCP_Contents::stop_on_gap [protected]
 

Definition at line 109 of file TCP_Contents.h.

Referenced by TCP_Contents(), and Undelivered().

TCP_Reassembler* TCP_Contents::t_reassem [protected]
 

Definition at line 107 of file TCP_Contents.h.

Referenced by AckReceived(), CheckEOF(), DataSent(), DataSeq(), HasUndeliveredData(), MatchUndeliveredData(), SetContentsFile(), TCP_Contents(), and ~TCP_Contents().


The documentation for this class was generated from the following files:
Generated on Sat May 1 15:32:42 2004 for bro_docs.8a82 by doxygen 1.3.6