Skip navigation.
Home
A virtual network infrastructure
PlanetLab logo
Powered by PlanetLab

Understanding PL-VINI and IIAS

NOTE: As part of the Abilene upgrade to NewNet, the PlanetLab Abilene nodes are currently being decomissioned and replaced by VINI nodes. As a result, the abilene_pl.rb configuration cannot actually be run at this time. The following is still useful for understanding virtual networks built with the PL-VINI/IIAS tools. We will provide a new VINI Abilene configuration once the VINI rollout is complete.

As described here, the PL-VINI/IIAS control and data planes can be configured in a number of different ways. This page looks at several configurations and explains the functionality each provides. All are variations of the Abilene virtual network configured using config/abilene_pl.rb, which assigns OSPF link costs to each virtual link identical to those used to manage the real Abilene network.


All configurations

In all PL-VINI configurations, four things remain the same: the way that network interfaces are created in UML, the mapping of DNS names to IP addresses, the NAPT setup, and the IP addresses assigned to OpenVPN clients.

UML network interfaces

Virtual network interfaces in UML are created as follows.

  • eth0 is used for communicating with the PlanetLab machine's tap0 interface and the OpenVPN clients. It always has an IP address one more than that of tap0 interface; for example, if tap0 has an address of 10.1.89.1, then eth0 will be 10.1.89.2. It is attached to a /24 network.
  • eth1 is used to send packets through the NAPT egress and out onto the network. It has an IP address of 192.168.X.99 (where X is assigned by the configuration scripts) and is attached to a /24 network. External destinations associated with the NAPT egress are not directly reachable on this /24 network and so a next hop of 192.168.X.1 is associated with this interface. Packets sent to this next hop traverse the NAPT.
  • eth2..ethN represent tunnels to adjacent nodes in the topology. Each virtual link has its own 192.168.X.0/24 network (where X is assigned by the configuration scripts); the endpoints have IP addresses of 192.168.X.2 and 192.168.X.3.

So, for example, this is what ifconfig displays on the Washington D.C. node in the Abilene virtual network, which directly connects to nodes in Atlanta (on eth2) and New York (on eth3):

bash-2.05b# ifconfig
eth0      Link encap:Ethernet  HWaddr FE:FD:0A:00:DA:02
          inet addr:10.0.218.2  Bcast:10.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5

eth1      Link encap:Ethernet  HWaddr FE:FD:C0:A8:7C:63
          inet addr:192.168.124.99  Bcast:192.168.124.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5

eth2      Link encap:Ethernet  HWaddr FE:FD:C0:A8:66:03
          inet addr:192.168.102.3  Bcast:192.168.102.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5

eth3      Link encap:Ethernet  HWaddr FE:FD:C0:A8:70:03
          inet addr:192.168.112.3  Bcast:192.168.112.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Mapping names to IP addresses

The scripts generate an /etc/hosts file that maps an interface's IP address to a name. The format of the name is the interface name plus the node's label attribute. For example, if the PL-VINI node running on machine planetlab1.wash.internet2.planet-lab.org has a label of wash, then its eth2 interface is assigned a name of eth2.wash. This mapping of IP address to names is solely for the convenience of the experimenter, and can be changed without impacting PL-VINI.

External destinations via NAPT

The eth1 interface on each node is used to contact any external destinations for which that node has been configured as an egress. Any TCP, UDP, or ICMP packet sent out on this interface to the associated next hop address will traverse the NAPT (Network Address and Port Translation) gateway in Click and be sent on the network to its destination. For example, we can manually add Princeton's network as an external destination, and then download the CS department's welcome page, as follows:

bash-2.05b# route add -net 128.112.0.0 netmask 255.255.0.0 gw 192.168.121.1
bash-2.05b# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.112.0   *               255.255.255.0   U     0      0        0 eth3
10.0.114.0      *               255.255.255.0   U     0      0        0 eth0
192.168.104.0   *               255.255.255.0   U     0      0        0 eth2
192.168.121.0   *               255.255.255.0   U     0      0        0 eth1
128.112.0.0     192.168.121.1   255.255.0.0     UG    0      0        0 eth1
10.0.0.0        tap0.nycm       255.0.0.0       UG    0      0        0 eth0
bash-2.05b# wget http://128.112.136.35/index.php/Main_Page
--12:34:17--  http://128.112.136.35/index.php/Main_Page
           => `Main_Page'
Connecting to 128.112.136.35:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]

    [ <=>                                 ] 10,476        --.--K/s

12:34:18 (2.19 MB/s) - `Main_Page' saved [10,476]

XORP and Quagga automatically add entries such as these to the routing table to reach external destinations configured with the add_nat_dests Node method.

OpenVPN clients

