From a577fadf94786fcb6248b019bd56b5f69784e23a Mon Sep 17 00:00:00 2001 From: Milo Date: Thu, 30 Jan 2020 19:32:01 -0500 Subject: [PATCH] ip-netmask --- iputil.rkt | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/iputil.rkt b/iputil.rkt index e2e5748..c98ae67 100644 --- a/iputil.rkt +++ b/iputil.rkt @@ -1,14 +1,18 @@ #lang racket -(require racket/struct) - (provide (struct-out peer) (struct-out subnet) string->ip ip->string + ip-netmask string->subnet subnet->string string->peer) +(require racket/struct) + +(module+ test + (require rackunit)) + (struct peer [ip type] #:methods gen:custom-write [(define write-proc @@ -37,6 +41,11 @@ 255))))) (string-join parts ".")) +(define (ip-netmask ip) + (for/sum ([i (in-range 32)]) + #:break (positive? (bitwise-and ip (arithmetic-shift 1 i))) + 1)) + (define (string->subnet str) (match-define (list ipstr maskstr) (string-split str "/")) (subnet (string->ip ipstr) @@ -44,9 +53,18 @@ (define (subnet->string sub) (format "~a/~a" - (subnet-ip sub) + (ip->string (subnet-ip sub)) (subnet-mask sub))) (define (string->peer str) (match-define (list ip type) (string-split str "-")) (peer (string->ip ip) (string->symbol type))) + +;; ================================================================================ + +(module+ test + (check-equal? (ip->string (string->ip "123.84.0.67")) "123.84.0.67") + (check-equal? (ip->string (string->ip "0.0.0.0")) "0.0.0.0") + + (check-equal? (ip-netmask (string->ip "255.255.254.0")) 9) + (check-equal? (ip-netmask (string->ip "255.0.0.0")) 24))