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;
}
}