jimlib/ipv4.tcl | 23 +++++++++++++++++++++++ jimlib/net-utils.tcl | 27 +++++++++++++++++++++++++++ diff --git a/jimlib/ipv4.tcl b/jimlib/ipv4.tcl new file mode 100644 index 0000000000000000000000000000000000000000..724a9b8e543a05cb6797923cb2fc73b6a6b66dbbd5ed1565ada1b91df833896d --- /dev/null +++ b/jimlib/ipv4.tcl @@ -0,0 +1,23 @@ +package provide ipv4 1.0 + +namespace eval ipv4 { + +proc contract {addr} { + set octets [split $addr .] + if {[llength $octets] != 4} { + error "invalid format" + } + set rv [list] + foreach octet $octets { + if {[string is integer -strict $octet] == 0} { + error "non integer IPv4 octet" + } + if {($octet < 0) || ($octet > 255)} { + error "out of range IPv4 octet" + } + lappend rv [expr {0 + $octet}] + } + return [join $rv .] +} + +} diff --git a/jimlib/net-utils.tcl b/jimlib/net-utils.tcl index 5c24cda56c385789b75835ea969941f7c120462b66520d922fcad36e51ae73aa..cb217988cd92c2790de17b9601525c529633ab2cc88124c8036586481c1540b3 100644 --- a/jimlib/net-utils.tcl +++ b/jimlib/net-utils.tcl @@ -35,3 +35,30 @@ } } return $addrs } + +proc parse-ip {addr} { + set addr [string map {/ " "} $addr] + set addr [split $addr " "] + set prefixlen "" + switch [llength $addr] { + 1 {} + 2 {lassign $addr addr prefixlen} + default {error "bad address format"} + } + set maxlen 128 + if {[string first : $addr] == -1} { + package require ipv4 + set maxlen 32 + set addr [ipv4::contract $addr] + } else { + package require ipv6 + if {[ipv6::isIpv6 $addr] != 1} {error "invalid IPv6 format"} + set addr [ipv6::contract $addr] + } + package require check-utils + set prefixlen [parse-int $prefixlen $maxlen] + if {($prefixlen < 0) || ($prefixlen > $maxlen)} { + error "prefixlen is not in acceptable range" + } + return [list $addr $prefixlen] +}