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.20 by pcg, Sun Mar 6 21:32:15 2005 UTC vs.
Revision 1.23 by pcg, Sun Mar 6 21:52:15 2005 UTC

664 664
665void dns_snd::gen_syn_req () 665void dns_snd::gen_syn_req ()
666{ 666{
667 timeout = NOW + INITIAL_SYN_TIMEOUT; 667 timeout = NOW + INITIAL_SYN_TIMEOUT;
668 668
669 printf ("send syn\n");//D
670
671 pkt->flags = htons (DEFAULT_CLIENT_FLAGS); 669 pkt->flags = htons (DEFAULT_CLIENT_FLAGS);
672 pkt->qdcount = htons (1); 670 pkt->qdcount = htons (1);
673 671
674 int offs = 6 * 2; 672 int offs = 6 * 2;
675 673
875 // new packet, queue 873 // new packet, queue
876 rcv = new dns_rcv (seqno, data, datalen); 874 rcv = new dns_rcv (seqno, data, datalen);
877 dns->receive_rep (rcv); 875 dns->receive_rep (rcv);
878 } 876 }
879 877
878 {
880 pkt [offs++] = 0xc0; pkt [offs++] = 6 * 2; // refer to name in query section 879 pkt [offs++] = 0xc0; pkt [offs++] = 6 * 2; // refer to name in query section
881 880
882 int rtype = dns ? dns->cfg.rrtype : RR_TYPE_A; 881 int rtype = dns ? dns->cfg.rrtype : RR_TYPE_A;
883 pkt [offs++] = rtype >> 8; pkt [offs++] = rtype; // type 882 pkt [offs++] = rtype >> 8; pkt [offs++] = rtype; // type
884 pkt [offs++] = RR_CLASS_IN >> 8; pkt [offs++] = RR_CLASS_IN; // class 883 pkt [offs++] = RR_CLASS_IN >> 8; pkt [offs++] = RR_CLASS_IN; // class
885 pkt [offs++] = 0; pkt [offs++] = 0; 884 pkt [offs++] = 0; pkt [offs++] = 0;
886 pkt [offs++] = 0; pkt [offs++] = dns ? dns->cfg.def_ttl : 0; // TTL 885 pkt [offs++] = 0; pkt [offs++] = dns ? dns->cfg.def_ttl : 0; // TTL
887 886
888 int rdlen_offs = offs += 2; 887 int rdlen_offs = offs += 2;
889 888
890 int dlen = (dns ? ntohs (dns->cfg.max_size) : MAX_PKT_SIZE) - offs; 889 int dlen = (dns ? ntohs (dns->cfg.max_size) : MAX_PKT_SIZE) - offs;
891 // bind doesn't compress well, so reduce further by one label length 890 // bind doesn't compress well, so reduce further by one label length
892 dlen -= qlen; 891 dlen -= qlen;
893 892
894 if (dns) 893 if (dns)
895 { 894 {
896 // only put data into in-order sequence packets, if 895 // only put data into in-order sequence packets, if
897 // we receive out-of-order packets we generate empty 896 // we receive out-of-order packets we generate empty
898 // replies 897 // replies
899 while (dlen > 1 && !dns->snddq.empty () && in_seq) 898 while (dlen > 1 && !dns->snddq.empty () && in_seq)
900 { 899 {
901 int txtlen = dlen <= 255 ? dlen - 1 : 255; 900 int txtlen = dlen <= 255 ? dlen - 1 : 255;
902 901
903 if (txtlen > dns->snddq.size ()) 902 if (txtlen > dns->snddq.size ())
904 txtlen = dns->snddq.size (); 903 txtlen = dns->snddq.size ();
905 904
906 pkt[offs++] = txtlen; 905 pkt[offs++] = txtlen;
907 memcpy (pkt.at (offs), dns->snddq.begin (), txtlen); 906 memcpy (pkt.at (offs), dns->snddq.begin (), txtlen);
908 offs += txtlen; 907 offs += txtlen;
909 dns->snddq.remove (txtlen); 908 dns->snddq.remove (txtlen);
910 909
911 dlen -= txtlen + 1; 910 dlen -= txtlen + 1;
912 } 911 }
913 912
914 // avoid empty TXT rdata 913 // avoid empty TXT rdata
915 if (offs == rdlen_offs) 914 if (offs == rdlen_offs)
916 pkt[offs++] = 0; 915 pkt[offs++] = 0;
917 916
918 slog (L_NOISE, "DNS: snddq %d", dns->snddq.size ()); 917 slog (L_NOISE, "DNS: snddq %d", dns->snddq.size ());
919 } 918 }
920 else 919 else
921 { 920 {
922 // send RST 921 // send RST
923 pkt [offs++] = CMD_IP_1; pkt [offs++] = CMD_IP_2; pkt [offs++] = CMD_IP_3; 922 pkt [offs++] = CMD_IP_1; pkt [offs++] = CMD_IP_2; pkt [offs++] = CMD_IP_3;
924 pkt [offs++] = CMD_IP_RST; 923 pkt [offs++] = CMD_IP_RST;
925 } 924 }
926 925
927 int rdlen = offs - rdlen_offs; 926 int rdlen = offs - rdlen_offs;
928 927
929 pkt [rdlen_offs - 2] = rdlen >> 8; 928 pkt [rdlen_offs - 2] = rdlen >> 8;
930 pkt [rdlen_offs - 1] = rdlen; 929 pkt [rdlen_offs - 1] = rdlen;
931 930
932 if (dns) 931 if (dns)
933 { 932 {
934 // now update dns_rcv copy 933 // now update dns_rcv copy
935 rcv->pkt->len = offs; 934 rcv->pkt->len = offs;
936 memcpy (rcv->pkt->at (0), pkt.at (0), offs); 935 memcpy (rcv->pkt->at (0), pkt.at (0), offs);
937 } 936 }
937 }
938 938
939 duplicate_request: ; 939 duplicate_request: ;
940 } 940 }
941 else 941 else
942 pkt.flags = htons (DEFAULT_SERVER_FLAGS | FLAG_RCODE_FORMERR); 942 pkt.flags = htons (DEFAULT_SERVER_FLAGS | FLAG_RCODE_FORMERR);
1238 { 1238 {
1239 if (vpn->dns_sndpq.empty ()) 1239 if (vpn->dns_sndpq.empty ())
1240 { 1240 {
1241 send = new dns_snd (this); 1241 send = new dns_snd (this);
1242 1242
1243 printf ("new conn %p %d\n", this, c->conf->id);//D
1244 cfg.reset (THISNODE->id); 1243 cfg.reset (THISNODE->id);
1245 send->gen_syn_req (); 1244 send->gen_syn_req ();
1246 } 1245 }
1247 } 1246 }
1248 else if (vpn->dns_sndpq.size () < MAX_OUTSTANDING 1247 else if (vpn->dns_sndpq.size () < MAX_OUTSTANDING

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines