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

Vlad Dogaru ddvlad at herebedragons.ro
Tue May 14 18:36:20 EEST 2013


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.

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.

Vlad


More information about the so2 mailing list