<div dir="ltr">Mulțumesc!<div class="gmail_extra"><br><div class="gmail_quote">2013/5/14 Vlad Dogaru <span dir="ltr"><<a href="mailto:ddvlad@herebedragons.ro" target="_blank">ddvlad@herebedragons.ro</a>></span><br><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>On Mon, May 13, 2013 at 11:45:09PM +0300, Dan Filimon wrote:<br>
> Codul din af_packet.c pentru packet_sendmsg e destul de complicat și<br>
> presupun că are multe părți care nu sunt necesare.<br>
><br>
> Din ce am înțeles pașii de făcut sunt:<br>
><br>
> 1. obținerea datelor despre dispozitivul și portul către care trebuie<br>
> trimis pachetul (din structura noastră sock dacă există, sau alternativ din<br>
> sockaddr_stp)<br>
><br>
> 2. alocarea unui skb pentru pachetul de trimis, cu sock_alloc_send_pskb<br>
> care să aibă spațiu rezervat pentru header (apropo, aici modul îl luăm din<br>
> msg->msg_flags ca în exemplu sau presupunem o variantă?)<br>
> Asta ar fi de dimensiune len + sizeof(struct sockaddr_stp).<br>
<br>
</div>So far, so good.<br>
<div><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>
</div>Poți folosi secvența reserve + reset_network_header din af_packet.</blockquote><div><br></div><div style>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.</div>

<div style>Unde ar trebui să pointeze network_header și mac_header de fapt?</div><div><br></div><div style>2. Și despre mac_header, trebuie să punem headerul STP cu checksumul calculat sau și headerul Ethernet?</div><div style>

Întreb fiindcă spuneai mai jos că trebuie apelat dev_hard_header. Nu mi-e clar ce face.</div><div style><br></div><div style>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...</div>

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

<div style>|STP header | data |</div><div style><br></div><div style>Header-ul și trailerul Ethernet urmând să fie adăugate mai mai jos, după dev_queue_xmit().</div><div style><br></div><div style>[1] <a href="http://www.skbuff.net/skbbasic.html">http://www.skbuff.net/skbbasic.html</a></div>

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