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 /ot_udp.c | |
parent | 1968f47d7429afbbf1b84795c8d0284c93aa5061 (diff) |
Try to act upon all udp packets at once
Diffstat (limited to 'ot_udp.c')
-rw-r--r-- | ot_udp.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -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( ) { |