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

[tyndur-devel] [PATCH] tcpip: SYN-ACK-Timeout-TODO + Clientportoverflow



+ tcpip: Verbindung wird bei SYN-ACK-Timeout
         getrennt.
+ tcpip: Die if-Abfrage in tcp_get_free_port()
         soll ein Overflow der Clientports
         verhindern (damit Ports wie 80 oder 21
         nicht aus Versehen belegt werden).
---
 src/modules/tcpip/tcp.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/modules/tcpip/tcp.c b/src/modules/tcpip/tcp.c
index 84d272a..061ceb9 100644
--- a/src/modules/tcpip/tcp.c
+++ b/src/modules/tcpip/tcp.c
@@ -81,6 +81,9 @@ static word tcp_get_free_port(void)
 {
     // FIXME
     static word source_port = 32768;
+    if (source_port > 65500) { //Bisschen Platz lassen
+        source_port = 32768;
+    }
     return source_port++;
 }
 
@@ -183,6 +186,7 @@ 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;
@@ -218,7 +222,19 @@ struct tcp_connection* tcp_open_connection(dword ip, word port)
     }
 
     if (conn->status == TCPS_WAIT_FOR_SYN_ACK) {
-        // TODO Verbindung abbrechen und wieder freigeben
+        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);
         DEBUG_MSG("Timeout beim Verbindungsaufbau");
         return NULL;
     }
@@ -290,7 +306,7 @@ dword tcp_check_in_data_order(struct tcp_connection* conn)
     }
     v();
 
-    DEBUG_MSG1("Verbleibende Segemnte im in-Buffer: %d",
+    DEBUG_MSG1("Verbleibende Segmente im in-Buffer: %d",
         list_size(conn->in_buffer));
 
 
@@ -378,7 +394,7 @@ 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");
+        //printf("\033[1;31mTCP-Checksumme ungueltig\n\033[0;37m\n\n");
 
 #if 0
         debug_checksum = TRUE;
-- 
1.6.0.2