BGPCEP-576: Neighbor’s local address configurable
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / config / BgpPeer.java
index 3189e6f7ef44f877b7ff96c6402c5cce60ea596e..fe4beb7b64215790bf9d987f97dcd5cece51c3d4 100644 (file)
@@ -9,7 +9,6 @@
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getGlobalClusterIdentifier;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -46,6 +45,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.p
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.BgpParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.BgpParametersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.bgp.parameters.OptionalCapabilities;
@@ -221,6 +221,7 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
         private final InetSocketAddress inetAddress;
         private final int retryTimer;
         private final KeyMapping keys;
+        private final InetSocketAddress localAddress;
         private final BGPPeer bgpPeer;
         private final IpAddress neighborAddress;
         private final BGPSessionPreferences prefs;
@@ -260,7 +261,7 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
 
             final List<BgpParameters> bgpParameters = getBgpParameters(afisSAfis, rib, tableTypeRegistry);
             final KeyMapping keyMapping = OpenConfigMappingUtil.getNeighborKey(neighbor);
-
+            final IpAddress neighborLocalAddress = OpenConfigMappingUtil.getLocalAddress(neighbor.getTransport());
             int hold = OpenConfigMappingUtil.getHoldTimer(neighbor, peerGroup);
             final AsNumber ribAs = rib.getLocalAs();
             final AsNumber neighborAs = OpenConfigMappingUtil.getPeerAs(neighbor, peerGroup, ribAs);
@@ -271,8 +272,13 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
             this.retryTimer = OpenConfigMappingUtil.getRetryTimer(neighbor, peerGroup);
             this.dispatcher = rib.getDispatcher();
 
-            this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress,
-                    OpenConfigMappingUtil.getPort(neighbor, peerGroup));
+            final PortNumber port = OpenConfigMappingUtil.getPort(neighbor, peerGroup);
+            this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress, port);
+            if (neighborLocalAddress != null) {
+                this.localAddress = Ipv4Util.toInetSocketAddress(neighborLocalAddress, port);
+            } else {
+                this.localAddress = null;
+            }
             this.keys = keyMapping;
         }
 
@@ -282,8 +288,8 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
             this.bgpPeer.instantiateServiceInstance();
             this.dispatcher.getBGPPeerRegistry().addPeer(this.neighborAddress, this.bgpPeer, this.prefs);
             if (this.activeConnection) {
-                this.connection = this.dispatcher.createReconnectingClient(this.inetAddress, this.retryTimer,
-                        this.keys);
+                this.connection = this.dispatcher.createReconnectingClient(this.inetAddress, this.localAddress,
+                        this.retryTimer, this.keys);
             }
         }