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.17 by pcg, Sat Mar 5 03:47:05 2005 UTC vs.
Revision 1.18 by pcg, Sat Mar 5 19:13:16 2005 UTC

356 return true; 356 return true;
357} 357}
358 358
359vpn_packet *byte_stream::get () 359vpn_packet *byte_stream::get ()
360{ 360{
361 unsigned int len;
362
363 for (;;)
364 {
361 unsigned int len = (data [0] << 8) | data [1]; 365 len = (data [0] << 8) | data [1];
362 366
363 if (len > MAXSIZE && fill >= 2) 367 if (len <= MAXSIZE || fill < 2)
364 assert (len <= MAXSIZE || fill < 2); // TODO handle this gracefully, connection reset 368 break;
365 369
370 // TODO: handle this better than skipping, e.g. by reset
371 slog (L_DEBUG, _("DNS: corrupted packet stream skipping a byte..."));
372 remove (1);
373 }
374
366 if (fill < len + 2) 375 if (fill < len + 2)
367 return 0; 376 return 0;
368 377
369 vpn_packet *pkt = new vpn_packet; 378 vpn_packet *pkt = new vpn_packet;
370 379
498 return data - orig; 507 return data - orig;
499} 508}
500 509
501///////////////////////////////////////////////////////////////////////////// 510/////////////////////////////////////////////////////////////////////////////
502 511
512static u16 dns_id = 0; // TODO: should be per-vpn
513
514static u16 next_id ()
515{
516 if (!dns_id)
517 dns_id = time (0);
518
519 // the simplest lsfr with periodicity 65535 i could find
520 dns_id = (dns_id << 1)
521 | (((dns_id >> 1)
522 ^ (dns_id >> 2)
523 ^ (dns_id >> 4)
524 ^ (dns_id >> 15)) & 1);
525
526 return dns_id;
527}
528
529struct dns_rcv;
530struct dns_snd;
531
532struct dns_connection
533{
534 connection *c;
535 struct vpn *vpn;
536
537 dns_cfg cfg;
538
539 bool established;
540
541 tstamp last_received;
542 tstamp last_sent;
543 double last_latency;
544 double poll_interval, send_interval;
545
546 vector<dns_rcv *> rcvpq;
547
548 byte_stream rcvdq; int rcvseq;
549 byte_stream snddq; int sndseq;
550
551 void time_cb (time_watcher &w); time_watcher tw;
552 void receive_rep (dns_rcv *r);
553
554 dns_connection (connection *c);
555 ~dns_connection ();
556};
557
503struct dns_snd 558struct dns_snd
504{ 559{
505 dns_packet *pkt; 560 dns_packet *pkt;
506 tstamp timeout, sent; 561 tstamp timeout, sent;
507 int retry; 562 int retry;
508 struct dns_connection *dns; 563 struct dns_connection *dns;
509 int seqno; 564 int seqno;
510 bool stdhdr; 565 bool stdhdr;
511 566
512 void gen_stream_req (int seqno, byte_stream &stream); 567 void gen_stream_req (int seqno, byte_stream &stream);
513 void gen_syn_req (const dns_cfg &cfg); 568 void gen_syn_req ();
514 569
515 dns_snd (dns_connection *dns); 570 dns_snd (dns_connection *dns);
516 ~dns_snd (); 571 ~dns_snd ();
517}; 572};
518
519static u16 dns_id = 12098; // TODO: should be per-vpn
520
521static u16 next_id ()
522{
523 // the simplest lsfr with periodicity 65535 i could find
524 dns_id = (dns_id << 1)
525 | (((dns_id >> 1)
526 ^ (dns_id >> 2)
527 ^ (dns_id >> 4)
528 ^ (dns_id >> 15)) & 1);
529
530 return dns_id;
531}
532 573
533dns_snd::dns_snd (dns_connection *dns) 574dns_snd::dns_snd (dns_connection *dns)
534: dns (dns) 575: dns (dns)
535{ 576{
536 timeout = 0; 577 timeout = 0;
618 (*pkt)[offs++] = RR_CLASS_IN >> 8; (*pkt)[offs++] = RR_CLASS_IN; 659 (*pkt)[offs++] = RR_CLASS_IN >> 8; (*pkt)[offs++] = RR_CLASS_IN;
619 660
620 pkt->len = offs; 661 pkt->len = offs;
621} 662}
622 663
623void dns_snd::gen_syn_req (const dns_cfg &cfg) 664void dns_snd::gen_syn_req ()
624{ 665{
625 timeout = NOW + INITIAL_SYN_TIMEOUT; 666 timeout = NOW + INITIAL_SYN_TIMEOUT;
667
668 printf ("send syn\n");//D
626 669
627 pkt->flags = htons (DEFAULT_CLIENT_FLAGS); 670 pkt->flags = htons (DEFAULT_CLIENT_FLAGS);
628 pkt->qdcount = htons (1); 671 pkt->qdcount = htons (1);
629 672
630 int offs = 6*2; 673 int offs = 6 * 2;
631 674
632 int elen = cdc26.encode ((char *)pkt->at (offs + 1), (u8 *)&cfg, sizeof (dns_cfg)); 675 int elen = cdc26.encode ((char *)pkt->at (offs + 1), (u8 *)&dns->cfg, sizeof (dns_cfg));
633 676
634 assert (elen <= MAX_LBL_SIZE); 677 assert (elen <= MAX_LBL_SIZE);
635 678
636 (*pkt)[offs] = elen; 679 (*pkt)[offs] = elen;
637 offs += elen + 1; 680 offs += elen + 1;
666 delete pkt; 709 delete pkt;
667} 710}
668 711
669///////////////////////////////////////////////////////////////////////////// 712/////////////////////////////////////////////////////////////////////////////
670 713
671struct dns_connection
672{
673 connection *c;
674 struct vpn *vpn;
675
676 dns_cfg cfg;
677
678 bool established;
679
680 tstamp last_received;
681 tstamp last_sent;
682 double last_latency;
683 double poll_interval, send_interval;
684
685 vector<dns_rcv *> rcvpq;
686
687 byte_stream rcvdq; int rcvseq;
688 byte_stream snddq; int sndseq;
689
690 void time_cb (time_watcher &w); time_watcher tw;
691 void receive_rep (dns_rcv *r);
692
693 dns_connection (connection *c);
694 ~dns_connection ();
695};
696
697dns_connection::dns_connection (connection *c) 714dns_connection::dns_connection (connection *c)
698: c (c) 715: c (c)
699, rcvdq (MAX_BACKLOG * 2) 716, rcvdq (MAX_BACKLOG * 2)
700, snddq (MAX_BACKLOG * 2) 717, snddq (MAX_BACKLOG * 2)
701, tw (this, &dns_connection::time_cb) 718, tw (this, &dns_connection::time_cb)
765 } 782 }
766 783
767 while (vpn_packet *pkt = rcvdq.get ()) 784 while (vpn_packet *pkt = rcvdq.get ())
768 { 785 {
769 sockinfo si; 786 sockinfo si;
770 si.host = 0; si.port = 0; si.prot = PROT_DNSv4; 787 si.host = 0x01010101; si.port = htons (c->conf->id); si.prot = PROT_DNSv4;
771 788
772 vpn->recv_vpn_packet (pkt, si); 789 vpn->recv_vpn_packet (pkt, si);
773 790
774 delete pkt; 791 delete pkt;
775 } 792 }
1142 } 1159 }
1143 } 1160 }
1144} 1161}
1145 1162
1146bool 1163bool
1147connection::send_dnsv4_packet (vpn_packet *pkt, const sockinfo &si, int tos) 1164vpn::send_dnsv4_packet (vpn_packet *pkt, const sockinfo &si, int tos)
1148{ 1165{
1166 int client = ntohs (si.port);
1167
1168 assert (0 < client && client <= conns.size ());
1169
1170 connection *c = conns [client - 1];
1171
1149 if (!dns) 1172 if (!c->dns)
1150 dns = new dns_connection (this); 1173 c->dns = new dns_connection (c);
1151 1174
1152 if (!dns->snddq.put (pkt)) 1175 if (!c->dns->snddq.put (pkt))
1153 return false; 1176 return false;
1154 1177
1155 dns->tw.trigger (); 1178 c->dns->tw.trigger ();
1156 1179
1157 return true; 1180 return true;
1158} 1181}
1159 1182
1160void 1183void
1214 { 1237 {
1215 if (vpn->dns_sndpq.empty ()) 1238 if (vpn->dns_sndpq.empty ())
1216 { 1239 {
1217 send = new dns_snd (this); 1240 send = new dns_snd (this);
1218 1241
1242 printf ("new conn %p %d\n", this, c->conf->id);//D
1219 cfg.reset (THISNODE->id); 1243 cfg.reset (THISNODE->id);
1220 send->gen_syn_req (cfg); 1244 send->gen_syn_req ();
1221 } 1245 }
1222 } 1246 }
1223 else if (vpn->dns_sndpq.size () < MAX_OUTSTANDING 1247 else if (vpn->dns_sndpq.size () < MAX_OUTSTANDING
1224 && !SEQNO_EQ (rcvseq, sndseq - (MAX_WINDOW - 1))) 1248 && !SEQNO_EQ (rcvseq, sndseq - (MAX_WINDOW - 1)))
1225 { 1249 {
1250 //printf ("sending data request etc.\n"); //D
1226 if (!snddq.empty ()) 1251 if (!snddq.empty ())
1227 { 1252 {
1228 poll_interval = send_interval; 1253 poll_interval = send_interval;
1229 NEXT (NOW + send_interval); 1254 NEXT (NOW + send_interval);
1230 } 1255 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines