Work toward common IP address classes.

 * Updated classes PortAddresses (in core/api) and Interface (in sdnip)
   to use class InterfaceIpAddress instead of IpPrefix
 * Updated corresponding unit tests and relevant code
 * Minor refactoring inside ProxyArpManager to simplify some of the
   logic and usage related to PortAddresses. Also, renamed
   method findOutsidePortInSubnet() to findPortInSubnet() and updated
   its implementation to reflect better its usage.
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
index 6864fd7..c20da19 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
@@ -31,10 +31,12 @@
 import org.onlab.onos.net.host.HostProvider;
 import org.onlab.onos.net.host.HostProviderRegistry;
 import org.onlab.onos.net.host.HostProviderService;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.store.trivial.impl.SimpleHostStore;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -68,9 +70,15 @@
     private static final ConnectPoint CP1 = new ConnectPoint(DID1, P1);
     private static final ConnectPoint CP2 = new ConnectPoint(DID2, P2);
 
-    private static final IpPrefix PREFIX1 = IpPrefix.valueOf("10.0.1.0/24");
-    private static final IpPrefix PREFIX2 = IpPrefix.valueOf("10.1.0.0/16");
-    private static final IpPrefix PREFIX3 = IpPrefix.valueOf("5.8.2.0/23");
+    private static final InterfaceIpAddress IA1 =
+        new InterfaceIpAddress(IpAddress.valueOf("10.1.1.1"),
+                               IpPrefix.valueOf("10.1.1.0/24"));
+    private static final InterfaceIpAddress IA2 =
+        new InterfaceIpAddress(IpAddress.valueOf("10.2.2.2"),
+                               IpPrefix.valueOf("10.2.0.0/16"));
+    private static final InterfaceIpAddress IA3 =
+        new InterfaceIpAddress(IpAddress.valueOf("10.3.3.3"),
+                               IpPrefix.valueOf("10.3.3.0/24"));
 
     private HostManager mgr;
 
@@ -207,23 +215,24 @@
 
     @Test
     public void bindAddressesToPort() {
-        PortAddresses add1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+        PortAddresses add1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
         PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(add1.ips().equals(storedAddresses.ips()));
+        assertTrue(add1.ipAddresses().equals(storedAddresses.ipAddresses()));
         assertTrue(add1.mac().equals(storedAddresses.mac()));
 
         // Add some more addresses and check that they're added correctly
-        PortAddresses add2 = new PortAddresses(CP1, Sets.newHashSet(PREFIX3), null);
+        PortAddresses add2 =
+            new PortAddresses(CP1, Sets.newHashSet(IA3),  null);
 
         mgr.bindAddressesToPort(add2);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().equals(
-                Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
+        assertTrue(storedAddresses.ipAddresses().equals(
+                Sets.newHashSet(IA1, IA2, IA3)));
         assertTrue(storedAddresses.mac().equals(MAC1));
 
         PortAddresses add3 = new PortAddresses(CP1, null, MAC2);
@@ -231,29 +240,29 @@
         mgr.bindAddressesToPort(add3);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().equals(
-                Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
+        assertTrue(storedAddresses.ipAddresses().equals(
+                Sets.newHashSet(IA1, IA2, IA3)));
         assertTrue(storedAddresses.mac().equals(MAC2));
     }
 
     @Test
     public void unbindAddressesFromPort() {
-        PortAddresses add1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+        PortAddresses add1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
         PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().size() == 2);
+        assertTrue(storedAddresses.ipAddresses().size() == 2);
         assertNotNull(storedAddresses.mac());
 
-        PortAddresses rem1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1), null);
+        PortAddresses rem1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1), null);
 
         mgr.unbindAddressesFromPort(rem1);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
+        assertTrue(storedAddresses.ipAddresses().equals(Sets.newHashSet(IA2)));
         assertTrue(storedAddresses.mac().equals(MAC1));
 
         PortAddresses rem2 = new PortAddresses(CP1, null, MAC1);
@@ -261,47 +270,48 @@
         mgr.unbindAddressesFromPort(rem2);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
+        assertTrue(storedAddresses.ipAddresses().equals(Sets.newHashSet(IA2)));
         assertNull(storedAddresses.mac());
 
-        PortAddresses rem3 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX2), MAC1);
+        PortAddresses rem3 =
+            new PortAddresses(CP1, Sets.newHashSet(IA2), MAC1);
 
         mgr.unbindAddressesFromPort(rem3);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().isEmpty());
+        assertTrue(storedAddresses.ipAddresses().isEmpty());
         assertNull(storedAddresses.mac());
     }
 
     @Test
     public void clearAddresses() {
-        PortAddresses add1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+        PortAddresses add1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
         PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().size() == 2);
+        assertTrue(storedAddresses.ipAddresses().size() == 2);
         assertNotNull(storedAddresses.mac());
 
         mgr.clearAddresses(CP1);
         storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
