[so2] [Tema 5] stp_packet_type.func nu se apeleaza

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun May 15 21:02:39 EEST 2016


Madalina Hristache <madalina.hristache at gmail.com> writes:
> Razvan Deaconescu via so2 <so2 at cursuri.cs.pub.ro>:
>> Madalina Hristache <madalina.hristache at gmail.com> writes:
>>> Madalina Hristache <madalina.hristache at gmail.com>:
>>>> Razvan Deaconescu via so2 <so2 at cursuri.cs.pub.ro>:
>>>>> Madalina Hristache via so2 <so2 at cursuri.cs.pub.ro> writes:
>>>>>> Salut,
>>>>>>
>>>>>> Am văzut pe listele trecute că trebuie să pui htons(ETH_P_STP) în
>>>>>> .type ca să se apeleze .func, dar nu merge și nu îmi dau seama ce
>>>>>> altceva fac prost de nu se apelează. De curiozitate, ETH_P_STP trebuie
>>>>>> să îl mai folosim și altundeva în cod? Că nu îi văd locul.
>>>>>
>>>>> Nu ar trebui să vreo problemă cu apelarea funcției.
>>>>>
>>>>> Simpla definiție a structurii stp_packet_type și a inițializării celor
>>>>> două câmpuri ale ei (.type și .func) ar trebui să fie OK și să apeleze
>>>>> funcția. Ai apelat dev_add_pack în funcția de inițializare a modulului,
>>>>> da?
>>>>>
>>>>> Vei mai folosi constructul ETH_P_STP în fucția de tipul sendmsg atunci
>>>>> când construiești pachetul pentru a-l trimite.
>>>>
>>>> Da, apelez dev_add_pack în init. Mai lucrez să văd ce are.
>>
>> Iar funcția de recvmsg ai definit-o în structura de tip proto_ops? Poate
>> că nu primești pentru că nu trimiți cum trebuie :-) Poate implementarea
>> recepției este bună dar nu este bună implementarea transmiterii
>>
>>>> Altă chestie. Nu îmi e prea clar... cât spațiu trebuie dat ca al
>>>> doilea parametru la skb_reserve (parametrul hlen)?
>>
>> Cel mai bine folosești macro-ul LL_RESERVED_SPACE, așa cum se întâmplă
>> și în af_packet.c[1].
>>
>>> De asemenea, tot în zona aia, de reserve, dev_hard_header, tot apare
>>> un dev în codul model. Ce e cu el?
>>
>> Păi este o încapsulare a unei interfețe de rețea. Poți obține folosind
>> apelul dev_get_by_index așa cum este indicat și în diferite locuri din
>> af_packet.c.
>
> Bun, mulțumesc, m-am lămurit. E greșită implementarea mea de send din
> cauză că nu îmi e clar fluxul de execuție al operațiilor și ce fac
> diferite funcții pe un sk_buff.

Urmărește funcția packet_sendmsg și, de acolo, packet_snd[1].

> Am de pus un header de STP, unul de Ethernet și datele efective.
>
> 1. Înainte de asta, am de alocat un skb. Funcția de alocare are la
> parametrii 2 și 3 niște lungimi. Nu îmi e clar care sunt în cazul meu.
> Am 4 lungimi cu care lucrez: eth_len, stp_len, tail_len și data_len
> primit de funcția de send. Nu înțeleg cum se mapează pe apel.

Alocă folosind sock_alloc_send_skb. Urmărește modelul din af_packet.c.

> 2. După ce aloc skb-ul, trebuie să îl populez. În ce ordine fac asta?

Vezi packet_snd[1].

> Datele și headerul de STP le pun cu memcpy, iar headerul Ethernet cu
> dev_hard_header.

Cel mai bine copiezi datele folosind skb_copy_datagram_from_iovec, așa
cum este în packet_snd[1].

> dev_hard_header are ca ultim parametru lungimea datelor?

Da.

> 3. Am de făcut clar un reserve, dar nu știu dacă fac unul cu eth_len +
> stp_len sau fac 2 pe rând. Nu am înțeles cum funcționează.

Faci unul cu LL_RESERVED_SPACE(dev), așa cum are loc packet_alloc_skb,
apelat de packet_snd[1].

Zăbovește și insistă mai mult pe codul sursă, foarte multe dintre
întrebări își găsesc rezolvare acolo.

[1] http://lxr.free-electrons.com/source/net/packet/af_packet.c?v=3.13#L2231

Razvan


More information about the so2 mailing list