[so2] [Tema 5] Pasi pentru sendmsg

Vlad Dogaru ddvlad at herebedragons.ro
Tue May 14 11:03:43 EEST 2013


On Mon, May 13, 2013 at 11:45:09PM +0300, Dan Filimon wrote:
> Codul din af_packet.c pentru packet_sendmsg e destul de complicat și
> presupun că are multe părți care nu sunt necesare.
> 
> Din ce am înțeles pașii de făcut sunt:
> 
> 1. obținerea datelor despre dispozitivul și portul către care trebuie
> trimis pachetul (din structura noastră sock dacă există, sau alternativ din
> sockaddr_stp)
> 
> 2. alocarea unui skb pentru pachetul de trimis, cu sock_alloc_send_pskb
> care să aibă spațiu rezervat pentru header (apropo, aici modul îl luăm din
> msg->msg_flags ca în exemplu sau presupunem o variantă?)
> Asta ar fi de dimensiune len + sizeof(struct sockaddr_stp).

So far, so good.

> 3. scrierea headerului și a corpului; aici sunt nelămurit cum anume merge
> asta. Aș zice că la început scriem headerul stp_hdr și apoi corpul în
> câmpul skb->data... Dar în af_packet sunt tot felul de apeluri
> skb_set_network_header() sau skb_reset_mac_header().

Poți folosi secvența reserve + reset_network_header din af_packet.

> Ar trebui să facem ceva cu push/pull ca în curs?
> Cred că putem scrie direct la offset-urile corecte headerul și datele...
> Deși, mă întreb dacă skb-ul poate fi fragmentat?

Al treilea parametru al sendmsg este un struct msghdr, care conține un
struct iovec.  Poți folosi iovec-ul într-un apel de
skb_copy_datagram_from_iovec.  This takes care of fragmentation.

> 4. dev_queue_xmit() ca să fie adăugat în coada de transmisie

Înainte de asta, calculează checksum-ul protocolului nostru (STP) și
apelează dev_hard_header.

> Bănuiesc că putem ignora alte lucruri mai complicate.

Pretty much so, yeah.

Hope this helps,
Vlad


More information about the so2 mailing list