X-Git-Url: http://sjero.net/git/?p=ltp2tcp;a=blobdiff_plain;f=encap.c;h=c841ba29e5d76098a67f3bf2b26af1626a22b4a4;hp=2f08235931d94854adc8663a8859d3a8b83def2d;hb=HEAD;hpb=415ee2322fe2a27adcd10e5db2871699fc4f4f07 diff --git a/encap.c b/encap.c index 2f08235..c841ba2 100644 --- a/encap.c +++ b/encap.c @@ -28,6 +28,7 @@ Notes: 2)Uses some special types from Linux (u_char, u_int32_t) ******************************************************************************/ #include "ltp2tcp.h" +#include "checksums.h" @@ -74,6 +75,7 @@ int fill_eip4_encap(struct eip4_en_p *eip, const u_char* data, int dlen, struct /* encapsulation manipulation after conversion */ int eip4_post(struct eip4_en_p *eip, int tlen, u_char* data){ struct iphdr *iph; + struct tcphdr *tcph; /* Move data pointer to start of IPv4 header*/ data+=sizeof(struct ether_header); @@ -86,7 +88,17 @@ int eip4_post(struct eip4_en_p *eip, int tlen, u_char* data){ /*Adjust IPv4 header to account for packet's total length*/ iph=(struct iphdr*)data; - iph->tot_len=htons(sizeof(struct iphdr)+tlen); + iph->tot_len=htons(iph->ihl*4+tlen); + + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum(data,iph->ihl*4); + + /*Compute TCP Checksum*/ + data+=iph->ihl*4; + tcph=(struct tcphdr*)data; + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum(data, tlen, (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); return 0; } @@ -135,6 +147,10 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ iph->check=htonl(0); iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)+4); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -161,6 +177,11 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ ptr++; *ptr=2; + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,tcph->doff*4, + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /*Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); @@ -188,6 +209,10 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ iph->daddr=temp; iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)+4); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -214,6 +239,11 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ ptr++; *ptr=2; + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,tcph->doff*4 , + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /*Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); @@ -237,6 +267,10 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ iph->check=htonl(0); iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -257,6 +291,11 @@ int eip4_handshake(struct eip4_en_p *eip, struct pcap_pkthdr *h){ tcph->ack_seq=htonl(state.ack_num); tcph->window=htons(WIN_FACTOR); + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,tcph->doff*4, + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /*Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); return 0; @@ -307,6 +346,10 @@ int eip4_fin(struct eip4_en_p *eip){ iph->check=htonl(0); iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -330,6 +373,11 @@ int eip4_fin(struct eip4_en_p *eip){ /*Update Sequence Number to include the fin packet in the sequence number space*/ state.seq_num++; + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,tcph->doff*4, + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /* Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); @@ -356,6 +404,10 @@ int eip4_fin(struct eip4_en_p *eip){ iph->daddr=temp; iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -376,6 +428,11 @@ int eip4_fin(struct eip4_en_p *eip){ tcph->ack_seq=htonl(state.seq_num); tcph->window=htons(WIN_FACTOR); + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,sizeof(struct tcphdr), + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /*Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); @@ -399,6 +456,10 @@ int eip4_fin(struct eip4_en_p *eip){ iph->check=htonl(0); iph->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); + /*Compute IPv4 Checksum*/ + iph->check=0; + iph->check=ipv4_chksum((u_char*)iph,iph->ihl*4); + /*Build TCP header*/ ptr+=sizeof(struct ether_header)+ sizeof(struct iphdr); tcph=(struct tcphdr*)ptr; @@ -419,6 +480,11 @@ int eip4_fin(struct eip4_en_p *eip){ tcph->ack_seq=htonl(state.ack_num); tcph->window=htons(WIN_FACTOR); + /*Compute TCP Checksum*/ + tcph->check=0; + tcph->check=ipv4_pseudohdr_chksum((u_char*)tcph,tcph->doff*4, + (u_char*)&iph->daddr, (u_char*)&iph->saddr, iph->protocol); + /*Save To Packet Capture*/ pcap_dump((u_char*)state.out,&nh, data); return 0;