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

[tyndur-devel] [PATCH] tcpip: Schreibvorgaenge auf mehrere TCP-Pakete aufteilen



! tcpip: Beim Senden von TCP-Paketen sollte man die MSS nicht
  ueberschreiten, sonst spielt der Netzwerktreiber nicht mehr mit und
  man kann keine Foreneintraege abschicken. Daher werden in der
  LostIO-Schnittstelle jetzt die Daten auf mehrere Pakete verteilt.
---
 src/modules/tcpip/include/tcp.h |    7 +++++++
 src/modules/tcpip/lostio_if.c   |   24 ++++++++++++++++++------
 src/modules/tcpip/tcp.c         |   10 ++++++++++
 3 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/modules/tcpip/include/tcp.h b/src/modules/tcpip/include/tcp.h
index e325ae7..42b5699 100644
--- a/src/modules/tcpip/include/tcp.h
+++ b/src/modules/tcpip/include/tcp.h
@@ -121,4 +121,11 @@ void tcp_update_checksum
 void tcp_receive(dword source_ip, void* data, dword data_size);
 void tcp_send_ack(struct tcp_connection* conn); // TODO Ersetzen
 
+/**
+ * Gibt die MSS (Maximum Segment Size) fuer eine TCP-Verbindung zurueck, d.h.
+ * die maximale Anzahl Bytes, die als Nutzdaten in einem TCP-Paket uebertragen
+ * werden koennen
+ */
+size_t tcp_get_mss(struct tcp_connection* conn);
+
 #endif
diff --git a/src/modules/tcpip/lostio_if.c b/src/modules/tcpip/lostio_if.c
index 5b4037b..410d221 100644
--- a/src/modules/tcpip/lostio_if.c
+++ b/src/modules/tcpip/lostio_if.c
@@ -293,13 +293,25 @@ size_t lostio_tcp_write
         return 0;
     }
 
-    struct tcp_out_buffer* out_buffer = malloc(sizeof(*out_buffer));
-    out_buffer->data = data;
-    out_buffer->size = blocksize * count;
+    // Zu schreibende Teile auf passende Paketgroessen zusammenhacken und in
+    // den ausgehenden Puffer speichern
+    struct tcp_out_buffer* out_buffer;
+    size_t size = blocksize * count;
+    size_t mss = tcp_get_mss(conn);
+    while (size > 0) {
+        size_t packet_size = size > mss ? mss : size;
 
-    list_insert(conn->out_buffer, list_size(conn->out_buffer), out_buffer);
-    //list_push(conn->out_buffer, "GET / HTTP/1.0\r\n\r\n");
-    
+        out_buffer = malloc(packet_size);
+        out_buffer->data = data;
+        out_buffer->size = packet_size;
+
+        list_insert(conn->out_buffer, list_size(conn->out_buffer), out_buffer);
+
+        data += packet_size;
+        size -= packet_size;
+    }
+
+    // Ausgehenden Puffer senden
     while (!list_is_empty(conn->out_buffer)) {
         tcp_send_ack(conn);
     }
diff --git a/src/modules/tcpip/tcp.c b/src/modules/tcpip/tcp.c
index 7e63c9e..7eac8b2 100644
--- a/src/modules/tcpip/tcp.c
+++ b/src/modules/tcpip/tcp.c
@@ -81,6 +81,16 @@ static word tcp_get_free_port(void)
     return source_port++;
 }
 
+/**
+ * Gibt die MSS (Maximum Segment Size) fuer eine TCP-Verbindung zurueck, d.h.
+ * die maximale Anzahl Bytes, die als Nutzdaten in einem TCP-Paket uebertragen
+ * werden koennen
+ */
+size_t tcp_get_mss(struct tcp_connection* conn)
+{
+    return 1500 - sizeof(struct ip_header) - sizeof(struct tcp_header);
+}
+
 static void tcp_send_packet(struct tcp_connection* conn, void* data, 
     dword data_size, byte flags)
 {
-- 
1.6.0.2