Table of Contents

e100 - driver de rețea

Scopul temei

Enunț

Să se scrie un driver pentru placa de rețea Intel 82559ER (device întâlnit şi sub numele de e100 sau eepro100). Modulul va trebui să suporte device-urile de rețea configurate în maşina virtuală qemu. Specificațiile se gasesc in documentul:

Nu va trebui să ciți în întregime documentul de mai sus, ci doar secțiunile indicate în enunț.

Puteți porni implementarea de la zero sau folosi scheletul de cod generat:

    $ LABS=assignments/6-e100 make skels 

Precizări

Interfața PCI

Urmăriți comentariile marcate cu TODO 1:

În acest moment puteți testa daca device-ul de rețea este enumerat pe magistrala de PCI (observați dacă se apelează funcția probe).

Magistrala PCI conține linii de date, adrese și întreruperi și permite procesorului să comunice cu device-urile conectate. După ce un device este descoperit (enumerat) pe magistrala PCI este nevoie să fie inițializat. În procesul de inițializare vom aloca spațiul de I/O și memorie și vom obține linia de întrerupere folosită.

Urmăriți comentariile marcate cu TODO 2:

e100 private data

Structura e100_priv_data va contine informatii specifice fiecarui device de retea gestionat de driver. În primul rând va conține informații despre pci_dev și netdevice-ul curent, apoi informatii de stare, registre, unitatea de transmisie, unitatea de recepție, etc. Spațiul de memorie pentru e100_priv_data se va aloca în funcția alloc_etherdev urmăriți sectiunea structura_net_device.

Pentru a adauga câmpuri noi în structura e100_priv_data urmăriți TODO 3.

Structura net_device

Este reprezentarea din kernel a interfeței de rețea din user-space (ixeth0, ixeth1, ș.a.m.d)

Urmăriți comentariile marcate cu TODO 4:

Modelul de funcționare al plăcii de rețea e100

e100 conține două unități funcționale descrise in capitolul 6.5 din manualul dezvoltatorului. Aceste unități funcționează ca două procesoare independente și îndeplinesc următoarele roluri:

Driverul comunică cu unitățile CU și RU prin intermediul registrului CSR (Command Register) și prin intermediul DMA rings.

Transmiterea pachetelor

Driverul trebuie sa construiasca un ring DMA in RAM pentru a instrui device-ul e100 unde se găsesc pachetele pe care dorește să le trimită. Secțiunea 6.4 din manual descrie formatul unui DMA ring.

Un ring DMA de control este alcătuit din buffere denumite Control Blocks (CB). Un CB generic arată astfel:

 +--------------+--------------+
 |    CONTROL   |    STATUS    |
 +--------------+--------------+
 |            LINK             |
 +--------------+--------------+
 |    COMMAND SPECIFIC DATA    |
 +--------------+--------------+

Mai multe detalii despre trimiterea pachetelor citiți in secțiunea Transmitting Packets de aici. Urmăriți comentariile marcate cu TODO 5.

Recepționarea pachetelor

Un al doilea DMA ring este necesar pentru recepționarea pachetelor. Fiecare buffer din DMA ring-ul de recepție este denumit RFD (Receive Frame Descriptor).

Unitatea de recepție (RU) se ocupă de primirea pachetelor. La primirea unui pachet din rețea, copiaza pachetul în urmator-ul RFD liber, marchează RFD-ul valid și se mută la următorul RFD.

Mai multe detalii despre trimiterea pachetelor citiți in secțiunea Receiving Packets de aici. Urmăriți comentariile cu TODO 6.

e100 header

Antetul e100 conține descrierea in memorie a structurilor importante expuse de device-ul e100.

Testare

Pentru simplificarea procesului de corectare a temelor, dar și pentru a reduce greșelile temelor trimise, corectarea temelor se va face automat cu ajutorul unor teste publice.

Sfaturi

Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul Coding Style.

De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul:

checkpatch.pl

sparse

cppcheck

Depunctări

Tema valorează 2 puncte.

Depunctările generale pentru teme se găsesc pe pagina de Indicații generale.

În cazuri excepționale (tema trece testele prin nerespectarea cerințelor) și în cazul în care tema nu trece toate testele se poate scădea mai mult decât este menționat mai sus.

Submitere

Arhiva temei va fi submisă pe vmchecker, în conformitate cu precizările din pagina de reguli.

Din interfața vmchecker alegeți opțiunea e100 Driver, aferentă acestei teme.

Resurse

Resursele temei se găsesc și în repo-ul so2-assignments de pe GitHub. Repo-ul conține și un script Bash care vă ajută să vă creați un repository privat pe instanța de GitLab a facultății. Urmăriți indicațiile din README și de pe pagina de Wiki dedicată pentru git.

FAQ

  1. Unde setăm adresa MAC?
    • Adresa MAC trebuie pusă în câmpul dev_addr din structura net_device înaintea înregistrării netdevice-ului în kernel (register_netdevice) în funcția probe.
  2. Este necesar să citim adresa MAC din EEPROM-ul e100? Cum luăm adresa MAC ?
    • Nu este necesar să citiți adresa MAC din EEPROM. Puteți configura o adresă random folosind funcția eth_hw_addr_random, atenție apoi să trimiteți plăcii de rețea comanda de setare a noului mac.
    • Este acceptată și varianta mai simplă în care puteți folosi MAC-ul default al plăcii de rețea (52:54:00:12:34:56).

Întrebări

Pentru întrebări legate de temă puteți consulta arhivele listei de discuții sau puteți trimite un e-mail (trebuie să fiți înregistrați). Vă rugăm să urmăriți și să respectați indicațiile de utilizare a listei.