OpenVPN clients participate in an experiment by connecting to an OpenVPN server running on one of the experiment nodes. The OpenVPN server running on a node assigns IP addresses to clients from the /24 of the local tap0 interface. For example, if tap0 has an IP address of 10.1.89.1, then the OpenVPN server will be 10.1.89.5 and the first client to connect will be assigned 10.1.89.6. Note that the OpenVPN server does not respond to pings on its IP address.

The OpenVPN server pushes out routes to 10.0.0.0/8 and to its configured external destinations (i.e., reachable via NAPT on eth1) to its connected clients. This means that the clients should be able to reach all of these addresses as long as the experiment provides inter-node connectivity. For example, the addresses will be reachable when running OSPF using Quagga or XORP.


No routing software

Global variables:

$router = "none"

With this configuration, each UML kernel only has connectivity to its direct neighbors. For example, here is the routing table on the Washington D.C. node:

bash-2.05b# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.102.0   *               255.255.255.0   U     0      0        0 eth2
192.168.112.0   *               255.255.255.0   U     0      0        0 eth3
192.168.124.0   *               255.255.255.0   U     0      0        0 eth1
10.0.218.0      *               255.255.255.0   U     0      0        0 eth0
10.0.0.0        tap0.wash       255.0.0.0       UG    0      0        0 eth0

Only the directly connected interfaces on the Atlanta and New York neighbors are reachable:

bash-2.05b# traceroute 192.168.102.2
traceroute to 192.168.102.2 (192.168.102.2), 30 hops max, 38 byte packets
 1  eth4.atla (192.168.102.2)  17.754 ms  17.476 ms  17.464 ms
bash-2.05b# traceroute 192.168.112.2
traceroute to 192.168.112.2 (192.168.112.2), 30 hops max, 38 byte packets
 1  eth3.nycm (192.168.112.2)  5.955 ms  5.746 ms  5.539 ms

Note that the 10.0.0.0/8 route is inactive in this configuration.


Quagga running OSPF

Global variables:

$router = "Quagga"

Quagga produces no output to the console. A few seconds after UML boots up, Quagga will insert destinations it learns of from OSPF into the local routing table. For example, on the Washington D.C. node:

bash-2.05b# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.141.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
10.0.218.0      *               255.255.255.0   U     0      0        0 eth0
10.0.217.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
10.0.221.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
10.0.245.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
10.0.248.0      eth4.atla       255.255.255.0   UG    20     0        0 eth2
10.0.253.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
192.168.100.0   eth4.atla       255.255.255.0   UG    2022   0        0 eth2
192.168.101.0   eth4.atla       255.255.255.0   UG    1433   0        0 eth2
192.168.102.0   *               255.255.255.0   U     0      0        0 eth2
192.168.103.0   eth3.nycm       255.255.255.0   UG    1193   0        0 eth3
192.168.108.0   eth3.nycm       255.255.255.0   UG    2643   0        0 eth3
192.168.109.0   eth4.atla       255.255.255.0   UG    3915   0        0 eth2
192.168.110.0   eth3.nycm       255.255.255.0   UG    1741   0        0 eth3
192.168.111.0   eth3.nycm       255.255.255.0   UG    4041   0        0 eth3
192.168.104.0   eth3.nycm       255.255.255.0   UG    933    0        0 eth3
192.168.105.0   eth3.nycm       255.255.255.0   UG    2380   0        0 eth3
192.168.106.0   eth3.nycm       255.255.255.0   UG    3675   0        0 eth3
192.168.107.0   eth3.nycm       255.255.255.0   UG    4475   0        0 eth3
192.168.116.0   eth3.nycm       255.255.255.0   UG    2390   0        0 eth3
192.168.117.0   eth4.atla       255.255.255.0   UG    2032   0        0 eth2
192.168.118.0   eth3.nycm       255.255.255.0   UG    1203   0        0 eth3
192.168.119.0   eth3.nycm       255.255.255.0   UG    1751   0        0 eth3
192.168.112.0   *               255.255.255.0   U     0      0        0 eth3
192.168.113.0   eth3.nycm       255.255.255.0   UG    4531   0        0 eth3
192.168.114.0   eth4.atla       255.255.255.0   UG    856    0        0 eth2
192.168.115.0   eth3.nycm       255.255.255.0   UG    943    0        0 eth3
192.168.124.0   *               255.255.255.0   U     0      0        0 eth1
192.168.120.0   eth4.atla       255.255.255.0   UG    3925   0        0 eth2
192.168.121.0   eth3.nycm       255.255.255.0   UG    243    0        0 eth3
192.168.122.0   eth3.nycm       255.255.255.0   UG    3685   0        0 eth3
192.168.123.0   eth3.nycm       255.255.255.0   UG    4485   0        0 eth3
10.1.88.0       eth4.atla       255.255.255.0   UG    20     0        0 eth2
10.1.89.0       eth4.atla       255.255.255.0   UG    20     0        0 eth2
10.0.117.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
10.0.114.0      eth3.nycm       255.255.255.0   UG    20     0        0 eth3
130.207.0.0     eth4.atla       255.255.0.0     UG    20     0        0 eth2
128.252.0.0     eth3.nycm       255.255.0.0     UG    20     0        0 eth3
10.0.0.0        tap0.wash       255.0.0.0       UG    0      0        0 eth0

