-void convert_packet(struct pcap_pkthdr *h, const u_char *odata, u_char *ndata)
-{
- u_char* ncur=ndata;
- const u_char* ocur=odata;
- int length=h->caplen;
- struct iphdr *iph;
- struct tcphdr *tcph;
- struct dccp_hdr *dccph;
- struct dccp_hdr_ext *dccphex;
- struct dccp_hdr_ack_bits *dccphack;
- int datalength;
- const u_char* pd;
- u_char* npd;
- u_char* tcpopt;
-
- /*copy ethernet and ip headers over*/
- memcpy(ncur, ocur, sizeof(struct ether_header)+sizeof(struct iphdr) );
- ocur+=sizeof(struct ether_header)+ sizeof(struct iphdr);
- ncur+=sizeof(struct ether_header) +sizeof(struct iphdr);
- length-=sizeof(struct ether_header) +sizeof(struct iphdr);
-
- /*set ip to indicate that tcp is next protocol*/
- iph= (struct iphdr *) (ncur - sizeof(struct iphdr));
- iph->protocol=6;
- iph->check=htonl(0);
-
- /*cast header pointers*/
- tcph=(struct tcphdr*)ncur;
- tcpopt=ncur+ sizeof(struct tcphdr);
- dccph=(struct dccp_hdr*)ocur;
- dccphex=(struct dccp_hdr_ext*)(ocur+sizeof(struct dccp_hdr));
- dccphack=(struct dccp_hdr_ack_bits*)(ocur+ sizeof(struct dccp_hdr) + sizeof(struct dccp_hdr_ext));
-
- dbgprintf(2,"Sequence Number: %llu\n", (unsigned long long)(((unsigned long)ntohs(dccph->dccph_seq)<<32) + ntohl(dccphex->dccph_seq_low)));
-
- /*determine data length*/
- datalength=ntohs(iph->tot_len) - sizeof(struct iphdr) - dccph->dccph_doff*4;
- pd=odata + sizeof(struct ether_header)+sizeof(struct iphdr) + dccph->dccph_doff*4;
-
- /*set tcp standard features*/
- tcph->source=dccph->dccph_sport;
- tcph->dest=dccph->dccph_dport;
- tcph->doff=5;
- tcph->check=htonl(0);
- tcph->urg_ptr=0;
-
- /*Adjust TCP advertised window size*/
- if(!yellow){
- tcph->window=htons(30000);
- }
-
- /*make changes by packet type*/
- if(dccph->dccph_type==DCCP_PKT_REQUEST){//DCCP REQUEST -->TCP SYN
- dbgprintf(2,"Packet Type: Request\n");
-
- if(yellow){
- tcph->window=htons(0);
- }
- tcph->ack_seq=htonl(0);
- tcph->seq=htonl(initialize_seq(&s1, dccph->dccph_sport, ntohl(dccphex->dccph_seq_low)));
- tcph->syn=1;
- tcph->ack=0;
- tcph->fin=0;
- tcph->rst=0;
-
- /* add Sack-permitted option, if relevant*/
- if(sack){
- *tcpopt=4;
- tcpopt++;
- *tcpopt=2;
- tcph->doff++;
- }
-
- /*set libpcap header lengths*/
- h->len=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4;
- h->caplen=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4;
-
- /*set length in ip header*/
- iph->tot_len=htons(sizeof(struct iphdr) + tcph->doff*4);
- }
-
- if(dccph->dccph_type==DCCP_PKT_RESPONSE){//DCCP RESPONSE-->TCP SYN,ACK
- dbgprintf(2,"Packet Type: Response\n");
- tcph->ack_seq=htonl(convert_ack(s1,ntohl(dccphack->dccph_ack_nr_low)));
- if(yellow){
- tcph->window=htons(0);
- }
- tcph->seq=htonl(initialize_seq(&s2, dccph->dccph_sport, ntohl(dccphex->dccph_seq_low)));
- tcph->syn=1;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /* add Sack-permitted option, if relevant*/
- if(sack){
- *tcpopt=4;
- *(tcpopt+1)=2;
- tcph->doff++;
- }
-
- /*set libpcap header lengths*/
- h->len=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4;
- h->caplen=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4;
-
- /*set length in ip header*/
- iph->tot_len=htons(sizeof(struct iphdr) + tcph->doff*4);
- }
-
- if(dccph->dccph_type==DCCP_PKT_DATA){//DCCP DATA----Never seen in packet capture
- dbgprintf(0,"DCCP Data packet not yet implemented\n");
- exit(1);
- }
-
- if(dccph->dccph_type==DCCP_PKT_DATAACK){//DCCP DATAACK-->TCP ACK with data
- dbgprintf(2,"Packet Type: DataAck\n");
- if(s1 && dccph->dccph_sport==s1->addr){ //determine which side of connection is sending this packet
- if(green){
- tcph->ack_seq=htonl(convert_ack(s2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(s2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(s1, ntohl(dccphex->dccph_seq_low),datalength, dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low)));
- }
- if(sack){
- ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
- }
- }else{
- if(green){
- tcph->ack_seq=htonl(convert_ack(s1,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(s1,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(s2, ntohl(dccphex->dccph_seq_low),datalength,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
- }
- if(sack){
- ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*copy data*/
- npd=ndata+ sizeof(struct ether_header)+sizeof(struct iphdr)+ tcph->doff*4;
- memcpy(npd, pd, datalength);
-
- /*set libpcap header lengths*/
- h->len=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4 + datalength;
- h->caplen=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4 + datalength;
-
- /*set length in ip header*/
- iph->tot_len=htons(sizeof(struct iphdr) + tcph->doff*4 + datalength);
- }
-
- if(dccph->dccph_type==DCCP_PKT_ACK){ //DCCP ACK -->TCP ACK with no data
- dbgprintf(2,"Packet Type: Ack\n");
- if(s1 && dccph->dccph_sport==s1->addr){//determine which side of connection is sending this packet
- if(green){
- tcph->ack_seq=htonl(convert_ack(s2,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(s2,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(s1, ntohl(dccphex->dccph_seq_low),1,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*1400);
- if(-interp_ack_vect((u_char*)dccph)*1400 > 65535){
- printf("Note: TCP Window Overflow @ %d.%d\n", (int)h->ts.tv_sec, (int)h->ts.tv_usec);
- }
- }
- if(sack){
- ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
- }
- }else{
- if(green){
- tcph->ack_seq=htonl(convert_ack(s1,ntohl(dccphack->dccph_ack_nr_low)));
- }else{
- tcph->ack_seq=htonl(convert_ack(s1,ntohl(dccphack->dccph_ack_nr_low)+interp_ack_vect((u_char*)dccph)));
- }
- tcph->seq=htonl(add_new_seq(s2, ntohl(dccphex->dccph_seq_low),1,dccph->dccph_type));
- if(yellow){
- tcph->window=htons(-interp_ack_vect((u_char*)dccph)*1400);
- if(-interp_ack_vect((u_char*)dccph)*1400 > 65535){
- printf("Note: TCP Window Overflow @ %d.%d\n", (int)h->ts.tv_sec, (int)h->ts.tv_usec);
- }
- }
- if(sack){
- ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
- }
- }
-
- tcph->syn=0;
- tcph->ack=1;
- tcph->fin=0;
- tcph->rst=0;
-
- /*set libpcap header lengths*/
- h->len=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4 + 1;
- h->caplen=sizeof(struct ether_header) + sizeof(struct iphdr) + tcph->doff*4 + 1;
-
- /*set length in ip header*/
- iph->tot_len=htons(sizeof(struct iphdr) + tcph->doff*4 + 1);
- }
-
- if(dccph->dccph_type==DCCP_PKT_CLOSEREQ){//DCCP CLOSEREQ----Never seen in packet capture
- dbgprintf(0,"DCCP CloseReq not yet implemented\n");