##
x <- ipv4(0L) + sample.int(10)
x[order(x)]
sort(x)
##
## matching the address space of a wifi interface on a GNU/Linux box
## that uses Predictable Network Interface Names
## notes: the name of the interface might change depending on the distribution
## you're using among other things and the localhost.ip() function
## only works for POSIX platforms at the moment
##
# \donttest{
ipv4.reserved()[match(ipv4(localhost.ip())['wlp2s0'], ipv4.reserved() )]
## alternatively, if tables has to be looked up several time
m <- ip.index(ipv4.reserved())
m(ipv4(localhost.ip())['wlp2s0'])
# }
##
## ip.match() and ip.index() comparison
##
##
## index the table
bidx <- ip.index(ipv4.reserved())
## "169.254.0.0/16"
x <- ipv4.reserved()['Link Local']
## match
ip.match(x, ipv4.reserved() )
## match
ipv4.reserved()[bidx(x)]
## a range that lies within "169.254.0.0/16"
x <- ipv4r("169.254.0.0/24")
## no match ("169.254.0.0/24"!="169.254.0.0/16")
ip.match(x, ipv4.reserved() )
## match ("169.254.0.0/24" \in "169.254.0.0/16")
ipv4.reserved()[bidx(x)]
##
## overlap
##
## this demonstrates that ranges in ipv4.reserved() overlap
##
## range match
m <- (
ip.index(ipv4.reserved())
)(value=TRUE)
## FALSE because there are overlapping ranges and, in this case,
## the query returns the first matching range
all(m==ipv4.reserved())
## OTH match works as expected
all(ipv4.reserved()[ip.match(ipv4.reserved(),ipv4.reserved())]==ipv4.reserved())
##
## Find overlapping IPv4 ranges (pure R)
##
ipr.overlaps <- function(x, y, rm.diag = FALSE){
overlaps <- function(x,y) ( lo(x) <= hi(y) ) & ( hi(x) >= lo( y))
x <- x[!is.na(x)]
y <- if( missing(y) ) x else y[!is.na(y)]
rv <- outer( x , y, overlaps)
if( rm.diag) diag(rv) <- 0
ij <- which(rv>0,arr.ind = TRUE)
data.frame(nm=names(x)[ij[,1]], x=x[ij[,1]], y=y[ij[,2]])
}
##
ipr.overlaps(ipv4.reserved(),rm.diag=TRUE)
##
## Find overlapping IPv4 ranges (IP package)
##
bsearch <- ip.index(ipv4.reserved(), overlap=TRUE)
##
m <- bsearch()
## get the indices
idx <- getIdx(m)
## matches indices
midx <- idx$midx
## start indices for each address in the midx vector
## (diff(ptr) gives the number of matches per address)
ptr <- idx$ptr
##
subset(
data.frame(
nm = names(ipv4.reserved()[midx])
, x = rep(m, diff(ptr))
, tbl = ipv4.reserved()[midx]
, n = rep(diff(ptr), diff(ptr))
)
, n>1 & x!=tbl
)
##
## Same thing for IPv6r
##
ip.index(ipv6.reserved(), overlap=TRUE)(value=TRUE)
Run the code above in your browser using DataLab