versucht, diesen Code für eine Weile ohne Glück zu beheben, versuchte, verschiedene Implementierungen, die die IPv4-Header-Prüfsumme berechnen, aber ihre Leistung ist ganz anders als meine Programme Ausgabe:IPv4-Header-Prüfsumme Berechnung, was bin ich fehle
Funktion stahl ich aus dem linux-kernel dies zu tun:
static inline uint16_t ip_fast_csum(const void *iph, unsigned int ihl){
unsigned int sum;
asm(" movl (%1), %0\n"
" subl $4, %2\n"
" jbe 2f\n"
" addl 4(%1), %0\n"
" adcl 8(%1), %0\n"
" adcl 12(%1), %0\n"
"1: adcl 16(%1), %0\n"
" lea 4(%1), %1\n"
" decl %2\n"
" jne 1b\n"
" adcl $0, %0\n"
" movl %0, %2\n"
" shrl $16, %0\n"
" addw %w2, %w0\n"
" adcl $0, %0\n"
" notl %0\n"
"2:"
/* Since the input registers which are loaded with iph and ihl
are modified, we must also specify them as outputs, or gcc
will assume they contain their original values. */
: "=r" (sum), "=r" (iph), "=r" (ihl)
: "1" (iph), "2" (ihl)
: "memory");
return (uint16_t)sum; }
Beispiel Header (Byte): 45009d4326400406af6cd052ed12ac10a51
Abschnitt meines Programms, das die oben ruft Funktion ordnet die Prüfsumme an den Header und druckt den Header sowie die Prüfsumme:
newpacket.ipheader->check = ip_fast_csum ((unsigned short *) newpacket.ipheader, IP4_HDRLEN);
debug(5,"newpacket checksum set to %0x\r\n",newpacket.ipheader->check);
uint8_t *ipbuf=(uint8_t *)newpacket.ipheader;
for(i=0;i<IP4_HDRLEN;i++){
debug(5,"%0x",ipbuf[i]);
}debug(5,"\n");
debug() ist nur eine printf() Wrapper, folgende Beispielausgabe:
newpacket checksum set to 6caf
45009d4326400406af6cd052ed12ac10a51
Screencap von dem, was wireshark ist mir zu sagen:
können Sie mir helfen und mir sagen, was ich falsch mache?
Dies ist die Funktion, die ich normalerweise verwenden:
inline unsigned short csum (unsigned short *buf, int nwords) {
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return (unsigned short) (~sum);
}
Vielen Dank im Voraus.
[RFC 1071] (https://tools.ietf.org/html/rfc1071), [RFC 1141] (https://tools.ietf.org/html/rfc1141) und [RFC 1624] (https : //tools.ietf.org/html/rfc1624) sind die Quellen, die Ihnen den Algorithmus zur Berechnung der IPv4 Header Checksum geben. –
Sieht so aus, als würden Sie die IP-Header-Prüfsumme berechnen. Wireshark scheint die TCP-Header-Prüfsumme anzuzeigen. – SergeyA
Nur um @SergeyA zu erweitern, scheint es, dass Sie die IP-Schicht-Prüfsumme in der TCP-Schicht platziert haben. Oder in "offiziellen" Bedingungen. https://en.wikipedia.org/wiki/OSI_model Sie vermischen Schicht 3 und 4. – arduic