From 90275458edca6ee2d385e4eba2380d6f477a2a77 Mon Sep 17 00:00:00 2001 From: Milo Date: Fri, 31 Jan 2020 22:35:34 -0500 Subject: [PATCH] router registration and lookup --- router | 89 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/router b/router index 3491bca..f49accd 100755 --- a/router +++ b/router @@ -5,7 +5,9 @@ (require json "iputil.rkt" "unix-socket.rkt" - "msg.rkt") + "msg.rkt" + "radix-tree.rkt" + ) ;; info : Peer ;; sock-in : Input-Port @@ -14,24 +16,41 @@ [info sock-in sock-out] #:transparent) -;; alist : [Listof [Cons IP Route]] -(struct router - [(alist #:mutable)] - #:transparent) +;; a Router is a [RTof [Listof [Cons Peer Route]]] ;; -> Router (define (make-router) - (router '())) + (make-rt)) -;; Router Route IP -> Void -(define (router-add! rs r src) - (set-router-alist! rs - (cons (cons src r) - (router-alist rs)))) +;; Router Route Peer -> Void +(define (router-add! rt r peer) + (rt-update! rt + (subnet->bl (route-subnet r)) + (lambda (rst) (cons (cons peer r) rst)) + (lambda () '()))) -;; Router IP -> (U IP #f) -(define (router-find-best rs src) - #f) +(define (route< r1 r2) + #| + (route< r1 r2) iff "r1 wins" + + 1. The path with the highest "localpref" wins. If the "localpref"s are equal... + 2. The path with "selfOrigin" = true wins. If all selfOrigins are the equal... + 3. The path with the shortest "ASPath" wins. If multiple routes have the shortest length... + 4. The path with the best "origin" wins, were IGP > EGP > UNK. + If multiple routes have the best origin... + 5. The path from the neighbor router with the lowest IP address. + |# + #t) + +;; Router IP -> (U Peer #f) +(define (router-find-best rt src-ip) + (match (sort (rt-lookup rt + (ip->bl src-ip) + (λ () '())) + route< + #:key cdr) + [(list* (cons peer _) _) peer] + [_ #f])) ;; Str [Listof Peer-Conn] -> Void ;; -- @@ -52,42 +71,46 @@ (channel-put mail (list peer msg)) (loop)))))) - (define (ip->peer-conn ip) - (findf (λ (p) - (equal? ip (peer-ip (peer-conn-info p)))) + (define (ip->peer ip) + (findf (λ (peer) + (equal? ip (peer-ip peer))) + (map peer-conn-info peer-conns))) + + (define (peer->peer-conn peer) + (findf (λ (pc) + (equal? peer (peer-conn-info pc))) peer-conns)) (define router (make-router)) - (define (loop) - (match-define (list src-peer msg) (channel-get mail)) - (printf "====\nfrom ~a:\n~s\n" src-peer msg) + (let loop () + (match-define (list src-peer-conn msg) (channel-get mail)) + (printf "====\nfrom ~a:\n~s\n" src-peer-conn msg) (match msg [(msg:update src dst r) - (router-add! router r src)] + (router-add! router + r + (ip->peer src)) + (rt-dump router)] [(msg:data src dst data) - (define-values [dst-peer resp-msg] + (define-values [dst-peer-conn resp-msg] (match (router-find-best router dst) [#f - (values peer - (msg:no-route src - dst))] - [dst-peer-ip - (values (ip->peer-conn dst-peer-ip) + (values src-peer-conn + (msg:no-route src dst))] + [dst-peer + (values (peer->peer-conn dst-peer) msg)])) - (printf "----\nwant to send back ~a to ~a\n" - dst-peer + (printf "----\nwant to send back to ~a:\n~a\n" + (peer-conn-info dst-peer-conn) resp-msg)] [_ (printf "----\nignored\n")]) - (loop)) - - (printf "waiting for messages...\n") - (loop)) + (loop))) ;; Str [Listof Peer] -> ;; Router main