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.48 by pcg, Tue Jul 28 00:42:14 2009 UTC vs.
Revision 1.49 by root, Tue Feb 8 23:11:36 2011 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines