Extend FPM module to handle routes from multiple peers.

This has the side-effect of fixing a bug when the same peer changes its
route advertisement for a particular prefix.

Change-Id: I09af3baf0a7741919be2a2986112db6db2556666
diff --git a/apps/routing/fpm/src/main/java/org/onosproject/routing/fpm/FpmSessionHandler.java b/apps/routing/fpm/src/main/java/org/onosproject/routing/fpm/FpmSessionHandler.java
index 33f845e..f6e982f 100644
--- a/apps/routing/fpm/src/main/java/org/onosproject/routing/fpm/FpmSessionHandler.java
+++ b/apps/routing/fpm/src/main/java/org/onosproject/routing/fpm/FpmSessionHandler.java
@@ -26,6 +26,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -38,6 +41,7 @@
     private final FpmListener fpmListener;
 
     private Channel channel;
+    private FpmPeer us;
 
     /**
      * Class constructor.
@@ -52,7 +56,7 @@
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
             throws Exception {
         FpmHeader fpmMessage = (FpmHeader) e.getMessage();
-        fpmListener.fpmMessage(fpmMessage);
+        fpmListener.fpmMessage(us, fpmMessage);
     }
 
     @Override
@@ -68,7 +72,15 @@
     @Override
     public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
             throws Exception {
-        if (!fpmListener.peerConnected(ctx.getChannel().getRemoteAddress())) {
+        SocketAddress socketAddress = ctx.getChannel().getRemoteAddress();
+
+        if (!(socketAddress instanceof InetSocketAddress)) {
+            throw new IllegalStateException("Address type is not InetSocketAddress");
+        }
+
+        us = FpmPeer.fromSocketAddress((InetSocketAddress) socketAddress);
+
+        if (!fpmListener.peerConnected(us)) {
             log.error("Received new FPM connection while already connected");
             ctx.getChannel().close();
             return;
@@ -94,7 +106,9 @@
     }
 
     private void handleDisconnect() {
-        fpmListener.peerDisconnected(channel.getRemoteAddress());
+        if (us != null) {
+            fpmListener.peerDisconnected(us);
+        }
         channel = null;
     }
 }