kan er iemand een uitgewerkt voorbeeld van een checksum geven en gedetailleerd uitleggen ?
ik moet enkel weten hoe men een checksum maakt
ik zal zelf een voorbeeld geven waar ik niet uit geraak omdat ik niet begrijp hoe de checksum wordt berekend:
hier wordt een checksum gemaakt in de ip-laag:
Code: Selecteer alles
void make_ping_answer_from_request(uint8_t *buf)
{
uint8_t i=0;
buf[34]=0x00;
unsigned int checksumvar;
while(i<6){
buf[0+i]=buf[6+i];
buf[6+i]=mymac[i];
i++;
}
i=0;
while(i<4){
buf[30+i]=buf[26+i];
buf[26+i]=myip[i];
i++;
}
buf[36]=0;
buf[37]=0;
checksumvar=checksum((&buf[34]),40,0);
buf[36]=checksumvar >> 8;
buf[37]=checksumvar & 0x00ff;
// eth+arp is 74 bytes:
enc28j60PacketSend(74,buf);
}
hier gebeurt de checksum in de udp-laag
void make_udp_answer_from_request(uint8_t *buf, uint16_t len, int cmd)
{
int i;
unsigned int checksumvar;
uint16_t des_port = 61558;
// ip omdraaien
for (i=0;i<4;i++)
{
buf[30+i] = buf[26+i];
buf[26+i] = myip[i];
}
// mac omdraaien
for (i=0;i<6;i++)
{
buf[0+i] = buf[6+i];
buf[6+i] = mymac[i];
}
// poorten veranderen
for (i=0;i<2;i++)
{
buf[34+i] = buf[36+i];
}
buf[36] = des_port >>8;
buf[37] = des_port & 0x00ff;
// data veranderen
if (cmd == 1) {
buf[42] = 0x61;
}
if (cmd == 0) {
buf[42] = 0x75;
}
// checksum veranderen
buf[40]=0;
buf[41]=0;
checksumvar=checksum((&buf[26]),buf[39]+8,1);
buf[40]=checksumvar >> 8;
buf[41]=checksumvar & 0x00ff;
enc28j60PacketSend(60,buf);
}