[so2] [Tema 5] Pasi pentru sendmsg

Vlad Dogaru ddvlad at herebedragons.ro
Tue May 14 12:28:44 EEST 2013


On Tue, May 14, 2013 at 12:05:39PM +0300, Dan Filimon wrote:
> > > 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.
> 
> 
> 1. reset_network_header() face ca offset-ul pentru network_header să fie
> data - head. Dar, dacă fac asta practic network_header va arăta la
> începutul pachetului, unde e header-ul STP.

Da, dar înainte de reset_network_header() faci reserve(), care are grijă
să păstreze spațiu "înaintea" headerului STP.  Acest spațiu va fi
folosit de dev_hard_header, care apelează eth_header, care face skb_push
ca primă acțiune.

> Unde ar trebui să pointeze network_header și mac_header de fapt?
> 
> 2. Și despre mac_header, trebuie să punem headerul STP cu checksumul
> calculat sau și headerul Ethernet?
> Întreb fiindcă spuneai mai jos că trebuie apelat dev_hard_header. Nu mi-e
> clar ce face.

dev_hard_header pune headerul Ethernet.

> Am văzut că dev_hard_header apelează header_ops.create() din dev. Eu n-am
> adăugat o structură custom header_ops și fiindcă protocolul e ETH_P_STP
> care suprascrie un protocol mai vechi, mă gândesc că scrie un header de
> acel tip cumva...

STP e încapsulat în Ethernet.  Nu e nevoie să înregistrezi header_ops-ul
tău, ci doar să folosești dev_hard_header pentru a adăuga headerul
Ethernet după ce îl pui pe cel STP.

> Sau, e un mod fancy de a face memcpy() de la data (după un push() ca în
> pozele de aici [1])?
> 
> Efectiv, pachetul rezultat înțeleg eu că trebuie să arate așa:
> |STP header | data |

Cu un Ehternet header în față, hence the dev_hard_header call :)

Vlad


More information about the so2 mailing list