пытался исправить этот код на некоторое время без везения, пробовал различные варианты реализацию, которые рассчитывают контрольную сумму заголовка IPv4, однако их выход сильно отличается от моей программы выхода:IPv4, то, что я упускаю
Функция я украл из Linux kernel сделать это:
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; }
заголовок образца (байт): 45009d4326400406af6cd052ed12ac10a51
Раздел моей программы, которая вызывает выше Функция присваивает контрольную сумму в заголовок и печатает заголовок, а также контрольную сумму:
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");
отладки() является просто Е() обертки, Ниже приведен пример вывода:
newpacket checksum set to 6caf
45009d4326400406af6cd052ed12ac10a51
ScreenCap от чего Wireshark говорит мне:
Можете ли вы помочь мне и сказать мне, что я делаю неправильно?
Это функция, которую я обычно использую:
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);
}
Спасибо заранее.
[RFC 1071] (https://tools.ietf.org/html/rfc1071), [RFC 1141] (https://tools.ietf.org/html/rfc1141) и [RFC 1624] (https : //tools.ietf.org/html/rfc1624) являются источниками, которые дают вам алгоритм вычисления контрольной суммы заголовка IPv4. –
Похоже, вы рассчитываете контрольную сумму IP-заголовка. Кажется, что Wireshark отображает контрольную сумму TCP-заголовка. – SergeyA
Просто для расширения на @SergeyA кажется, что вы поместили контрольную сумму IP-уровня в уровень TCP. Или в более «официальных» условиях. https://en.wikipedia.org/wiki/OSI_model Вы смешиваете слой 3 и 4. – arduic