Changeset bd1a84 for src/iodine.c


Ignore:
Timestamp:
01/10/09 20:30:55 (4 years ago)
Author:
Erik Ekman <yarrick@…>
Branches:
master
Children:
78d324
Parents:
df93da
git-author:
Erik Ekman <yarrick@…> (01/10/09 20:30:55)
git-committer:
Erik Ekman <erik@…> (02/04/12 20:33:59)
Message:

#7 finally done\! Added autoprobing of max downstream fragsize.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/iodine.c

    r2bccb3 rbd1a84  
    411411 
    412412static void 
     413send_fragsize_probe(int fd, int fragsize) 
     414{ 
     415        char probedata[256]; 
     416        char buf[4096]; 
     417 
     418        /* build a large query domain which is random and maximum size */ 
     419        memset(probedata, MIN(1, rand_seed & 0xff), sizeof(probedata)); 
     420        probedata[1] = MIN(1, (rand_seed >> 8) & 0xff); 
     421        rand_seed++; 
     422        build_hostname(buf + 4, sizeof(buf) - 4, probedata, sizeof(probedata), topdomain, dataenc); 
     423 
     424        fragsize &= 2047; 
     425 
     426        buf[0] = 'r'; /* Probe downstream fragsize packet */ 
     427        buf[1] = b32_5to8((userid << 1) | (fragsize & 1024)); 
     428        buf[2] = b32_5to8((fragsize >> 5) & 31); 
     429        buf[3] = b32_5to8(fragsize & 31); 
     430 
     431        send_query(fd, buf); 
     432} 
     433 
     434static void 
    413435send_set_downstream_fragsize(int fd, int fragsize) 
    414436{ 
     
    678700autodetect_max_fragsize: 
    679701        if (autodetect_frag_size) { 
    680                 printf("Autoprobing max downstream fragment size...\n"); 
    681                 /* TODO */ 
     702                int proposed_fragsize = 768; 
     703                int range = 768; 
     704                max_downstream_frag_size = 0; 
     705                printf("Autoprobing max downstream fragment size... (skip with -m fragsize)\n");  
     706                while (range >= 8 || !max_downstream_frag_size) { 
     707                        for (i=0; running && i<3 ;i++) { 
     708                                tv.tv_sec = 1; 
     709                                tv.tv_usec = 0; 
     710                                send_fragsize_probe(dns_fd, proposed_fragsize); 
     711 
     712                                FD_ZERO(&fds); 
     713                                FD_SET(dns_fd, &fds); 
     714 
     715                                r = select(dns_fd + 1, &fds, NULL, NULL, &tv); 
     716 
     717                                if(r > 0) { 
     718                                        read = read_dns(dns_fd, in, sizeof(in)); 
     719                                         
     720                                        if (read > 0) { 
     721                                                /* We got a reply */ 
     722                                                int acked_fragsize = ((in[0] & 0xff) << 8) | (in[1] & 0xff); 
     723                                                if (acked_fragsize == proposed_fragsize) { 
     724                                                        printf("%d ok.. ", acked_fragsize); 
     725                                                        fflush(stdout); 
     726                                                        max_downstream_frag_size = acked_fragsize; 
     727                                                        range >>= 1; 
     728                                                        proposed_fragsize += range; 
     729                                                        continue; 
     730                                                } 
     731                                        } 
     732                                } 
     733                        } 
     734                        printf("%d not ok.. ", proposed_fragsize); 
     735                        fflush(stdout); 
     736                        range >>= 1; 
     737                        proposed_fragsize -= range; 
     738                } 
     739                printf("will use %d\n", max_downstream_frag_size); 
    682740        } 
    683741        printf("Setting downstream fragment size to max %d...\n", max_downstream_frag_size); 
Note: See TracChangeset for help on using the changeset viewer.