[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