Commit 0d1255c4 authored by Jonathon Duerig's avatar Jonathon Duerig

The 'internet' node is defined and has a single interface called 'border' and...

The 'internet' node is defined and has a single interface called 'border' and is marked by the '<cloud />' element. All control interfaces with publicly routable IP addresses (not in one of the three private IP spaces) have a link to the 'internet'. Those interfaces now also contain a 'public_ipv4' attribute which contains their address. The modified schema validates this.
parent 93958f63
......@@ -154,6 +154,7 @@
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="public_ipv4"/>
</xs:complexType>
<xs:element name="monitoring">
<xs:complexType>
......
......@@ -45,7 +45,8 @@ LinkContents &=
InterfaceDecl &=
ComponentInterfaceDeclName &
element monitoring { attribute user_traffic { text }? }? &
attribute role { "control" }?
attribute role { "control" }? &
attribute public_ipv4 { text }?
InterfaceRef &=
ComponentInterfaceRefName
......
......@@ -193,19 +193,26 @@ if (defined($options{"1"})) {
usage()
if ($prune && !defined($exempt_eid));
$fake_inet_switch = "internet";
$fake_inet_iface = "(null)";
if ($genimode) {
$fake_inet_iface = "border";
}
print_header();
my %nodetointerface;
my %interfaceroles = ();
my %interfacetypes = ();
my %interfaceips = ();
# Read interfaces
my $result =
DBQueryFatal("SELECT node_id,card,port,iface,interface_type,role" .
DBQueryFatal("SELECT node_id,card,port,iface,interface_type,role,IP" .
" from interfaces " .
($genimode ? "where role!='gw'" : ""));
while (($node,$card,$port,$iface,$type, $role) = $result->fetchrow_array) {
while (($node,$card,$port,$iface,$type,$role,$ip) = $result->fetchrow_array) {
push @{ $nodetointerface{"$node"} }, $iface;
$interfacemap{"$node:$card:$port"} = $iface;
if ((defined $type) && ($type ne "")) {
......@@ -214,6 +221,9 @@ while (($node,$card,$port,$iface,$type, $role) = $result->fetchrow_array) {
if ((defined $role) && ($role ne "")) {
$interfaceroles{"$node:$iface"} = $role;
}
if ((defined $ip) && ($ip ne "")) {
$interfaceips{"$node:$iface"} = $ip;
}
}
my %nodetouuid;
......@@ -880,6 +890,19 @@ foreach $node (keys(%nodes)) {
$nodetointerface{$node}, $country, $latitude, $longitude);
}
my @inet_protos = ("ipv4");
if (($widearea && ! defined($component_name)) || $genimode) {
#
# Set up 'the Internet' as a fake switch that all widearea nodes can
# talk to.
# Some day, it may make sense to connect control net ports to this
# switch.
#
my @types = map("*$_:*", @inet_protos);
print_node($fake_inet_switch, \@types, [], [], undef, [], undef, undef,
undef);
}
#
# Widearea Nodes. Includes plab nodes. Note that widearea nodes are never
# allocated directly (they are in a holding experiment), but assign deals
......@@ -896,18 +919,6 @@ foreach $node (keys(%nodes)) {
# physnode.
#
if ($widearea && ! defined($component_name)) {
#
# Set up 'the Internet' as a fake switch that all widearea nodes can
# talk to.
# Some day, it may make sense to connect control net ports to this
# switch.
#
my $fake_inet_switch = "internet";
my @inet_protos = ("ipv4");
my @types = map("*$_:*", @inet_protos);
print_node($fake_inet_switch, \@types, [], [], undef, [], undef, undef,
undef);
#
# Note - there is currently an assumption in this query that widearea nodes
# have only one control interface.
......@@ -1037,7 +1048,7 @@ if ($widearea && ! defined($component_name)) {
#
if ($iface) {
print_simple_link($physnode, $iface,
$fake_inet_switch, "(null)",
$fake_inet_switch, $fake_inet_iface,
100000, 0, 0, @inet_protos);
}
......@@ -1046,6 +1057,21 @@ if ($widearea && ! defined($component_name)) {
}
}
if ($genimode) {
foreach $key (keys %interfaceroles) {
if (is_public_interface($key)) {
$key =~ /^([^:]+):([^:]+)$/;
my $node = $1;
my $iface = $2;
if (defined($nodes{$node})) {
print_simple_link($node, $iface,
$fake_inet_switch, $fake_inet_iface,
100000, 0, 0, @inet_protos);
}
}
}
}
# Read interface types. First need to find the protocols an interface supports
# and then then the speed for each of those protocols.
# Note that we are going to assume anything attached to a switch is ethernet.
......@@ -1490,6 +1516,11 @@ sub print_node
else {
print " <exclusive>true</exclusive>\n";
}
if ($name eq $fake_inet_switch)
{
print " <cloud />\n";
print " <interface component_id=\"".$fake_inet_iface."\" />\n";
}
if (defined($lat) && defined($long)) {
# TODO: May not be a good default for country
if (!defined($country) || $country eq "") {
......@@ -1588,6 +1619,54 @@ sub print_node_flags
}
}
sub make_ip
{
my $in = shift(@_);
my @octets = split(/\./, $in);
my $result = 0;
my $i = 0;
for (; $i < scalar(@octets); ++$i) {
$result = (($result << 8) | $octets[$i]);
}
return $result;
}
sub is_routable
{
my @privateIps = (make_ip("10.0.0.0"), make_ip("172.16.0.0"),
make_ip("192.168.0.0"));
my @privateMasks = (8, 12, 16);
my $in = shift(@_);
my $result = 0;
if (defined($in) && $in =~ /\d+\.\d+\.\d+\.\d+/) {
$result = 1;
my $ip = make_ip($in);
my $i = 0;
for ($i = 0; $i < scalar(@privateIps); ++$i) {
my $mask = (0xffffffff << (32 - $privateMasks[$i]));
if (($ip & $mask) == ($privateIps[$i] & $mask)) {
$result = 0;
}
}
}
return $result;
}
sub is_public_interface
{
my $key = shift(@_);
my $result = 0;
if (exists($interfaceroles{$key})
&& exists($interfaceips{$key})) {
if ($interfaceroles{$key} eq "ctrl"
&& is_routable($interfaceips{$key})) {
$result = 1;
}
}
return $result;
}
sub print_node_interfaces
{
my $nodeName = shift(@_);
......@@ -1597,13 +1676,13 @@ sub print_node_interfaces
my $name = $interfaces[$i];
my $urn = GeniHRN::GenerateInterface($OURDOMAIN, $nodeName, $name);
print " <interface component_id=\"$urn\" ";
if (exists($interfaceroles{"$nodeName:$name"}))
{
my $role = $interfaceroles{"$nodeName:$name"};
if ($role eq "ctrl")
{
print "role=\"control\" ";
}
if (exists($interfaceroles{"$nodeName:$name"})
&& $interfaceroles{"$nodeName:$name"} eq "ctrl") {
print "role=\"control\" ";
}
if (is_public_interface("$nodeName:$name")) {
my $ip = $interfaceips{"$nodeName:$name"};
print "public_ipv4=\"$ip\" ";
}
print "/>\n";
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment