2)Uses some special types from Linux (u_char, u_int32_t)
******************************************************************************/
#include "ltp2tcp.h"
+#include "checksums.h"
/* 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);
/*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;
}
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;
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);
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;
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);
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;
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;
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;
/*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);
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;
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);
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;
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;