2

Ich habe einige Fragen im Zusammenhang mit der SKB.skb und Scatter sammeln Funktion

Wenn wir versuchen, ein Skb mit alloc_skb() zuzuordnen, werden alle Header zugeordnet werden, zum Beispiel ein l4 Header, l3 Header, l2 Header usw., Ich habe sizeof (struct sk_buff) als gesehen 188. Das muss mit dem ganzen Header - Bin ich richtig?

Der Inhalt von SKB wird mit allen Headern zusammenhängend sein (unter Berücksichtigung einer Zwischenlage ohne Fragmente). richtig?

Scatter Gather (SG) - eine Hardwarefunktion zum Abrufen von Daten von verschiedenen Speicherorten zum Kopieren (DMA) in den Gerätespeicher.

Wenn der SKB Liner sein soll und wenn er innerhalb der MTU-Größe liegt, wird SG nicht verwendet. ?

Wenn der SKB nichtlinear ist und die Größe die MTU-Größe überschreitet, wird SG verwendet.

Wenn wir skb als nichtlinearen Fall treffen, in dem Sinne skb mit mehreren Fragmenten. Bitte bestätigen?

Danke, Kumar

+0

sock_alloc_send_pskb() scheint ein Fragment pro Seite zu verwenden. – ninjalj

Antwort

2

Ich versuche, Ihre Frage zu verstehen.

Wenn Sie alloc_skb verwenden, geben Sie die Größe der Daten an, die in der skb-Struktur selbst berücksichtigt werden sollen. Dies wird häufig für Netzwerk-Header verwendet.

Die Scatter-Gather-Listen innerhalb des Skb werden üblicherweise für die Daten Nutzlast Ihres Pakets verwendet.

Dies bedeutet, dass wenn Sie eine Reihe von Daten im Speicher haben, können Sie die SKB erstellen, Platz für die Header und schreiben Sie die Header innerhalb der SKB selbst - die Verwendung der SG-Einträge auf Ihre Daten zeigen, Beseitigung der Notwendigkeit, Kopie es.

Das Konzept von "MTU" hat nichts damit zu tun, dass SG verwendet wird oder nicht.

Wenn Sie "skb_put" Daten in Ihr skb - es wird mit dem Paket übertragen werden. Wenn Sie Elemente zu SG hinzufügen, werden diese an sie gesendet.

+0

Daten gehen normalerweise nicht in S/G IO-Fragmente, es sei denn, der Hauptskbuff-Puffer hat bereits eine Seite gefüllt, zumindest für Sendeoperationen auf TCP und UDP, siehe tcp_sendmsg()/udp_sendmsg(). – ninjalj