… | |
… | |
43 | |
43 | |
44 | #include "netcompat.h" |
44 | #include "netcompat.h" |
45 | |
45 | |
46 | #include "vpn.h" |
46 | #include "vpn.h" |
47 | |
47 | |
48 | #define MIN_POLL_INTERVAL .2 // how often to poll minimally when the server is having data |
48 | #define MIN_POLL_INTERVAL .02 // how often to poll minimally when the server is having data |
49 | #define MAX_POLL_INTERVAL 6. // how often to poll minimally when the server has no data |
49 | #define MAX_POLL_INTERVAL 6. // how often to poll minimally when the server has no data |
50 | #define ACTIVITY_INTERVAL 5. |
50 | #define ACTIVITY_INTERVAL 5. |
51 | |
51 | |
52 | #define INITIAL_TIMEOUT 1. |
52 | #define INITIAL_TIMEOUT 1. |
53 | #define INITIAL_SYN_TIMEOUT 2. |
53 | #define INITIAL_SYN_TIMEOUT 2. |
54 | |
54 | |
55 | #define MIN_SEND_INTERVAL 0.001 |
55 | #define MIN_SEND_INTERVAL 0.01 |
56 | #define MAX_SEND_INTERVAL 0.5 // optimistic? |
56 | #define MAX_SEND_INTERVAL 0.5 // optimistic? |
57 | |
57 | |
58 | #define MAX_OUTSTANDING 400 // max. outstanding requests |
58 | #define MAX_OUTSTANDING 800 // max. outstanding requests |
59 | #define MAX_WINDOW 1000 // max. for MAX_OUTSTANDING |
59 | #define MAX_WINDOW 1000 // max. for MAX_OUTSTANDING |
60 | #define MAX_BACKLOG (100*1024) // size of protocol backlog, must be > MAXSIZE |
60 | #define MAX_BACKLOG (100*1024) // size of protocol backlog, must be > MAXSIZE |
61 | |
61 | |
62 | #define MAX_DOMAIN_SIZE 220 // 255 is legal limit, but bind doesn't compress well |
62 | #define MAX_DOMAIN_SIZE 220 // 255 is legal limit, but bind doesn't compress well |
63 | // 240 leaves about 4 bytes of server reply data |
63 | // 240 leaves about 4 bytes of server reply data |
… | |
… | |
350 | return true; |
350 | return true; |
351 | } |
351 | } |
352 | |
352 | |
353 | vpn_packet *byte_stream::get () |
353 | vpn_packet *byte_stream::get () |
354 | { |
354 | { |
355 | int len = (data [0] << 8) | data [1]; |
355 | unsigned int len = (data [0] << 8) | data [1]; |
356 | |
356 | |
357 | if (len > MAXSIZE && fill >= 2) |
357 | if (len > MAXSIZE && fill >= 2) |
358 | abort (); // TODO handle this gracefully, connection reset |
358 | abort (); // TODO handle this gracefully, connection reset |
359 | |
359 | |
360 | if (fill < len + 2) |
360 | if (fill < len + 2) |
… | |
… | |
714 | if (r->datalen) |
714 | if (r->datalen) |
715 | { |
715 | { |
716 | last_received = NOW; |
716 | last_received = NOW; |
717 | tw.trigger (); |
717 | tw.trigger (); |
718 | |
718 | |
719 | poll_interval *= 0.99; |
719 | poll_interval = send_interval; |
720 | if (poll_interval > MIN_POLL_INTERVAL) |
|
|
721 | poll_interval = MIN_POLL_INTERVAL; |
|
|
722 | } |
720 | } |
723 | else |
721 | else |
724 | { |
722 | { |
725 | poll_interval *= 1.1; |
723 | poll_interval *= 1.1; |
726 | if (poll_interval > MAX_POLL_INTERVAL) |
724 | if (poll_interval > MAX_POLL_INTERVAL) |
… | |
… | |
953 | i != dns_sndpq.end (); |
951 | i != dns_sndpq.end (); |
954 | ++i) |
952 | ++i) |
955 | if ((*i)->pkt->id == pkt.id) |
953 | if ((*i)->pkt->id == pkt.id) |
956 | { |
954 | { |
957 | dns_connection *dns = (*i)->dns; |
955 | dns_connection *dns = (*i)->dns; |
|
|
956 | connection *c = dns->c; |
958 | int seqno = (*i)->seqno; |
957 | int seqno = (*i)->seqno; |
959 | u8 data[MAXSIZE], *datap = data; |
958 | u8 data[MAXSIZE], *datap = data; |
960 | |
959 | |
961 | if ((*i)->retry) |
960 | if ((*i)->retry) |
962 | { |
961 | { |
963 | dns->send_interval *= 1.01; |
962 | dns->send_interval *= 1.001; |
964 | if (dns->send_interval < MAX_SEND_INTERVAL) |
963 | if (dns->send_interval > MAX_SEND_INTERVAL) |
965 | dns->send_interval = MAX_SEND_INTERVAL; |
964 | dns->send_interval = MAX_SEND_INTERVAL; |
966 | } |
965 | } |
967 | else |
966 | else |
968 | { |
967 | { |
|
|
968 | #if 1 |
969 | dns->send_interval *= 0.99; |
969 | dns->send_interval *= 0.9999; |
|
|
970 | #endif |
970 | if (dns->send_interval < MIN_SEND_INTERVAL) |
971 | if (dns->send_interval < MIN_SEND_INTERVAL) |
971 | dns->send_interval = MIN_SEND_INTERVAL; |
972 | dns->send_interval = MIN_SEND_INTERVAL; |
972 | |
973 | |
973 | // the latency surely puts an upper bound on |
974 | // the latency surely puts an upper bound on |
974 | // the minimum send interval |
975 | // the minimum send interval |
|
|
976 | double latency = NOW - (*i)->sent; |
|
|
977 | |
975 | if (dns->send_interval > NOW - (*i)->sent) |
978 | if (dns->send_interval > latency) |
976 | dns->send_interval = NOW - (*i)->sent; |
979 | dns->send_interval = latency; |
977 | } |
980 | } |
978 | |
981 | |
979 | delete *i; |
982 | delete *i; |
980 | dns_sndpq.erase (i); |
983 | dns_sndpq.erase (i); |
981 | |
984 | |
… | |
… | |
1037 | |
1040 | |
1038 | if (ip [3] == CMD_IP_RST) |
1041 | if (ip [3] == CMD_IP_RST) |
1039 | { |
1042 | { |
1040 | slog (L_DEBUG, _("got tunnel RST request")); |
1043 | slog (L_DEBUG, _("got tunnel RST request")); |
1041 | |
1044 | |
1042 | connection *c = dns->c; |
|
|
1043 | delete c->dns; c->dns = 0; |
1045 | delete dns; c->dns = 0; |
1044 | |
1046 | |
1045 | return; |
1047 | return; |
1046 | } |
1048 | } |
1047 | else if (ip [3] == CMD_IP_SYN) |
1049 | else if (ip [3] == CMD_IP_SYN) |
|
|
1050 | { |
|
|
1051 | slog (L_DEBUG, _("got tunnel SYN reply, server likes us.")); |
1048 | dns->established = true; |
1052 | dns->established = true; |
|
|
1053 | } |
|
|
1054 | else if (ip [3] == CMD_IP_REJ) |
|
|
1055 | { |
|
|
1056 | slog (L_DEBUG, _("got tunnel REJ reply, server does not like us, aborting.")); |
|
|
1057 | abort (); |
|
|
1058 | } |
1049 | else |
1059 | else |
1050 | slog (L_INFO, _("got unknown meta command %02x"), ip [3]); |
1060 | slog (L_INFO, _("got unknown meta command %02x"), ip [3]); |
1051 | } |
1061 | } |
1052 | else |
1062 | else |
1053 | slog (L_INFO, _("got spurious a record %d.%d.%d.%d"), |
1063 | slog (L_INFO, _("got spurious a record %d.%d.%d.%d"), |
… | |
… | |
1118 | dns->tw.trigger (); |
1128 | dns->tw.trigger (); |
1119 | |
1129 | |
1120 | return true; |
1130 | return true; |
1121 | } |
1131 | } |
1122 | |
1132 | |
|
|
1133 | void |
|
|
1134 | connection::dnsv4_reset_connection () |
|
|
1135 | { |
|
|
1136 | //delete dns; dns = 0; //TODO |
|
|
1137 | } |
|
|
1138 | |
1123 | #define NEXT(w) do { if (next > (w)) next = w; } while (0) |
1139 | #define NEXT(w) do { if (next > (w)) next = w; } while (0) |
1124 | |
1140 | |
1125 | void |
1141 | void |
1126 | dns_connection::time_cb (time_watcher &w) |
1142 | dns_connection::time_cb (time_watcher &w) |
1127 | { |
1143 | { |
… | |
… | |
1182 | } |
1198 | } |
1183 | |
1199 | |
1184 | if (send) |
1200 | if (send) |
1185 | { |
1201 | { |
1186 | last_sent = NOW; |
1202 | last_sent = NOW; |
1187 | |
|
|
1188 | sendto (vpn->dnsv4_fd, |
1203 | sendto (vpn->dnsv4_fd, |
1189 | send->pkt->at (0), send->pkt->len, 0, |
1204 | send->pkt->at (0), send->pkt->len, 0, |
1190 | vpn->dns_forwarder.sav4 (), vpn->dns_forwarder.salenv4 ()); |
1205 | vpn->dns_forwarder.sav4 (), vpn->dns_forwarder.salenv4 ()); |
1191 | } |
1206 | } |
1192 | } |
1207 | } |
1193 | else |
1208 | else |
1194 | NEXT (last_sent + send_interval); |
1209 | NEXT (last_sent + send_interval); |
1195 | |
1210 | |
1196 | //printf ("pi %f si %f N %f (%d:%d)\n", poll_interval, send_interval, next - NOW, vpn->dns_sndpq.size (), snddq.size ()); |
1211 | slog (L_NOISE, "pi %f si %f N %f (%d:%d)", |
|
|
1212 | poll_interval, send_interval, next - NOW, |
|
|
1213 | vpn->dns_sndpq.size (), snddq.size ()); |
1197 | |
1214 | |
1198 | // TODO: no idea when this happens, but when next < NOW, we have a problem |
1215 | // TODO: no idea when this happens, but when next < NOW, we have a problem |
1199 | if (next < NOW + 0.0001) |
1216 | if (next < NOW + 0.0001) |
1200 | next = NOW + 0.1; |
1217 | next = NOW + 0.1; |
1201 | |
1218 | |