19 |
|
|
20 |
open Printf2 |
open Printf2 |
21 |
open Md4 |
open Md4 |
22 |
|
open AnyEndian |
|
open AnyEndian |
|
|
|
|
23 |
open BasicSocket |
open BasicSocket |
24 |
open CommonOptions |
open CommonOptions |
25 |
open Options |
open Options |
28 |
open LittleEndian |
open LittleEndian |
29 |
open CommonGlobals |
open CommonGlobals |
30 |
open DonkeyMftp |
open DonkeyMftp |
31 |
open DonkeyOvernet |
open DonkeyOvernet |
32 |
|
|
33 |
module Proto = struct |
module Proto = struct |
34 |
|
|
35 |
let names_of_tag = file_common_tags |
let names_of_tag = file_common_tags |
36 |
|
|
37 |
let buf_peer buf p = |
let buf_peer buf p = |
38 |
buf_md4 buf p.peer_md4; |
buf_md4 buf p.peer_md4; |
39 |
buf_ip buf p.peer_ip; |
buf_ip buf p.peer_ip; |
40 |
buf_int16 buf p.peer_port; |
buf_int16 buf p.peer_port; |
41 |
buf_int8 buf p.peer_kind |
buf_int8 buf p.peer_kind |
42 |
|
|
43 |
let get_peer s pos = |
let get_peer s pos = |
44 |
let md4 = get_md4 s pos in |
let md4 = get_md4 s pos in |
45 |
let ip = get_ip s (pos+16) in |
let ip = get_ip s (pos+16) in |
46 |
let port = get_int16 s (pos+20) in |
let port = get_int16 s (pos+20) in |
54 |
peer_last_recv = 0; |
peer_last_recv = 0; |
55 |
peer_last_send = 0; |
peer_last_send = 0; |
56 |
}, pos + 23 |
}, pos + 23 |
57 |
|
|
|
|
|
58 |
let write buf t = |
let write buf t = |
59 |
match t with |
match t with |
60 |
| OvernetConnect p -> |
| OvernetConnect p -> |
63 |
buf_ip buf p.peer_ip; |
buf_ip buf p.peer_ip; |
64 |
buf_int16 buf p.peer_port; |
buf_int16 buf p.peer_port; |
65 |
buf_int8 buf p.peer_kind |
buf_int8 buf p.peer_kind |
66 |
|
|
67 |
| OvernetConnectReply peers -> |
| OvernetConnectReply peers -> |
68 |
buf_int8 buf 11; |
buf_int8 buf 11; |
69 |
buf_list16 buf_peer buf peers |
buf_list16 buf_peer buf peers |
70 |
|
|
71 |
| OvernetPublicize p -> |
| OvernetPublicize p -> |
72 |
buf_int8 buf 12; |
buf_int8 buf 12; |
73 |
buf_md4 buf p.peer_md4; |
buf_md4 buf p.peer_md4; |
74 |
buf_ip buf p.peer_ip; |
buf_ip buf p.peer_ip; |
75 |
buf_int16 buf p.peer_port; |
buf_int16 buf p.peer_port; |
76 |
buf_int8 buf p.peer_kind |
buf_int8 buf p.peer_kind |
77 |
|
|
78 |
| OvernetPublicized p -> |
| OvernetPublicized p -> |
79 |
buf_int8 buf 13 |
buf_int8 buf 13 |
80 |
|
|
81 |
| OvernetSearch (kind, md4, _) -> |
| OvernetSearch (kind, md4, _) -> |
82 |
buf_int8 buf 14; |
buf_int8 buf 14; |
83 |
buf_int8 buf kind; |
buf_int8 buf kind; |
84 |
buf_md4 buf md4 |
buf_md4 buf md4 |
85 |
|
|
86 |
| OvernetSearchReply (md4, peers) -> |
| OvernetSearchReply (md4, peers) -> |
87 |
buf_int8 buf 15; |
buf_int8 buf 15; |
88 |
buf_md4 buf md4; |
buf_md4 buf md4; |
89 |
buf_list8 buf_peer buf peers |
buf_list8 buf_peer buf peers |
90 |
|
|
91 |
| OvernetGetSearchResults (md4, kind, min, max) -> |
| OvernetGetSearchResults (md4, kind, min, max) -> |
92 |
buf_int8 buf 16; |
buf_int8 buf 16; |
93 |
buf_md4 buf md4; |
buf_md4 buf md4; |
95 |
(* buf_int8 buf kind; *) |
(* buf_int8 buf kind; *) |
96 |
buf_int16 buf min; |
buf_int16 buf min; |
97 |
buf_int16 buf max |
buf_int16 buf max |
98 |
|
|
99 |
| OvernetSearchFilesResults (md4, [r_md4, r_tags]) -> |
| OvernetSearchFilesResults (md4, [r_md4, r_tags]) -> |
100 |
buf_int8 buf 17; |
buf_int8 buf 17; |
101 |
buf_md4 buf md4; |
buf_md4 buf md4; |
102 |
buf_md4 buf r_md4; |
buf_md4 buf r_md4; |
103 |
buf_tags buf r_tags names_of_tag |
buf_tags buf r_tags names_of_tag |
104 |
|
|
105 |
| OvernetSearchSourcesResults (md4, [p]) -> |
| OvernetSearchSourcesResults (md4, [p]) -> |
106 |
(* buf_int8 buf 17; |
(* buf_int8 buf 17; |
107 |
buf_md4 buf md4; |
buf_md4 buf md4; |
108 |
buf_md4 buf r_md4; |
buf_md4 buf r_md4; |
109 |
buf_tags buf r_tags names_of_tag |
buf_tags buf r_tags names_of_tag |
110 |
*) () |
*) () |
111 |
|
|
112 |
| OvernetNoResult md4 -> |
| OvernetNoResult md4 -> |
113 |
buf_int8 buf 18; |
buf_int8 buf 18; |
114 |
buf_md4 buf md4 |
buf_md4 buf md4 |
115 |
|
|
116 |
| OvernetPublishFiles (md4, [r_md4, r_tags]) -> |
| OvernetPublishFiles (md4, [r_md4, r_tags]) -> |
117 |
buf_int8 buf 19; |
buf_int8 buf 19; |
118 |
buf_md4 buf md4; |
buf_md4 buf md4; |
126 |
buf_md4 buf p.peer_md4; |
buf_md4 buf p.peer_md4; |
127 |
buf_tags buf r_tags names_of_tag |
buf_tags buf r_tags names_of_tag |
128 |
*) |
*) |
129 |
|
|
130 |
| OvernetPublished md4 -> |
| OvernetPublished md4 -> |
131 |
buf_int8 buf 20; |
buf_int8 buf 20; |
132 |
buf_md4 buf md4 |
buf_md4 buf md4 |
133 |
|
|
134 |
| OvernetGetMyIP port -> |
| OvernetGetMyIP port -> |
135 |
buf_int8 buf 27; |
buf_int8 buf 27; |
136 |
buf_int16 buf port |
buf_int16 buf port |
137 |
|
|
138 |
| OvernetGetMyIPResult (ip) -> |
| OvernetGetMyIPResult (ip) -> |
139 |
buf_int8 buf 28; |
buf_int8 buf 28; |
140 |
buf_ip buf ip |
buf_ip buf ip |
141 |
|
|
142 |
| OvernetGetMyIPDone -> |
| OvernetGetMyIPDone -> |
143 |
buf_int8 buf 29 |
buf_int8 buf 29 |
144 |
|
|
145 |
| OvernetFirewallConnection(md4,port) -> |
| OvernetFirewallConnection(md4,port) -> |
146 |
buf_int8 buf 24; |
buf_int8 buf 24; |
147 |
buf_md4 buf md4; |
buf_md4 buf md4; |
148 |
buf_int16 buf port |
buf_int16 buf port |
149 |
|
|
150 |
| OvernetFirewallConnectionACK(md4) -> |
| OvernetFirewallConnectionACK(md4) -> |
151 |
buf_int8 buf 25; |
buf_int8 buf 25; |
152 |
buf_md4 buf md4 |
buf_md4 buf md4 |
153 |
|
|
154 |
| OvernetFirewallConnectionNACK(md4) -> |
| OvernetFirewallConnectionNACK(md4) -> |
155 |
buf_int8 buf 26; |
buf_int8 buf 26; |
156 |
buf_md4 buf md4 |
buf_md4 buf md4 |
157 |
|
|
158 |
| OvernetPeerNotFound peer -> |
| OvernetPeerNotFound peer -> |
159 |
buf_int8 buf 33; |
buf_int8 buf 33; |
160 |
buf_peer buf peer |
buf_peer buf peer |
161 |
|
|
162 |
| OvernetUnknown21 peer -> |
| OvernetUnknown21 peer -> |
163 |
buf_int8 buf 21; |
buf_int8 buf 21; |
164 |
buf_peer buf peer |
buf_peer buf peer |
165 |
|
|
166 |
| OvernetUnknown (opcode, s) -> |
| OvernetUnknown (opcode, s) -> |
167 |
buf_int8 buf opcode; |
buf_int8 buf opcode; |
168 |
Buffer.add_string buf s |
Buffer.add_string buf s |
171 |
| OvernetPublishSources _ |
| OvernetPublishSources _ |
172 |
| OvernetSearchSourcesResults _ -> |
| OvernetSearchSourcesResults _ -> |
173 |
raise MessageNotImplemented |
raise MessageNotImplemented |
174 |
|
|
175 |
let get_peer_from_result ip port r_md4 r_tags = |
let get_peer_from_result ip port r_md4 r_tags = |
176 |
let peer_ip = ref ip in |
let peer_ip = ref ip in |
177 |
let peer_udpport = ref port in |
let peer_udpport = ref port in |
184 |
if !verbose_overnet then |
if !verbose_overnet then |
185 |
lprintf_nl "loc tag : [%s]" bcp; |
lprintf_nl "loc tag : [%s]" bcp; |
186 |
if String2.starts_with bcp "bcp://" then |
if String2.starts_with bcp "bcp://" then |
187 |
let bcp2 = String.sub bcp 6 (String.length bcp - 6) |
let bcp2 = String.sub bcp 6 (String.length bcp - 6) |
188 |
in |
in |
189 |
match String2.split_simplify bcp2 ':' with |
match String2.split_simplify bcp2 ':' with |
190 |
| [_;ip;port] -> |
| [_;ip;port] -> |
191 |
if !verbose_overnet then |
if !verbose_overnet then |
192 |
lprintf_nl "FIXME: Received BCP type 2 %s" |
lprintf_nl "[Overnet] Received BCP type 2 %s" |
193 |
bcp; |
bcp; |
194 |
|
|
195 |
(* FIXME: A firewalled peer... |
(* FIXME: A firewalled peer... |
196 |
peer_ip := Ip.of_string ip; |
peer_ip := Ip.of_string ip; |
197 |
peer_tcpport := int_of_string port; |
peer_tcpport := int_of_string port; |
198 |
*) |
*) |
199 |
|
|
200 |
| [ip;port] -> |
| [ip;port] -> |
201 |
peer_ip := Ip.of_string ip; |
peer_ip := Ip.of_string ip; |
202 |
peer_tcpport := int_of_string port; |
peer_tcpport := int_of_string port; |
203 |
| _ -> |
| _ -> |
204 |
if !verbose_overnet then |
if !verbose_overnet then |
205 |
lprintf_nl "Ill formed bcp: [%s]" bcp; |
lprintf_nl "[Overnet] Ill formed bcp: [%s]" bcp; |
206 |
else |
else |
207 |
if !verbose_overnet then |
if !verbose_overnet then |
208 |
lprintf "Ill formed bcp: [%s]" bcp; |
lprintf "[Overnet] Ill formed bcp: [%s]" bcp; |
209 |
) |
) |
210 |
| _ -> |
| _ -> |
211 |
if !verbose_overnet then |
if !verbose_unknown_messages then |
212 |
lprintf_nl "Unused source tag [%s]" |
lprintf_nl "[Overnet] Unused source tag [%s]" |
213 |
(escaped_string_of_field tag) |
(escaped_string_of_field tag) |
214 |
) r_tags; |
) r_tags; |
215 |
{ |
{ |
221 |
peer_last_send = 0; |
peer_last_send = 0; |
222 |
peer_kind = !peer_kind; |
peer_kind = !peer_kind; |
223 |
} |
} |
224 |
|
|
225 |
let parse ip port opcode s = |
let parse ip port opcode s = |
226 |
try |
try |
227 |
match opcode with |
match opcode with |
228 |
| 10 -> |
| 10 -> |
229 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
230 |
let ip = get_ip s 16 in |
let ip = get_ip s 16 in |
231 |
let port = get_int16 s 20 in |
let port = get_int16 s 20 in |
239 |
peer_last_recv = 0; |
peer_last_recv = 0; |
240 |
peer_last_send = 0; |
peer_last_send = 0; |
241 |
} |
} |
242 |
| 11 -> |
| 11 -> |
243 |
let peers, pos = get_list16 get_peer s 0 in |
let peers, pos = get_list16 get_peer s 0 in |
244 |
OvernetConnectReply peers |
OvernetConnectReply peers |
245 |
| 12 -> |
| 12 -> |
246 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
247 |
let ip = get_ip s 16 in |
let ip = get_ip s 16 in |
248 |
let port = get_int16 s 20 in |
let port = get_int16 s 20 in |
258 |
} |
} |
259 |
| 13 -> |
| 13 -> |
260 |
OvernetPublicized None |
OvernetPublicized None |
261 |
| 14 -> |
| 14 -> |
262 |
let kind = get_uint8 s 0 in |
let kind = get_uint8 s 0 in |
263 |
let md4 = get_md4 s 1 in |
let md4 = get_md4 s 1 in |
264 |
OvernetSearch (kind, md4, None) |
OvernetSearch (kind, md4, None) |
265 |
|
| 15 -> |
|
| 15 -> |
|
266 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
267 |
let peers, pos = get_list8 get_peer s 16 in |
let peers, pos = get_list8 get_peer s 16 in |
268 |
OvernetSearchReply (md4, peers) |
OvernetSearchReply (md4, peers) |
|
|
|
269 |
| 16 -> |
| 16 -> |
270 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
271 |
let kind = get_uint8 s 16 in |
let kind = get_uint8 s 16 in |
272 |
let min = get_int16 s 17 in |
let min = get_int16 s 17 in |
273 |
let max = get_int16 s 19 in |
let max = get_int16 s 19 in |
274 |
OvernetGetSearchResults (md4, Search_for_kind kind, min, max) |
OvernetGetSearchResults (md4, Search_for_kind kind, min, max) |
|
|
|
275 |
| 17 -> |
| 17 -> |
276 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
277 |
let r_md4 = get_md4 s 16 in |
let r_md4 = get_md4 s 16 in |
278 |
let r_tags, pos = get_tags s 32 names_of_tag in |
let r_tags, pos = get_tags s 32 names_of_tag in |
|
|
|
279 |
let sources = ref false in |
let sources = ref false in |
280 |
List.iter (fun tag -> |
List.iter (fun tag -> |
281 |
if tag.tag_name = Field_UNKNOWN "loc" then sources := true; |
if tag.tag_name = Field_UNKNOWN "loc" then sources := true; |
282 |
) r_tags; |
) r_tags; |
283 |
if !sources then |
if !sources then |
284 |
let peer = get_peer_from_result ip port r_md4 r_tags in |
let peer = get_peer_from_result ip port r_md4 r_tags in |
|
|
|
285 |
OvernetSearchSourcesResults (md4, [peer]) |
OvernetSearchSourcesResults (md4, [peer]) |
286 |
else |
else |
287 |
OvernetSearchFilesResults (md4, [r_md4, r_tags]) |
OvernetSearchFilesResults (md4, [r_md4, r_tags]) |
|
|
|
288 |
| 18 -> |
| 18 -> |
289 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
290 |
OvernetNoResult md4 |
OvernetNoResult md4 |
|
|
|
291 |
| 19 -> |
| 19 -> |
292 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
293 |
let r_md4 = get_md4 s 16 in |
let r_md4 = get_md4 s 16 in |
294 |
let r_tags, pos = get_tags s 32 names_of_tag in |
let r_tags, pos = get_tags s 32 names_of_tag in |
|
|
|
295 |
let sources = ref false in |
let sources = ref false in |
296 |
List.iter (fun tag -> |
List.iter (fun tag -> |
297 |
if tag.tag_name = Field_UNKNOWN "loc" then sources := true; |
if tag.tag_name = Field_UNKNOWN "loc" then sources := true; |
298 |
) r_tags; |
) r_tags; |
299 |
if !sources then |
if !sources then |
300 |
let peer = get_peer_from_result ip port r_md4 r_tags in |
let peer = get_peer_from_result ip port r_md4 r_tags in |
|
|
|
301 |
OvernetPublishSources (md4, [peer]) |
OvernetPublishSources (md4, [peer]) |
302 |
else |
else |
303 |
OvernetPublishFiles (md4, [r_md4, r_tags]) |
OvernetPublishFiles (md4, [r_md4, r_tags]) |
|
|
|
304 |
| 20 -> |
| 20 -> |
305 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
306 |
OvernetPublished md4 |
OvernetPublished md4 |
|
|
|
307 |
| 21 -> |
| 21 -> |
308 |
(* idem as 33, but IP seem to be a low ID *) |
(* idem as 33, but IP seem to be a low ID *) |
309 |
if !verbose_overnet then begin |
if !verbose_overnet then begin |
311 |
dump s; |
dump s; |
312 |
lprint_newline (); |
lprint_newline (); |
313 |
end; |
end; |
|
|
|
314 |
let peer, _ = get_peer s 0 in |
let peer, _ = get_peer s 0 in |
315 |
OvernetUnknown21 peer |
OvernetUnknown21 peer |
|
|
|
316 |
| 24 -> |
| 24 -> |
317 |
if !verbose_overnet then |
if !verbose_overnet then |
318 |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION (24)"; |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION (24)"; |
319 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
320 |
let port = get_int16 s 16 in |
let port = get_int16 s 16 in |
321 |
OvernetFirewallConnection(md4,port) |
OvernetFirewallConnection(md4,port) |
|
|
|
322 |
| 25 -> |
| 25 -> |
323 |
if !verbose_overnet then |
if !verbose_overnet then |
324 |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION ACK (25)"; |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION ACK (25)"; |
325 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
326 |
OvernetFirewallConnectionACK(md4) |
OvernetFirewallConnectionACK(md4) |
|
|
|
327 |
| 26 -> |
| 26 -> |
328 |
if !verbose_overnet then |
if !verbose_overnet then |
329 |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION NACK (26)"; |
lprintf_nl "RCVD: OVERNET FIREWALL CONNECTION NACK (26)"; |
330 |
let md4 = get_md4 s 0 in |
let md4 = get_md4 s 0 in |
331 |
OvernetFirewallConnectionNACK(md4) |
OvernetFirewallConnectionNACK(md4) |
|
|
|
332 |
| 27 -> |
| 27 -> |
333 |
if !verbose_overnet then |
if !verbose_overnet then |
334 |
lprintf_nl "RCVD: GETMYIP MESSAGE (27)"; |
lprintf_nl "RCVD: GETMYIP MESSAGE (27)"; |
335 |
OvernetGetMyIP (get_int16 s 0) |
OvernetGetMyIP (get_int16 s 0) |
336 |
| 28 -> |
| 28 -> |
337 |
if !verbose_overnet then |
if !verbose_overnet then |
338 |
lprintf_nl "RCVD: GETMYIPRESULT MESSAGE (28)"; |
lprintf_nl "RCVD: GETMYIPRESULT MESSAGE (28)"; |
339 |
let ip = get_ip s 0 in |
let ip = get_ip s 0 in |
340 |
OvernetGetMyIPResult (ip) |
OvernetGetMyIPResult (ip) |
341 |
| 29 -> |
| 29 -> |
342 |
if !verbose_overnet then |
if !verbose_overnet then |
343 |
lprintf_nl "RCVD: GETMYIPDONE MESSAGE (29)"; |
lprintf_nl "RCVD: GETMYIPDONE MESSAGE (29)"; |
344 |
OvernetGetMyIPDone |
OvernetGetMyIPDone |
|
|
|
345 |
| 33 -> |
| 33 -> |
346 |
if !verbose_overnet then |
if !verbose_overnet then |
347 |
lprintf_nl "RCVD: PEER NOT FOUND (33)"; |
lprintf_nl "RCVD: PEER NOT FOUND (33)"; |
348 |
let peer, _ = get_peer s 0 in |
let peer, _ = get_peer s 0 in |
349 |
OvernetPeerNotFound peer |
OvernetPeerNotFound peer |
|
|
|
350 |
| _ -> |
| _ -> |
351 |
if !verbose_unknown_messages then |
if !verbose_unknown_messages then |
352 |
begin |
begin |
353 |
lprintf_nl "UNKNOWN: opcode %d" opcode; |
lprintf_nl "[Overnet] unknown opcode %d" opcode; |
354 |
dump s; |
dump s; |
355 |
lprint_newline (); |
lprint_newline (); |
356 |
end; |
end; |
363 |
lprint_newline (); |
lprint_newline (); |
364 |
end; |
end; |
365 |
OvernetUnknown (opcode, s) |
OvernetUnknown (opcode, s) |
366 |
|
|
367 |
let udp_handler f sock event = |
let udp_handler f sock event = |
368 |
match event with |
match event with |
369 |
UdpSocket.READ_DONE -> |
UdpSocket.READ_DONE -> |
370 |
UdpSocket.read_packets sock (fun p -> |
UdpSocket.read_packets sock (fun p -> |
371 |
try |
try |
372 |
let pbuf = p.UdpSocket.udp_content in |
let pbuf = p.UdpSocket.udp_content in |
373 |
let len = String.length pbuf in |
let len = String.length pbuf in |
374 |
if len < 2 || |
if len < 2 || |
375 |
int_of_char pbuf.[0] <> 227 then |
int_of_char pbuf.[0] <> 227 then |
376 |
begin |
begin |
377 |
if !verbose_unknown_messages then begin |
if !verbose_unknown_messages then begin |
378 |
lprintf_nl "Received unknown UDP packet"; |
lprintf_nl "[Overnet] Received unknown UDP packet"; |
379 |
dump pbuf; |
dump pbuf; |
380 |
end |
end |
381 |
end |
end |
382 |
else |
else |
383 |
begin |
begin |
384 |
let (ip, port) = |
let (ip, port) = |
385 |
match p.UdpSocket.udp_addr with |
match p.UdpSocket.udp_addr with |
387 |
Ip.of_inet_addr inet, port |
Ip.of_inet_addr inet, port |
388 |
| _ -> assert false |
| _ -> assert false |
389 |
in |
in |
390 |
|
|
391 |
let t = parse ip port (int_of_char pbuf.[1]) (String.sub pbuf 2 (len-2)) in |
let t = parse ip port (int_of_char pbuf.[1]) (String.sub pbuf 2 (len-2)) in |
392 |
f t p |
f t p |
393 |
end |
end |
394 |
with e -> |
with e -> |
395 |
if !verbose_hidden_errors then begin |
if !verbose_unknown_messages then begin |
396 |
lprintf_nl "Error %s in udp_handler, dump of packet:" |
lprintf_nl "[Overnet] Error %s in udp_handler, dump of packet:" |
397 |
(Printexc2.to_string e); |
(Printexc2.to_string e); |
398 |
dump p.UdpSocket.udp_content; |
dump p.UdpSocket.udp_content; |
399 |
lprint_newline () |
lprint_newline () |
400 |
end |
end |
401 |
); |
); |
402 |
| _ -> () |
| _ -> () |
403 |
|
|
404 |
let redirector_section = "DKKO" |
let redirector_section = "DKKO" |
405 |
let options_section_name = overnet_options_section_name |
let options_section_name = overnet_options_section_name |
406 |
let overnet_section = overnet_section |
let overnet_section = overnet_section |
407 |
let overnet_port = overnet_port |
let overnet_port = overnet_port |
408 |
let overnet_tcpport = overnet_port |
let overnet_tcpport = overnet_port |
409 |
|
|
410 |
let udp_buf = Buffer.create 2000 |
let udp_buf = Buffer.create 2000 |
411 |
|
|
412 |
let udp_send sock ip port ping msg = |
let udp_send sock ip port ping msg = |
415 |
buf_int8 udp_buf 227; |
buf_int8 udp_buf 227; |
416 |
write udp_buf msg; |
write udp_buf msg; |
417 |
let s = Buffer.contents udp_buf in |
let s = Buffer.contents udp_buf in |
418 |
if !verbose_overnet then |
if !verbose_overnet then |
419 |
begin |
begin |
420 |
lprintf_nl "Sending UDP to %s:%d (0x%02X)" |
lprintf_nl "Sending UDP to %s:%d (0x%02X)" |
421 |
(Ip.to_string ip) port (get_uint8 s 1); |
(Ip.to_string ip) port (get_uint8 s 1); |
422 |
lprintf_nl " %s" (message_to_string msg) |
lprintf_nl " %s" (message_to_string msg) |
431 |
match msg with |
match msg with |
432 |
| OvernetSearchFilesResults (target, ((_ :: _ :: _) as results)) -> |
| OvernetSearchFilesResults (target, ((_ :: _ :: _) as results)) -> |
433 |
List.iter (fun r -> |
List.iter (fun r -> |
434 |
udp_send sock ip port ping |
udp_send sock ip port ping |
435 |
(OvernetSearchFilesResults (target, [r])) |
(OvernetSearchFilesResults (target, [r])) |
436 |
) results |
) results |
437 |
| OvernetSearchSourcesResults (target, ((_ :: _ :: _) as results)) -> |
| OvernetSearchSourcesResults (target, ((_ :: _ :: _) as results)) -> |
450 |
(OvernetPublishSources (target, [r])) |
(OvernetPublishSources (target, [r])) |
451 |
) results |
) results |
452 |
| _ -> udp_send sock ip port ping msg |
| _ -> udp_send sock ip port ping msg |
453 |
|
|
454 |
let enable_overnet = enable_overnet |
let enable_overnet = enable_overnet |
455 |
let command_prefix = "ov_" |
let command_prefix = "ov_" |
456 |
let source_brand = true |
let source_brand = true |
457 |
let web_info = "ocl" |
let web_info = "ocl" |
458 |
end |
end |
459 |
|
|
460 |
module Overnet_initial = Make(Proto) |
module Overnet_initial = Make(Proto) |
461 |
|
|
462 |
let overnet_protocol_connect_version = |
let overnet_protocol_connect_version = |
463 |
define_option overnet_section [ |
define_option overnet_section [ |
464 |
Proto.options_section_name; |
Proto.options_section_name; |
465 |
"protocol_connect_version"] |
"protocol_connect_version"] |
466 |
"The protocol version sent on Overnet connections" |
"The protocol version sent on Overnet connections" |
467 |
int_option 1044 |
int_option 1044 |
468 |
|
|
469 |
let overnet_protocol_connectreply_version = |
let overnet_protocol_connectreply_version = |
470 |
define_option overnet_section [Proto.options_section_name; "protocol_connectreply_version"] |
define_option overnet_section [Proto.options_section_name; "protocol_connectreply_version"] |
471 |
"The protocol version sent on Overnet connections replies" |
"The protocol version sent on Overnet connections replies" |
472 |
int_option 44 |
int_option 44 |
473 |
|
|
474 |
|
|
475 |
(* In Overnet case, the TCP protocol is changed, so we need to create a special |
(* In Overnet case, the TCP protocol is changed, so we need to create a special |
476 |
TCP port for Overnet clients, that will not be used by normal Edonkey |
TCP port for Overnet clients, that will not be used by normal Edonkey |
477 |
and Kademlia clients. *) |
and Kademlia clients. *) |
478 |
|
|
479 |
let tcp_sock = ref None |
let tcp_sock = ref None |
480 |
|
|
481 |
module Overnet = struct |
module Overnet = struct |
482 |
include Overnet_initial |
include Overnet_initial |
483 |
|
|
484 |
let enable enabler = |
let enable enabler = |
485 |
enable enabler; |
enable enabler; |
486 |
try |
try |
487 |
let sock = TcpServerSocket.create |
let sock = TcpServerSocket.create |
488 |
"overnet client server" |
"overnet client server" |
489 |
(Ip.to_inet_addr !!client_bind_addr) |
(Ip.to_inet_addr !!client_bind_addr) |
490 |
(!!overnet_port) |
(!!overnet_port) |
491 |
(DonkeyClient.client_connection_handler true) in |
(DonkeyClient.client_connection_handler true) in |
492 |
|
|
493 |
tcp_sock := Some sock; |
tcp_sock := Some sock; |
494 |
|
|
495 |
match Unix.getsockname (BasicSocket.fd (TcpServerSocket.sock sock)) with |
match Unix.getsockname (BasicSocket.fd (TcpServerSocket.sock sock)) with |
496 |
Unix.ADDR_INET (ip, port) -> |
Unix.ADDR_INET (ip, port) -> |
497 |
assert (port = !!overnet_port) |
assert (port = !!overnet_port) |
499 |
with e -> |
with e -> |
500 |
lprintf_nl "Could not assign TCP port %d for Overnet\n" !!overnet_port; |
lprintf_nl "Could not assign TCP port %d for Overnet\n" !!overnet_port; |
501 |
tcp_sock := None |
tcp_sock := None |
502 |
|
|
503 |
let disable () = |
let disable () = |
504 |
disable (); |
disable (); |
505 |
(match !tcp_sock with |
(match !tcp_sock with |
506 |
None -> () |
None -> () |
507 |
| Some sock -> |
| Some sock -> |
508 |
tcp_sock := None; |
tcp_sock := None; |
509 |
TcpServerSocket.close sock Closed_by_user); |
TcpServerSocket.close sock Closed_by_user); |
510 |
end |
end |