Author: kloesing Date: 2012-03-07 09:11:48 +0000 (Wed, 07 Mar 2012) New Revision: 25509
Removed: torperf/trunk/LICENSE torperf/trunk/Makefile torperf/trunk/measurements-HOWTO torperf/trunk/plot_results.R torperf/trunk/run_test.py torperf/trunk/trivsocks-client.c torperf/trunk/util.c torperf/trunk/util.h Log: Remove everything except the README pointing to the Git repo.
Deleted: torperf/trunk/LICENSE =================================================================== --- torperf/trunk/LICENSE 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/LICENSE 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,31 +0,0 @@ -Copyright (c) 2003 Roger Dingledine -Copyright (c) 2004-2007 Roger Dingledine, Nick Mathewson -Copyright (c) 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - - * Neither the names of the copyright owners nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Deleted: torperf/trunk/Makefile =================================================================== --- torperf/trunk/Makefile 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/Makefile 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,25 +0,0 @@ -### Copyright 2007 Steven J. Murdoch -### See LICENSE for licensing information -### $Id$ - -CC=gcc -Wall -Werror -ggdb -R=R CMD BATCH --vanilla -IMAGES=first-download.png first-local.png first-net.png second-download.png second-local.png second-net.png - -all: trivsocks-client - -trivsocks-client: trivsocks-client.o util.o - $(CC) -o $@ $^ - -%.o: %.c - $(CC) -c $< - -test: trivsocks-client - ./trivsocks-client -4 tor.eff.org / - ./trivsocks-client -5 tor.eff.org / - -$(IMAGES): plot_results.R - $(R) $< - -clean: - rm -f *~ *.o trivsocks-client *.png *.Rout
Deleted: torperf/trunk/measurements-HOWTO =================================================================== --- torperf/trunk/measurements-HOWTO 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/measurements-HOWTO 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,136 +0,0 @@ -Measuring Tor's performance as users experience it -================================================== - -The performance (latency and throughput) that Tor users experience depends -on numerous factors and is the subject of current research. In order to -evaluate progress in improving Tor's performance, we need to continuously -measure how fast Tor really is for our users. The primary purpose of these -measurements is to compare how performance evolves over time. This howto -uses a trivial SOCKS client to download files of various sizes over the Tor -network and write down how long substeps take. - -The following configuration parameters are used: - -- 50 KB file, downloaded every 5 minutes, timeout of 4:55 minutes, - MaxCircuitDirtiness of 1 minute, SOCKS port 9020, no entry guards -- 1 MB file, downloaded every 30 minutes, timeout of 29:55 minutes, default - MaxCircuitDirtiness of 10 minutes, SOCKS port 9021, no entry guards -- 5 MB file, downloaded every 60 minutes, timeout of 59:55 minutes, default - MaxCircuitDirtiness of 10 minutes, SOCKS port 9022, no entry guards - -Create sample files of correct sizes and make them available somewhere via -http: - -$ dd if=/dev/urandom of=.50kbfile count=1 bs=50K -$ dd if=/dev/urandom of=.1mbfile count=1 bs=1M -$ dd if=/dev/urandom of=.5mbfile count=1 bs=5M - -These files are available as http://torperf.torproject.org/.50kbfile (and -the other two file names). You may use these files, or you can use your -own files instead. - -Check out and build torperf: - -$ svn co https://svn.torproject.org/svn/torperf/trunk ~/torperf -$ cd ~/torperf -$ make - -Create data directories for the Tor clients (every download uses its own -Tor client) and write torrc files: - -$ mkdir torclient50kb -$ mkdir torclient1mb -$ mkdir torclient5mb - -$ cat <<EOF >> torclient50kb/torrc -DataDirectory . -SocksPort 9020 -MaxCircuitDirtiness 1 minute -UseEntryGuards 0 -RunAsDaemon 1 -Log notice file log -EOF - -$ cat <<EOF >> torclient1mb/torrc -DataDirectory . -SocksPort 9021 -UseEntryGuards 0 -RunAsDaemon 1 -Log notice file log -EOF - -$ cat <<EOF >> torclient5mb/torrc -DataDirectory . -SocksPort 9022 -UseEntryGuards 0 -RunAsDaemon 1 -Log notice file log -EOF - -Write a start script to start the Tor clients and execute it: - -$ cat <<EOF >> start-tors -#!/bin/bash -cd ~/torperf/torclient50kb && tor -f ~/torperf/torclient50kb/torrc -cd ~/torperf/torclient1mb && tor -f ~/torperf/torclient1mb/torrc -cd ~/torperf/torclient5mb && tor -f ~/torperf/torclient5mb/torrc -EOF - -$ chmod a+x start-tors -$ ./start-tors - -Install the timeout tool: - -$ sudo apt-get install timeout - -Add crontab entries to start the regular requests (line breaks are only for -formatting purposes here): - -$ crontab -e - -*/5 * * * * timeout -2 295 ~/torperf/trivsocks-client - torperf.torproject.org 127.0.0.1:9020 /.50kbfile >> ~/torperf/50kb.data - 2>/dev/null -2,32 * * * * timeout -2 1795 ~/torperf/trivsocks-client - torperf.torproject.org 127.0.0.1:9021 /.1mbfile >> ~/torperf/1mb.data - 2>/dev/null -8 * * * * timeout -2 3595 ~/torperf/trivsocks-client - torperf.torproject.org 127.0.0.1:9022 /.5mbfile >> ~/torperf/5mb.data - 2>/dev/null - -From now on, the three files 50kb.data, 1mb.data, and 5mb.data should -accumulate lines like this (50kb.data shown here; line breaks are only for -formatting purposes): - -1244638801 612981 - 1244638801 612991 - 1244638801 613051 - 1244638801 613126 - 1244638801 613134 - 1244638814 282441 - 1244638814 282466 - 1244638817 164531 - 1244638826 335235 - 84 51466 - -The column headers might be: - -startsec startusec - socketsec socketusec - connectsec connectusec - negotiatesec negotiateusec - requestsec requestusec - responsesec responseusec - datarequestsec datarequestusec - dataresponsesec dataresponseusec - datacompletesec datacompleteusec - writebytes readbytes - -If everything works, you might want to let your system start these Tor -clients on system startup. On Debian, this can be done using a crontab -entry, too: - -$ crontab -e - -@reboot ~/torperf/start-tors 2>/dev/null -
Deleted: torperf/trunk/plot_results.R =================================================================== --- torperf/trunk/plot_results.R 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/plot_results.R 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,143 +0,0 @@ -### Copyright 2007 Steven J. Murdoch -### See LICENSE for licensing information -### $Id$ - -UFACTOR = 1e6 - -## Subtract to timevals, maintaining precision -todelta <- function(startsec, startusec, tsec, tusec) { - tsec[tsec == 0] <- NA - dsec <- tsec - startsec - dusec <- tusec - startusec - return(dsec*UFACTOR + dusec) -} - - -parsedata <- function(filename, size) { - - filename <- paste("data/run2/", filename, sep="") - - t = read.table(filename, header=TRUE) - - tStart <- t$startsec*UFACTOR + t$startusec - dSocket <- todelta(t$startsec, t$startusec, t$socketsec, t$socketusec) - dConnect <- todelta(t$startsec, t$startusec, t$connectsec, t$connectusec) - dNegotiate <- todelta(t$startsec, t$startusec, t$negotiatesec, t$negotiateusec) - dRequest <- todelta(t$startsec, t$startusec, t$requestsec, t$requestusec) - dResponse <- todelta(t$startsec, t$startusec, t$responsesec, t$responseusec) - dDRequest <- todelta(t$startsec, t$startusec, t$datarequestsec, t$datarequestusec) - dDResponse <- todelta(t$startsec, t$startusec, t$dataresponsesec, t$dataresponseusec) - dDComplete <- todelta(t$startsec, t$startusec, t$datacompletesec, t$datacompleteusec) - cbWrite <- t$writebytes - cbRead <- t$readbytes - - results <- data.frame(tStart, dSocket, dConnect, - dNegotiate, dRequest, dResponse, - dDRequest, dDResponse, dDComplete, - cbWrite, cbRead) - - invalid <- abs(results$cbRead - size) > 64 - results[invalid,] <- NA - - return(results) -} - -plotdist <- function(data, factor, labels, title, ylim=c(NA,NA)) { - ## Scale units - if (factor == 1e6) - ylab <- "Time (s)" - else if (factor == 1e3) - ylab <- "Time (ms)" - else { - ylab <- "Time (us)" - factor <- 1 - } - - d <- na.omit(data)/factor - - ## Find plotting range - MinY<- NULL - MaxY <- NULL - - range <- 1.5 - - for (col in d) { - s <- summary(col) - Q1 <- as.vector(s[2]) - Q3 <- as.vector(s[5]) - InterQ <- Q3-Q1 - a <- Q1 - range*InterQ - b <- Q3 + range*InterQ - - if (is.null(MinY) || a<MinY) - MinY <- a - - if (is.null(MaxY) || b>MaxY) - MaxY <- b - } - - if (!is.na(ylim[1])) - MinY <- ylim[1] - - if (!is.na(ylim[2])) - MaxY <- ylim[2] - - ## Find how many points this will cause to be skipped - skipped <- vector() - for (i in (1:length(d))) { - col <- d[[i]] - isSkipped <- col<MinY | col>MaxY - d[[i]][isSkipped] <- NA - s <- length(which(isSkipped)) - ss <- paste("(",s,")",sep="") - skipped <- append(skipped, ss) - } - - labels <- mapply(paste, labels, skipped) - if (length(d)>1) - title <- paste(title, " (", length(d[[1]]), " runs)", sep="") - else - title <- paste(title, " (", length(d[[1]]), " runs, ", s, " skipped)", sep="") - - ## Plot the data - boxplot(names=labels, d, frame.plot=FALSE, ylab=ylab, range=range, - ylim=c(MinY, MaxY), xlab="Event (# points omitted)", main=title, - pars=list(show.names=TRUE, boxwex = 0.8, staplewex = 0.5, outwex = 0.5)) -} - -first <- parsedata("first-big.data", 1048869) -second <- parsedata("second-big.data", 1048868) - -EventNames <- c("start", - "socket()", "connect()", "auth", "SOCKS req", "SOCKS resp", - "HTTP req", "HTTP resp", "HTTP done") - -png("first-local.png", width=800, height=533, bg="transparent") -par(mar=c(4.3,4.1,3.1,0.1)) -plotdist(first[2:5], 1e3, EventNames[2:5], "Local events -- first request", c(0,2)) -dev.off() - -png("second-local.png", width=800, height=533, bg="transparent") -par(mar=c(4.3,4.1,5.1,0.1)) -plotdist(second[2:5], 1e3, EventNames[2:5], "Local events -- second request", c(0,2)) -dev.off() - -png("first-net.png", width=800, height=533, bg="transparent") -par(mar=c(4.3,4.1,3.1,0.1)) -plotdist(first[6:8], 1e6, EventNames[6:8], "Network events -- first request", c(0,8)) -dev.off() - -png("second-net.png", width=800, height=533, bg="transparent") -par(mar=c(4.3,4.1,5.1,0.1)) -plotdist(second[6:8], 1e6, EventNames[6:8], "Network events -- second request", c(0,8)) -dev.off() - -png("first-download.png", width=600, height=533, bg="transparent") -par(mar=c(0.3,4.1,3.1,0.1)) -plotdist(first[9], 1e6, EventNames[9], "HTTP download -- first request", c(0,150)) -dev.off() - -png("second-download.png", width=600, height=533, bg="transparent") -par(mar=c(0.3,4.1,3.1,0.1)) -plotdist(second[9], 1e6, EventNames[9], "HTTP download -- second request", c(0,150)) -dev.off()
Deleted: torperf/trunk/run_test.py =================================================================== --- torperf/trunk/run_test.py 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/run_test.py 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,65 +0,0 @@ -#!/usr/bin/python - -### Copyright 2007 Steven J. Murdoch -### See LICENSE for licensing information -### $Id$ - -import os -import time - -## Configuration - -## Files to download -bigfile1 = ## location of big file on server 1 -smallfiler2 = ## location of a small file on server 2 -bigfile2 = ## location of a big file on server 2 - -## Duration of a experiment -test_duration = 15 * 60 ## Should be > 10min to ensure circuits are not re-used - -## Duration of a sub-experiment -delay = test_duration/2 - -## Main program - -def write_header(filename): - ## Write file header - fh = file(filename, "wt") - fh.write("startsec startusec \ - socketsec socketusec \ - connectsec connectusec \ - negotiatesec negotiateusec \ - requestsec requestusec \ - responsesec responseusec \ - datarequestsec, datarequestusec \ - dataresponsesec, dataresponseusec \ - datacompletesec, datacompleteusec \ - writebytes readbytes\n") - fh.close() - -write_header("first-small.data") -write_header("first-big.data") -write_header("second-big.data") - -wait = 0 -for i in range(104): - if wait > 0: - time.sleep(wait) - - one_file = (i % 2) == 0 - if one_file: - test_type = "one file" - else: - test_type = "two files" - - print "Starting run (%s)"%test_type, i, "at", time.asctime() - - start = time.time() - if one_file: - os.system("./trivsocks-client %s %s >> first-big.data 2>/dev/null"%bigfile1) - else: - os.system("./trivsocks-client %s %s >> first-small.data 2>/dev/null"%smallfile2) - os.system("./trivsocks-client %s %s >> second-big.data 2>/dev/null"%bigfile2) - - wait = start + delay - time.time() - print "Finished run (%s)"%test_type, i, "at", time.asctime(), "waiting for %5f s"%wait
Deleted: torperf/trunk/trivsocks-client.c =================================================================== --- torperf/trunk/trivsocks-client.c 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/trivsocks-client.c 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,512 +0,0 @@ -/* Copyright 2004-2007 Roger Dingledine, Nick Mathewson */ -/* Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */ -/* See LICENSE for licensing information */ -/* $Id$ */ - -#include "util.h" - -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <assert.h> -#include <signal.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <sys/socket.h> -#include <sys/time.h> -#include <sys/types.h> -#include <errno.h> - -#define RESPONSE_LEN_4 8 -#define RESPONSE_LEN_5 4 -#define HTTP_BUF_LEN 256 -#define HTTP_READ_LEN 16 // Must be <= (HTTP_BUF_LEN - 1) - -static void usage(void) __attribute__((noreturn)); - - -/** Set *<b>out</b> to a newly allocated SOCKS4a resolve request with - * <b>username</b> and <b>hostname</b> as provided. Return the number - * of bytes in the request. */ -static int -build_socks_connect_request(char **out, - const char *username, - const char *hostname, - int reverse, - int version) -{ - size_t len = 0; - assert(out); - assert(username); - assert(hostname); - - if (version == 4) { - len = 8 + strlen(username) + 1 + strlen(hostname) + 1; - *out = malloc(len); - (*out)[0] = 4; /* SOCKS version 4 */ - (*out)[1] = '\x01'; /* Command: connect. */ - set_uint16((*out)+2, htons(80)); /* port: 80. */ - set_uint32((*out)+4, htonl(0x00000001u)); /* addr: 0.0.0.1 */ - memcpy((*out)+8, username, strlen(username)+1); - memcpy((*out)+8+strlen(username)+1, hostname, strlen(hostname)+1); - } else if (version == 5) { - int is_ip_address; - struct in_addr in; - size_t addrlen; - is_ip_address = inet_aton(hostname, &in); - if (!is_ip_address && reverse) { - fprintf(stderr,"Tried to do a reverse lookup on a non-IP!\n"); - return -1; - } - addrlen = is_ip_address ? 4 : 1 + strlen(hostname); - len = 6 + addrlen; - *out = malloc(len); - (*out)[0] = 5; /* SOCKS version 5 */ - (*out)[1] = '\x01'; /* connect. */ - (*out)[2] = 0; /* reserved. */ - (*out)[3] = is_ip_address ? 1 : 3; - if (is_ip_address) { - set_uint32((*out)+4, in.s_addr); - } else { - (*out)[4] = (char)(uint8_t)(addrlen - 1); - memcpy((*out)+5, hostname, addrlen - 1); - } - set_uint16((*out)+4+addrlen, htons(80)); /* port */ - } else { - assert(0); - } - - return len; -} - -/** Given a <b>len</b>-byte SOCKS4a response in <b>response</b>, set - * *<b>addr_out</b> to the address it contains (in host order). - * Return 0 on success, -1 on error. - */ -static int -parse_socks4a_connect_response(const char *response, size_t len, - uint32_t *addr_out) -{ - uint8_t status; - assert(response); - assert(addr_out); - - if (len < RESPONSE_LEN_4) { - fprintf(stderr, "Truncated socks response.\n"); - return -1; - } - if (((uint8_t)response[0])!=0) { /* version: 0 */ - fprintf(stderr, "Nonzero version in socks response: bad format.\n"); - return -1; - } - status = (uint8_t)response[1]; - if (get_uint16(response+2)!=0) { /* port: 0 */ - fprintf(stderr, "Nonzero port in socks response: bad format.\n"); - return -1; - } - fprintf(stderr, "Port number: %u\n", (unsigned)get_uint16(response+2)); - if (status != 90) { - fprintf(stderr, "Got status response '%u': socks request failed.\n", (unsigned)status); - return -1; - } - - *addr_out = ntohl(get_uint32(response+4)); - return 0; -} - -static int -parse_socks5_connect_response(const char *response, size_t len, int s, - uint32_t *result_addr, char **result_hostname) -{ - char reply_buf[4]; - uint16_t port; - - if (len < RESPONSE_LEN_5) { - fprintf(stderr, "Truncated socks response.\n"); - return -1; - } - if (response[0] != 5) { - fprintf(stderr, "Bad SOCKS5 reply version\n"); - return -1; - } - if (response[1] != 0) { - fprintf(stderr, "Got status response '%u': SOCKS5 request failed\n", - (unsigned)response[1]); - return -1; - } - - if (response[3] == 1) { - /* IPv4 address */ - if (read_all(s, reply_buf, 4, 1) != 4) { - fprintf(stderr,"Error reading address in socks5 response\n"); - return -1; - } - *result_addr = ntohl(get_uint32(reply_buf)); - } else if (response[3] == 3) { - size_t result_len; - if (read_all(s, reply_buf, 1, 1) != 1) { - fprintf(stderr,"Error reading address_length in socks5 response\n"); - return -1; - } - result_len = *(uint8_t*)(reply_buf); - *result_hostname = malloc(result_len+1); - if (read_all(s, *result_hostname, result_len, 1) != (int) result_len) { - fprintf(stderr,"Error reading hostname in socks5 response\n"); - return -1; - } - (*result_hostname)[result_len] = '\0'; - } - if (read_all(s, reply_buf, 2, 1) != 2) { - fprintf(stderr,"Error reading port in socks5 response\n"); - return -1; - } - port = ntohl(get_uint16(reply_buf)); - fprintf(stderr,"Port number: %u\n", (unsigned)port); - return 0; -} - -static int -do_socks5_negotiate(int s){ - char method_buf[2]; - if (write_all(s, "\x05\x01\x00", 3, 1) != 3) { - perror("sending SOCKS5 method list"); - return -1; - } - if (read_all(s, method_buf, 2, 1) != 2) { - perror("reading SOCKS5 methods"); - return -1; - } - if (method_buf[0] != '\x05') { - perror("unrecognized SOCKS version"); - return -1; - } - if (method_buf[1] != '\x00') { - perror("unrecognized socks authentication method"); - return -1; - } - return 0; -} - -int -do_http_get(int s, const char *path, const char *hostname, size_t *read_bytes, size_t *write_bytes, - struct timeval *datarequesttime, - struct timeval *dataresponsetime, - struct timeval *datacompletetime) { - char buf[HTTP_BUF_LEN]; - int len; // Length of request, not including \0 - char is_first = 1; - - len = snprintf(buf, HTTP_BUF_LEN, "GET %s HTTP/1.0\r\nPragma: no-cache\r\n" - "Host: %s\r\n\r\n", path, hostname); - - // Check for overflow or error - if (len >= HTTP_BUF_LEN || len < 0) - return -1; - - // Write the request - fprintf(stderr, "Response: %s\n", buf); - if (write_all(s, buf, len, 1) != len) - return -1; - *write_bytes = len; - // Get when request is sent - if (gettimeofday(datarequesttime, NULL)) { - perror("getting datarequesttime"); - return -1; - } - - // Half-close the socket - //if (shutdown(s, SHUT_WR)) - // return -1; - - // Default, in case no data is returned - dataresponsetime -> tv_sec = dataresponsetime -> tv_usec = 0; - - // Read the response - *read_bytes = 0; - while ((len = read_all(s, buf, HTTP_READ_LEN, 1)) > 0) { - buf[len] = '\0'; - fprintf(stderr, "Response: %s\n", buf); - *read_bytes += len; - // Get when start of response was received - if (is_first) { - is_first = 0; - if (gettimeofday(dataresponsetime, NULL)) { - perror("getting dataresponsetime"); - return -1; - } - } - } - - // Get when response is complete - if (gettimeofday(datacompletetime, NULL)) { - perror("getting datacompletetime"); - return -1; - } - - return len; -} - -static int -print_time(struct timeval t) { - return printf("%ld %ld ", t.tv_sec, t.tv_usec); -} - -// Timestamps of important events -struct timeval starttime; // Connection process started -struct timeval sockettime; // After socket is created -struct timeval connecttime; // After socket is connected -struct timeval negotiatetime; // After authentication methods are negotiated (SOCKS 5 only) -struct timeval requesttime; // After SOCKS request is sent -struct timeval responsetime; // After SOCKS response is received -struct timeval datarequesttime; // After HTTP request is written -struct timeval dataresponsetime; // After first response is received -struct timeval datacompletetime; // After payload is complete - -// Data counters of SOCKS payload -size_t read_bytes; -size_t write_bytes; - -static void -output_status_information(void) -{ - print_time(starttime); - print_time(sockettime); - print_time(connecttime); - print_time(negotiatetime); - print_time(requesttime); - print_time(responsetime); - print_time(datarequesttime); - print_time(dataresponsetime); - print_time(datacompletetime); - - printf("%lu %lu\n", (unsigned long)write_bytes, (unsigned long)read_bytes); -} - -/** Send a resolve request for <b>hostname</b> to the Tor listening on - * <b>sockshost</b>:<b>socksport</b>. Store the resulting IPv4 - * address (in host order) into *<b>result_addr</b>. - */ -static int -do_connect(const char *hostname, const char *filename, uint32_t sockshost, uint16_t socksport, - int reverse, int version, - uint32_t *result_addr, char **result_hostname) -{ - - int s; - struct sockaddr_in socksaddr; - char *req = NULL; - int len = 0; - int retval; - - assert(hostname); - assert(filename); - assert(result_addr); - assert(version == 4 || version == 5); - - *result_addr = 0; - *result_hostname = NULL; - - // Get time that connection was started - if (gettimeofday(&starttime, NULL)) { - perror("getting starttime"); - return -1; - } - - // Create the socket for connecting to SOCKS server - s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); - if (s<0) { - perror("creating socket"); - return -1; - } - // Get time that socket was created - if (gettimeofday(&sockettime, NULL)) { - perror("getting sockettime"); - return -1; - } - - // Connect to the SOCKS server - memset(&socksaddr, 0, sizeof(socksaddr)); - socksaddr.sin_family = AF_INET; - socksaddr.sin_port = htons(socksport); - socksaddr.sin_addr.s_addr = htonl(sockshost); - if (connect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) { - perror("connecting to SOCKS host"); - return -1; - } - // Get time that socket was connected - if (gettimeofday(&connecttime, NULL)) { - perror("getting connecttime"); - return -1; - } - - // Negotiate authentication method for SOCKS 5 - if (version == 5) { - retval = do_socks5_negotiate(s); - if (retval) - return retval; - } - // Get time that negotiation was completed - if (gettimeofday(&negotiatetime, NULL)) { - perror("getting negotiatetime"); - return -1; - } - - if ((len = build_socks_connect_request(&req, "", hostname, reverse, - version))<0) { - fprintf(stderr, "error generating SOCKS request: %d\n", len); - return -1; - } - if (write_all(s, req, len, 1) != len) { - perror("sending SOCKS request"); - free(req); - return -1; - } - free(req); - // Get time that request was sent - if (gettimeofday(&requesttime, NULL)) { - perror("getting requesttime"); - return -1; - } - - if (version == 4) { - char reply_buf[RESPONSE_LEN_4]; - if (read_all(s, reply_buf, RESPONSE_LEN_4, 1) != RESPONSE_LEN_4) { - fprintf(stderr, "Error reading SOCKS4 response.\n"); - return -1; - } - if (parse_socks4a_connect_response(reply_buf, RESPONSE_LEN_4, - result_addr)<0){ - return -1; - } - } else { - char reply_buf[RESPONSE_LEN_5]; - if (read_all(s, reply_buf, RESPONSE_LEN_5, 1) != RESPONSE_LEN_5) { - fprintf(stderr, "Error reading SOCKS5 response\n"); - return -1; - } - if (parse_socks5_connect_response(reply_buf, RESPONSE_LEN_5, s, - result_addr, result_hostname)<0){ - return -1; - } - } - // Get time that response was received - if (gettimeofday(&responsetime, NULL)) { - perror("getting responsetime"); - return -1; - } - - /* - char reply_buf[1]; - while (read_all(s, reply_buf, 1, 1) != 0) { - fprintf(stderr,"Extra data: 0x%x\n", reply_buf[0]); - } - */ - - // Request a file using HTTP - do_http_get(s, filename, hostname, &read_bytes, &write_bytes, - &datarequesttime, &dataresponsetime, &datacompletetime); - - // Output status information - output_status_information(); - - return 0; -} - -/** Print a usage message and exit. */ -static void -usage(void) -{ - puts("Syntax: trivsocks-client hostname [sockshost:socksport] /path/to/file"); - exit(1); -} - -static void -termination_handler(int signum) -{ - fprintf(stderr,"Received a timeout. Exiting.\n"); - output_status_information(); - - exit(1); -} - -/** Entry point to tor-resolve */ -int -main(int argc, char **argv) -{ - uint32_t sockshost; - uint16_t socksport; - int isSocks4 = 0, isVerbose = 0, isReverse = 0, force = 0; - char **arg; - int n_args; - uint32_t result = 0; - char *result_hostname = NULL; - char *hostname = NULL, *filename = NULL; - - signal(SIGINT, termination_handler); - - arg = &argv[1]; - n_args = argc-1; - - if (!n_args) - usage(); - - if (!strcmp(arg[0],"--version")) { - printf("Tor version 0.1\n"); - return 0; - } - - while (n_args && *arg[0] == '-') { - if (!strcmp("-v", arg[0])) - isVerbose = 1; - else if (!strcmp("-4", arg[0])) - isSocks4 = 1; - else if (!strcmp("-5", arg[0])) - isSocks4 = 0; - else if (!strcmp("-x", arg[0])) - isReverse = 1; - else if (!strcmp("-F", arg[0])) - force = 1; - else { - fprintf(stderr, "Unrecognized flag '%s'\n", arg[0]); - usage(); - } - ++arg; - --n_args; - } - - if (isSocks4 && isReverse) { - fprintf(stderr, "Reverse lookups not supported with SOCKS4a\n"); - usage(); - } - - if (n_args == 2) { - fprintf(stderr,"defaulting to localhost:9050\n"); - sockshost = 0x7f000001u; /* localhost */ - socksport = 9050; /* 9050 */ - hostname = arg[0]; - filename = arg[1]; - } else if (n_args == 3) { - if (parse_addr_port(0, arg[1], NULL, &sockshost, &socksport)<0) { - fprintf(stderr, "Couldn't parse/resolve address %s\n", arg[1]); - return 1; - } - if (socksport == 0) { - fprintf(stderr,"defaulting to port 9050\n"); - socksport = 9050; - } - hostname = arg[0]; - filename = arg[2]; - } else { - usage(); - } - - if (do_connect(hostname, filename, sockshost, socksport, - isReverse, isSocks4 ? 4 : 5, &result, - &result_hostname)) - return 1; - - return 0; -} -
Deleted: torperf/trunk/util.c =================================================================== --- torperf/trunk/util.c 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/util.c 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,260 +0,0 @@ -/* Copyright 2003 Roger Dingledine - * Copyright 2004-2007 Roger Dingledine, Nick Mathewson - * Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */ -/* See LICENSE for licensing information */ -/* $Id$ */ - -/** - * Utility functions (based on src/common/util.c from Tor) - */ - -#define _GNU_SOURCE - -#include "util.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <unistd.h> -#include <stdint.h> -#include <assert.h> -#include <string.h> -#include <netdb.h> -#include <stdio.h> - -#define SIZE_T_CEILING (sizeof(char)<<(sizeof(size_t)*8 - 1)) - -/** Write <b>count</b> bytes from <b>buf</b> to <b>fd</b>. <b>isSocket</b> - * must be 1 if fd was returned by socket() or accept(), and 0 if fd - * was returned by open(). Return the number of bytes written, or -1 - * on error. Only use if fd is a blocking fd. */ -int -write_all(int fd, const char *buf, size_t count, int isSocket) -{ - size_t written = 0; - int result; - - while (written != count) { - if (isSocket) - result = send(fd, buf+written, count-written, 0); - else - result = write(fd, buf+written, count-written); - if (result<0) - return -1; - written += result; - } - return count; -} - -/** Read from <b>fd</b> to <b>buf</b>, until we get <b>count</b> bytes - * or reach the end of the file. <b>isSocket</b> must be 1 if fd - * was returned by socket() or accept(), and 0 if fd was returned by - * open(). Return the number of bytes read, or -1 on error. Only use - * if fd is a blocking fd. */ -int -read_all(int fd, char *buf, size_t count, int isSocket) -{ - size_t numread = 0; - int result; - - if (count > SIZE_T_CEILING) - return -1; - - while (numread != count) { - if (isSocket) - result = recv(fd, buf+numread, count-numread, 0); - else - result = read(fd, buf+numread, count-numread); - if (result<0) - return -1; - else if (result == 0) - break; - numread += result; - } - return numread; -} - -/** - * Read a 16-bit value beginning at <b>cp</b>. Equivalent to - * *(uint16_t*)(cp), but will not cause segfaults on platforms that forbid - * unaligned memory access. - */ -uint16_t -get_uint16(const char *cp) -{ - uint16_t v; - memcpy(&v,cp,2); - return v; -} -/** - * Read a 32-bit value beginning at <b>cp</b>. Equivalent to - * *(uint32_t*)(cp), but will not cause segfaults on platforms that forbid - * unaligned memory access. - */ -uint32_t -get_uint32(const char *cp) -{ - uint32_t v; - memcpy(&v,cp,4); - return v; -} -/** - * Set a 16-bit value beginning at <b>cp</b> to <b>v</b>. Equivalent to - * *(uint16_t)(cp) = v, but will not cause segfaults on platforms that forbid - * unaligned memory access. */ -void -set_uint16(char *cp, uint16_t v) -{ - memcpy(cp,&v,2); -} -/** - * Set a 32-bit value beginning at <b>cp</b> to <b>v</b>. Equivalent to - * *(uint32_t)(cp) = v, but will not cause segfaults on platforms that forbid - * unaligned memory access. */ -void -set_uint32(char *cp, uint32_t v) -{ - memcpy(cp,&v,4); -} - -/* Helper: common code to check whether the result of a strtol or strtoul or - * strtoll is correct. */ -#define CHECK_STRTOX_RESULT() \ - /* Was at least one character converted? */ \ - if (endptr == s) \ - goto err; \ - /* Were there unexpected unconverted characters? */ \ - if (!next && *endptr) \ - goto err; \ - /* Is r within limits? */ \ - if (r < min || r > max) \ - goto err; \ - if (ok) *ok = 1; \ - if (next) *next = endptr; \ - return r; \ - err: \ - if (ok) *ok = 0; \ - if (next) *next = endptr; \ - return 0 - -/** Extract a long from the start of s, in the given numeric base. If - * there is unconverted data and next is provided, set *next to the - * first unconverted character. An error has occurred if no characters - * are converted; or if there are unconverted characters and next is NULL; or - * if the parsed value is not between min and max. When no error occurs, - * return the parsed value and set *ok (if provided) to 1. When an error - * occurs, return 0 and set *ok (if provided) to 0. - */ -long -parse_long(const char *s, int base, long min, long max, - int *ok, char **next) -{ - char *endptr; - long r; - - r = strtol(s, &endptr, base); - CHECK_STRTOX_RESULT(); -} - -/** Similar behavior to Unix gethostbyname: resolve <b>name</b>, and set - * *<b>addr</b> to the proper IP address, in host byte order. Returns 0 - * on success, -1 on failure; 1 on transient failure. - * - * (This function exists because standard windows gethostbyname - * doesn't treat raw IP addresses properly.) - */ -int -lookup_hostname(const char *name, uint32_t *addr) -{ - struct hostent *hp; - struct in_addr* myaddr; - - if ((hp = gethostbyname(name)) == NULL) - return -1; - - if (hp->h_addrtype != AF_INET) - return -1; - - myaddr = (struct in_addr*)(hp -> h_addr_list[0]); - - if (myaddr == NULL) - return -1; - - *addr = ntohl(myaddr -> s_addr); - - return 0; -} - -/** Parse a string of the form "host[:port]" from <b>addrport</b>. If - * <b>address</b> is provided, set *<b>address</b> to a copy of the - * host portion of the string. If <b>addr</b> is provided, try to - * resolve the host portion of the string and store it into - * *<b>addr</b> (in host byte order). If <b>port_out</b> is provided, - * store the port number into *<b>port_out</b>, or 0 if no port is given. - * If <b>port_out</b> is NULL, then there must be no port number in - * <b>addrport</b>. - * Return 0 on success, -1 on failure. - */ -int -parse_addr_port(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out) -{ - const char *colon; - char *_address = NULL; - int _port; - int ok = 1; - - assert(addrport); - - colon = strchr(addrport, ':'); - if (colon) { - _address = strndup(addrport, colon-addrport); - _port = (int) parse_long(colon+1,10,1,65535,NULL,NULL); - if (!_port) { - fprintf(stderr, "Port %s out of range\n", colon+1); - ok = 0; - } - if (!port_out) { - fprintf(stderr, "Port %s given on %s when not required\n", - colon+1, addrport); - ok = 0; - } - } else { - _address = strdup(addrport); - _port = 0; - } - - if (addr) { - /* There's an addr pointer, so we need to resolve the hostname. */ - if (lookup_hostname(_address,addr)) { - fprintf(stderr, "Couldn't look up %s\n", _address); - ok = 0; - *addr = 0; - } - } - - if (address && ok) { - *address = _address; - } else { - if (address) - *address = NULL; - free(_address); - } - if (port_out) - *port_out = ok ? ((uint16_t) _port) : 0; - - return ok ? 0 : -1; -} - -/** Compares the last strlen(s2) characters of s1 with s2. Returns as for - * strcasecmp. - */ -int -strcasecmpend(const char *s1, const char *s2) -{ - size_t n1 = strlen(s1), n2 = strlen(s2); - if (n2>n1) /* then they can't be the same; figure out which is bigger */ - return strcasecmp(s1,s2); - else - return strncasecmp(s1+(n1-n2), s2, n2); -} -
Deleted: torperf/trunk/util.h =================================================================== --- torperf/trunk/util.h 2012-03-06 04:28:13 UTC (rev 25508) +++ torperf/trunk/util.h 2012-03-07 09:11:48 UTC (rev 25509) @@ -1,35 +0,0 @@ -/* Copyright 2003 Roger Dingledine - * Copyright 2004-2007 Roger Dingledine, Nick Mathewson - * Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */ -/* See LICENSE for licensing information */ -/* $Id$ */ - -/** - * Utility functions (based on src/common/util.h from Tor) - */ - -#ifndef UTIL_H -#define UTIL_H - -#include <stdlib.h> -#include <stdint.h> - -#define INET_NTOA_BUF_LEN 16 /* 255.255.255.255 */ - -int write_all(int fd, const char *buf, size_t count, int isSocket); -int read_all(int fd, char *buf, size_t count, int isSocket); - -uint16_t get_uint16(const char *cp); -uint32_t get_uint32(const char *cp); -void set_uint16(char *cp, uint16_t v); -void set_uint32(char *cp, uint32_t v); - -int parse_addr_port(int severity, const char *addrport, char **address, - uint32_t *addr, uint16_t *port_out); - -long parse_long(const char *s, int base, long min, long max, - int *ok, char **next); - -int strcasecmpend(const char *s1, const char *s2); - -#endif // !UTIL_H
tor-commits@lists.torproject.org