diff options
-rw-r--r-- | ot_udp.c | 30 |
1 files changed, 28 insertions, 2 deletions
@@ -4,6 +4,7 @@ | |||
4 | /* System */ | 4 | /* System */ |
5 | #include <string.h> | 5 | #include <string.h> |
6 | #include <arpa/inet.h> | 6 | #include <arpa/inet.h> |
7 | #include <stdio.h> | ||
7 | 8 | ||
8 | /* Libowfat */ | 9 | /* Libowfat */ |
9 | #include "socket.h" | 10 | #include "socket.h" |
@@ -17,6 +18,24 @@ | |||
17 | static char static_inbuf[8192]; | 18 | static char static_inbuf[8192]; |
18 | static char static_outbuf[8192]; | 19 | static char static_outbuf[8192]; |
19 | 20 | ||
21 | static const uint8_t g_static_connid[8] = { 0x23, 0x42, 0x05, 0x17, 0xde, 0x41, 0x50, 0xff }; | ||
22 | |||
23 | static void udp_make_connectionid( uint32_t * connid, const char * remoteip ) { | ||
24 | /* Touch unused variable */ | ||
25 | remoteip = remoteip; | ||
26 | |||
27 | /* Use a static secret for now */ | ||
28 | memcpy( connid, g_static_connid, 8 ); | ||
29 | } | ||
30 | |||
31 | static int udp_test_connectionid( const uint32_t * const connid, const char * remoteip ) { | ||
32 | /* Touch unused variable */ | ||
33 | remoteip = remoteip; | ||
34 | |||
35 | /* Test against our static secret */ | ||
36 | return !memcmp( connid, g_static_connid, 8 ); | ||
37 | } | ||
38 | |||
20 | /* UDP implementation according to http://xbtt.sourceforge.net/udp_tracker_protocol.html */ | 39 | /* UDP implementation according to http://xbtt.sourceforge.net/udp_tracker_protocol.html */ |
21 | void handle_udp4( int64 serversocket ) { | 40 | void handle_udp4( int64 serversocket ) { |
22 | ot_peer peer; | 41 | ot_peer peer; |
@@ -44,8 +63,9 @@ void handle_udp4( int64 serversocket ) { | |||
44 | 63 | ||
45 | switch( ntohl( inpacket[2] ) ) { | 64 | switch( ntohl( inpacket[2] ) ) { |
46 | case 0: /* This is a connect action */ | 65 | case 0: /* This is a connect action */ |
47 | outpacket[0] = 0; outpacket[1] = inpacket[3]; | 66 | outpacket[0] = 0; |
48 | outpacket[2] = inpacket[0]; outpacket[3] = inpacket[1]; | 67 | outpacket[1] = inpacket[3]; |
68 | udp_make_connectionid( outpacket + 2, remoteip ); | ||
49 | socket_send4( serversocket, static_outbuf, 16, remoteip, remoteport ); | 69 | socket_send4( serversocket, static_outbuf, 16, remoteip, remoteport ); |
50 | stats_issue_event( EVENT_CONNECT, 0, 16 ); | 70 | stats_issue_event( EVENT_CONNECT, 0, 16 ); |
51 | break; | 71 | break; |
@@ -54,6 +74,9 @@ void handle_udp4( int64 serversocket ) { | |||
54 | if( r < 98 ) | 74 | if( r < 98 ) |
55 | return; | 75 | return; |
56 | 76 | ||
77 | if( !udp_test_connectionid( inpacket, remoteip )) | ||
78 | fprintf( stderr, "UDP Connection id missmatch\n" ); | ||
79 | |||
57 | numwant = 200; | 80 | numwant = 200; |
58 | /* We do only want to know, if it is zero */ | 81 | /* We do only want to know, if it is zero */ |
59 | left = inpacket[64/4] | inpacket[68/4]; | 82 | left = inpacket[64/4] | inpacket[68/4]; |
@@ -93,6 +116,9 @@ void handle_udp4( int64 serversocket ) { | |||
93 | break; | 116 | break; |
94 | 117 | ||
95 | case 2: /* This is a scrape action */ | 118 | case 2: /* This is a scrape action */ |
119 | if( !udp_test_connectionid( inpacket, remoteip )) | ||
120 | fprintf( stderr, "UDP Connection id missmatch\n" ); | ||
121 | |||
96 | outpacket[0] = htonl( 2 ); /* scrape action */ | 122 | outpacket[0] = htonl( 2 ); /* scrape action */ |
97 | outpacket[1] = inpacket[12/4]; | 123 | outpacket[1] = inpacket[12/4]; |
98 | 124 | ||