This shows you the differences between two versions of the page.
so2:teme:challenge [2017/03/12 10:24] adrian.stanciu [Depunctări] |
so2:teme:challenge [2020/04/11 19:18] (current) constantin.ghioc [PITIX - sistem de fișiere] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Ixia Challenge ====== | ====== Ixia Challenge ====== | ||
- | ===== e100 - driver de rețea ==== | + | ===== PITIX - sistem de fișiere ==== |
- | * Termen de predare: **Duminică, 26 Martie 2017, ora 23:00 ** \\ | + | |
- | * Poate participa orice student din ciclul de licență din cadrul Facultății de Automatică și Calculatoare \\ | + | |
- | <hidden> | + | |
- | * Premiul **Ixia Challenge** - participarea sponsorizată de Ixia (toate costurile) la [[http://events.linuxfoundation.org/events/linuxcon-europe|LinuxCon Europe 2016]], 4-6 octombrie 2016, Berlin | + | |
- | </hidden> | + | |
- | ===== Scopul temei ===== | + | |
- | * implementarea unui driver de rețea | + | Tema Ixia Challenge are termen de predare: **Sâmbătă, 25 Aprilie 2020, ora 23:00**. |
- | * citire documentație hardware, implementare conform specificațiilor | + | |
- | * familiarizare cu următoarele concepte: întreruperi, transfer DMA, I/O ports | + | |
- | * citire surse, kernel hacking | + | |
- | ===== Enunț ===== | + | Poate participa orice student din ciclul de licență din cadrul Facultății de Automatică și Calculatoare. |
- | 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: | + | Premiile și detalii despre desfășurarea premierei pentru **Ixia Challenge** vor fi anunțate în curând. |
- | * [[ http://application-notes.digchip.com/027/27-45688.pdf | Intel 8255x 10/100 Mbps Ethernet Controller Family Open Source Software Developer Manual ]] | + | |
- | * [[http://www.intel.com/content/www/us/en/ethernet-controllers/82559er-fast-ethernet-pci-datasheet.html | 82559ER Fast Ethernet PCI Controller Datasheet]] | + | |
- | Nu va trebui să ciți în întregime documentele de mai sus, ci doar secțiunile indicate în enunț. | + | Enunțul temei se găsește [[https://ocw.cs.pub.ro/courses/so2/teme/tema5|aici]]. |
- | + | ||
- | ==== 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 [[http://lxr.free-electrons.com/source/include/linux/pci.h#L696 | pci_driver]] | + | |
- | * driverul va fi accesat ca un device de tip rețea, structura centrală pe care trebuie să o urmăriți este [[http://lxr.free-electrons.com/source/include/linux/netdevice.h#L1645 | 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 [[http://elf.cs.pub.ro/so2/res/teme/ix-e100.zip |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 [[http://lxr.free-electrons.com/source/Documentation/process/coding-style.rst | Coding Style]]. | + | |
- | + | ||
- | De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul: | + | |
- | + | ||
- | === checkpatch.pl === | + | |
- | + | ||
- | * <code bash> /path/to/linux-4.9.11/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/src-file.c </code> | + | |
- | === sparse === | + | |
- | * <code bash> sudo apt-get install sparse </code> | + | |
- | * <code bash> | + | |
- | cd /path/to/linux-4.9.11 | + | |
- | make C=2 /path/to/your/src-file.c </code> | + | |
- | + | ||
- | === cppcheck === | + | |
- | * <code bash> sudo apt-get install cppcheck </code> | + | |
- | * <code bash> cppcheck /path/to/your/src-file.c </code> | + | |
- | ==== Depunctări ==== | + | |
- | Tema valorează 2 puncte şi intră în competiția Ixia Challenge dacă se trimite până la data Duminică, 26 Martie 2017, 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 [[so2:teme:general| 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 [[:so2:reguli-notare#reguli_de_trimitere_a_temelor|precizările din pagina de reguli]]. | + | |
- | + | ||
- | Din interfața vmchecker alegeți opțiunea ''e100'', aferentă acestei teme. | + | |
- | + | ||
- | ===== Resurse ===== | + | |
- | + | ||
- | <note important> | + | |
- | Resursele temei se găsesc și în repo-ul [[https://github.com/systems-cs-pub-ro/so2-assignments|so2-assignments]] de pe GitHub. Repo-ul conține și un [[https://github.com/systems-cs-pub-ro/so2-assignments/blob/master/so2-create-repo.sh|script Bash]] care vă ajută să vă creați un repository privat pe instanța de [[https://gitlab.cs.pub.ro|GitLab]] a facultății. Urmăriți indicațiile din [[https://github.com/systems-cs-pub-ro/so2-assignments/blob/master/README.md|README]] și de pe [[:so2:teme:folosire-gitlab| pagina de Wiki dedicată pentru git]]. | + | |
- | </note> | + | |
- | + | ||
- | * [[http://pdos.csail.mit.edu/6.828/2009/labs/lab6/lab6.html | Lab06: Network Driver]] de la MIT | + | |
- | * [[http://lxr.free-electrons.com/source/drivers/net/ethernet/intel/e100.c | e100.c]] - sursele din Linux pentru e100 | + | |
- | * [[https://lwn.net/images/pdf/LDD3/ch12.pdf | PCI Drivers ]] - Linux Device Drivers, Chapter 12 | + | |
- | * [[https://lwn.net/images/pdf/LDD3/ch17.pdf | Network Drivers]] - Linux Device Drivers, Chapter 17 | + | |
- | * [[https://www.privateinternetaccess.com/blog/2016/01/linux-networking-stack-from-the-ground-up-part-1/ | Recent article on network drivers]] - Linux networking stack from the ground up, Parts 1-3 | + | |
- | + | ||
- | ===== FAQ ===== | + | |
- | - 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''. | + | |
- | - 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 [[http://lxr.free-electrons.com/source/include/linux/etherdevice.h?v=4.9#L261 | 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 [[http://cursuri.cs.pub.ro/pipermail/so2/ | arhivele]] listei de discuții sau puteți trimite un [[so2@cursuri.cs.pub.ro |e-mail]] (trebuie să fiți [[http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so2 | înregistrați]]). | + |