summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Barksdale <amatus.amongus@gmail.com>2010-09-29 22:38:12 -0700
committerDavid Barksdale <amatus.amongus@gmail.com>2010-09-29 22:38:12 -0700
commit6ee3a243f49da5c91711bb39f8cd5c3a7b1105c0 (patch)
tree500f8b0919ef3a82c89bc67a5bb89b13b6b8042a
parented0d80ab6cbba5b4fed1df409ef355ffa1e3dfce (diff)
More work on network transport support. Switching gears to add UDP support first.
-rw-r--r--src/org/gnu/clojure/gnunet/hostlist.clj2
-rw-r--r--src/org/gnu/clojure/gnunet/inet.clj6
-rw-r--r--src/org/gnu/clojure/gnunet/transport.clj21
-rw-r--r--src/org/gnu/clojure/gnunet/udp.clj14
4 files changed, 42 insertions, 1 deletions
diff --git a/src/org/gnu/clojure/gnunet/hostlist.clj b/src/org/gnu/clojure/gnunet/hostlist.clj
index 2edf064..eab79f3 100644
--- a/src/org/gnu/clojure/gnunet/hostlist.clj
+++ b/src/org/gnu/clojure/gnunet/hostlist.clj
@@ -39,4 +39,4 @@
peer."
[peer url]
(proxy [java.util.TimerTask] []
- (run [] (download-hostlist (partial admit-hello! peer) url)))) \ No newline at end of file
+ (run [] (download-hostlist! (partial admit-hello! peer) url))))
diff --git a/src/org/gnu/clojure/gnunet/inet.clj b/src/org/gnu/clojure/gnunet/inet.clj
index 8d34a23..5b48d7b 100644
--- a/src/org/gnu/clojure/gnunet/inet.clj
+++ b/src/org/gnu/clojure/gnunet/inet.clj
@@ -17,3 +17,9 @@
(domonad parser-m [addr (items 4)
port parse-uint16]
(InetSocketAddress. (InetAddress/getByAddress (byte-array addr)) port))))
+
+(defn is-unicast-address
+ [address]
+ (and
+ (not (.isAnyLocalAddress address))
+ (not (.isMulticastAddress address))))
diff --git a/src/org/gnu/clojure/gnunet/transport.clj b/src/org/gnu/clojure/gnunet/transport.clj
new file mode 100644
index 0000000..6428e74
--- /dev/null
+++ b/src/org/gnu/clojure/gnunet/transport.clj
@@ -0,0 +1,21 @@
+(ns org.gnu.clojure.gnunet.transport
+ (:use (org.gnu.clojure.gnunet udp hello))
+ (:import java.util.Date))
+
+(def my-transports {"udp" udp-send!})
+
+(defn best-transport
+ [transports]
+ (let [current-transports (merge-transports (Date.) {} (list-transports
+ transports))
+ usable-transports (filter #(contains? my-transports (key %))
+ current-transports)
+ best (first usable-transports)]
+ [(my-transports (key best)) (val best)]))
+
+(defn send-message!
+ "Sends message to remote-peer."
+ [remote-peer message]
+ (let [[transport-send! addresses] (best-transport
+ (deref (:transports-agent remote-peer)))]
+ (transport-send! remote-peer addresses message)))
diff --git a/src/org/gnu/clojure/gnunet/udp.clj b/src/org/gnu/clojure/gnunet/udp.clj
new file mode 100644
index 0000000..20d1755
--- /dev/null
+++ b/src/org/gnu/clojure/gnunet/udp.clj
@@ -0,0 +1,14 @@
+(ns org.gnu.clojure.gnunet.udp
+ (:use org.gnu.clojure.gnunet.inet))
+
+(defn pick-address
+ [addresses]
+ (let [parsed-addresses (map #(first (parse-address (key %))) addresses)
+ usable-addresses (filter #(and % (is-unicast-address (.getAddress %)))
+ parsed-addresses)]
+ (first usable-addresses)))
+
+(defn udp-send!
+ [remote-peer addresses encoded-message]
+ (let [address (pick-address addresses)]
+ ))