[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