[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Mldonkey-commits] Changes to mldonkey/src/networks/donkey/donkeyProtoKa
From: |
mldonkey-commits |
Subject: |
[Mldonkey-commits] Changes to mldonkey/src/networks/donkey/donkeyProtoKademlia.ml |
Date: |
Mon, 08 Aug 2005 12:47:40 -0400 |
Index: mldonkey/src/networks/donkey/donkeyProtoKademlia.ml
diff -u mldonkey/src/networks/donkey/donkeyProtoKademlia.ml:1.9
mldonkey/src/networks/donkey/donkeyProtoKademlia.ml:1.10
--- mldonkey/src/networks/donkey/donkeyProtoKademlia.ml:1.9 Fri Jul 22
10:58:55 2005
+++ mldonkey/src/networks/donkey/donkeyProtoKademlia.ml Mon Aug 8 16:47:31 2005
@@ -24,19 +24,21 @@
open AnyEndian
open BasicSocket
open LittleEndian
-
+
open CommonOptions
open CommonTypes
open CommonGlobals
-
+
open DonkeyMftp
-open DonkeyOvernet
+open DonkeyOvernet
open DonkeyOptions
module P = struct
-
+
let names_of_tag =
[
+ "\248", Field_UNKNOWN "buddyhash"; (* 0xF8 *)
+ "\249", Field_UNKNOWN "clientlowid"; (* 0xF9 *)
"\250", Field_UNKNOWN "serverport"; (* 0xFA *)
"\251", Field_UNKNOWN "serverip"; (* 0xFB *)
"\252", Field_UNKNOWN "sourceuport"; (* 0xFC *)
@@ -49,55 +51,55 @@
16 8-bits integers... welcome back to the non-portability problems... *)
let get_md4 s pos =
let ss = String.create 16 in
-
+
ss.[0] <- s.[pos+3];
ss.[1] <- s.[pos+2];
ss.[2] <- s.[pos+1];
ss.[3] <- s.[pos+0];
-
+
ss.[4] <- s.[pos+7];
ss.[5] <- s.[pos+6];
ss.[6] <- s.[pos+5];
ss.[7] <- s.[pos+4];
-
+
ss.[8] <- s.[pos+11];
ss.[9] <- s.[pos+10];
ss.[10] <- s.[pos+9];
ss.[11] <- s.[pos+8];
-
+
ss.[12] <- s.[pos+15];
ss.[13] <- s.[pos+14];
ss.[14] <- s.[pos+13];
ss.[15] <- s.[pos+12];
-
+
Md4.direct_of_string ss
-
+
let buf_md4 buf s =
let s = Md4.direct_to_string s in
-
+
let ss = String.create 16 in
let pos = 0 in
-
+
ss.[0] <- s.[pos+3];
ss.[1] <- s.[pos+2];
ss.[2] <- s.[pos+1];
ss.[3] <- s.[pos+0];
-
+
ss.[4] <- s.[pos+7];
ss.[5] <- s.[pos+6];
ss.[6] <- s.[pos+5];
ss.[7] <- s.[pos+4];
-
+
ss.[8] <- s.[pos+11];
ss.[9] <- s.[pos+10];
ss.[10] <- s.[pos+9];
ss.[11] <- s.[pos+8];
-
+
ss.[12] <- s.[pos+15];
ss.[13] <- s.[pos+14];
ss.[14] <- s.[pos+13];
ss.[15] <- s.[pos+12];
-
+
Buffer.add_string buf ss
@@ -108,68 +110,66 @@
let c3 = int_of_char s.[pos+2] in
let c4 = int_of_char s.[pos+3] in
Ip.of_ints (c4, c3, c2, c1)
-
-
+
let buf_ip buf ip =
let (ip3,ip2,ip1,ip0) = Ip.to_ints ip in
buf_int8 buf ip0;
buf_int8 buf ip1;
buf_int8 buf ip2;
buf_int8 buf ip3
-
+
let buf_peer buf p =
buf_md4 buf p.peer_md4;
buf_ip buf p.peer_ip;
buf_int16 buf p.peer_port;
buf_int16 buf p.peer_tcpport;
buf_int8 buf p.peer_kind
-
- let write buf t =
+
+ let write buf t =
match t with
| OvernetConnect p ->
buf_int8 buf 0x00;
buf_peer buf p
-
+
| OvernetConnectReply peers ->
buf_int8 buf 0x08;
buf_int16 buf (List.length peers);
List.iter (buf_peer buf) peers
-
+
| OvernetPublicize p ->
buf_int8 buf 0x10;
buf_peer buf p
-
+
| OvernetPublicized (Some p) ->
buf_int8 buf 0x18;
buf_peer buf p
-
+
| OvernetSearch (nresults, target, Some uid) ->
buf_int8 buf 0x20;
buf_int8 buf (nresults land 0x1f);
buf_md4 buf target;
buf_md4 buf uid
-
+
| OvernetSearchReply (md4, peers) ->
buf_int8 buf 0x28;
buf_md4 buf md4;
buf_int8 buf (List.length peers);
List.iter (buf_peer buf) peers
-
+
| OvernetGetSearchResults (target, kind, min, max) ->
buf_int8 buf 0x30;
buf_md4 buf target;
begin
match kind with
| Search_for_kind _
- | Search_for_file ->
+ | Search_for_file ->
buf_int8 buf 1
| Search_for_keyword None ->
buf_int8 buf 0
| Search_for_keyword (Some e) ->
buf_int8 buf 1
-
end
-
+
| OvernetSearchFilesResults (target, results) ->
buf_int8 buf 0x38;
buf_md4 buf target;
@@ -180,8 +180,8 @@
List.iter (fun tag ->
buf_tag buf tag names_of_tag
) tags
- ) results
-
+ ) results
+
| OvernetPublishFiles (target, results) ->
buf_int8 buf 0x40;
buf_md4 buf target;
@@ -192,8 +192,8 @@
List.iter (fun tag ->
buf_tag buf tag names_of_tag
) tags
- ) results
-
+ ) results
+
| OvernetPublishSources _
| OvernetSearchSourcesResults _
| OvernetUnknown21 _
@@ -201,20 +201,20 @@
| OvernetFirewallConnectionNACK _
| OvernetFirewallConnectionACK _
| OvernetFirewallConnection (_, _)
- | OvernetGetMyIPResult _
+ | OvernetGetMyIPResult _
| OvernetGetMyIP _
| OvernetNoResult _
| OvernetPublished _
| OvernetSearch (_,_, None)
| OvernetPublicized None
| OvernetGetMyIPDone -> raise MessageNotImplemented
-
- | OvernetUnknown (opcode, s) ->
+
+ | OvernetUnknown (opcode, s) ->
buf_int8 buf opcode;
Buffer.add_string buf s
-
+
let get_peer s pos =
-
+
let md4 = get_md4 s pos in
let ip = get_ip s (pos+16) in
let udp_port = get_int16 s (pos + 20) in
@@ -229,8 +229,8 @@
peer_last_recv = 0;
peer_last_send = 0;
}, pos + 25
-
- let get_peers_from_results ip port answers =
+
+ let get_peers_from_results ip port answers =
List.map (fun (r_md4, r_tags) ->
let peer_ip = ref ip in
let peer_udpport = ref port in
@@ -252,8 +252,8 @@
for_int_tag tag (fun kind ->
peer_kind := kind)
| _ ->
- if !verbose_hidden_errors then
- lprintf_nl "Unused source tag [%s]"
+ if !verbose_unknown_messages then
+ lprintf_nl "[Kademlia] Unused source tag [%s]"
(escaped_string_of_field tag)
) r_tags;
{
@@ -266,41 +266,41 @@
peer_kind = !peer_kind;
}
) answers
-
- let parse ip port opcode s =
+
+ let parse ip port opcode s =
match opcode with
- 0x00 ->
+ 0x00 ->
let p, pos = get_peer s 0 in
OvernetConnect p
-
+
| 0x08 ->
let n = get_int16 s 0 in
let peers, pos = get_list16 get_peer s 0 in
OvernetConnectReply peers
-
+
| 0x10 ->
let p, pos = get_peer s 0 in
OvernetPublicize p
-
+
| 0x18 ->
let p, pos = get_peer s 0 in
OvernetPublicized (Some p)
-
+
| 0x20 ->
let nresults = (get_uint8 s 0) land 0x1f in
let target = get_md4 s 1 in
let uid = get_md4 s 17 in
OvernetSearch (nresults, target, Some uid)
-
+
| 0x28 ->
let target = get_md4 s 0 in
let peers, pos = get_list8 get_peer s 16 in
OvernetSearchReply (target, peers)
-
+
| 0x30 ->
let target = get_md4 s 0 in
let kind = get_uint8 s 16 in
- let kind =
+ let kind =
if String.length s = 17 then
if kind = 1 then Search_for_file else
Search_for_keyword None
@@ -308,7 +308,7 @@
Search_for_kind kind
in
OvernetGetSearchResults (target, kind, 0, 100)
-
+
| 0x38 ->
let target = get_md4 s 0 in
let answers, pos = get_list16 (fun s pos ->
@@ -327,13 +327,13 @@
if !sources then
let peers = get_peers_from_results Ip.null 0 answers in
OvernetSearchSourcesResults (target, peers)
-
+
else
OvernetSearchFilesResults (target, answers)
- | [] ->
+ | [] ->
OvernetSearchFilesResults (target, answers)
end
-
+
| 0x40 ->
let target = get_md4 s 0 in
let answers, pos = get_list16 (fun s pos ->
@@ -342,7 +342,7 @@
s (pos + 16) in
(uid, tags), pos
) s 16 in
-
+
begin
match answers with
(_, first_tags) :: _ ->
@@ -353,43 +353,42 @@
if !sources then
let peers = get_peers_from_results ip port answers in
OvernetPublishSources (target, peers)
-
+
else
OvernetPublishFiles (target, answers)
- | [] ->
+ | [] ->
OvernetPublishFiles (target, answers)
end
-
| 0x48 ->
let target = get_md4 s 0 in
OvernetPublished target
-
-(*
-#define KADEMLIA_PUBLISH_REQ 0x40 // <HASH (key) [16]> <CNT1 [2]> (<HASH
(target) [16]> <CNT2 [2]> <META>*(CNT2))*(CNT1)
-#define KADEMLIA_PUBLISH_RES 0x48 // <HASH (key) [16]>
-
-#define KADEMLIA_FIREWALLED_REQ 0x50 // <TCPPORT (sender) [2]>
-#define KADEMLIA_BUDDY_REQ 0x51 // <TCPPORT (sender) [2]>
-#define KADEMLIA_BUDDY_CON 0x52 //
-#define KADEMLIA_BUDDY_ACK 0x57 // <TCPPORT (sender) [2]>
-#define KADEMLIA_FIREWALLED_RES 0x58 // <IP (sender) [4]>
-#define KADEMLIA_FIREWALLED_ACK 0x59 // (null)
+
+(*
+#define KADEMLIA_SRC_NOTES_RES 0x3A // <HASH (key) [16]> <CNT1 [2]> (<HASH
(answer) [16]> <CNT2 [2]> <META>*(CNT2))*(CNT1)
+#define KADEMLIA_PUB_NOTES_REQ 0x42 // <HASH (key) [16]> <HASH (target)
[16]> <CNT2 [2]> <META>*(CNT2))*(CNT1)
+#define KADEMLIA_PUB_NOTES_RES 0x4A // <HASH (key) [16]>
+#define KADEMLIA_FIREWALLED_REQ 0x50 // <TCPPORT (sender) [2]>
+#define KADEMLIA_FINDBUDDY_REQ 0x51 // <TCPPORT (sender) [2]>
+#define KADEMLIA_CALLBACK_REQ 0x52 // <TCPPORT (sender) [2]>
+#define KADEMLIA_FIREWALLED_RES 0x58 // <IP (sender) [4]>
+#define KADEMLIA_FIREWALLED_ACK 0x59 // (null)
+#define KADEMLIA_FINDBUDDY_RES 0x5A // <TCPPORT (sender) [2]>
*)
-
+
| _ ->
OvernetUnknown (opcode, String.sub s 1 (String.length s - 1))
-
+
let udp_buf = Buffer.create 2000
-
+
let kademlia_header_code = char_of_int 0xE4
let kademlia_packed_header_code = char_of_int 0xE5
let kademlia_header = String.make 1 kademlia_header_code
let kademlia_packed_header = String.make 1 kademlia_packed_header_code
-
+
let parse_message ip port pbuf =
let len = String.length pbuf in
- if len < 2 ||
+ if len < 2 ||
(let magic = pbuf.[0] in
magic <> kademlia_header_code &&
magic <> kademlia_packed_header_code) then
@@ -399,9 +398,9 @@
dump pbuf;
end;
raise Not_found
-
- end
- else
+
+ end
+ else
let magic = pbuf.[0] in
let opcode = int_of_char pbuf.[1] in
let msg = String.sub pbuf 2 (len-2) in
@@ -413,26 +412,26 @@
else msg
in
let t = parse ip port opcode msg in
- t
-
+ t
+
let udp_send sock ip port ping msg =
try
Buffer.clear udp_buf;
write udp_buf msg;
let s = Buffer.contents udp_buf in
-
+
let s =
if String.length s > 200 then
let opcode = String.sub s 0 1 in
let args = String.sub s 1 (String.length s - 1) in
kademlia_packed_header ^ opcode ^ (Autoconf.zlib__compress_string
args)
- else
+ else
kademlia_header ^ s
in
-
- if !verbose_overnet then
- begin
- lprintf_nl "Sending UDP to %s:%d type %s (opcode 0x%02X len %d)"
+
+ if !verbose_overnet then
+ begin
+ lprintf_nl "[Kademlia] Sending UDP to %s:%d type %s (opcode 0x%02X
len %d)"
(Ip.to_string ip) port (message_to_string msg) (get_uint8 s 1)
(String.length s);
(*dump s; lprint_newline ();*)
@@ -443,20 +442,20 @@
if t <> msg then begin
lprintf "********** SENT MESSAGE DIFFERS FROM EXPECTED ******\n";
end;
-*)
-
+*)
+
UdpSocket.write sock ping s ip port
with
| MessageNotImplemented -> ()
- | e -> lprintf_nl "Exception %s in udp_send" (Printexc2.to_string e)
-
+ | e -> lprintf_nl "[Kademlia] Exception %s in udp_send"
(Printexc2.to_string e)
+
let udp_handler f sock event =
match event with
UdpSocket.READ_DONE ->
- UdpSocket.read_packets sock (fun p ->
+ UdpSocket.read_packets sock (fun p ->
try
let pbuf = p.UdpSocket.udp_content in
-
+
let (ip, port) =
match p.UdpSocket.udp_addr with
Unix.ADDR_INET (inet, port) ->
@@ -466,36 +465,36 @@
let t = parse_message ip port pbuf in
f t p
with e ->
- if !verbose_hidden_errors then
+ if !verbose_unknown_messages then
begin
- lprintf_nl "Error %s in udp_handler, dump of packet:"
- (Printexc2.to_string e);
+ lprintf_nl "[Kademlia] Error %s in udp_handler, dump of
packet:"
+ (Printexc2.to_string e);
dump p.UdpSocket.udp_content;
lprint_newline ()
end
);
| _ -> ()
-
+
let redirector_section = "DKKA"
- let options_section_name = "Kademlia"
-
+ let options_section_name = "Kademlia"
+
let enable_overnet = enable_kademlia
let source_brand = false
-
- let overnet_section = file_section donkey_ini
+
+ let overnet_section = file_section donkey_ini
[ options_section_name ]
- "Kademlia options"
-
- let overnet_port =
- define_option overnet_section [options_section_name; "port"]
- "port for Kademlia"
- int_option (2000 + Random.int 20000)
-
+ "Kademlia options"
+
+ let overnet_port =
+ define_option overnet_section [options_section_name; "port"]
+ "port for Kademlia"
+ int_option (2000 + Random.int 20000)
+
let overnet_tcpport = donkey_port
let command_prefix = "kad_"
-
+
let web_info = "kad"
end
-
+
module Kademlia = Make(P)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Mldonkey-commits] Changes to mldonkey/src/networks/donkey/donkeyProtoKademlia.ml,
mldonkey-commits <=