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

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



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: pgpETFJxx4w6d.pgp
Description: PGP signature