This is an old revision of the document!


Ixia Challenge

e100 - driver de rețea

  • Termen de predare: Marți, 22 Martie 2016, ora 23:00
  • Poate participa orice student din ciclul de licență din cadrul Facultății de Automatică și Calculatoare

Scopul temei

  • implementarea unui driver de rețea
  • citire documentație hardware, implementare conform specificațiilor
  • familiarizare cu următoarele concepte: întreruperi, transfer DMA, I/O ports
  • citire surse, kernel hacking

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 cele două device-uri de rețea configurate în maşina virtuală qemu. Specificațiile acestora le găsiți în următoarele documente:

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

Precizări

  • modulul de kernel se va numi e100-ix.ko
  • interfețele de rețea gestionate de acesta se vor numi ixeth0, respectiv ixeth1
  • device-ul e100 se găseşte pe magistrala PCI, va trebui descoperit şi gestionat folosind o structură de tipul pci_driver
  • driverul va fi accesat ca un device de tip rețea, structura centrală pe care trebuie să o urmăriți este struct net_device
  • recepționarea pachetelor se va face în întrerupere, nu se va folosi polling sau NAPI

Interfața PCI

  • declarați o structură de tipul struct pci_driver şi inițializați următoarele câmpuri
    • .name - numele driverului, acesta va fi inițializat cu valoarea e100-ix
    • .id_table - structură care identifică unic deviceul e100 în sistem. Vendor ID şi device ID vor fi găsite în secțiunea 4 din manualul dezvoltatorului.
    • .probe - funcție apelată de subsystemul PCI din kernel atunci când în urma parcurgerii device-urilor din sistem se va găsi un device cu identitatea dată de .id_table.
    • .remove - funcție apelată atunci când driver-ul sau device-ul sunt scoase din sistem.
  • în funcția de init a modulului înregistrați structura pci_driver. Operația aceasta va avea ca efect apelarea funcției probe
  • în funcția de exit a modului deînregistrați structura pci_driver. Operația aceasta va avea ca efect apelarea funcției remove

Structura net_device

  • este reprezentarea din kernel a interfeței de rețea din user-space (ixeth0, respectiv ixeth1)
  • structura net_device va fi alocată şi înregistrată (în funcția probe) atunci când se descoperă un device de rețea pe magistrala PCI
    • folosiți funcția alloc etherdev pentru a aloca memorie
    • va trebui să adăugați şi implementați operațiile ndo_open, ndo_stop şi ndo_start_xmit din câmpul netdev_ops
    • folosiți funcția register_netdev pentru înregistrare
  • structura net_device va fi deînregistrată şi eliberată (în funcția remove) atunci când device-ul sau modulul sunt înlăturate
    • folosiți funcția unregister_netdev pentru deînregistrare
    • folosiți funcția free_netdev pentru eliberare de memorie

Transmiterea pachetelor

  • transmiterea pachetelor se va face în funcția .ndo_start_xmit
  • driverul va aloca o zonă de memorie DMA (DMA ring) şi va instrui placa de rețea să trimită pachetele din acea zonă.

Recepționarea pachetelor

  • recepționarea pachetelor se va face în handlerul de întrerupere
  • la primirea unui pachet device-ul e100 copiază datele într-o zonă DMA şi generează o întrerupere pentru a informa procesorul de sosirea unui nou pachet.

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

  •  /path/to/linux-4.9.11/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/src-file.c 

sparse

  •  sudo apt-get install sparse 
  •  cd /path/to/linux-4.9.11 
     make C=2 /path/to/your/src-file.c 

cppcheck

  •  sudo apt-get install cppcheck 
  •  cppcheck /path/to/your/src-file.c 

Depunctări

Tema valorează 2 puncte şi intră în competiția Ixia Challenge dacă se trimite până la data Marți, 22 Martie 2016, ora 23:00. După această dată tema valoreaza 1 punct, minus depunctarea pentru întârziere.

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, aferentă acestei teme.

Î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).

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).

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.

so2/teme/challenge.1488635196.txt.gz · Last modified: 2017/03/04 15:46 by adrian.stanciu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0