]> sjero.net Git - dccp2tcp/blobdiff - dccp2tcp.c
Option to only show Ack Vectors/SACKS with loss
[dccp2tcp] / dccp2tcp.c
index 193df2c46d678e21dfbff1dc1124a98b87fbd9a9..0ed79a50fed94afe1ef42c6929ea5701ace9d266 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
 Author: Samuel Jero
 
-Date: 4/2011
+Date: 5/2011
 
 Description: Program to convert a DCCP flow to a TCP flow for DCCP analysis via
                tcptrace.
@@ -23,7 +23,7 @@ int yellow=0; /*tcptrace yellow line as currently acked packet*/
 int green=0;   /*tcptrace green line as currently acked packet*/
 int sack=0;            /*add TCP SACKS*/
 
-pcap_t*                in;                     /*libpcap input file discriptor*/
+pcap_t*                        in;                     /*libpcap input file discriptor*/
 pcap_dumper_t  *out;   /*libpcap output file discriptor*/
 struct seq_num *s1;    /*sequence number structure for side one of connection*/
 struct seq_num *s2;    /*sequence number structure for side two of connection*/
@@ -33,7 +33,7 @@ struct seq_num        *s2;    /*sequence number structure for side two of connection*/
 void PcapSavePacket(struct pcap_pkthdr *h, u_char *data);
 void process_packets();
 void handle_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);
-void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u_char **odata, int *length);
+int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_char **optr, int *length);
 unsigned int interp_ack_vect(u_char* hdr);
 u_int32_t initialize_seq(struct seq_num **seq, __be16 source, __be32 initial);
 u_int32_t add_new_seq(struct seq_num *seq, __be32 num, int size, enum dccp_pkt_type type);
@@ -80,7 +80,7 @@ int main(int argc, char *argv[])
                                green=1;
                        }
                        if(argv[i][1]=='s' && strlen(argv[i])==2){ /*sack option*/
-                               sack=1;
+                               sack++;
                        }
                }
        }
@@ -144,6 +144,10 @@ void handle_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *byte
        int                                     length;
        int                                     nlength;
        struct pcap_pkthdr      nh;
+       int                                     link_type;
+
+       /*Determine the link type for this packet*/
+       link_type=pcap_datalink(in);
 
        /*create new libpcap header*/
        memcpy(&nh, h, sizeof(struct pcap_pkthdr));
@@ -161,11 +165,8 @@ void handle_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *byte
        memset(nptr, 0, MAX_PACKET);
        
        /*do all the fancy conversions*/
-       if(eth_ip_encap_pre(&nh, &nptr, &nlength, &bytes, &length)<0){
-               return;
-       }
-       convert_packet(&nh, &nptr, &nlength, &bytes, &length);
-       if(eth_ip_encap_post(&nh, &ndata, &nlength)<0){
+       if(!do_encap(link_type, &nh, &nptr, &nlength, &bytes, &length)){
+               free(ndata);
                return;
        }
 
@@ -178,10 +179,10 @@ return;
 
 
 /*do all the dccp to tcp conversions*/
-void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u_char **odata, int *length)
+int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_char **optr, int *length)
 {      
-       u_char* ncur=*ndata;
-       const u_char* ocur=*odata;
+       u_char* ncur=*nptr;
+       const u_char* ocur=*optr;
        struct tcphdr *tcph;
        struct dccp_hdr *dccph;
        struct dccp_hdr_ext *dccphex;
@@ -203,7 +204,7 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
 
        /*determine data length*/
        datalength=*length - dccph->dccph_doff*4;
-       pd=*odata + dccph->dccph_doff*4;
+       pd=*optr + dccph->dccph_doff*4;
 
        /*set tcp standard features*/
        tcph->source=dccph->dccph_sport;
@@ -219,7 +220,7 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
 
        /*Only accept the first connection*/
        if(s1 && s2 && dccph->dccph_sport!=s1->addr && dccph->dccph_dport!=s1->addr){
-               return;
+               return 0;
        }
 
        /*make changes by packet type*/
@@ -292,7 +293,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                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) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -305,7 +308,10 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                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) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+
+                               }
                        }
                }
 
@@ -315,7 +321,7 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                tcph->rst=0;
 
                /*copy data*/
-               npd=*ndata + tcph->doff*4;
+               npd=*nptr + tcph->doff*4;
                memcpy(npd, pd, datalength);
 
                /*calculate length*/
@@ -338,7 +344,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                }
                        }
                        if(sack){
-                               ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -354,7 +362,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                }
                        }
                        if(sack){
-                               ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }
 
@@ -385,7 +395,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                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) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -398,7 +410,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
                        }
                        if(sack){
-                               ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }
 
@@ -424,7 +438,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                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) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -437,7 +453,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
                        }
                        if(sack){
-                               ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }
 
@@ -465,7 +483,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(0);
                        }
                        if(sack){
-                               ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -480,7 +500,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(0);
                        }
                        if(sack){
-                               ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }
 
@@ -508,7 +530,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(0);
                        }
                        if(sack){
-                               ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low));
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low));
+                               }
                        }
                }else if(s1 && s2 && dccph->dccph_sport==s2->addr){
                        if(green){
@@ -523,7 +547,9 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
                                tcph->window=htons(0);
                        }
                        if(sack){
-                               ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               if(sack!=2 || interp_ack_vect((u_char*)dccph)){
+                                       ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) );
+                               }
                        }
                }
 
@@ -538,15 +564,16 @@ void convert_packet(struct pcap_pkthdr *h, u_char **ndata, int *nlength, const u
 
        if(dccph->dccph_type==DCCP_PKT_INVALID){//DCCP INVALID----Never seen in packet capture
                dbgprintf(0,"Invalid DCCP Packet!!\n");
-               exit(1);
+               return 0;
        }
 
        *nlength=len;
-return;
+return 1;
 }
 
 
-/*Parse Ack Vector Options*/
+/*Parse Ack Vector Options
+ * Returns the Number of packets since last recorded loss*/
 unsigned int interp_ack_vect(u_char* hdr)
 {
        int hdrlen=((struct dccp_hdr*)hdr)->dccph_doff*4;