Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:teme:challenge [2017/03/12 10:37]
adrian.stanciu [Submitere]
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 2020ora 23:00**.
-  ​citire documentație hardware, implementare conform specificațiilor +
-  ​familiarizare cu următoarele concepte: întreruperitransfer DMAI/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 ''​Ixia Challenge - 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]]).+
so2/teme/challenge.1489307872.txt.gz · Last modified: 2017/03/12 10:37 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