]> sjero.net Git - dccp2tcp/blobdiff - connections.c
IPv6 support!
[dccp2tcp] / connections.c
index b5eb11287c71bfea62b3d9fdc7437badd177f47b..4bc60f04f3684d989bc19b5bd309956252944f7e 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
 Author: Samuel Jero
 
-Date: 7/2011
+Date: 11/2012
 
 Description: Functions for differentiating different DCCP connections.
 
@@ -9,12 +9,13 @@ Description: Functions for differentiating different DCCP connections.
 #include "dccp2tcp.h"
 
 /*Lookup a connection. If it doesn't exist, add a new connection and return it.*/
-int get_host(uint32_t src_id, uint32_t dest_id, int src_port, int dest_port, struct host **fwd, struct host **rev){
+int get_host(u_char *src_id, u_char* dest_id, int id_len, int src_port, int dest_port,
+               struct host **fwd, struct host **rev){
        struct connection *ptr;
 
        /*Empty list*/
        if(chead==NULL){
-               if(add_connection(src_id, dest_id, src_port, dest_port)==NULL){
+               if(add_connection(src_id, dest_id, id_len, src_port, dest_port)==NULL){
                        return 1;
                }
                *fwd=&chead->A;
@@ -25,12 +26,14 @@ int get_host(uint32_t src_id, uint32_t dest_id, int src_port, int dest_port, str
        /*Loop list looking for connection*/
        ptr=chead;
        while(ptr!=NULL){
-               if(ptr->A.id==src_id && ptr->A.port==src_port && ptr->A.state!=CLOSE){
+               if(memcmp(ptr->A.id,src_id,id_len)==0 && ptr->A.port==src_port &&
+                               !(ptr->A.state==CLOSE && ptr->B.state==CLOSE)){
                        *fwd=&ptr->A;
                        *rev=&ptr->B;
                        return 0;
                }
-               if(ptr->B.id==src_id && ptr->B.port==src_port && ptr->B.state!=CLOSE){
+               if(memcmp(ptr->B.id,src_id,id_len)==0 && ptr->B.port==src_port &&
+                               !(ptr->B.state==CLOSE && ptr->A.state==CLOSE)){
                        *fwd=&ptr->B;
                        *rev=&ptr->A;
                        return 0;
@@ -39,7 +42,7 @@ int get_host(uint32_t src_id, uint32_t dest_id, int src_port, int dest_port, str
        }
 
        /*Add new connection*/
-       ptr=add_connection(src_id, dest_id, src_port, dest_port);
+       ptr=add_connection(src_id, dest_id, id_len, src_port, dest_port);
        if(ptr==NULL){
                return 1;
        }
@@ -49,7 +52,7 @@ int get_host(uint32_t src_id, uint32_t dest_id, int src_port, int dest_port, str
 }
 
 /*Add a connection. Return it. On failure, return NULL*/
-struct connection *add_connection(uint32_t src_id, uint32_t dest_id, int src_port, int dest_port){
+struct connection *add_connection(u_char *src_id, u_char* dest_id, int id_len, int src_port, int dest_port){
        struct connection *ptr;
        struct connection *prev;
 
@@ -72,10 +75,16 @@ struct connection *add_connection(uint32_t src_id, uint32_t dest_id, int src_por
        }
 
        /*Initialize*/
-       ptr->A.id=src_id;
+       ptr->A.id=malloc(id_len);
+       ptr->B.id=malloc(id_len);
+       if(ptr->A.id==NULL||ptr->B.id==NULL){
+               dbgprintf(0,"Error: Couldn't allocate Memory\n");
+               exit(1);
+       }
+       memcpy(ptr->A.id,src_id,id_len);
        ptr->A.port=src_port;
        ptr->A.state=INIT;
-       ptr->B.id=dest_id;
+       memcpy(ptr->B.id,dest_id,id_len);
        ptr->B.port=dest_port;
        ptr->B.state=INIT;
 
@@ -90,3 +99,19 @@ int update_state(struct host* hst, enum con_state st){
        hst->state=st;
        return 0;
 }
+
+/*Free all connections*/
+void cleanup_connections(){
+       struct connection *ptr;
+       struct connection *prev;
+       prev=ptr=chead;
+
+       while(ptr!=NULL){
+               prev=ptr;
+               free(ptr->A.id);
+               free(ptr->B.id);
+               ptr=ptr->next;
+               free(prev);
+       }
+return;
+}