Gå til innhold

Anbefalte innlegg

Hellos.

 

jeg holder på å programere et IXP-kort, og så prøver jeg å finne hvilke flag TCP-pakkene jeg får har. Det jeg har prøvd, er å bruke en

uint8_t tcp_flags = *((uint8_t*)(dataVAddr + (104 + (ip_len*4))));

, og

uint16_t tcp_flags = *((uint16_t*)(dataVAddr + (96 + (ip_len*4)))) & 0x00ff;

 

Legge til (ip_len*4) er riktig, for jeg får destination port med

uint16_t tcp_port = *((uint16_t*)(dataVAddr + (14 + (ip_len*4) + 2)));

, og dette dataVAddr er også riktig, siden jeg får sluttporten.

 

Altså, sluttporten har offset 16 bit og er 2 byte. Flagga jeg skal ha har offset 96 bit; og binary AND med 0x00FF får jeg de 8 bitsa jeg skal ha, eller 1 byte med offset 104 bit.

 

Det er på en XScale jeg styrer.

 

Hva gjør jeg galt?

Endret av Arntfinn
Lenke til kommentar
Videoannonse
Annonse
Tror du blander litt med tall og størrelser..

 

Du får, som du sier, destinasjons port med +2, så hvorfor skal du da ha 96 eller 104 for å få flags?

Det er riktig at det er et offset på 104 bits til de flaggene du vil ha, men er du sikker på at du vil ha tallet i bits?

uint8_t har en lengde av hvor mange bits?

 

Er godt mulig jeg tuller, ja.

 

Hvis du ser her, http://www.visi.com/~mjb/Drawings/TCP_Header.png , så ser du at destination port har offset 16 (14+2), og blir lagt i en uint16_t, som jeg da regner med bruker 16 bit. Flaggene jeg vil ha er 8 bit, og det ser ut som de begynner på offset 104.

 

En annen bemerkning ang. bit: lengde-feltet i IP-holdet er 4 bit, men i koden jeg driver med blir det lagt i en uint8_t som blir AND-et med 0x0f. Ergo ergo er uint16_t 16 bit.

 

Har også prøvd litt forsjellig offset og uintX_t, uten at det har hjulpen. Noe mer konkret ang. disse eksperimentene kan jeg ikke være, for de var ikke akkurat vitenskapelige ;)

 

Edit: men når du nevnet +2, så kan det jo hende at destination port har byte offset +2 (som det jo har; byte nr. 3), så jeg tror jeg prøver å leke med byte før jeg legger meg i stedet for bit!

Endret av Arntfinn
Lenke til kommentar

Jepp kjepp, Mr. Garibaldi; det var bare jeg som trodde det var bit, men så var det byte. Riktig svar er

uint16_t tcp_flags = *((uint16_t*)(dataVAddr + (14 + (ip_len*4) + 12))) & 0x00ff;

 

Takk takk

 

Hvis noen har en rask snarvei for å bruke uint8_t, uten for mye styr, så er dere hjertelig velkommen.

 

Edit: kanskje bruke offset 13 i en uint8_t?

 

Edit igjen: det kan se ut så ja.

Endret av Arntfinn
Lenke til kommentar

Ja, helt riktig at du kan bruke uint8_t tcp_flags = *((uint8_t*)(dataVAddr + (14 + (ip_len*4) + 13)));

Du har forøvrig de forskjellige flaggene definert i packet_types.h som gjør det mer oversiktlig i koden enn hvis du setter inn "harde" hex-verdier...

 

Lykke til videre med resten av oppgaven. Hvis du sitter fast på andre deler er det bare å spørre, gjorde oppgaven ferdig forrige uke :)

Evt. ta en tur på "gruppetimen" og spør noen som sitter i klasserommet og jobber...

Lenke til kommentar
Ja, helt riktig at du kan bruke uint8_t tcp_flags = *((uint8_t*)(dataVAddr + (14 + (ip_len*4) + 13)));

Du har forøvrig de forskjellige flaggene definert i packet_types.h som gjør det mer oversiktlig i koden enn hvis du setter inn "harde" hex-verdier...

 

Lykke til videre med resten av oppgaven. Hvis du sitter fast på andre deler er det bare å spørre, gjorde oppgaven ferdig forrige uke :)

Evt. ta en tur på "gruppetimen" og spør noen som sitter i klasserommet og jobber...

 

Takk skal du ha. Er jo egentlig ikke så veldig vanskelig dette her, men vi brukte for mye tid på å komme i gang.

 

Hvor avansert har du implementert connection tracking? Jeg tror vi dropper det; er for liten tid til å finne ut hvordan + finne frem til hva slags tabeller og greier vi kan bruke fra sdket.

Lenke til kommentar
Hvor avansert har du implementert connection tracking? Jeg tror vi dropper det; er for liten tid til å finne ut hvordan + finne frem til hva slags tabeller og greier vi kan bruke fra sdket.

 

Gjør ikke så mye på den, siden teksten er litt uklar. "number of established connections (both half open and open)" regner vi som antallet connections som har blitt etablert, ikke hvor mange som er aktive. Og det er ganske enkelt å telle.

Vi valgte å ikke tolke den som "hvor mange connections er aktive nå" og telle ned når de er ferdige...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...