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/apps/sdnip/src/main/java/org/onlab/onos/sdnip/HostToInterfaceAdaptor.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/HostToInterfaceAdaptor.java
index 5dc2d1f..a02ce27 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/HostToInterfaceAdaptor.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/HostToInterfaceAdaptor.java
@@ -24,10 +24,10 @@
 
 import org.onlab.onos.net.ConnectPoint;
 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.sdnip.config.Interface;
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
 
 import com.google.common.collect.Sets;
 
@@ -59,7 +59,7 @@
         PortAddresses portAddresses =
                 hostService.getAddressBindingsForPort(connectPoint);
 
-        if (!portAddresses.ips().isEmpty()) {
+        if (!portAddresses.ipAddresses().isEmpty()) {
             return new Interface(portAddresses);
         }
 
@@ -71,8 +71,8 @@
         checkNotNull(ipAddress);
 
         for (PortAddresses portAddresses : hostService.getAddressBindings()) {
-            for (IpPrefix p : portAddresses.ips()) {
-                if (p.contains(ipAddress)) {
+            for (InterfaceIpAddress ia : portAddresses.ipAddresses()) {
+                if (ia.subnetAddress().contains(ipAddress)) {
                     return new Interface(portAddresses);
                 }
             }
diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java
index 52c4cde..829cffa 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java
@@ -22,8 +22,8 @@
 import java.util.Set;
 
 import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.host.PortAddresses;
-import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 
 import com.google.common.base.MoreObjects;
@@ -35,21 +35,22 @@
  */
 public class Interface {
     private final ConnectPoint connectPoint;
-    private final Set<IpPrefix> ipAddresses;
+    private final Set<InterfaceIpAddress> ipAddresses;
     private final MacAddress macAddress;
 
     /**
-     * Creates an Interface based on a connection point, a set of IP addresses
-     * and a MAC address.
+     * Creates an Interface based on a connection point, a set of interface
+     * IP addresses, and a MAC address.
      *
      * @param connectPoint the connect point this interface is mapped to
-     * @param prefixAddress the IP addresses for the interface
+     * @param ipAddresses the IP addresses for the interface
      * @param macAddress the MAC address of the interface
      */
-    public Interface(ConnectPoint connectPoint, Set<IpPrefix> prefixAddress,
+    public Interface(ConnectPoint connectPoint,
+                     Set<InterfaceIpAddress> ipAddresses,
                      MacAddress macAddress) {
         this.connectPoint = connectPoint;
-        this.ipAddresses = Sets.newHashSet(prefixAddress);
+        this.ipAddresses = Sets.newHashSet(ipAddresses);
         this.macAddress = macAddress;
     }
 
@@ -60,7 +61,7 @@
      */
     public Interface(PortAddresses portAddresses) {
         connectPoint = portAddresses.connectPoint();
-        ipAddresses = Sets.newHashSet(portAddresses.ips());
+        ipAddresses = Sets.newHashSet(portAddresses.ipAddresses());
         macAddress = portAddresses.mac();
     }
 
@@ -76,9 +77,9 @@
     /**
      * Retrieves the set of IP addresses that are assigned to the interface.
      *
-     * @return the set of IP addresses
+     * @return the set of interface IP addresses
      */
-   public Set<IpPrefix> ips() {
+   public Set<InterfaceIpAddress> ipAddresses() {
         return ipAddresses;
     }
 
diff --git a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/HostToInterfaceAdaptorTest.java b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/HostToInterfaceAdaptorTest.java
index e9a8420..a42cd87 100644
--- a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/HostToInterfaceAdaptorTest.java
+++ b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/HostToInterfaceAdaptorTest.java
@@ -35,6 +35,7 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.PortNumber;
 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.sdnip.config.Interface;
 import org.onlab.packet.IpAddress;
@@ -76,20 +77,33 @@
         portAddresses = Sets.newHashSet();
         interfaces = Maps.newHashMap();
 
+        InterfaceIpAddress ia11 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.1.1"),
+                                   IpPrefix.valueOf("192.168.1.0/24"));
         createPortAddressesAndInterface(CP1,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.1.1/24")),
+                Sets.newHashSet(ia11),
                 MacAddress.valueOf("00:00:00:00:00:01"));
 
         // Two addresses in the same subnet
+        InterfaceIpAddress ia21 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.2.1"),
+                                   IpPrefix.valueOf("192.168.2.0/24"));
+        InterfaceIpAddress ia22 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.2.2"),
+                                   IpPrefix.valueOf("192.168.2.0/24"));
         createPortAddressesAndInterface(CP2,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.2.1/24"),
-                        IpPrefix.valueOf("192.168.2.2/24")),
+                Sets.newHashSet(ia21, ia22),
                 MacAddress.valueOf("00:00:00:00:00:02"));
 
         // Two addresses in different subnets
+        InterfaceIpAddress ia31 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.3.1"),
+                                   IpPrefix.valueOf("192.168.3.0/24"));
+        InterfaceIpAddress ia41 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.4.1"),
+                                   IpPrefix.valueOf("192.168.4.0/24"));
         createPortAddressesAndInterface(CP3,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.3.1/24"),
-                        IpPrefix.valueOf("192.168.4.1/24")),
+                Sets.newHashSet(ia31, ia41),
                 MacAddress.valueOf("00:00:00:00:00:03"));
 
         expect(hostService.getAddressBindings()).andReturn(portAddresses).anyTimes();
