[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