summaryrefslogtreecommitdiffhomepage
path: root/src/trie.go
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2017-06-28 23:45:45 +0200
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2017-06-28 23:45:45 +0200
commit1f0976a26c1d0a6b5eb2c0aa993f12d89f96eed2 (patch)
tree36771e8468214583a5c3f3441b36662c4108a58c /src/trie.go
parent8236f3afa2eca0aae6c5da9560301c04d882c81b (diff)
Work on UAPI
Cross-platform API (get operation) Handshake initiation creation process Outbound packet flow Fixes from code-review
Diffstat (limited to 'src/trie.go')
-rw-r--r--src/trie.go31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/trie.go b/src/trie.go
index 746c1b4..4049167 100644
--- a/src/trie.go
+++ b/src/trie.go
@@ -1,15 +1,20 @@
package main
import (
+ "errors"
"net"
)
/* Binary trie
*
+ * The net.IPs used here are not formatted the
+ * same way as those created by the "net" functions.
+ * Here the IPs are slices of either 4 or 16 byte (not always 16)
+ *
* Syncronization done seperatly
* See: routing.go
*
- * Todo: Better commenting
+ * TODO: Better commenting
*/
type Trie struct {
@@ -24,7 +29,7 @@ type Trie struct {
}
/* Finds length of matching prefix
- * Maybe there is a faster way
+ * TODO: Make faster
*
* Assumption: len(ip1) == len(ip2)
*/
@@ -189,3 +194,25 @@ func (node *Trie) Count() uint {
r := node.child[1].Count()
return l + r
}
+
+func (node *Trie) AllowedIPs(p *Peer, results []net.IPNet) {
+ if node.peer == p {
+ var mask net.IPNet
+ mask.Mask = net.CIDRMask(int(node.cidr), len(node.bits)*8)
+ if len(node.bits) == net.IPv4len {
+ mask.IP = net.IPv4(
+ node.bits[0],
+ node.bits[1],
+ node.bits[2],
+ node.bits[3],
+ )
+ } else if len(node.bits) == net.IPv6len {
+ mask.IP = node.bits
+ } else {
+ panic(errors.New("bug: unexpected address length"))
+ }
+ results = append(results, mask)
+ }
+ node.child[0].AllowedIPs(p, results)
+ node.child[1].AllowedIPs(p, results)
+}