-        assertTrue(storedAddresses.ips().isEmpty());
+        assertTrue(storedAddresses.ipAddresses().isEmpty());
         assertNull(storedAddresses.mac());
     }
 
     @Test
     public void getAddressBindingsForPort() {
-        PortAddresses add1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+        PortAddresses add1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
         PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
 
         assertTrue(storedAddresses.connectPoint().equals(CP1));
-        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX1, PREFIX2)));
+        assertTrue(storedAddresses.ipAddresses().equals(
+                        Sets.newHashSet(IA1, IA2)));
         assertTrue(storedAddresses.mac().equals(MAC1));
     }
 
@@ -311,8 +321,8 @@
 
         assertTrue(storedAddresses.isEmpty());
 
-        PortAddresses add1 = new PortAddresses(CP1,
-                                               Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+        PortAddresses add1 =
+            new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1);
 
         mgr.bindAddressesToPort(add1);
 
@@ -320,8 +330,8 @@
 
         assertTrue(storedAddresses.size() == 1);
 
-        PortAddresses add2 = new PortAddresses(CP2,
-                                               Sets.newHashSet(PREFIX3), MAC2);
+        PortAddresses add2 =
+            new PortAddresses(CP2, Sets.newHashSet(IA3), MAC2);
 
         mgr.bindAddressesToPort(add2);
 
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
index 7fc6b8c..4b9d214 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
@@ -28,6 +28,7 @@
 import org.onlab.onos.net.flow.instructions.Instruction;
 import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
 import org.onlab.onos.net.host.HostProvider;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.packet.OutboundPacket;
 import org.onlab.onos.net.packet.PacketProcessor;
@@ -48,7 +49,10 @@
     private IpAddress targetIpAddress = IpAddress.valueOf("10.0.0.1");
     private IpPrefix targetIpPrefix = IpPrefix.valueOf(targetIpAddress.toOctets());
 
-    private IpPrefix sourcePrefix = IpPrefix.valueOf("10.0.0.99/24");
+    private static final IpAddress SOURCE_ADDR =
+        IpAddress.valueOf("10.0.0.99");
+    private static final InterfaceIpAddress IA1 =
+        new InterfaceIpAddress(SOURCE_ADDR, IpPrefix.valueOf("10.0.0.0/24"));
     private MacAddress sourceMac = MacAddress.valueOf(1L);
 
     private HostMonitor hostMonitor;
@@ -108,8 +112,8 @@
         deviceService.addDevice(device, Collections.singleton(port));
 
         ConnectPoint cp = new ConnectPoint(devId, portNum);
-        PortAddresses pa = new PortAddresses(cp, Collections.singleton(sourcePrefix),
-                sourceMac);
+        PortAddresses pa =
+            new PortAddresses(cp, Collections.singleton(IA1), sourceMac);
 
         expect(hostManager.getHostsByIp(targetIpPrefix))
                 .andReturn(Collections.<Host>emptySet()).anyTimes();
@@ -143,7 +147,8 @@
         Ethernet eth = new Ethernet();
         eth.deserialize(packet.data().array(), 0, packet.data().array().length);
         ARP arp = (ARP) eth.getPayload();
-        assertTrue(Arrays.equals(arp.getSenderProtocolAddress(), sourcePrefix.toOctets()));
+        assertTrue(Arrays.equals(arp.getSenderProtocolAddress(),
+                                 SOURCE_ADDR.toOctets()));
         assertTrue(Arrays.equals(arp.getSenderHardwareAddress(), sourceMac.toBytes()));
         assertTrue(Arrays.equals(arp.getTargetProtocolAddress(), targetIpPrefix.toOctets()));
     }
diff --git a/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
index fa68761..76bf021 100644
--- a/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/proxyarp/impl/ProxyArpManagerTest.java
@@ -32,6 +32,7 @@
 import org.onlab.onos.net.flow.instructions.Instruction;
 import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
 import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.link.LinkListener;
 import org.onlab.onos.net.link.LinkService;
@@ -41,6 +42,7 @@
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.packet.ARP;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -186,10 +188,15 @@
 
         for (int i = 1; i <= NUM_ADDRESS_PORTS; i++) {
             ConnectPoint cp = new ConnectPoint(getDeviceId(i), P1);
-            IpPrefix prefix1 = IpPrefix.valueOf("10.0." + (2 * i - 1) + ".1/24");
-            IpPrefix prefix2 = IpPrefix.valueOf("10.0." + (2 * i) + ".1/24");
-            PortAddresses pa = new PortAddresses(cp,
-                    Sets.newHashSet(prefix1, prefix2), MacAddress.valueOf(i));
+            IpPrefix prefix1 = IpPrefix.valueOf("10.0." + (2 * i - 1) + ".0/24");
+            IpAddress addr1 = IpAddress.valueOf("10.0." + (2 * i - 1) + ".1");
+            IpPrefix prefix2 = IpPrefix.valueOf("10.0." + (2 * i) + ".0/24");
+            IpAddress addr2 = IpAddress.valueOf("10.0." + (2 * i) + ".1");
+            InterfaceIpAddress ia1 = new InterfaceIpAddress(addr1, prefix1);
+            InterfaceIpAddress ia2 = new InterfaceIpAddress(addr2, prefix2);
+            PortAddresses pa =
+                new PortAddresses(cp, Sets.newHashSet(ia1, ia2),
+                                  MacAddress.valueOf(i));
             addresses.add(pa);
 
             expect(hostService.getAddressBindingsForPort(cp))