<div dir="ltr">2013/5/14 Vlad Dogaru <span dir="ltr"><<a href="mailto:ddvlad@herebedragons.ro" target="_blank">ddvlad@herebedragons.ro</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div class="im">On Tue, May 14, 2013 at 12:05:39PM +0300, Dan Filimon wrote:<br>
> > > 3. scrierea headerului și a corpului; aici sunt nelămurit cum anume merge<br>
> > > asta. Aș zice că la început scriem headerul stp_hdr și apoi corpul în<br>
> > > câmpul skb->data... Dar în af_packet sunt tot felul de apeluri<br>
> > > skb_set_network_header() sau skb_reset_mac_header().<br>
> ><br>
> > Poți folosi secvența reserve + reset_network_header din af_packet.<br>
><br>
><br>
> 1. reset_network_header() face ca offset-ul pentru network_header să fie<br>
> data - head. Dar, dacă fac asta practic network_header va arăta la<br>
> începutul pachetului, unde e header-ul STP.<br>
<br>
</div>Da, dar înainte de reset_network_header() faci reserve(), care are grijă<br>
să păstreze spațiu "înaintea" headerului STP.  Acest spațiu va fi<br>
folosit de dev_hard_header, care apelează eth_header, care face skb_push<br>
ca primă acțiune.<br></blockquote><div><br></div><div style>Hmm, deci atunci pachetul pe care-l aloc are dimensiune len + sizeof(stp_hdr) + sizeof(ethernet header)?</div><div style>Sau, mai degrabă zis, headerul STP există deja în mesajul pe care-l trimit sau eu îl construiesc?</div>

<div style><br></div><div style>Iar reserve() e de fapt, skb_reserve(skb, hlen), unde hlen e lungimea headerului pe care vreau să o rezerv, right?</div><div style><br></div><div style>Î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?</div>

<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">
> Unde ar trebui să pointeze network_header și mac_header de fapt?<br>
><br>
> 2. Și despre mac_header, trebuie să punem headerul STP cu checksumul<br>
> calculat sau și headerul Ethernet?<br>
> Întreb fiindcă spuneai mai jos că trebuie apelat dev_hard_header. Nu mi-e<br>
> clar ce face.<br>
<br>
</div>dev_hard_header pune headerul Ethernet.<br>
<div class="im"><br>
> Am văzut că dev_hard_header apelează header_ops.create() din dev. Eu n-am<br>
> adăugat o structură custom header_ops și fiindcă protocolul e ETH_P_STP<br>
> care suprascrie un protocol mai vechi, mă gândesc că scrie un header de<br>
> acel tip cumva...<br>
<br>
</div>STP e încapsulat în Ethernet.  Nu e nevoie să înregistrezi header_ops-ul<br>
tău, ci doar să folosești dev_hard_header pentru a adăuga headerul<br>
Ethernet după ce îl pui pe cel STP.<br>
<div class="im"><br>
> Sau, e un mod fancy de a face memcpy() de la data (după un push() ca în<br>
> pozele de aici [1])?<br>
><br>
> Efectiv, pachetul rezultat înțeleg eu că trebuie să arate așa:<br>
> |STP header | data |<br>
<br>
</div>Cu un Ehternet header în față, hence the dev_hard_header call :)<br>
<br>
Vlad<br></blockquote><div><br></div><div style>Makes sense ce e cu dev_hard_header atunci. </div><div><br></div><div>[1] <a href="http://stackoverflow.com/questions/10245281/using-sk-buff-to-add-an-ethernet-frame-header">http://stackoverflow.com/questions/10245281/using-sk-buff-to-add-an-ethernet-frame-header</a> </div>

</div><br></div></div>