@@ -104,16 +118,17 @@
      * places them in the correct global data stores.
      *
      * @param cp the connect point
-     * @param ips the set of IP addresses
+     * @param ipAddresses the set of interface IP addresses
      * @param mac the MAC address
      */
     private void createPortAddressesAndInterface(
-            ConnectPoint cp, Set<IpPrefix> ips, MacAddress mac) {
-        PortAddresses pa = new PortAddresses(cp, ips, mac);
+            ConnectPoint cp, Set<InterfaceIpAddress> ipAddresses,
+            MacAddress mac) {
+        PortAddresses pa = new PortAddresses(cp, ipAddresses, mac);
         portAddresses.add(pa);
         expect(hostService.getAddressBindingsForPort(cp)).andReturn(pa).anyTimes();
 
-        Interface intf = new Interface(cp, ips, mac);
+        Interface intf = new Interface(cp, ipAddresses, mac);
         interfaces.put(cp, intf);
     }
 
diff --git a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/PeerConnectivityManagerTest.java b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/PeerConnectivityManagerTest.java
index e3e4896..832989f 100644
--- a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/PeerConnectivityManagerTest.java
+++ b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/PeerConnectivityManagerTest.java
@@ -31,6 +31,7 @@
 import org.onlab.onos.net.flow.DefaultTrafficTreatment;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.intent.IntentService;
 import org.onlab.onos.net.intent.PointToPointIntent;
 import org.onlab.onos.sdnip.bgp.BgpConstants;
@@ -175,14 +176,20 @@
         configuredInterfaces = new HashMap<>();
 
         String interfaceSw1Eth1 = "s1-eth1";
+        InterfaceIpAddress ia1 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.10.1"),
+                                   IpPrefix.valueOf("192.168.10.0/24"));
         Interface intfsw1eth1 = new Interface(s1Eth1,
-                Collections.singleton(IpPrefix.valueOf("192.168.10.0/24")),
+                Collections.singleton(ia1),
                 MacAddress.valueOf("00:00:00:00:00:01"));
 
         configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
         String interfaceSw2Eth1 = "s2-eth1";
+        InterfaceIpAddress ia2 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.20.2"),
+                                   IpPrefix.valueOf("192.168.20.0/24"));
         Interface intfsw2eth1 = new Interface(s2Eth1,
-                Collections.singleton(IpPrefix.valueOf("192.168.20.0/24")),
+                Collections.singleton(ia2),
                 MacAddress.valueOf("00:00:00:00:00:02"));
         configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
 
diff --git a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/RouterTest.java b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/RouterTest.java
index add4f79..6d77a2c 100644
--- a/apps/sdnip/src/test/java/org/onlab/onos/sdnip/RouterTest.java
+++ b/apps/sdnip/src/test/java/org/onlab/onos/sdnip/RouterTest.java
@@ -51,6 +51,7 @@
 import org.onlab.onos.net.flow.TrafficTreatment;
 import org.onlab.onos.net.host.HostListener;
 import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.host.InterfaceIpAddress;
 import org.onlab.onos.net.intent.IntentService;
 import org.onlab.onos.net.intent.MultiPointToSinglePointIntent;
 import org.onlab.onos.net.provider.ProviderId;
@@ -150,22 +151,31 @@
 
         Set<Interface> interfaces = Sets.newHashSet();
 
+        InterfaceIpAddress ia1 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
+                                   IpPrefix.valueOf("192.168.10.0/24"));
         Interface sw1Eth1 = new Interface(SW1_ETH1,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.10.101/24")),
+                Sets.newHashSet(ia1),
                 MacAddress.valueOf("00:00:00:00:00:01"));
 
         expect(interfaceService.getInterface(SW1_ETH1)).andReturn(sw1Eth1).anyTimes();
         interfaces.add(sw1Eth1);
 
+        InterfaceIpAddress ia2 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
+                                   IpPrefix.valueOf("192.168.20.0/24"));
         Interface sw2Eth1 = new Interface(SW2_ETH1,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.20.101/24")),
+                Sets.newHashSet(ia2),
                 MacAddress.valueOf("00:00:00:00:00:02"));
 
         expect(interfaceService.getInterface(SW2_ETH1)).andReturn(sw2Eth1).anyTimes();
         interfaces.add(sw2Eth1);
 
+        InterfaceIpAddress ia3 =
+            new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
+                                   IpPrefix.valueOf("192.168.30.0/24"));
         Interface sw3Eth1 = new Interface(SW3_ETH1,
-                Sets.newHashSet(IpPrefix.valueOf("192.168.30.101/24")),
+                Sets.newHashSet(ia3),
                 MacAddress.valueOf("00:00:00:00:00:03"));
 
         expect(interfaceService.getInterface(SW3_ETH1)).andReturn(sw3Eth1).anyTimes();