[so2] [Tema 5] Pasi pentru sendmsg
Dan Filimon
dangeorge.filimon at gmail.com
Tue May 14 12:51:54 EEST 2013
2013/5/14 Vlad Dogaru <ddvlad at herebedragons.ro>
> 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.
>
Hmm, deci atunci pachetul pe care-l aloc are dimensiune len +
sizeof(stp_hdr) + sizeof(ethernet header)?
Sau, mai degrabă zis, headerul STP există deja în mesajul pe care-l trimit
sau eu îl construiesc?
Iar reserve() e de fapt, skb_reserve(skb, hlen), unde hlen e lungimea
headerului pe care vreau să o rezerv, right?
În plus, când apelez dev_hard_header(), tipul pe care-l trimit ca al 3-lea
argument ar trebui să fie ETH_P_STP? Sau, ca aici [1], ETH_P_IP?
> > 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
>
Makes sense ce e cu dev_hard_header atunci.
[1]
http://stackoverflow.com/questions/10245281/using-sk-buff-to-add-an-ethernet-frame-header
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20130514/6fb9d00a/attachment.html>
More information about the so2
mailing list