/[mldonkey]/mldonkey/src/networks/donkey/donkeyProtoOvernet.ml
ViewVC logotype

Diff of /mldonkey/src/networks/donkey/donkeyProtoOvernet.ml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.17 by spiralvoice, Fri Jul 22 10:58:55 2005 UTC revision 1.18 by spiralvoice, Mon Aug 8 16:47:31 2005 UTC
# Line 19  Line 19 
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
# Line 30  open CommonTypes Line 28  open CommonTypes
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
# Line 56  module Proto = struct Line 54  module Proto = struct
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 ->
# Line 66  module Proto = struct Line 63  module Proto = struct
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;
# Line 98  module Proto = struct Line 95  module Proto = struct
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;
# Line 129  module Proto = struct Line 126  module Proto = struct
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
# Line 174  module Proto = struct Line 171  module Proto = struct
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
# Line 187  module Proto = struct Line 184  module Proto = struct
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        {        {
# Line 224  module Proto = struct Line 221  module Proto = struct
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
# Line 242  module Proto = struct Line 239  module Proto = struct
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
# Line 261  module Proto = struct Line 258  module Proto = struct
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
# Line 325  module Proto = struct Line 311  module Proto = struct
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;
# Line 384  module Proto = struct Line 363  module Proto = struct
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
# Line 408  module Proto = struct Line 387  module Proto = struct
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 =
# Line 436  module Proto = struct Line 415  module Proto = struct
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)
# Line 452  module Proto = struct Line 431  module Proto = struct
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)) ->
# Line 471  module Proto = struct Line 450  module Proto = struct
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)
# Line 520  module Overnet = struct Line 499  module Overnet = struct
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

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.18

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26