TCPSerializer Class Reference

#include <TCPSerializer.h>

List of all members.


Detailed Description

Converts between IPDatagram and binary (network byte order) IP header.

Public Member Functions

 TCPSerializer ()
int serialize (TCPSegment *msg, unsigned char *buf, unsigned int bufsize, pseudoheader *pseudo)

Static Public Member Functions

static unsigned short checksum (unsigned char *addr, unsigned int count)

Constructor & Destructor Documentation

TCPSerializer::TCPSerializer (  )  [inline]

00046 {}


Member Function Documentation

int TCPSerializer::serialize ( TCPSegment msg,
unsigned char *  buf,
unsigned int  bufsize,
pseudoheader pseudo 
)

Serializes a TCPMessage for transmission on the wire. The checksum is NOT filled in. (The kernel does that when sending the frame over a raw socket.) Returns the length of data written into buffer.

00045 {
00046         //cMessage* cmsg;
00047         struct tcphdr *tcp = (struct tcphdr*) (buf);
00048         //int writtenbytes = sizeof(struct tcphdr)+msg->payloadLength();
00049         int writtenbytes = msg->getByteLength();
00050 
00051         // fill TCP header structure
00052         tcp->th_sum = 0;
00053         tcp->th_sport = htons(msg->getSrcPort());
00054         tcp->th_dport = htons(msg->getDestPort());
00055         tcp->th_seq = htonl(msg->getSequenceNo());
00056         tcp->th_ack = htonl(msg->getAckNo());
00057         tcp->th_off = (sizeof(struct tcphdr)/4)<<4;
00058 
00059         unsigned char flags = 0;
00060         if(msg->getFinBit())
00061                 flags |= TH_FIN;
00062         if(msg->getSynBit())
00063                 flags |= TH_SYN;
00064         if(msg->getRstBit())
00065                 flags |= TH_RST;
00066         if(msg->getPshBit())
00067                 flags |= TH_PUSH;
00068         if(msg->getAckBit())
00069                 flags |= TH_ACK;
00070         if(msg->getUrgBit())
00071                 flags |= TH_URG;
00072         tcp->th_flags = (TH_FLAGS & flags);
00073         tcp->th_win = htons(msg->getWindow());
00074         tcp->th_urp = htons(msg->getUrgentPointer());
00075         
00076 
00077                 // for computation of the checksum we need the pseudo header infront of the tcp header
00078         int wholeheadersize = sizeof(pseudoheader) + writtenbytes;
00079         char *wholeheader = (char*) malloc(wholeheadersize);
00080 
00081         memcpy(wholeheader, pseudo, sizeof(pseudoheader));
00082         memcpy(wholeheader + sizeof(pseudoheader), buf, writtenbytes);
00083 
00084         tcp->th_sum = checksum((unsigned char*)wholeheader, wholeheadersize);
00085         free(wholeheader);
00086         //tcp->th_sum =checksum((unsigned char*)tcp, writtenbytes);
00087         return writtenbytes;
00088 }

unsigned short TCPSerializer::checksum ( unsigned char *  addr,
unsigned int  count 
) [static]

Puts a packet sniffed from the wire into an SCTPMessage.

Referenced by serialize().

00091 {
00092     long sum = 0;
00093 
00094     while (count > 1)  {
00095         sum += *((unsigned short *&)addr)++;
00096         if (sum & 0x80000000)
00097             sum = (sum & 0xFFFF) + (sum >> 16);
00098         count -= 2;
00099     }
00100 
00101     if (count)
00102         sum += *(unsigned char *)addr;
00103 
00104     while (sum >> 16)
00105         sum = (sum & 0xffff) + (sum >> 16);
00106 
00107     return ~sum;
00108 }


The documentation for this class was generated from the following files:

Generated on Fri Mar 20 18:51:22 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5