Reimplemented the ProxyArp app on top of the NeighbourResolutionService.

Also some small API changes to track app ID of handler registrations, and
improved interface matching in NeighbourPacketManager.

Added CLI to view handler registrations.

Change-Id: I8cd0b91a16d9ec60287b65f9d8fc5e3cd87560e8
diff --git a/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
new file mode 100644
index 0000000..1fd618e
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cli.net;
+
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.neighbour.NeighbourResolutionService;
+
+/**
+ * Lists neighbour message handlers.
+ */
+@Command(scope = "onos", name = "neighbour-handlers",
+        description = "Lists neighbour message handlers")
+public class NeighbourHandlersListCommand extends AbstractShellCommand {
+
+    private static final String FORMAT = "%20s: interface=%s, class=%s";
+
+    @Override
+    protected void execute() {
+        NeighbourResolutionService service = get(NeighbourResolutionService.class);
+
+        service.getHandlerRegistrations().forEach((cp, list) -> {
+            list.forEach(hr -> print(FORMAT, cp, intfToName(hr.intf()),
+                    hr.handler().getClass().getCanonicalName()));
+        });
+    }
+
+    private String intfToName(Interface intf) {
+        return (intf == null) ?  "(None)" : intf.name();
+    }
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 5664cc3..4da1d8b 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -485,6 +485,9 @@
         <command>
             <action class="org.onosproject.cli.net.PacketProcessorsListCommand"/>
         </command>
+        <command>
+            <action class="org.onosproject.cli.net.NeighbourHandlersListCommand"/>
+        </command>
 
         <command>
             <action class="org.onosproject.cli.net.AddTestFlowsCommand"/>