aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2019-03-06 13:03:35 +0100
committerGitHub <noreply@github.com>2019-03-06 13:03:35 +0100
commite7090ddba39e5a75ba763a4df91482b8e85eca81 (patch)
tree467344bcd93825860ecbd50d9b9c63a01103c41f
parent20cdaf399dfddb41245d90aa0aa86fce4bbc69e0 (diff)
parent47627aca9b4b59c11eedc319f00000c3c4452515 (diff)
Merge pull request #10 from Masaq-/extended-options
improvements for empty pings mode
-rw-r--r--src/pdesc.h1
-rw-r--r--src/pkt.c16
-rw-r--r--src/ptunnel.c8
3 files changed, 19 insertions, 6 deletions
diff --git a/src/pdesc.h b/src/pdesc.h
index 169c069..f02b870 100644
--- a/src/pdesc.h
+++ b/src/pdesc.h
@@ -156,6 +156,7 @@ typedef struct proxy_desc_t {
double last_ack;
/** Time when a packet was last received. */
double last_activity;
+ double last_data_activity;
uint16_t window_size;
double ack_interval;
double resend_interval;
diff --git a/src/pkt.c b/src/pkt.c
index 7ca6ade..f1e134b 100644
--- a/src/pkt.c
+++ b/src/pkt.c
@@ -297,6 +297,10 @@ void handle_packet(char *buf, unsigned bytes, int is_pcap, struct sockaddr_in *a
}
if (cur && cur->sock) {
+ double now = time_as_double();
+ if (pt_pkt->state != kProto_ack) {
+ cur->last_data_activity = now;
+ }
if (pt_pkt->state == kProto_data || pt_pkt->state == kProxy_start ||
pt_pkt->state == kProto_ack)
{
@@ -309,7 +313,7 @@ void handle_packet(char *buf, unsigned bytes, int is_pcap, struct sockaddr_in *a
handle_ack((uint16_t)pt_pkt->ack, cur->send_ring, &cur->send_wait_ack,
0, cur->send_idx, &cur->send_first_ack, &cur->remote_ack_val,
is_pcap, cur->window_size);
- cur->last_activity = time_as_double();
+ cur->last_activity = now;
}
}
}
@@ -432,10 +436,14 @@ void handle_extended_options(void *vcur)
{
proxy_desc_t *cur = (proxy_desc_t *)vcur;
if (cur->extended_options[0] > 0) {
- remove_proxy_desc_rings(cur);
+ if (cur->extended_options[0] > cur->window_size) {
+ size_t extend = cur->extended_options[0] - cur->window_size;
+ cur->send_ring = realloc(cur->send_ring, cur->extended_options[0] * sizeof(icmp_desc_t));
+ cur->recv_ring = realloc(cur->recv_ring, cur->extended_options[0] * sizeof(forward_desc_t *));
+ memset(cur->send_ring + cur->window_size, 0, extend * sizeof(icmp_desc_t));
+ memset(cur->recv_ring + cur->window_size, 0, extend * sizeof(forward_desc_t *));
+ }
cur->window_size = cur->extended_options[0];
- cur->send_ring = calloc(cur->window_size, sizeof(icmp_desc_t));
- cur->recv_ring = calloc(cur->window_size, sizeof(forward_desc_t *));
pt_log(kLog_verbose, "Received extended option for window size %d \n", cur->window_size);
}
if (cur->extended_options[1] > 0) {
diff --git a/src/ptunnel.c b/src/ptunnel.c
index b92f76c..4463077 100644
--- a/src/ptunnel.c
+++ b/src/ptunnel.c
@@ -662,21 +662,25 @@ void* pt_proxy(void *args) {
cur->remote_ack_val+1 != cur->next_remote_seq)
{
idx = cur->send_idx;
- cur->last_ack = now;
queue_packet(fwd_sock, cur->pkt_type, 0, 0, cur->id_no, cur->icmp_id,
&cur->my_seq, cur->send_ring, &cur->send_idx, &cur->send_wait_ack,
cur->dst_ip, cur->dst_port, kProto_ack | cur->type_flag,
&cur->dest_addr, cur->next_remote_seq, &cur->send_first_ack, &cur->ping_seq, cur->window_size);
cur->xfer.icmp_ack_out++;
- if (cur->send_ring[idx].pkt_len > sizeof(icmp_echo_packet_t) && cur->send_ring[idx].pkt->type == kICMP_echo_request) {
+ if (opts.empty_pings &&
+ cur->last_data_activity > cur->last_ack &&
+ cur->send_ring[idx].pkt_len > sizeof(icmp_echo_packet_t) &&
+ cur->send_ring[idx].pkt->type == kICMP_echo_request) {
for (uint16_t e = 0; e < opts.empty_pings; e++) {
cur->send_ring[idx].pkt->seq = htons(cur->ping_seq);
cur->ping_seq++;
+ cur->send_ring[idx].pkt->checksum = 0;
cur->send_ring[idx].pkt->checksum = htons(calc_icmp_checksum((uint16_t*)cur->send_ring[idx].pkt, sizeof(icmp_echo_packet_t)));
sendto(fwd_sock, (const void*)cur->send_ring[idx].pkt, sizeof(icmp_echo_packet_t),
0, (struct sockaddr*)&cur->dest_addr, sizeof(struct sockaddr));
}
}
+ cur->last_ack = now;
}
}
pthread_mutex_unlock(&chain_lock);