#include <TCPSerializer.h>
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) |
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 }