Laboration 2, Ethernet-gränssnittet


Introduktion

Laboration 2 beskrivs här. Dessutom finns vanliga frågor och deras svar här.

Nedladdning av programmet

För att ladda ner programmet gör som i introduktionslabben, dvs.

Mål

Du har klarat labben när du kan pinga CD-servern med alla möjliga storlekar från 4 till 1450 och den svarar fastän du pingar många gånger med olika storlekar.
Servern skall givetvis inte krascha.
Inga minnesläckor får förekomma. Använd följande kodrad för att ta reda på tillgängligt minne: (för att använda ax_coreleft_total() måste sp_alloc.h inkluderas med #include "sp_alloc.h").

cout << "Core " << ax_coreleft_total() << endl;

CD-servern skall svara på rimlig tid. En normal pingtid från en CD-server är ca 2 ms och din tid skall inte vara mycket högre. Bovarna i dramat här är minnesallokeringar, minneskopieringar och debugutskrifter. Tag bort alla debugutskrifter och minimera antalet allokeringar och kopieringar. Tänk på att objektinstansieringar ger en minnesallokering vardera. Stackallokeringar är mycket snabbare än vanliga dynamiska allokeringar!

Slutligen skall givetvis de ethernetpaket som skickas ut på nätet vara korrekta, dvs. ha rätt längd och käll- och destinationsadress.

Tips

Gör labben i följande steg: (tänk på att bygga på lab1!)

  1. Få något att köra med de nya källkoderna. Implementera enbart stubbar till nödvändiga metoder.
    Obs: Långt ifrån alla metoder är nödvändiga för att kunna kompilera och köra koden! Se till att programmet kör utan att krascha och utan att läcka minne. Det behöver inte göra något.
    Obs: Initiera inte nätverksdelen!
  2. Implementera mottagningsbuffertens initieringsmetoder och paketmottagningsrutiner.
    Obs gör ingeting med de paket du får in. Se bara till att hårdvaran är glad så du kan ta emot paket utan att den hänger sig. För varje paket du får in skall nätverks-LEDen blinka. Skicka inte vidare paket. Avancera bara buffertpekarna! Du skall nu kunna köra ping mot CD-servern. Den kommer inte svara men den kommer heller inte krascha. Se till att minnet inte läcker.
  3. Börja avkoda paket. Börja med små paket (mindre än totalt 252 byte) så att fragmentering inte kan ske. Jobba dig uppåt i "paketkedjan" och kontrollera i varje steg att pekare och längder stämmer. LLC-dummyn skall nu få korrekta paket.
    Tips: Använd dig av utskrifterna i LLC-dummyn! Servern kommer fortfarande inte att kunna svara på ping men LLC kommer att notera ett ping.
  4. Implementera answer-metoderna. Gå hela kedjan ner till sändningsbufferten men rör inte sändningsbufferten. Kontrollera att alla pekare och längder stämmer. Håll ett öga på minnet! Kontrollera att du får ner ett paket till sändningsrutinen för varje pingpaket in till servern!
  5. Implementera sändningsrutinen. Var noga med att du förstår hur sändningssidhuvudet skall sättas! CD-servern skall nu kunna svara på "små" pingar, dvs. pingpaket mindre än 252 byte. Testa att pinga med alla möjliga storlekat från 4 och uppåt. Var noga med att du inte skickar ut för små ethernetpaket!
  6. Lägg till stöd för ethernetpaket större än en buffertsida. Börja med mottagningen! Tänk på att även sändningsbufferten är en ringbuffert!
  7. Klart! Testa alla möjliga paketstorlekar. Vilka är de möjliga paketstorlekarna? Se till att alla ethernetpaket ut från servern är korrekta! Läcker programmet minne någonstans? Hur är det med pingtiden?