[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] tcpip: tcp_free_connection()



! tcpip: Das Löschen einer Verbindung nach
         tcp_free_connection() ausgelagert
         (und gelockt)
- tcpip: Kommentar des doppelten printf()
---
 src/modules/tcpip/include/tcp.h |    1 +
 src/modules/tcpip/tcp.c         |   46 ++++++++++++++++++++++++++------------
 2 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/modules/tcpip/include/tcp.h b/src/modules/tcpip/include/tcp.h
index 4f33957..b0b5917 100644
--- a/src/modules/tcpip/include/tcp.h
+++ b/src/modules/tcpip/include/tcp.h
@@ -116,6 +116,7 @@ struct tcp_server {
 
 void init_tcp(void);
 struct tcp_connection* tcp_open_connection(dword ip, word port);
+void tcp_free_connection(struct tcp_connection* conn);
 void tcp_accept_connection(struct tcp_connection* conn);
 
 word tcp_checksum
diff --git a/src/modules/tcpip/tcp.c b/src/modules/tcpip/tcp.c
index 061ceb9..1501316 100644
--- a/src/modules/tcpip/tcp.c
+++ b/src/modules/tcpip/tcp.c
@@ -186,7 +186,6 @@ struct tcp_connection* tcp_open_connection(dword ip, word port)
 {
     struct routing_entry* route = get_routing_entry(ip);
     uint64_t timeout;
-    int tcp_list_size, i;
 
     if (route == NULL) {
         return NULL;
@@ -223,18 +222,7 @@ struct tcp_connection* tcp_open_connection(dword ip, word port)
 
     if (conn->status == TCPS_WAIT_FOR_SYN_ACK) {
         tcp_send_reset(conn);
-        tcp_list_size = list_size(tcp_connections);
-        for (i = 0; i < tcp_list_size; i++) //Geht alle Elemente durch, es könnte ja sein, dass conn jetzt nicht mehr das erste Element ist
-        {
-            if (list_get_element_at(tcp_connections, i) == conn) {
-                list_remove(tcp_connections, i); //Hoffen wir mal, dass in der Zwischenzeit (von list_get_element_at() bis hier) nichts gepusht wurde
-                break;
-            }
-        }
-        list_destroy(conn->out_buffer);
-        list_destroy(conn->in_buffer);
-        list_destroy(conn->to_lostio);
-        free(conn);
+        tcp_free_connection(conn);
         DEBUG_MSG("Timeout beim Verbindungsaufbau");
         return NULL;
     }
@@ -244,6 +232,36 @@ struct tcp_connection* tcp_open_connection(dword ip, word port)
     return conn;
 }
 
+void tcp_free_connection(struct tcp_connection* conn)
+{
+    int tcp_list_size, i;
+    
+    tcp_list_size = list_size(tcp_connections);
+    for (i = 0; i < tcp_list_size; i++) //Geht alle Elemente durch, es koennte
+                                        //ja sein, dass conn jetzt nicht mehr
+                                        //das erste Element ist
+    {
+        if (list_get_element_at(tcp_connections, i) == conn) {
+            p();
+            //Falls inzwischen was geaendert wurde, dauert das erneute Durchlaufen
+            //der ganze Liste relativ lang. Aber es passiert vermutlich selten und
+            //anstatt die ganze Schleife zu locken, ist das bestimmt besser.
+            if (list_get_element_at(tcp_connections, i) != conn) {
+                v();
+                i = -1; //Wird nach dem continue auf 0 inkrementiert
+                continue;
+            }
+            list_remove(tcp_connections, i);
+            v();
+            break;
+        }
+    }
+    list_destroy(conn->out_buffer);
+    list_destroy(conn->in_buffer);
+    list_destroy(conn->to_lostio);
+    free(conn);
+}
+
 void tcp_accept_connection(struct tcp_connection* conn)
 {
     DEBUG_MSG("tcp_send_syn_ack");
@@ -394,8 +412,6 @@ void tcp_receive(dword source_ip, void* data, dword data_size)
         
         printf("\033[1;31mTCP-Checksumme ungueltig\n\033[0;37m\n\n");
 
-        //printf("\033[1;31mTCP-Checksumme ungueltig\n\033[0;37m\n\n");
-
 #if 0
         debug_checksum = TRUE;
         p();
-- 
1.6.0.2