Note that now all active IP addresses in the 10.0.0.0/8 network are now reachable. For example, we can traceroute to the Seattle node and see the UML network interfaces that the packet traverses:

bash-2.05b# traceroute eth0.sttl
traceroute to eth0.sttl (10.0.141.2), 30 hops max, 38 byte packets
 1  eth3.nycm (192.168.112.2)  5.986 ms  5.783 ms  5.556 ms
 2  eth3.chin (192.168.104.2)  29.076 ms  28.730 ms  28.921 ms
 3  eth3.ipls (192.168.103.3)  33.610 ms  33.873 ms  33.654 ms
 4  eth4.kscy (192.168.110.3)  43.849 ms  44.023 ms  44.059 ms
 5  eth2.dnvr (192.168.105.2)  55.928 ms  56.551 ms  56.620 ms
 6  eth0.sttl (10.0.141.2)  93.567 ms  95.746 ms  93.567 ms


XORP running OSPF

There are two ways to configure the IP data plane with XORP: with IP forwarding performed by UML or by Click. Each case is discussed separately below.

IP forwarding in UML

Global variables:

$router = "XORP"
$click_forwarding = false

This configuration looks much like the Quagga case, except that XORP spits out lots of messages when it is starting up. XORP has successfully initialized once it reports: No more tasks to run; at this point it will start inserting entries into the routing table. For example, on the Washington D.C. node:

bash-2.05b# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0   eth4.atla       255.255.255.0   UG    2022   0        0 eth2
192.168.101.0   eth4.atla       255.255.255.0   UG    1433   0        0 eth2
10.0.117.0      eth3.nycm       255.255.255.0   UG    1193   0        0 eth3
192.168.102.0   *               255.255.255.0   U     0      0        0 eth2
192.168.103.0   eth3.nycm       255.255.255.0   UG    1193   0        0 eth3
192.168.112.0   *               255.255.255.0   U     0      0        0 eth3
192.168.113.0   eth3.nycm       255.255.255.0   UG    4531   0        0 eth3
10.0.114.0      eth3.nycm       255.255.255.0   UG    233    0        0 eth3
10.1.88.0       eth4.atla       255.255.255.0   UG    2022   0        0 eth2
10.0.245.0      eth3.nycm       255.255.255.0   UG    2380   0        0 eth3
10.1.89.0       eth4.atla       255.255.255.0   UG    846    0        0 eth2
192.168.108.0   eth3.nycm       255.255.255.0   UG    2643   0        0 eth3
192.168.124.0   *               255.255.255.0   U     0      0        0 eth1
10.0.218.0      *               255.255.255.0   U     0      0        0 eth0
192.168.109.0   eth4.atla       255.255.255.0   UG    3915   0        0 eth2
192.168.110.0   eth3.nycm       255.255.255.0   UG    1741   0        0 eth3
192.168.111.0   eth3.nycm       255.255.255.0   UG    4041   0        0 eth3
10.0.248.0      eth4.atla       255.255.255.0   UG    3915   0        0 eth2
10.0.217.0      eth3.nycm       255.255.255.0   UG    933    0        0 eth3
192.168.104.0   eth3.nycm       255.255.255.0   UG    933    0        0 eth3
192.168.105.0   eth3.nycm       255.255.255.0   UG    2380   0        0 eth3
10.0.141.0      eth3.nycm       255.255.255.0   UG    4475   0        0 eth3
192.168.106.0   eth3.nycm       255.255.255.0   UG    3675   0        0 eth3
10.0.253.0      eth3.nycm       255.255.255.0   UG    3675   0        0 eth3
192.168.107.0   eth3.nycm       255.255.255.0   UG    4475   0        0 eth3
10.0.221.0      eth3.nycm       255.255.255.0   UG    1741   0        0 eth3
130.207.0.0     eth4.atla       255.255.0.0     UG    846    0        0 eth2
128.252.0.0     eth3.nycm       255.255.0.0     UG    1193   0        0 eth3
10.0.0.0        tap0.wash       255.0.0.0       UG    0      0        0 eth0

One difference between the XORP and Quagga configuration is that XORP does not advertise a route to the local eth1 interface, and so there are a few less entries in the routing table. Now all active address in the 10.0.0.0/8 network should be reachable; for example, we can traceroute the Seattle node from Washington D.C.:

