diff options
author | erdgeist <> | 2012-03-31 20:01:05 +0000 |
---|---|---|
committer | erdgeist <> | 2012-03-31 20:01:05 +0000 |
commit | 1af67bab1d0286ecb777529d2b0f8bf9dc98a8b2 (patch) | |
tree | 16f9db7f8e18359ba136935e8d81662f309bb9c8 | |
parent | 1968f47d7429afbbf1b84795c8d0284c93aa5061 (diff) |
Try to act upon all udp packets at once
-rw-r--r-- | opentracker.c | 2 | ||||
-rw-r--r-- | ot_udp.c | 12 |
2 files changed, 8 insertions, 6 deletions
diff --git a/opentracker.c b/opentracker.c index 0c535ec..52078b5 100644 --- a/opentracker.c +++ b/opentracker.c | |||
@@ -266,7 +266,7 @@ static void * server_mainloop( void * args ) { | |||
266 | if( (intptr_t)cookie == FLAG_TCP ) | 266 | if( (intptr_t)cookie == FLAG_TCP ) |
267 | handle_accept( sock ); | 267 | handle_accept( sock ); |
268 | else if( (intptr_t)cookie == FLAG_UDP ) | 268 | else if( (intptr_t)cookie == FLAG_UDP ) |
269 | handle_udp6( sock, &ws ); | 269 | while( handle_udp6( sock, &ws ) ) {}; |
270 | else if( (intptr_t)cookie == FLAG_SELFPIPE ) | 270 | else if( (intptr_t)cookie == FLAG_SELFPIPE ) |
271 | io_tryread( sock, ws.inbuf, G_INBUF_SIZE ); | 271 | io_tryread( sock, ws.inbuf, G_INBUF_SIZE ); |
272 | else | 272 | else |
@@ -28,7 +28,7 @@ static void udp_make_connectionid( uint32_t * connid, const ot_ip6 remoteip ) { | |||
28 | } | 28 | } |
29 | 29 | ||
30 | /* UDP implementation according to http://xbtt.sourceforge.net/udp_tracker_protocol.html */ | 30 | /* UDP implementation according to http://xbtt.sourceforge.net/udp_tracker_protocol.html */ |
31 | void handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | 31 | int handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { |
32 | ot_ip6 remoteip; | 32 | ot_ip6 remoteip; |
33 | uint32_t *inpacket = (uint32_t*)ws->inbuf; | 33 | uint32_t *inpacket = (uint32_t*)ws->inbuf; |
34 | uint32_t *outpacket = (uint32_t*)ws->outbuf; | 34 | uint32_t *outpacket = (uint32_t*)ws->outbuf; |
@@ -37,6 +37,7 @@ void handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
37 | size_t byte_count, scrape_count; | 37 | size_t byte_count, scrape_count; |
38 | 38 | ||
39 | byte_count = socket_recv6( serversocket, ws->inbuf, G_INBUF_SIZE, remoteip, &remoteport, &scopeid ); | 39 | byte_count = socket_recv6( serversocket, ws->inbuf, G_INBUF_SIZE, remoteip, &remoteport, &scopeid ); |
40 | if( !byte_count ) return 0; | ||
40 | 41 | ||
41 | stats_issue_event( EVENT_ACCEPT, FLAG_UDP, (uintptr_t)remoteip ); | 42 | stats_issue_event( EVENT_ACCEPT, FLAG_UDP, (uintptr_t)remoteip ); |
42 | stats_issue_event( EVENT_READ, FLAG_UDP, byte_count ); | 43 | stats_issue_event( EVENT_READ, FLAG_UDP, byte_count ); |
@@ -44,16 +45,16 @@ void handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
44 | /* Initialise hash pointer */ | 45 | /* Initialise hash pointer */ |
45 | ws->hash = NULL; | 46 | ws->hash = NULL; |
46 | ws->peer_id = NULL; | 47 | ws->peer_id = NULL; |
47 | 48 | ||
48 | /* Minimum udp tracker packet size, also catches error */ | 49 | /* Minimum udp tracker packet size, also catches error */ |
49 | if( byte_count < 16 ) | 50 | if( byte_count < 16 ) |
50 | return; | 51 | return 1; |
51 | 52 | ||
52 | switch( ntohl( inpacket[2] ) ) { | 53 | switch( ntohl( inpacket[2] ) ) { |
53 | case 0: /* This is a connect action */ | 54 | case 0: /* This is a connect action */ |
54 | /* look for udp bittorrent magic id */ | 55 | /* look for udp bittorrent magic id */ |
55 | if( (ntohl(inpacket[0]) != 0x00000417) || (ntohl(inpacket[1]) != 0x27101980) ) | 56 | if( (ntohl(inpacket[0]) != 0x00000417) || (ntohl(inpacket[1]) != 0x27101980) ) |
56 | return; | 57 | return 1; |
57 | 58 | ||
58 | outpacket[0] = 0; | 59 | outpacket[0] = 0; |
59 | outpacket[1] = inpacket[3]; | 60 | outpacket[1] = inpacket[3]; |
@@ -65,7 +66,7 @@ void handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
65 | case 1: /* This is an announce action */ | 66 | case 1: /* This is an announce action */ |
66 | /* Minimum udp announce packet size */ | 67 | /* Minimum udp announce packet size */ |
67 | if( byte_count < 98 ) | 68 | if( byte_count < 98 ) |
68 | return; | 69 | return 1; |
69 | 70 | ||
70 | /* We do only want to know, if it is zero */ | 71 | /* We do only want to know, if it is zero */ |
71 | left = inpacket[64/4] | inpacket[68/4]; | 72 | left = inpacket[64/4] | inpacket[68/4]; |
@@ -116,6 +117,7 @@ void handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
116 | stats_issue_event( EVENT_SCRAPE, FLAG_UDP, scrape_count ); | 117 | stats_issue_event( EVENT_SCRAPE, FLAG_UDP, scrape_count ); |
117 | break; | 118 | break; |
118 | } | 119 | } |
120 | return 1; | ||
119 | } | 121 | } |
120 | 122 | ||
121 | void udp_init( ) { | 123 | void udp_init( ) { |