[so2] [Tema 5] recvmsg in proto_ops si prot_hook_func

Dan Filimon dangeorge.filimon at gmail.com
Tue May 14 20:52:11 EEST 2013


2013/5/14 Dan Filimon <dangeorge.filimon at gmail.com>

> 2013/5/14 Dan Filimon <dangeorge.filimon at gmail.com>
>
>> 2013/5/14 Vlad Dogaru <ddvlad at herebedragons.ro>
>>
>>> On Tue, May 14, 2013 at 06:08:51PM +0300, Dan Filimon wrote:
>>> > În af_packet.c, există mai multe funcții care par să facă aproape
>>> același
>>> > lucru... să primească date.
>>> >
>>> > Există packet_rcv și packet_recvmsg.
>>> >
>>> > 1. packet_rcv e pusă în câmpul prot_hook.func ca și handler.
>>> > 2. Apoi, packet_recvmsg e funcția care e efectiv apelată la un receive.
>>> >
>>> > Întrebările:
>>> >
>>> > 1. Au prototipuri diferite și par să facă lucruri diferite, dar la
>>> > implementările mele, handlerul, prot_hook.func (numit stp_rcv) nu pare
>>>>>> > fie apelat niciodată.
>>> >
>>> > Din ce-am înțeles handlerul ar trebui apelat de kernel când primește un
>>> > pachet de acel tip.
>>> > Curios e că am adăugat hook-ul pentru ambii sockeți (am printat un
>>> mesaj
>>> > după instrucțiune) dar nu se apelează niciodată handler-ul. De ce?
>>>
>>> Nu știu ce înseamnă "am adăugat hook-ul pentru ambii sockeți".
>>> Structura packet_type (care are .func = stp_rcv) trebuie înregistrată o
>>> singură dată, la inserarea modulului.
>>>
>>
>> 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).
>> Ar trebui deci să înregistrez o singură dată I guess...
>>
>
> 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.
>
>
>> [1] http://lxr.linux.no/linux+v3.7.8/net/packet/af_packet.c#L232
>>
>
În caz că se lovește și altcineva de problema cu handlerul ne-apelat:

1. în structura packet_type, tipul (type) este htons(ETH_P_STP) (deci, aici
e în ordinea rețelei!)

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).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20130514/ca582b38/attachment-0001.html>


More information about the so2 mailing list