ports/91731: Patch to net/ipcalc, which adds an opportunity of a finding of the minimal greater network mask.
Ilya V. Guy
ilya at lisgroup.net
Fri Jan 13 00:40:07 UTC 2006
>Number: 91731
>Category: ports
>Synopsis: Patch to net/ipcalc, which adds an opportunity of a finding of the minimal greater network mask.
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Fri Jan 13 00:40:05 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Ilya V. Guy
>Release: 5.3-RELEASE
>Organization:
ISP `Lis'
>Environment:
FreeBSD ilya.home.lisgroup.net 5.3-RELEASE FreeBSD 5.3-RELEASE #1: Sat Sep 24 21:35:13 EEST 2005 ilya at ilya.home.lisgroup.net:/usr/obj/usr/src/sys/Ilya i386
>Description:
Patch to net/ipcalc (ipcalc-0.38), which adds an opportunity of a finding of the minimal greater network mask.
Use:
ipcalc 192.168.2.0 + 192.168.6.0
or
ipcalc -a 192.168.2.0 192.168.6.0
or
ipcalc -agg 192.168.2.0 192.168.6.0
Produce:
aggregate 192.168.2.0 + 192.168.6.0
192.168.0.0/21
>How-To-Repeat:
>Fix:
--- ipcalc Fri Jan 13 00:58:01 2006
+++ ipcalc.new Fri Jan 13 02:25:25 2006
@@ -46,6 +46,7 @@
my $opt_print_only_class = 0;
my $opt_split = 0;
my $opt_deaggregate = 0;
+my $opt_aggregate = 0;
my $opt_version = 0;
my $opt_help = 0;
my @opt_split_sizes;
@@ -137,8 +138,8 @@
$address = argton("192.168.1.1");
}
- # if deaggregate get last address
- if ($opt_deaggregate) {
+ # if aggregate or deaggregate get last address
+ if ($opt_deaggregate||$opt_aggregate) {
if (defined $ARGV[1]) {
$address2 = argton($ARGV[1],0);
}
@@ -157,6 +158,15 @@
exit;
}
+ if ($opt_aggregate) {
+ if ($error) {
+ print "$error\n";
+ }
+ print "aggregate ".ntoa($address) . " + " . ntoa($address2)."\n";
+ aggregate($address,$address2);
+ exit;
+ }
+
# get netmasks
if (defined $ARGV[1]) {
$mask1 = argton($ARGV[1],1);
@@ -208,6 +218,9 @@
if ($opt_deaggregate) {
deaggregate();
}
+ if ($opt_aggregate) {
+ aggregate();
+ }
if ($opt_split) {
split_network($network,$mask1,$mask2, at opt_split_sizes);
exit;
@@ -646,6 +659,28 @@
return 1 << $i;
}
+# Aggregate address range
+# expects: range: (dotted quads)start (dotted quads)end
+
+sub aggregate
+{
+ my $base = shift;
+ my $end = shift;
+ my $step;
+ my $mask;
+
+ $step=0;
+ while ( ($base != $end) )
+ {
+ $mask = $thirtytwobits-((1<<$step)-1);
+ $base = $base & $mask;
+ $end = $end & $mask;
+ $step++;
+ }
+ my $broadcast = $base | ((~$mask) & $thirtytwobits);
+ deaggregate($base,$broadcast);
+}
+
# Deaggregate address range
# expects: range: (dotted quads)start (dotted quads)end
@@ -735,6 +770,14 @@
elsif (/^\-$/) {
$opt_deaggregate = 1;
}
+ elsif (/^(.+)\+(.+)$/) {
+ push @arguments,$1;
+ push @arguments,$2;
+ $opt_aggregate = 1;
+ }
+ elsif (/^\+$/) {
+ $opt_aggregate = 1;
+ }
else {
push @arguments, $_;
}
@@ -743,6 +786,10 @@
@arguments = ($arguments[0],$arguments[2]);
$opt_deaggregate = 1;
}
+ if ($#arguments == 2 && $arguments[1] eq '+') {
+ @arguments = ($arguments[0],$arguments[2]);
+ $opt_aggregate = 1;
+ }
# workaround for -h
@@ -785,6 +832,9 @@
elsif ($opt eq 'r' || $opt eq 'range') {
$opt_deaggregate = 1;
}
+ elsif ($opt eq 'a' || $opt eq 'agg') {
+ $opt_aggregate = 1;
+ }
elsif ($opt eq 's' || $opt eq 'split') {
$opt_split = 1;
while (defined $ARGV[0] && $ARGV[0] =~ /^\d+$/) {
@@ -1043,6 +1093,7 @@
-s --split n1 n2 n3
Split into networks of size n1, n2, n3.
-r --range Deaggregate address range.
+ -a --agg Aggregate address range.
--help Longer help text.
Examples:
@@ -1054,6 +1105,8 @@
ipcalc <ADDRESS1> - <ADDRESS2> deaggregate address range
+
+ipcalc <ADDRESS1> + <ADDRESS2> aggregate address range
ipcalc <ADDRESS>/<NETMASK> --s a b c
split network to subnets
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list