ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/vpn_dns.C
(Generate patch)

Comparing gvpe/src/vpn_dns.C (file contents):
Revision 1.11 by pcg, Fri Mar 4 08:45:24 2005 UTC vs.
Revision 1.12 by pcg, Fri Mar 4 09:36:45 2005 UTC

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
353vpn_packet *byte_stream::get () 353vpn_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
1133void
1134connection::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
1125void 1141void
1126dns_connection::time_cb (time_watcher &w) 1142dns_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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines