From 7f73b7b7c8fa82079445512eef0aa6c9b281d5ff Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 16 Dec 2012 11:46:43 +0800 Subject: [PATCH] enable quick sort --- assets/pdnsd.conf | 3 +- assets/shadowsocks | Bin 42312 -> 42312 bytes jni/Application.mk | 2 +- jni/shadowsocks/android.h | 5 +++ jni/shadowsocks/encrypt.c | 31 ++++++++---------- jni/shadowsocks/encrypt.h | 5 ++- jni/shadowsocks/local.c | 25 +++++--------- .../shadowsocks/ShadowsocksService.java | 2 +- 8 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 jni/shadowsocks/android.h diff --git a/assets/pdnsd.conf b/assets/pdnsd.conf index 98b48792..d78ecc36 100644 --- a/assets/pdnsd.conf +++ b/assets/pdnsd.conf @@ -2,8 +2,9 @@ global { perm_cache = 2048; cache_dir = "/data/data/com.github.shadowsocks"; server_ip = 127.0.0.1; - server_port = 8053; + server_port = 8153; query_method = tcp_only; + run_ipv4 = on; min_ttl = 15m; max_ttl = 1w; timeout = 10; diff --git a/assets/shadowsocks b/assets/shadowsocks index 453daa2c70cdc63489bdf662f1ad9c747844b959..465409d3f6cae37ddb43cc5612484e46effef79c 100755 GIT binary patch delta 6622 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 + +#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "shadowsocks", __VA_ARGS__)) +#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "shadowsocks", __VA_ARGS__)) + diff --git a/jni/shadowsocks/encrypt.c b/jni/shadowsocks/encrypt.c index 107e4a48..2d6f4205 100755 --- a/jni/shadowsocks/encrypt.c +++ b/jni/shadowsocks/encrypt.c @@ -1,4 +1,5 @@ #include "encrypt.h" +#include "android.h" #include @@ -33,37 +34,31 @@ int recv_decrypt(int sock, char *buf, int len, int flags) { return result; } -inline int random_compare(unsigned char x, unsigned char y, unsigned int i, unsigned long long a) { +static int random_compare(const void *_x, const void *_y) { + unsigned int i = _i; + unsigned long long a = _a; + unsigned char x = *((unsigned char*) _x); + unsigned char y = *((unsigned char*) _y); return (a % (x + i) - a % (y + i)); } -void get_table(const unsigned char* key) { +void get_table(const char* key) { unsigned char *table = encrypt_table; unsigned char *tmp_hash; - tmp_hash = MD5((const unsigned char*)key, strlen((const char*)key), NULL); - unsigned long long a; - a = *(unsigned long long *)tmp_hash; + tmp_hash = MD5((const unsigned char*)key, strlen(key), NULL); + _a = *(unsigned long long *)tmp_hash; unsigned int i; + LOGD("key hash: %lld", _a); + for(i = 0; i < 256; ++i) { table[i] = i; } for(i = 1; i < 1024; ++i) { // use bubble sort in order to keep the array stable as in Python - int k,j; unsigned char t; - for(k = 256 - 2; k >= 0; --k) - { - for(j = 0;j <= k; ++j) - { - if(random_compare(table[j], table[j + 1], i, a) > 0) - { - t=table[j]; - table[j]=table[j + 1]; - table[j + 1]=t; - } - } - } + _i = i; + qsort(table, 256, sizeof(unsigned char), random_compare); } for(i = 0; i < 256; ++i) { // gen decrypt table from encrypt table diff --git a/jni/shadowsocks/encrypt.h b/jni/shadowsocks/encrypt.h index a4cc835e..700398d1 100755 --- a/jni/shadowsocks/encrypt.h +++ b/jni/shadowsocks/encrypt.h @@ -7,9 +7,12 @@ unsigned char encrypt_table[256]; unsigned char decrypt_table[256]; -void get_table(const unsigned char* key); +void get_table(const char* key); void encrypt(char *buf, int len); void decrypt(char *buf, int len); int send_encrypt(int sock, char *buf, int len, int flags); int recv_decrypt(int sock, char *buf, int len, int flags); +unsigned int _i; +unsigned long long _a; + diff --git a/jni/shadowsocks/local.c b/jni/shadowsocks/local.c index cc89c84f..761f5766 100644 --- a/jni/shadowsocks/local.c +++ b/jni/shadowsocks/local.c @@ -17,13 +17,10 @@ #include #include #include -#include #include "local.h" #include "encrypt.h" - -#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "shadowsocks", __VA_ARGS__)) -#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "shadowsocks", __VA_ARGS__)) +#include "android.h" #define REPLY "HTTP/1.1 200 OK\n\nhello" @@ -60,7 +57,7 @@ int create_and_bind(const char *port) { s = getaddrinfo("0.0.0.0", port, &hints, &result); if (s != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); + LOGD("getaddrinfo: %s", gai_strerror(s)); return -1; } @@ -83,7 +80,7 @@ int create_and_bind(const char *port) { } if (rp == NULL) { - fprintf(stderr, "Could not bind\n"); + LOGE("Could not bind"); return -1; } @@ -171,8 +168,8 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { return; } if (r < server->buf_len) { - // printf("r=%d\n", r); - // printf("server->buf_len=%d\n", server->buf_len); + LOGD("r=%d\n", r); + LOGD("server->buf_len=%d\n", server->buf_len); // partly sent, move memory, wait for the next time to send char *pt; for (pt = server->buf; pt < pt + min(r, BUF_SIZE); pt++) { @@ -204,7 +201,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { } while (1) { ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0); - // printf("after recv: r=%d\n", r); + /*LOGD("after recv: r=%d\n", r);*/ if (r == 0) { // connection closed server->buf_len = 0; @@ -227,7 +224,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { } decrypt(server->buf, r); int w = send(server->fd, server->buf, r, MSG_NOSIGNAL); - // printf("after send: w=%d\n", w); + /*LOGD("after send: w=%d\n", w);*/ if(w == -1) { perror("send"); if (errno == EAGAIN) { @@ -329,7 +326,6 @@ struct remote* new_remote(int fd) { remote->recv_ctx->connected = 0; remote->send_ctx->remote = remote; remote->send_ctx->connected = 0; - fprintf(stderr, "new remote\n"); return remote; } void free_remote(struct remote *remote) { @@ -340,7 +336,6 @@ void free_remote(struct remote *remote) { free(remote->recv_ctx); free(remote->send_ctx); free(remote); - fprintf(stderr, "free remote\n"); } } void close_and_free_remote(EV_P_ struct remote *remote) { @@ -363,7 +358,6 @@ struct server* new_server(int fd) { server->recv_ctx->connected = 0; server->send_ctx->server = server; server->send_ctx->connected = 0; - fprintf(stderr, "new server\n"); return server; } void free_server(struct server *server) { @@ -374,7 +368,6 @@ void free_server(struct server *server) { free(server->recv_ctx); free(server->send_ctx); free(server); - fprintf(stderr, "free server\n"); } } void close_and_free_server(EV_P_ struct server *server) { @@ -432,7 +425,7 @@ int main (int argc, char **argv) const char *server = argv[1]; const char *remote_port = argv[2]; const char *port = argv[3]; - const char *key = argv[4]; + const char *key = argv[4]; /* Our process ID and Session ID */ pid_t pid, sid; @@ -478,7 +471,7 @@ int main (int argc, char **argv) _server = strdup(server); _remote_port = strdup(remote_port); - fprintf(stderr, "calculating ciphers\n"); + LOGD("calculating ciphers"); get_table(key); int listenfd; diff --git a/src/com/github/shadowsocks/ShadowsocksService.java b/src/com/github/shadowsocks/ShadowsocksService.java index 0675e4bf..6b105964 100755 --- a/src/com/github/shadowsocks/ShadowsocksService.java +++ b/src/com/github/shadowsocks/ShadowsocksService.java @@ -95,7 +95,7 @@ public class ShadowsocksService extends Service { private static final int MSG_HOST_CHANGE = 4; private static final int MSG_STOP_SELF = 5; private static final String TAG = "ShadowsocksService"; - private final static int DNS_PORT = 8053; + private final static int DNS_PORT = 8153; private static final Class[] mStartForegroundSignature = new Class[]{ int.class, Notification.class}; private static final Class[] mStopForegroundSignature = new Class[]{boolean.class};