Changeset 9ababc
- Timestamp:
- 01/05/09 20:47:59 (4 years ago)
- Branches:
- master
- Children:
- 2bccb3
- Parents:
- d4e077
- git-author:
- Erik Ekman <yarrick@…> (01/05/09 20:47:59)
- git-committer:
- Erik Ekman <erik@…> (02/04/12 20:33:59)
- Files:
-
- 3 edited
-
doc/proto_00000403.txt (modified) (1 diff)
-
src/iodine.c (modified) (12 diffs)
-
src/iodined.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
doc/proto_00000403.txt
r43c438 r9ababc 47 47 BADCODEC if not accepted. Client must then revert to Base32 48 48 49 Set downstream fragment size: 50 Client sends: 51 First byte n or N 52 Rest encoded with base32: 53 1 byte userid 54 2 bytes new downstream fragment size 55 CMC 56 Server sends: 57 2 bytes new downstream fragment size. After this all downstream 58 payloads will be max (fragsize + 2) bytes long. 59 BADFRAG if not accepted. 60 49 61 Data: 50 62 Upstream data header: -
src/iodine.c
rd2b019 r9ababc 65 65 static int down_ack_fragment; 66 66 67 /* Current IP packet */ 67 static int max_downstream_frag_size; 68 static int autodetect_frag_size; 69 70 /* Current up/downstream IP packet */ 68 71 static struct packet outpkt; 69 72 static struct packet inpkt; … … 405 408 406 409 send_packet(fd, 'P', data, sizeof(data)); 410 } 411 412 static void 413 send_set_downstream_fragsize(int fd, int fragsize) 414 { 415 char data[5]; 416 417 data[0] = userid; 418 data[1] = (fragsize & 0xff00) >> 8; 419 data[2] = (fragsize & 0x00ff); 420 data[3] = (rand_seed >> 8) & 0xff; 421 data[4] = (rand_seed >> 0) & 0xff; 422 423 rand_seed++; 424 425 send_packet(fd, 'N', data, sizeof(data)); 407 426 } 408 427 … … 613 632 switch_codec: 614 633 if (!case_preserved) 615 return 0;634 goto set_downstream_fragment_size; 616 635 617 636 dataenc = get_base64_encoder(); … … 648 667 in[read] = 0; /* zero terminate */ 649 668 printf("Server switched to codec %s\n", in); 650 return 0;669 goto autodetect_max_fragsize; 651 670 } 652 671 } … … 657 676 printf("Falling back to base32\n"); 658 677 dataenc = get_base32_encoder(); 678 autodetect_max_fragsize: 679 if (autodetect_frag_size) { 680 printf("Autoprobing max downstream fragment size...\n"); 681 /* TODO */ 682 } 683 set_downstream_fragment_size: 684 printf("Setting downstream fragment size to max %d...\n", max_downstream_frag_size); 685 for (i=0; running && i<5 ;i++) { 686 tv.tv_sec = i + 1; 687 tv.tv_usec = 0; 688 689 send_set_downstream_fragsize(dns_fd, max_downstream_frag_size); 690 691 FD_ZERO(&fds); 692 FD_SET(dns_fd, &fds); 693 694 r = select(dns_fd + 1, &fds, NULL, NULL, &tv); 695 696 if(r > 0) { 697 read = read_dns(dns_fd, in, sizeof(in)); 698 699 if (read > 0) { 700 int accepted_fragsize; 701 702 if (strncmp("BADFRAG", in, 7) == 0) { 703 printf("Server rejected fragsize. Keeping default."); 704 goto done; 705 } else if (strncmp("BADIP", in, 5) == 0) { 706 printf("Server rejected sender IP address.\n"); 707 goto done; 708 } 709 710 accepted_fragsize = ((in[0] & 0xff) << 8) | (in[1] & 0xff); 711 goto done; 712 } 713 } 714 printf("Retrying set fragsize...\n"); 715 } 716 printf("No reply from server when setting fragsize. Keeping default.\n"); 717 done: 659 718 return 0; 660 719 } 661 720 662 721 static char * 663 722 get_resolvconf_addr() … … 706 765 707 766 printf("Usage: %s [-v] [-h] [-f] [-u user] [-t chrootdir] [-d device] " 708 "[ nameserver] topdomain\n", __progname);767 "[-P password] [-m maxfragsize] [nameserver] topdomain\n", __progname); 709 768 exit(2); 710 769 } … … 716 775 printf("iodine IP over DNS tunneling client\n"); 717 776 printf("Usage: %s [-v] [-h] [-f] [-u user] [-t chrootdir] [-d device] " 718 "[-P password] [ nameserver] topdomain\n", __progname);777 "[-P password] [-m maxfragsize] [nameserver] topdomain\n", __progname); 719 778 printf(" -v to print version info and exit\n"); 720 779 printf(" -h to print this help and exit\n"); … … 724 783 printf(" -d device to set tunnel device name\n"); 725 784 printf(" -P password used for authentication (max 32 chars will be used)\n"); 785 printf(" -m maxfragsize, to limit size of downstream packets\n"); 726 786 printf("nameserver is the IP number of the relaying nameserver, if absent /etc/resolv.conf is used\n"); 727 787 printf("topdomain is the FQDN that is delegated to the tunnel endpoint.\n"); … … 765 825 inpkt.len = 0; 766 826 827 autodetect_frag_size = 1; 828 max_downstream_frag_size = 3072; 829 767 830 b32 = get_base32_encoder(); 768 831 dataenc = get_base32_encoder(); … … 776 839 #endif 777 840 778 while ((choice = getopt(argc, argv, "vfhu:t:d:P: ")) != -1) {841 while ((choice = getopt(argc, argv, "vfhu:t:d:P:m:")) != -1) { 779 842 switch(choice) { 780 843 case 'v': … … 805 868 memset(optarg, 0, strlen(optarg)); 806 869 break; 870 case 'm': 871 autodetect_frag_size = 0; 872 max_downstream_frag_size = atoi(optarg); 873 break; 807 874 default: 808 875 usage(); … … 834 901 } 835 902 903 if (max_downstream_frag_size < 1 || max_downstream_frag_size > 0xffff) { 904 warnx("Use a max frag size between 1 and 65535 bytes.\n"); 905 usage(); 906 /* NOTREACHED */ 907 } 908 836 909 set_nameserver(nameserv_addr); 837 910 -
src/iodined.c
rd4e077 r9ababc 378 378 } 379 379 return; 380 } else if(in[0] == 'N' || in[0] == 'n') { 381 int max_frag_size; 382 383 read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), domain_len - 1, b32); 384 /* Downstream fragsize packet */ 385 userid = unpacked[0]; 386 if (userid < 0 || userid >= USERS || ip_cmp(userid, q) != 0) { 387 write_dns(dns_fd, q, "BADIP", 5); 388 return; /* illegal id */ 389 } 390 391 max_frag_size = ((unpacked[1] & 0xff) << 8) | (unpacked[2] & 0xff); 392 if (max_frag_size < 1) { 393 write_dns(dns_fd, q, "BADFRAG", 7); 394 } else { 395 users[userid].fragsize = max_frag_size; 396 write_dns(dns_fd, q, &unpacked[1], 2); 397 } 398 return; 380 399 } else if(in[0] == 'P' || in[0] == 'p') { 381 400 int dn_seq;
Note: See TracChangeset
for help on using the changeset viewer.
