M
Matija Papec
I would like to discover situations when one ip/mask is able to cover
another one, eg. does 22.122.0.0/16 cover 122.0.0.0/24?
I made integer conversion for ip/mask but don't know what to do further..
my $r1 = {
source => '22.122.0.0/16',
};
my $r2 = {
source => '122.0.0.0/24',
};
for my $r ($r1, $r2) {
$r->{_source} = CalcIP($r->{source}) if !$r->{_source};
}
use Data:
umper; print Dumper $r1, $r2;
sub CalcIP {
#
# calculate ip/mask
#
my ($source) = @_;
my %adr;
if ($source) {
my ($ip, $mask) = split /\//, $source;
$ip = unpack 'N', pack 'C4', split /\./, $ip;
if (!$mask) { $mask = 0xffffffff }
elsif ($mask =~ /^\d+$/) { $mask = 0xffffffff << (32-$mask) }
else { $mask = unpack 'N', pack 'C4', split /\./, $mask }
$ip = $ip & $mask;
%adr = ( ip => $ip, mask => $mask );
}
return \%adr;
}
another one, eg. does 22.122.0.0/16 cover 122.0.0.0/24?
I made integer conversion for ip/mask but don't know what to do further..
my $r1 = {
source => '22.122.0.0/16',
};
my $r2 = {
source => '122.0.0.0/24',
};
for my $r ($r1, $r2) {
$r->{_source} = CalcIP($r->{source}) if !$r->{_source};
}
use Data:
sub CalcIP {
#
# calculate ip/mask
#
my ($source) = @_;
my %adr;
if ($source) {
my ($ip, $mask) = split /\//, $source;
$ip = unpack 'N', pack 'C4', split /\./, $ip;
if (!$mask) { $mask = 0xffffffff }
elsif ($mask =~ /^\d+$/) { $mask = 0xffffffff << (32-$mask) }
else { $mask = unpack 'N', pack 'C4', split /\./, $mask }
$ip = $ip & $mask;
%adr = ( ip => $ip, mask => $mask );
}
return \%adr;
}