<div dir="ltr">2013/5/14 Dan Filimon <span dir="ltr"><<a href="mailto:dangeorge.filimon@gmail.com" target="_blank">dangeorge.filimon@gmail.com</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">2013/5/14 Dan Filimon <span dir="ltr"><<a href="mailto:dangeorge.filimon@gmail.com" target="_blank">dangeorge.filimon@gmail.com</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<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"><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>On Tue, May 14, 2013 at 06:08:51PM +0300, Dan Filimon wrote:<br>
> În af_packet.c, există mai multe funcții care par să facă aproape același<br>
> lucru... să primească date.<br>
><br>
> Există packet_rcv și packet_recvmsg.<br>
><br>
> 1. packet_rcv e pusă în câmpul prot_hook.func ca și handler.<br>
> 2. Apoi, packet_recvmsg e funcția care e efectiv apelată la un receive.<br>
><br>
> Întrebările:<br>
><br>
> 1. Au prototipuri diferite și par să facă lucruri diferite, dar la<br>
> implementările mele, handlerul, prot_hook.func (numit stp_rcv) nu pare să<br>
> fie apelat niciodată.<br>
><br>
> Din ce-am înțeles handlerul ar trebui apelat de kernel când primește un<br>
> pachet de acel tip.<br>
> Curios e că am adăugat hook-ul pentru ambii sockeți (am printat un mesaj<br>
> după instrucțiune) dar nu se apelează niciodată handler-ul. De ce?<br>
<br>
</div>Nu știu ce înseamnă "am adăugat hook-ul pentru ambii sockeți".<br>
Structura packet_type (care are .func = stp_rcv) trebuie înregistrată o<br>
singură dată, la inserarea modulului.<br></blockquote><div><br></div></div><div>Așa credeam și eu după ce-am citit inițial tema. Apoi, am văzut în codul af_packet.c [1] că se execută la fiecare packet_create() (acolo creeându-se sockeții packet).</div>
<div>Ar trebui deci să înregistrez o singură dată I guess...</div></div></div></div></blockquote><div><br></div></div><div>Legat de asta, am mai rumegat și concluzia e că arhitectura din af_packet.c e că adaugă un handler per dispozitiv, nu unul global. Deci, fiecare socket are câte unul.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">[1] <a href="http://lxr.linux.no/linux+v3.7.8/net/packet/af_packet.c#L232" target="_blank">http://lxr.linux.no/linux+v3.7.8/net/packet/af_packet.c#L232</a></div>
</div></blockquote></div></div></div>
</blockquote></div><br></div><div class="gmail_extra" style>În caz că se lovește și altcineva de problema cu handlerul ne-apelat:</div><div class="gmail_extra" style><br></div><div class="gmail_extra" style>1. în structura packet_type, tipul (type) este htons(ETH_P_STP) (deci, aici e în ordinea rețelei!)</div>
<div class="gmail_extra" style><br></div><div class="gmail_extra" style>2. la apelul funcției dev_hard_header(), trebuie pus același lucru, dar ÎN ORDINEA HOSTULUI; deci, dacă folosiți același câmp (cum am făcut eu...), dați ca argument ntohs(stp_packet_type.type).</div>
</div>