Bobbyb
hallo
Hallo
Ik ben bezig het een ethernet project en ben u bezig het bet bekijken van de ip header.
Nu krijg ik het niet voor elkaar om een juiste checksum te berekenen.
Ik doe het nu als volgt
Data van ip gedeelte vanaf version nr. t/m destination adress:
45 00 00 2A 66 FD 00 00 80 11 94 0B
die 94 0B is de gegeven checksum
45 00
00 2A
66 FD
00 00
80 11 +
-----------------------
12C38
2C38
1 +
-----------------------
2C39
FFFF
2C39 -
------------------------
D3C6 En dat moet 94 0B zijn
Wie kan mij helpen?
Edit: ja het was inderdaad 12C38 THX!
Hoe je de checksum moet berekenen weet ik zo niet, maar er zit wel een foutje in je eerste optelling. Hier moet volgens mij geen 13DCC uit komen, maar 12C38.
Groeten
http://www.cs.utk.edu/~cs594np/unp/checksum.html
Functie in C waarmee de CS van een IP-header berekend word.
(Helaas kan ik je niet echt helpen, het is eenvoudig te lang geleden en ik heb er nooit wat mee gedaan!)
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
je doet de bewerking verkeerd.
om te beginnen moet je met 32 bit getallen werken , niet met 16 bit getallen
die 32 bit getallen moet je splitten in een high-word en low -word
je telt ALLE high words op in een 16 bit register ( dus met overrun op FFFF
je telt ook ALLE low words op in een 16 bit register met overrun op FFFF
als je payload MOET eindigen op een 32 bit boundary.
stel je moet 2 byte versturen ( 16 bit ) dan moet je dus 2 bytes toevoegen met 0000 in ( om op een 32 bit boundary te vallen ). let wel dat de message length dan MOET aangepast worden en dus ook je checksum beinvloedt !
bon, eenmaal je die 2 16 bit getallen hebt tel je die bij elkaar op
dat is je checksum
vergeet ok niet dat als je checksum toevallig 0 is je die moet versturen als FFFF !
je kan die miserie ontwijken door gewoon 0000 te versturen. dan gebeurt er geen checksum op het pakket. UDP is toch geen reliable transport systeem.
trouwens als je een deftige netwerk processor hebt dan rekent hij die checksum uit voor jou...
hier heb je een c-code functie die de checksum berekent. hij wordt gebruikt in een atmel AVR, daar werkt ie perfect. de return value kan rechtstreeks in de checksum field geplaatst worden.
int checksum (unsigned char * pointer,unsigned int aantal_bytes, unsigned long totaal)
{
unsigned int result16 = 0;
unsigned int x = 0;
while(x < (aantal_bytes - 1))
{
result16 = ((pointer[x] << 8) + pointer[x+1]); //maakt een int van de 2 bytes uit de array
totaal += result16; //en telt deze op bij het totaal
x += 2; //gaat naar de volgende 2 bytes
}
if((aantal_bytes - x) == 1) //als er nog 1 byte over is wordt deze nog erbij opgetelt
{
result16 = pointer[x] << 8; //deze byte wordt als msb byte behandelt de lsb byte is 0
totaal += result16;
}
totaal = ((totaal & 0x0000FFFF)+ ((totaal & 0xFFFF0000) >> 16)); // telt de 2 MSB bytes en de 2 LSB byte bij elkaar op
totaal = ((totaal & 0x0000FFFF)+ ((totaal & 0xFFFF0000) >> 16)); // mocht er een carry zijn bij de vorige berenkening dan wordt alles nog een keer bij elkaar opgelt zodat je nu een getal hebt wat niet meer dan 16 bit(INT) groot is
result16 = ~(totaal & 0x0000FFFF); // 1's complement van het totaal
result16 = ((result16 & 0xFF00) >> 8)|((result16 & 0x00FF)<<8); // keert de bytes om zodat deze rechtstreeks in de header geplaats kunnen worden
return (result16);
}
Ik heb hem opengelaten totdat er een werkbaar antwoord kwam, dat is er nu.
Wegens het ontbreken van enige relatie tot de harde electronica, nu dan een slotje
Weer open wegens misverstand!
[Bericht gewijzigd door KT88 op ]
Hier staat het erg helder uitgelegd:
http://www.xs4all.nl/~sbp/projects/tcpip/theory/theory14.htm
Overigens hoef je geen C te kennen om het stukje programma van Pinochet uit te pluizen.
[Bericht gewijzigd door GJ_ op ]
LaStei
carpe cerevisi
Een heel goed document, waar ook HW (table driven) implementaties op staan:
http://www.geocities.com/SiliconValley/Pines/8659/crc.htm
Dit document heb ik gebruikt om mijn CRC routines te ontwikkelen.
Bobbyb
hallo
Ik heb jullie site's bekeken en heb inmiddels de ip checksum goed kunnen berekenen:).
Ik ben bezig met mijn eindexamen opdracht voor mijn opleiding MBO elektronica.
Mijn opdracht komt van mijn stage bedrijf dat veel doet met rgb led verlichting.
Dit wordt nu gestuurd via het dmx 512 (512 kanalen)protocol maar dit is met de nieuwe generatie led producten niet meer voldoende.
Ik moet onderzoeken wat de mogelijkheden zijn van ethernet.
Na 2 weken aan het zoeken te zijn geweest ben ik uit gekomen bij het ART-NET protocol.
Voor het aansturen van veel led's zijn al een aantal programma's visual dmx, pixel drive, color tramp die gebruik maken van het ART-NET protocol.
Naast het onderzoek moet ik een prototype print maken die gebruikt kan worden bij het ontwikkelen van de communicatie software.
Om mijn examen te halen is het ook verplicht te testen of alle functies van de print weken.
Dus moet ik wel een stukje ip/udp/artnet communicatie software schrijven.
En vandaar mijn vragen.
Nu ben ik bezig met het berekenen van de udp checksum en helaas wil dat niet lukken.
Ik gebruik de psuedo header zoals op hier beschreven.
Als "data" gebruik ik dit (wat gelijk is aan hieronder).
0: 00e0 f726 3fe9 0800 2086 354b 0800 4500 ..÷&?... .5K..E.
16: 0026 ab49 4000 ff11 f700 8b85 d96e 8b85 .&.I@...÷....n..
32: e902 99d0 043f 0012 7228 6865 6c6c 6f68 .....?..r(helloh
48: 656c 6c6f ello
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 12 arrived at 17:40:4.69
ETHER: Packet size = 52 bytes
ETHER: Destination = 0:e0:f7:26:3f:e9, CISCO Router
ETHER: Source = 8:0:20:86:35:4b, Sun
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00 (normal)
IP: Total length = 38 bytes
IP: Identification = 43849
IP: Flags = 0x4
IP: .1.. .... = do not fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 255 seconds/hops
IP: Protocol = 17 (UDP)
IP: Header checksum = f700
IP: Source address = 139.133.217.110, client
IP: Destination address = 139.133.233.2, server.abdn.ac.uk
IP: No options
IP:
UDP: ----- UDP Header -----
UDP:
UDP: Source port = 39376
UDP: Destination port = 1087
UDP: Length = 18
UDP: Checksum = 7228
UDP:
UDP: Data
8b85 d96e is het sourse address?
8b85 e902 is het destination address?
0011 0026 is een opvul byte het udp protocol en de total length uit de ip header.
Ik heb ook geprobeert de gegeven lengte ui de udp header te halen maar dat werkte ook niet:(.
Mijn berekening:
8B85 8B85
9D6E 9D6E
8B85 8B85
E902 E902
0011 0011
0026 (uit ip header) + 0012 (uit udp header) +
------------------------------------------------------
2D9B1 2D99D
2 + 2 +
----------- ----------------
D9B3 D99F
FFFF - FFFF -
----------- -----------
264C 2660
En das nie goe.
Kan iemand mij vertellen wat ik over het hoofd zie?
Ik heb er niet goed naar gekeken, maar heb je wel de checksum bytes eerst op nul gezet voor het berekenen?
Bobbyb
hallo
bij je udp psuedo header heb je geen checksum toch?
of is het de bedoeling dat je bij de udp checksum berekening de psuedo header en de normale header optelt??
Volgens mij moest je de UDP cheksum berekenen over de UDP header, en de UDP data (of ben ik nu in de war?). Voor het beginnen van het berekenen van de UDP checksum, moet je dan dus eerst de checksum van de UDP header clearen. Dus de words van de volledige UDP header en UDP data bij elkaar tellen, van het 32 bits getal een 16 bits getal maken, en dit inverteren. Als de data een oneven aantal bytes is, moet je hier gewoon een lege byte bij denken.
Edit:
Hier nog een mooie site erover: http://www.netfor2.com/udpsum.htm
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
0:e0:f7:26:3f:e9 is je source address.
je moet de ganse zwik in beschouwing nemen. MAC en IP address en alles
Bobbyb
hallo
Jippie! Ik ben er uit
:)
No. Time Source info:Destination Protocol Info Gebruiken voor
1 0.000000 192.168.124.19 info:2.255.255.255 ARTNET ArtPoll packet HEX Waarde IP of/en UDP
checksum (cs) Berekenen
info: Frame 1 (56 bytes on wire, 56 bytes captured)
info: Arrival Time: Mar 14, 2006 10:08:54.037653000
info: Time delta from previous packet: 0.000000000 seconds
info: Time since reference or first frame: 0.000000000 seconds
info: Frame Number: 1
info: Packet Length: 56 bytes
info: Capture Length: 56 bytes
info: Protocols in frame: eth:ip:udp:artnet
Ether header: Ethernet II, Src: Trend_7e:c3:23 (00:e0:98:7e:c3:23), Dst: Draytek_1c:0e:0f (00:50:7f:1c:0e:0f)
Ether header: Destination: Draytek_1c:0e:0f (00:50:7f:1c:0e:0f) 00 50 7f 1c 0e 0F
Ether header: Source: Trend_7e:c3:23 (00:e0:98:7e:c3:23) 00 e0 98 7e c3 23
Ether header: Type: IP (0x0800) 08 00
IP Header: Internet Protocol, Src: 192.168.124.19 (192.168.124.19), Dst: 2.255.255.255 (2.255.255.255)
IP Header: Version: 4 4 IP
IP Header: Header length: 20 bytes 5 IP
IP Header: Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 00 IP
IP Header: 0000 00.. = Differentiated Services Codepoint: Default (0x00)
IP Header: .... ..0. = ECN-Capable Transport (ECT): 0
IP Header: .... ...0 = ECN-CE: 0
IP Header: Total Length: 42 00 2a IP
IP Header: Identification: 0x030a (778) 03 0a IP
IP Header: Flags: 0x00 0 IP
IP Header: 0... = Reserved bit: Not set
IP Header: .0.. = Don't fragment: Not set
IP Header: ..0. = More fragments: Not set
IP Header: Fragment offset: 0 000 IP
IP Header: Time to live: 128 80 IP
IP Header: Protocol: UDP (0x11) 11 IP
IP Header: Header checksum: 0xf7fe [correct] f7fe (0000 Bij berekenen van IP cs) IP
IP Header: Good: True
IP Header: Bad : False
IP Header: Source: 192.168.124.19 (192.168.124.19) c0 a8 7c 13 IP/UDP
IP Header: Destination: 2.255.255.255 (2.255.255.255) 02 ff ff ff IP/UDP
UDP Header: User Datagram Protocol, Src Port: 6454 (6454), Dst Port: 6454 (6454)
UDP Header: Source port: 6454 (6454) 19 36 UDP
UDP Header: Destination port: 6454 (6454) 19 36 UDP
UDP Header: Length: 22 00 16 UDP
UDP Header: Checksum: 0x1368 [correct] 13 68 (0000 bij berekenen van UDP cs) UDP
Artnet id header: Art-Net
Artnet id header: Descriptor Header
Artnet id header: ID: Art-Net 41 72 74 2d 4e 65 74 00 UDP
Artnet id header: Opcode: ArtPoll packet (0x2000) 02 00 UDP
Artnet id header: ProVer: 14 00 0e UDP
ArtPoll: ArtPoll packet
ArtPoll: TalkToMe: 0x02 02 00 UDP
ArtPoll: .... ...0 = Reply destination: 0x00
ArtPoll: .... ..1. = Reply type: 0x01
ArtPoll: 0000 00.. = unused: 0x00
ArtPoll: filler: 00
0000 00 50 7f 1c 0e 0f 00 e0 98 7e c3 23 08 00 45 00 .P.......~.#..E.
0010 00 2a 03 0a 00 00 80 11 f7 fe c0 a8 7c 13 02 ff .*..........|...
0020 ff ff 19 36 19 36 00 16 13 68 41 72 74 2d 4e 65 ...6.6...hArt-Ne
0030 74 00 00 20 00 0e 02 00 t.. ...Dit is een ArtPoll van het art-net protocol opgevangen door Ethereal
Voor de IP checksum berekening:
IP Cecksum berekening
45 00 Version,Header length,Differentiated Services Field
00 2a Total Length
03 0a Identification
00 00 Flags,Fragment offset
80 11 Time to live,Protocol (UDP)
00 00 Cecksum Moet naar 0000 voor berekening
c0 a8 Source IP
7c 13 Source IP
02 ff Destination IP
ff ff Destination IP +
----------------------------------
307 fe 3 Carry's optellen bij 16 bit word
^--->3 +
------------------
08 01
ff ff -
-------------------
F7 fe Is de checksum
IP Cecksum controleeren
45 00 Version,Header length,Differentiated Services Field
00 2a Total Length
03 0a Identification
00 00 Flags,Fragment offset
80 11 Time to live,Protocol (UDP)
f7 fe Cecksum
c0 a8 Source IP
7c 13 Source IP
02 ff Destination IP
ff ff Destination IP +
----------------------------------
3ff fc 3 Carry's optellen bij 16 bit word
^--->3 +
------------------
ff ff
En de UDP header cs
UDP Cecksum berekening
c0 a8 Source IP udp psuedo header
7c 13 Source IP udp psuedo header
02 ff Destination IP udp psuedo header
ff ff Destination IP udp psuedo header
00 11 opvul 00, Protocol (UDP) udp header
00 16 Length (uit UDP header) udp header
19 36 Source port udp header
19 36 Destination port udp header
00 16 Length (uit UDP header) udp header
00 00 Cecksum Moet naar 0000 voor berekening udp header
41 72 Data (Art-Net) Data
74 2d Data (Art-Net) Data
4e 65 Data (Art-Net) Data
74 00 Data (Art-Net) Data
00 20 Data (Art-Net) Data
00 0e Data (Art-Net) Data
02 00 Data (Art-Net) + Data
-----------------------------------
3ec 94 3 Carry's optellen bij 16 bit word
^--->3 +
------------------
ec 97
ff ff -
-------------------
13 68
UDP Cecksum berekening
c0 a8 Source IP udp psuedo header
7c 13 Source IP udp psuedo header
02 ff Destination IP udp psuedo header
ff ff Destination IP udp psuedo header
00 11 opvul 00, Protocol (UDP) udp header
00 16 Length (uit UDP header) udp header
19 36 Source port udp header
19 36 Destination port udp header
00 16 Length (uit UDP header) udp header
13 68 Cecksum Moet naar 0000 voor berekening udp header
41 72 Data (Art-Net) Data
74 2d Data (Art-Net) Data
4e 65 Data (Art-Net) Data
74 00 Data (Art-Net) Data
00 20 Data (Art-Net) Data
00 0e Data (Art-Net) Data
02 00 Data (Art-Net) + Data
-----------------------------------
3FF FC 3 Carry's optellen bij 16 bit word
^--->3 +
------------------
ff ff Is de checksum
Ik dank u allen voor uw hulp!!!
[Bericht gewijzigd door Bobbyb op ]