On Mon, Apr 27 23:18, Kevin Wolf wrote: > ! 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); Hm, was hat packet_size mit der Groesse der Struktur zu tun? :-/ > + 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); > } Ich glaube abgesehen davon sieht das, soweit ich es beurteilen kann, vernuenftig aus. ;-) -- Antoine Kaufmann <toni@xxxxxxxxxxxxxxxx>
Attachment:
pgpo6RsGdyCL4.pgp
Description: PGP signature