[so2] [Tema 5] recvmsg in proto_ops si prot_hook_func
Dan Filimon
dangeorge.filimon at gmail.com
Tue May 14 18:50:26 EEST 2013
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 să
> > 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...
> După înregistrarea corectă, orice frame cu Ethertype == .type-ul pe care
> l-ai pus tu în packet_type (care trebuie să fie ETH_P_STP) ajunge în
> .func-ul tău.
> 2. La recvmsg, eroarea pe care o primesc de la skb_recv_datagram() este
> > -512, -ERESTARTSYS.
> > Deci, ar trebui re-apelată... cu alți parametri poate?
>
> stp_recv trebuie să parseze headerul de nivel STP (și să se uite și la
> MAC-uri, probabil) pentru a căuta cărui socket trebuie să îi trimită
> fiecare skb. După ce găsești sock-ul, trimiți skb-ul către el folosind
> sock_queue_rcv_skb.
>
Deci, .func-ul e responsabil pentru apelul sock_queue_rcv_skb() care să
pună pachetul în coada socket-ului care trebuie. Singurul apel de
sock_queue_rcv_skb() în af.packet e la [2], în packet_rcv_skb, care un
.func.
stp_recv e func-ul în ce-ai descris, right?
Pe urmă stp_recvmsg (altă funcție!) care e din proto_ops va lua mesajul din
coadă și-l copiază într-un iovec și-l trimite mai sus.
[1] http://lxr.linux.no/linux+v3.7.8/net/packet/af_packet.c#L232
[2] http://lxr.linux.no/linux+v3.7.8/net/packet/af_packet.c#L1328
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20130514/7425d71d/attachment.html>
More information about the so2
mailing list