]> sjero.net Git - dccp2tcp/blobdiff - dccp2tcp.c
IPv6 support!
[dccp2tcp] / dccp2tcp.c
index bbf729973186f8c7c08b80a79074936c73f08c13..3df497e33659ef7a630f33df1f79bdaebad60983 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
 Author: Samuel Jero
 
-Date: 7/2011
+Date: 11/2012
 
 Description: Program to convert a DCCP flow to a TCP flow for DCCP analysis via
                tcptrace.
@@ -10,9 +10,8 @@ Notes:
        1)CCID2 ONLY
        2)DCCP MUST use 48 bit sequence numbers
        3)Checksums are not computed (they are zeroed)
-       4)Only implements those packet types normally used in a session
+       4)DCCP DATA packets are not implemented (Linux doesn't use them)
        5)DCCP Ack packets show up as TCP packets containing one byte
-       6)Very little error checking of packet headers
 ******************************************************************************/
 #include "dccp2tcp.h"
 
@@ -28,8 +27,6 @@ struct connection *chead;     /*connection list*/
 
 
 
-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);
 int convert_packet(struct packet *new, const struct const_packet* old);
 unsigned int interp_ack_vect(u_char* hdr);
@@ -56,8 +53,9 @@ int main(int argc, char *argv[])
 
        /*loop through commandline options*/
        for(int i=1; i < argc; i++){
-               if(argv[i][0]!='-'){
-                       if(dfile==NULL){ /*assign first non-dash argument to the dccp file*/
+               if(argv[i][0]!='-' || (argv[i][0]=='-' && strlen(argv[i])==1)){
+                       if(dfile==NULL  || argv[i][0]=='-'){
+                               /*assign first non-dash (or only dash) argument to the dccp file*/
                                dfile=argv[i];
                        }else{
                                if(tfile==NULL){
@@ -131,6 +129,9 @@ int main(int argc, char *argv[])
        /*close files*/
        pcap_close(in);
        pcap_dump_close(out);
+
+       /*Delete all connections*/
+       cleanup_connections();
 return 0;
 }
 
@@ -154,8 +155,12 @@ void handle_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *byte
        old.h=h;
        old.length=h->caplen;
        old.data=bytes;
+       old.dest_id=NULL;
+       old.src_id=NULL;
        new.h=&nh;
        new.length=MAX_PACKET;
+       new.dest_id=NULL;
+       new.src_id=NULL;
 
        /*create buffer for new packet*/
        new.data=ndata=malloc(MAX_PACKET);
@@ -213,10 +218,12 @@ int convert_packet(struct packet *new, const struct const_packet* old)
        dccphex=(struct dccp_hdr_ext*)(old->data+sizeof(struct dccp_hdr));
        dccphack=(struct dccp_hdr_ack_bits*)(old->data+ 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)));
+       dbgprintf(2,"Sequence Number: %llu\n", (unsigned long long)
+                       (((unsigned long)ntohs(dccph->dccph_seq)<<32) + ntohl(dccphex->dccph_seq_low)));
 
        /*Get Hosts*/
-       if(get_host(new->src_id, new->dest_id, dccph->dccph_sport, dccph->dccph_dport, &h1, &h2)){
+       if(get_host(new->src_id, new->dest_id, new->id_len,
+                       dccph->dccph_sport, dccph->dccph_dport, &h1, &h2)){
                dbgprintf(0,"Error: Can't Get Hosts!\n");
                return 0;
        }