Changeset 9ababc


Ignore:
Timestamp:
01/05/09 20:47:59 (4 years ago)
Author:
Erik Ekman <yarrick@…>
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)
Message:

#7, set max fragsize with -m in the client

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • doc/proto_00000403.txt

    r43c438 r9ababc  
    4747        BADCODEC if not accepted. Client must then revert to Base32 
    4848 
     49Set downstream fragment size: 
     50Client 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 
     56Server 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 
    4961Data: 
    5062Upstream data header: 
  • src/iodine.c

    rd2b019 r9ababc  
    6565static int down_ack_fragment; 
    6666 
    67 /* Current IP packet */ 
     67static int max_downstream_frag_size; 
     68static int autodetect_frag_size; 
     69 
     70/* Current up/downstream IP packet */ 
    6871static struct packet outpkt; 
    6972static struct packet inpkt; 
     
    405408 
    406409        send_packet(fd, 'P', data, sizeof(data)); 
     410} 
     411 
     412static void 
     413send_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)); 
    407426} 
    408427 
     
    613632switch_codec: 
    614633        if (!case_preserved) 
    615                 return 0; 
     634                goto set_downstream_fragment_size; 
    616635 
    617636        dataenc = get_base64_encoder(); 
     
    648667                                in[read] = 0; /* zero terminate */ 
    649668                                printf("Server switched to codec %s\n", in); 
    650                                 return 0; 
     669                                goto autodetect_max_fragsize; 
    651670                        } 
    652671                } 
     
    657676        printf("Falling back to base32\n"); 
    658677        dataenc = get_base32_encoder(); 
     678autodetect_max_fragsize: 
     679        if (autodetect_frag_size) { 
     680                printf("Autoprobing max downstream fragment size...\n"); 
     681                /* TODO */ 
     682        } 
     683set_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"); 
     717done: 
    659718        return 0; 
    660719} 
    661                  
     720 
    662721static char * 
    663722get_resolvconf_addr() 
     
    706765 
    707766        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); 
    709768        exit(2); 
    710769} 
     
    716775        printf("iodine IP over DNS tunneling client\n"); 
    717776        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); 
    719778        printf("  -v to print version info and exit\n"); 
    720779        printf("  -h to print this help and exit\n"); 
     
    724783        printf("  -d device to set tunnel device name\n"); 
    725784        printf("  -P password used for authentication (max 32 chars will be used)\n"); 
     785        printf("  -m maxfragsize, to limit size of downstream packets\n"); 
    726786        printf("nameserver is the IP number of the relaying nameserver, if absent /etc/resolv.conf is used\n"); 
    727787        printf("topdomain is the FQDN that is delegated to the tunnel endpoint.\n"); 
     
    765825        inpkt.len = 0; 
    766826 
     827        autodetect_frag_size = 1; 
     828        max_downstream_frag_size = 3072; 
     829 
    767830        b32 = get_base32_encoder(); 
    768831        dataenc = get_base32_encoder(); 
     
    776839#endif 
    777840 
    778         while ((choice = getopt(argc, argv, "vfhu:t:d:P:")) != -1) { 
     841        while ((choice = getopt(argc, argv, "vfhu:t:d:P:m:")) != -1) { 
    779842                switch(choice) { 
    780843                case 'v': 
     
    805868                        memset(optarg, 0, strlen(optarg));  
    806869                        break; 
     870                case 'm': 
     871                        autodetect_frag_size = 0; 
     872                        max_downstream_frag_size = atoi(optarg); 
     873                        break; 
    807874                default: 
    808875                        usage(); 
     
    834901        } 
    835902 
     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 
    836909        set_nameserver(nameserv_addr); 
    837910 
  • src/iodined.c

    rd4e077 r9ababc  
    378378                } 
    379379                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; 
    380399        } else if(in[0] == 'P' || in[0] == 'p') { 
    381400                int dn_seq; 
Note: See TracChangeset for help on using the changeset viewer.