Implement revoke

This commit is contained in:
xenia 2020-02-04 14:39:58 -05:00
parent 0902781626
commit 30b1460d4d
2 changed files with 28 additions and 0 deletions

View File

@ -124,6 +124,12 @@
'netmask (ip->string (netmask-ip (subnet-mask (first entry))))
'peer (ip->string (second entry))))]
[(msg:revoke _ _ networks)
(map (lambda (net)
(hash 'network (ip->string (subnet-ip net))
'netmask (ip->string (netmask-ip (subnet-mask net)))))
networks)]
[_ (error 'msg->jsexpr
(format "unimplemented ~a" (msg-type msg)))])))

22
router
View File

@ -35,6 +35,20 @@
(lambda (rst) (cons (cons peer r) rst))
(lambda () '())))
;; Router Route Peer -> Void
;; Tries to find the given route and removes it from the routing database
(define (router-revoke! rt subnet peer)
;; [Listof [Cons Peer Route]] -> [Listof [Cons Peer Route]]
;; Removes route r from the given list, if present
(define (remove-route routes)
(filter (lambda (el) (not (and (equal? (car el) peer)
(equal? (route-subnet (cdr el)) subnet))))
routes))
(rt-update! rt
(subnet->bl subnet)
(lambda (lst) (remove-route lst))
(lambda () '())))
;; IP -> IP
;; Calculates our local IP on the subnet with peer p
(define (peer-ip->own-ip p)
@ -159,6 +173,14 @@
#:when (not (eq? (peer-conn-info pc) src-peer)))
(cons pc (router-format-update (peer-conn-info pc) r asn)))]
[(msg:revoke src dst networks)
(for ([net (in-list networks)]) (router-revoke! router net (ip->peer src)))
(rt-dump router)
(for/list ([pc (in-list peer-conns)]
#:when (not (eq? (peer-conn-info pc) src-peer)))
(let ([pip (peer-ip (peer-conn-info pc))])
(cons pc (msg:revoke (peer-ip->own-ip pip) pip networks))))]
[(msg:data src dst data)
(match (router-find-best router dst)
[#f