summaryrefslogtreecommitdiffstats
path: root/ipv4.c
diff options
context:
space:
mode:
Diffstat (limited to 'ipv4.c')
-rw-r--r--ipv4.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/ipv4.c b/ipv4.c
index 784f10c..243f9d0 100644
--- a/ipv4.c
+++ b/ipv4.c
@@ -64,40 +64,30 @@ void icmp_packet(int fd, const char *packet, size_t len, struct iphdr *ip) {
* ip - ip header
*/
void tcp_packet(int fd, const char *packet, size_t len, struct iphdr *ip) {
- struct tcphdr tcp;
+ const struct tcphdr *tcp = (const struct tcphdr *) packet;
const char *payload;
- const char *options;
- size_t payload_size, options_size;
+ size_t payload_size, header_size;
if(len < sizeof(tcp)) {
logmsg_dbg(ANDROID_LOG_ERROR,"tcp_packet/(too small)");
return;
}
- memcpy(&tcp, packet, sizeof(tcp));
-
- if(tcp.doff < 5) {
- logmsg_dbg(ANDROID_LOG_ERROR,"tcp_packet/tcp header length set to less than 5: %x",tcp.doff);
+ if(tcp->doff < 5) {
+ logmsg_dbg(ANDROID_LOG_ERROR,"tcp_packet/tcp header length set to less than 5: %x", tcp->doff);
return;
}
- if((size_t)tcp.doff*4 > len) {
- logmsg_dbg(ANDROID_LOG_ERROR,"tcp_packet/tcp header length set too large: %x",tcp.doff);
+ if((size_t) tcp->doff*4 > len) {
+ logmsg_dbg(ANDROID_LOG_ERROR,"tcp_packet/tcp header length set too large: %x", tcp->doff);
return;
}
- if(tcp.doff > 5) {
- options = packet + sizeof(tcp);
- options_size = tcp.doff*4 - sizeof(tcp);
- } else {
- options = NULL;
- options_size = 0;
- }
-
- payload = packet + tcp.doff*4;
- payload_size = len - tcp.doff*4;
+ header_size = tcp->doff * 4;
+ payload = packet + header_size;
+ payload_size = len - header_size;
- tcp_to_tcp6(fd,ip,&tcp,payload,payload_size,options,options_size);
+ tcp_to_tcp6(fd, ip, tcp, header_size, payload, payload_size);
}
/* function: udp_packet