bash-2.05b# traceroute eth0.sttl
traceroute to eth0.sttl (10.0.141.2), 30 hops max, 38 byte packets
 1  eth3.nycm (192.168.112.2)  6.021 ms  5.720 ms  5.701 ms
 2  eth3.chin (192.168.104.2)  28.995 ms  29.215 ms  28.846 ms
 3  eth3.ipls (192.168.103.3)  33.577 ms  33.850 ms  34.095 ms
 4  eth4.kscy (192.168.110.3)  44.403 ms  44.652 ms  44.340 ms
 5  eth2.dnvr (192.168.105.2)  55.832 ms  55.892 ms  55.766 ms
 6  eth0.sttl (10.0.141.2)  93.517 ms  94.374 ms  94.823 ms

IP forwarding in Click

Global variables:

$router = "XORP"
$click_forwarding = true

The key difference between this configuration and the previous one is that now Click forwards the IP packets instead of UML. This reduces overhead on the forwarding path, leading to lower latency and increased throughput.

The UML kernel's routing table looks exactly the same as before, but UML is not actually forwarding the packets. Rather, XORP duplicates the kernel routing table entries it inserts into Click. You can telnet into Click on the $click_port you specified in the experiment configuration and inspect its routing table directly. On the Washington D.C. node:

bash-2.05b# telnet tap0.wash 13653
Trying 10.0.218.1...
Connected to tap0.wash.
Escape character is '^]'.
Click::ControlSocket/1.1
read _xorp_rt4.table
200 Read handler '_xorp_rt4.table' OK
DATA 961
10.0.218.2/32           -               4
10.0.218.1/32           -               5
192.168.124.99/32       -               6
192.168.102.3/32        -               7
192.168.112.3/32        -               8
10.0.218.0/24           -               0
192.168.124.0/24        -               1
192.168.102.0/24        -               2
192.168.112.0/24        -               3
10.0.114.0/24           192.168.112.2   3
10.0.117.0/24           192.168.112.2   3
10.0.141.0/24           192.168.112.2   3
10.0.217.0/24           192.168.112.2   3
10.0.221.0/24           192.168.112.2   3
10.0.245.0/24           192.168.112.2   3
10.0.248.0/24           192.168.102.2   2
10.0.253.0/24           192.168.112.2   3
10.1.88.0/24            192.168.102.2   2
10.1.89.0/24            192.168.102.2   2
128.252.0.0/16          192.168.112.2   3
130.207.0.0/16          192.168.102.2   2
192.168.100.0/24        192.168.102.2   2
192.168.101.0/24        192.168.102.2   2
192.168.103.0/24        192.168.112.2   3
192.168.104.0/24        192.168.112.2   3
192.168.105.0/24        192.168.112.2   3
192.168.106.0/24        192.168.112.2   3
192.168.107.0/24        192.168.112.2   3
192.168.108.0/24        192.168.112.2   3
192.168.109.0/24        192.168.102.2   2
192.168.110.0/24        192.168.112.2   3
192.168.111.0/24        192.168.112.2   3
192.168.113.0/24        192.168.112.2   3

The first column in this table shows the destination, the second is the next hop, and the third is an index that corresponds to the Ethernet interface (e.g., index 3 corresponds to eth3). Above, entries with indices ≤ 3 are mirrored from the UML kernel routing table; entries with higher indices are used internally by the Click forwarder.

The output of traceroute shows that Click is actually forwarding the packets. Hops beginning with "fea" are responses from Click's forwarding engine. Again, on the Washington D.C. node:

bash-2.05b# traceroute eth0.sttl
traceroute to eth0.sttl (10.0.141.2), 30 hops max, 38 byte packets
 1  fea.wash (10.0.218.3)  0.692 ms  0.628 ms  0.476 ms
 2  fea.nycm (10.0.114.3)  5.500 ms  5.376 ms  5.241 ms
 3  fea.chin (10.0.217.3)  27.735 ms  27.769 ms  27.795 ms
 4  fea.ipls (10.0.117.3)  32.174 ms  32.159 ms  32.022 ms
 5  fea.kscy (10.0.221.3)  41.719 ms  41.928 ms  42.146 ms
 6  fea.dnvr (10.0.245.3)  53.108 ms  52.990 ms  53.059 ms
 7  fea.sttl (10.0.141.3)  89.924 ms  90.080 ms  89.781 ms
 8  eth0.sttl (10.0.141.2)  90.538 ms  90.359 ms  90.457 ms

Comparing this traceroute with one where UML forwards the packets, we note two things. First, the path reports two extra hops, corresponding to the Click forwarder on the Washington D.C. and Seattle nodes. On every node, an IP packet first passes through the Click forwarder before being forwarded up to UML or out to a tunnel; traceroute makes this behavior explicit. Second, forwarding in Click instead of UML shaves off about 0.5ms latency for each virtual router that the packet traverses.


[ Prev][ Top ][ Next ]