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

Ja gezien super site!!! Maar checksum begrijp ik niet met die uitleg

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!)

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 ]

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.

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?

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

0:e0:f7:26:3f:e9 is je source address.
je moet de ganse zwik in beschouwing nemen. MAC en IP address en alles

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 ]