From 4dfa4d70ebb3214c3b404912f7752845ae6a564f Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Wed, 17 Aug 2011 15:12:29 -0300 Subject: [PATCH] DHCP is working. Fixed ip checksum problem. --- src/ip.cpp | 12 ++++-------- src/tcp.cpp | 6 +++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/ip.cpp b/src/ip.cpp index a1d00e5..491e53b 100644 --- a/src/ip.cpp +++ b/src/ip.cpp @@ -28,7 +28,6 @@ #include "rawpdu.h" #include "utils.h" -#include using namespace std; @@ -200,16 +199,13 @@ void Tins::IP::write_serialization(uint8_t *buffer, uint32_t total_sz, const PDU _ip.protocol = new_flag; _ip.tot_len = Utils::net_to_host_s(total_sz); _ip.ihl = my_sz / sizeof(uint32_t); - if (parent && (_ip.check == 0)) { - uint32_t checksum = PDU::do_checksum((uint8_t*)&_ip, ((uint8_t*)&_ip) + sizeof(iphdr)); - checksum += PDU::do_checksum(buffer + sizeof(iphdr), buffer + total_sz); + memcpy(buffer, &_ip, sizeof(iphdr)); + if (parent && !_ip.check) { + uint32_t checksum = PDU::do_checksum(buffer, buffer + sizeof(iphdr)); while (checksum >> 16) checksum = (checksum & 0xffff) + (checksum >> 16); - _ip.check = Utils::net_to_host_s(~checksum); + ((iphdr*)buffer)->check = Utils::net_to_host_s(~checksum); } - - memcpy(buffer, &_ip, sizeof(iphdr)); - /* IP Options here... */ buffer += sizeof(iphdr); for (uint32_t i = 0; i < _ip_options.size(); ++i) diff --git a/src/tcp.cpp b/src/tcp.cpp index d0a2f46..fea0d5e 100644 --- a/src/tcp.cpp +++ b/src/tcp.cpp @@ -151,14 +151,14 @@ void Tins::TCP::write_serialization(uint8_t *buffer, uint32_t total_sz, const PD } const Tins::IP *ip_packet = dynamic_cast(parent); + memcpy(tcp_start, &_tcp, sizeof(tcphdr)); if(!_tcp.check && ip_packet) { uint32_t checksum = PDU::pseudoheader_checksum(ip_packet->source_address(), ip_packet->dest_address(), size(), IPPROTO_TCP) + - PDU::do_checksum(tcp_start + sizeof(tcphdr), tcp_start + total_sz) + PDU::do_checksum((uint8_t*)&_tcp, ((uint8_t*)&_tcp) + sizeof(tcphdr)); + PDU::do_checksum(tcp_start, tcp_start + total_sz); while (checksum >> 16) checksum = (checksum & 0xffff) + (checksum >> 16); - _tcp.check = Utils::net_to_host_s(~checksum); + ((tcphdr*)tcp_start)->check = Utils::net_to_host_s(~checksum); } - memcpy(tcp_start, &_tcp, sizeof(tcphdr)); _tcp.check = 0; }