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!)
- 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!
- 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.
- 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.
- 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!
- 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!
- 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!
- 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?
- Ibland kan en objektfil bli korrupt. Gör en axmake
-clean om du misstänker det.
- Om du lägger till en include-fil måste du göra genmake
igen!
- Ibland har koden blivit så grötig av debugging att det
enda man kan göra är att skriva om från början med de
erfarenheter man fått från debugsessionen!
- Använd Analyzer som ett hjälpmedel för att
förstå uppbyggnaden av olika paket!
- Läs boken!