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.47 by pcg, Thu Aug 7 17:54:27 2008 UTC vs.
Revision 1.49 by root, Tue Feb 8 23:11:36 2011 UTC

83#define MAX_PKT_SIZE 512 83#define MAX_PKT_SIZE 512
84 84
85#define RR_TYPE_A 1 85#define RR_TYPE_A 1
86#define RR_TYPE_NULL 10 86#define RR_TYPE_NULL 10
87#define RR_TYPE_TXT 16 87#define RR_TYPE_TXT 16
88#define RR_TYPE_AAAA 28
88#define RR_TYPE_ANY 255 89#define RR_TYPE_ANY 255
89 90
90#define RR_CLASS_IN 1 91#define RR_CLASS_IN 1
91 92
92#define CMD_IP_1 207 93#define CMD_IP_1 207
167 enc_len [len] = n; 168 enc_len [len] = n;
168 dec_len [n] = len; 169 dec_len [n] = len;
169 } 170 }
170} 171}
171 172
173unsigned int
172unsigned int basecoder::encode_len (unsigned int len) 174basecoder::encode_len (unsigned int len)
173{ 175{
174 return enc_len [len]; 176 return enc_len [len];
175} 177}
176 178
179unsigned int
177unsigned int basecoder::decode_len (unsigned int len) 180basecoder::decode_len (unsigned int len)
178{ 181{
179 while (len && !dec_len [len]) 182 while (len && !dec_len [len])
180 --len; 183 --len;
181 184
182 return dec_len [len]; 185 return dec_len [len];
183} 186}
184 187
188unsigned int
185unsigned int basecoder::encode (char *dst, u8 *src, unsigned int len) 189basecoder::encode (char *dst, u8 *src, unsigned int len)
186{ 190{
187 if (!len || len > MAX_DEC_LEN) 191 if (!len || len > MAX_DEC_LEN)
188 return 0; 192 return 0;
189 193
190 int elen = encode_len (len); 194 int elen = encode_len (len);
209 *dst++ = cmap.encode [dst_ [i]]; 213 *dst++ = cmap.encode [dst_ [i]];
210 214
211 return elen; 215 return elen;
212} 216}
213 217
218unsigned int
214unsigned int basecoder::decode (u8 *dst, char *src, unsigned int len) 219basecoder::decode (u8 *dst, char *src, unsigned int len)
215{ 220{
216 if (!len || len > MAX_ENC_LEN) 221 if (!len || len > MAX_ENC_LEN)
217 return 0; 222 return 0;
218 223
219 u8 src_ [MAX_ENC_LEN]; 224 u8 src_ [MAX_ENC_LEN];
278 283
279///////////////////////////////////////////////////////////////////////////// 284/////////////////////////////////////////////////////////////////////////////
280 285
281#define HDRSIZE 6 286#define HDRSIZE 6
282 287
288inline void
283inline void encode_header (char *data, int clientid, int seqno, int retry = 0) 289encode_header (char *data, int clientid, int seqno, int retry = 0)
284{ 290{
285 seqno &= SEQNO_MASK; 291 seqno &= SEQNO_MASK;
286 292
287 u8 hdr[3] = { 293 u8 hdr[3] = {
288 clientid, 294 clientid,
293 assert (clientid < 256); 299 assert (clientid < 256);
294 300
295 cdc26.encode (data, hdr, 3); 301 cdc26.encode (data, hdr, 3);
296} 302}
297 303
304inline void
298inline void decode_header (char *data, int &clientid, int &seqno) 305decode_header (char *data, int &clientid, int &seqno)
299{ 306{
300 u8 hdr[3]; 307 u8 hdr[3];
301 308
302 cdc26.decode (hdr, data, HDRSIZE); 309 cdc26.decode (hdr, data, HDRSIZE);
303 310
336byte_stream::~byte_stream () 343byte_stream::~byte_stream ()
337{ 344{
338 delete data; 345 delete data;
339} 346}
340 347
348void
341void byte_stream::remove (int count) 349byte_stream::remove (int count)
342{ 350{
343 if (count > fill) 351 if (count > fill)
344 assert (count <= fill); 352 assert (count <= fill);
345 353
346 memmove (data, data + count, fill -= count); 354 memmove (data, data + count, fill -= count);
347} 355}
348 356
357bool
349bool byte_stream::put (u8 *data, unsigned int datalen) 358byte_stream::put (u8 *data, unsigned int datalen)
350{ 359{
351 if (maxsize - fill < datalen) 360 if (maxsize - fill < datalen)
352 return false; 361 return false;
353 362
354 memcpy (this->data + fill, data, datalen); fill += datalen; 363 memcpy (this->data + fill, data, datalen); fill += datalen;
355 364
356 return true; 365 return true;
357} 366}
358 367
368bool
359bool byte_stream::put (vpn_packet *pkt) 369byte_stream::put (vpn_packet *pkt)
360{ 370{
361 if (maxsize - fill < pkt->len + 2) 371 if (maxsize - fill < pkt->len + 2)
362 return false; 372 return false;
363 373
364 data [fill++] = pkt->len >> 8; 374 data [fill++] = pkt->len >> 8;
446 bool valid (); 456 bool valid ();
447}; 457};
448 458
449int dns_cfg::next_uid; 459int dns_cfg::next_uid;
450 460
461void
451void dns_cfg::reset (int clientid) 462dns_cfg::reset (int clientid)
452{ 463{
453 id1 = 'G'; 464 id1 = 'G';
454 id2 = 'V'; 465 id2 = 'V';
455 id3 = 'P'; 466 id3 = 'P';
456 id4 = 'E'; 467 id4 = 'E';
470 481
471 r3 = r4 = 0; 482 r3 = r4 = 0;
472 r4 = r5 = r6 = r7 = 0; 483 r4 = r5 = r6 = r7 = 0;
473} 484}
474 485
486bool
475bool dns_cfg::valid () 487dns_cfg::valid ()
476{ 488{
477 // although the protocol itself allows for some configurability, 489 // although the protocol itself allows for some configurability,
478 // only the following encoding/decoding settings are implemented. 490 // only the following encoding/decoding settings are implemented.
479 return id1 == 'G' 491 return id1 == 'G'
480 && id2 == 'V' 492 && id2 == 'V'
495 u8 data [MAXSIZE - 6 * 2]; 507 u8 data [MAXSIZE - 6 * 2];
496 508
497 int decode_label (char *data, int size, int &offs); 509 int decode_label (char *data, int size, int &offs);
498}; 510};
499 511
512int
500int dns_packet::decode_label (char *data, int size, int &offs) 513dns_packet::decode_label (char *data, int size, int &offs)
501{ 514{
502 char *orig = data; 515 char *orig = data;
503 516
504 memset (data, 0, size); 517 memset (data, 0, size);
505 518
531 return data - orig; 544 return data - orig;
532} 545}
533 546
534///////////////////////////////////////////////////////////////////////////// 547/////////////////////////////////////////////////////////////////////////////
535 548
549static
550u16 next_id ()
551{
536static u16 dns_id = 0; // TODO: should be per-vpn 552 static u16 dns_id = 0; // TODO: should be per-vpn
537 553
538static u16 next_id ()
539{
540 if (!dns_id) 554 if (!dns_id)
541 dns_id = time (0); 555 dns_id = time (0);
542 556
543 // the simplest lsfr with periodicity 65535 i could find 557 // the simplest lsfr with periodicity 65535 i could find
544 dns_id = (dns_id << 1) 558 dns_id = (dns_id << 1)
612dns_snd::~dns_snd () 626dns_snd::~dns_snd ()
613{ 627{
614 delete pkt; 628 delete pkt;
615} 629}
616 630
631static void
617static void append_domain (dns_packet &pkt, int &offs, const char *domain) 632append_domain (dns_packet &pkt, int &offs, const char *domain)
618{ 633{
619 // add tunnel domain 634 // add tunnel domain
620 for (;;) 635 for (;;)
621 { 636 {
622 const char *end = strchr (domain, '.'); 637 const char *end = strchr (domain, '.');
635 650
636 domain = end + 1; 651 domain = end + 1;
637 } 652 }
638} 653}
639 654
655void
640void dns_snd::gen_stream_req (int seqno, byte_stream &stream) 656dns_snd::gen_stream_req (int seqno, byte_stream &stream)
641{ 657{
642 stdhdr = true; 658 stdhdr = true;
643 this->seqno = seqno; 659 this->seqno = seqno;
644 660
645 timeout = ev_now () + INITIAL_TIMEOUT; 661 timeout = ev_now () + INITIAL_TIMEOUT;
683 (*pkt)[offs++] = RR_CLASS_IN >> 8; (*pkt)[offs++] = RR_CLASS_IN; 699 (*pkt)[offs++] = RR_CLASS_IN >> 8; (*pkt)[offs++] = RR_CLASS_IN;
684 700
685 pkt->len = offs; 701 pkt->len = offs;
686} 702}
687 703
704void
688void dns_snd::gen_syn_req () 705dns_snd::gen_syn_req ()
689{ 706{
690 timeout = ev_now () + INITIAL_SYN_TIMEOUT; 707 timeout = ev_now () + INITIAL_SYN_TIMEOUT;
691 708
692 pkt->flags = htons (DEFAULT_CLIENT_FLAGS); 709 pkt->flags = htons (DEFAULT_CLIENT_FLAGS);
693 pkt->qdcount = htons (1); 710 pkt->qdcount = htons (1);
758 i != rcvpq.end (); 775 i != rcvpq.end ();
759 ++i) 776 ++i)
760 delete *i; 777 delete *i;
761} 778}
762 779
780void
763void dns_connection::receive_rep (dns_rcv *r) 781dns_connection::receive_rep (dns_rcv *r)
764{ 782{
765 if (r->datalen) 783 if (r->datalen)
766 { 784 {
767 last_received = ev_now (); 785 last_received = ev_now ();
768 tw (); 786 tw ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines