this.handlerFactory = new BGPHandlerFactory(messageRegistry);
}
- private synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress remoteAddress,
- final int retryTimer, final Bootstrap clientBootStrap) {
+ @VisibleForTesting
+ public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress localAddress,
+ final InetSocketAddress remoteAddress, final int retryTimer, final boolean reuseAddress) {
+ final Bootstrap clientBootStrap = createClientBootStrap(KeyMapping.getKeyMapping(), reuseAddress, localAddress);
final BGPClientSessionNegotiatorFactory snf = new BGPClientSessionNegotiatorFactory(this.bgpPeerRegistry);
final ChannelPipelineInitializer<BGPSessionImpl> initializer = BGPChannel.createChannelPipelineInitializer(
this.handlerFactory, snf);
return sessionPromise;
}
- @VisibleForTesting
- public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress localAddress,
- final InetSocketAddress remoteAddress, final int retryTimer, final boolean reuseAddress) {
- final Bootstrap clientBootStrap = createClientBootStrap(KeyMapping.getKeyMapping(), reuseAddress);
- clientBootStrap.localAddress(localAddress);
- return createClient(remoteAddress, retryTimer, clientBootStrap);
- }
-
- private synchronized Bootstrap createClientBootStrap(final KeyMapping keys, final boolean reuseAddress) {
+ private synchronized Bootstrap createClientBootStrap(final KeyMapping keys, final boolean reuseAddress,
+ final InetSocketAddress localAddress) {
final Bootstrap bootstrap = new Bootstrap();
if (Epoll.isAvailable()) {
bootstrap.channel(EpollSocketChannel.class);
if (bootstrap.config().group() == null) {
bootstrap.group(this.workerGroup);
}
+ bootstrap.localAddress(localAddress);
return bootstrap;
}
@Override
- public synchronized void close() throws InterruptedException {
+ public synchronized void close() {
if (Epoll.isAvailable()) {
LOG.debug("Closing Dispatcher");
this.workerGroup.shutdownGracefully(0, TIMEOUT, TimeUnit.SECONDS);
@Override
public synchronized Future<Void> createReconnectingClient(final InetSocketAddress remoteAddress,
- final int retryTimer, final KeyMapping keys) {
- return createReconnectingClient(remoteAddress, retryTimer, keys, null, false);
+ final InetSocketAddress localAddress, final int retryTimer, final KeyMapping keys) {
+ return createReconnectingClient(remoteAddress, retryTimer, keys, localAddress, false);
}
@VisibleForTesting
final int retryTimer, final KeyMapping keys, final InetSocketAddress localAddress,
final boolean reuseAddress) {
final BGPClientSessionNegotiatorFactory snf = new BGPClientSessionNegotiatorFactory(this.bgpPeerRegistry);
- final Bootstrap bootstrap = createClientBootStrap(keys, reuseAddress);
- bootstrap.localAddress(localAddress);
+ final Bootstrap bootstrap = createClientBootStrap(keys, reuseAddress, localAddress);
final BGPReconnectPromise<?> reconnectPromise = new BGPReconnectPromise<>(GlobalEventExecutor.INSTANCE,
remoteAddress, retryTimer, bootstrap, this.bgpPeerRegistry,
BGPChannel.createChannelPipelineInitializer(this.handlerFactory, snf));
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;
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;
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;
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);
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;
}
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);
}
}
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborAddPathsConfig;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborGroup;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflector;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
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.multiprotocol.rev171207.BgpTableType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.SendReceive;
return port;
}
+
+ @Nullable
+ public static IpAddress getLocalAddress(@Nullable final Transport transport) {
+ if (transport != null && transport.getConfig() != null) {
+ final BgpNeighborTransportConfig.LocalAddress localAddress = transport.getConfig().getLocalAddress();
+ if (localAddress != null ) {
+ return localAddress.getIpAddress();
+ }
+ }
+ return null;
+ }
}
import io.netty.channel.ChannelFuture;
import io.netty.util.concurrent.Future;
import java.net.InetSocketAddress;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import org.opendaylight.protocol.concepts.KeyMapping;
/**
* Creates Reconnecting client.
*
* @param remoteAddress remote Peer Address
+ * @param localAddress local Peer address
* @param retryTimer Retry timer
* @param keys for TCPMD5
* @return Future promising a client session
*/
- Future<Void> createReconnectingClient(InetSocketAddress remoteAddress, int retryTimer, KeyMapping keys);
+ @Nonnull
+ Future<Void> createReconnectingClient(@Nonnull InetSocketAddress remoteAddress,
+ @Nullable InetSocketAddress localAddress, int retryTimer, @Nonnull KeyMapping keys);
/**
* Create new BGP server to accept incoming bgp connections (bound to provided socket localAddress).
* @param localAddress Peer localAddress
* @return ChannelFuture promising a client session
*/
+ @Nonnull
ChannelFuture createServer(InetSocketAddress localAddress);
/**
*
* @return BGPPeerRegistry
*/
+ @Nonnull
BGPPeerRegistry getBGPPeerRegistry();
}
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
import static org.opendaylight.protocol.bgp.rib.impl.AbstractAddPathTest.AS_NUMBER;
import static org.opendaylight.protocol.bgp.rib.impl.AbstractAddPathTest.BGP_ID;
import static org.opendaylight.protocol.util.CheckUtil.readDataOperational;
.getSingletonInstance().getMessageRegistry(), Lists.newArrayList(fixMessages(bgpMessages)));
Mockito.doReturn(GlobalEventExecutor.INSTANCE.newSucceededFuture(null)).when(this.dispatcher)
- .createReconnectingClient(Mockito.any(InetSocketAddress.class), Mockito.anyInt(),
- Mockito.any(KeyMapping.class));
+ .createReconnectingClient(any(InetSocketAddress.class), any(InetSocketAddress.class),
+ anyInt(), any(KeyMapping.class));
this.ext1 = new SimpleRIBExtensionProviderContext();
this.ext2 = new SimpleRIBExtensionProviderContext();
doReturn(this.listener).when(this.dataTreeChangeService).registerDataTreeChangeListener(any(), any());
doReturn(new BgpId("127.0.0.1")).when(this.rib).getBgpIdentifier();
doReturn(true).when(this.future).cancel(true);
- doReturn(this.future).when(this.dispatcher)
- .createReconnectingClient(any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
+ doReturn(this.future).when(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
+ any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
doReturn(this.dispatcher).when(this.rib).getDispatcher();
doReturn(java.util.Optional.of(new BgpTableTypeImpl(Ipv4AddressFamily.class,
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import java.math.BigDecimal;
import java.net.InetSocketAddress;
.setTransport(createTransport()).setAddPaths(createAddPath()).build();
this.bgpPeer.start(this.rib, neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
- Mockito.verify(this.rib).createPeerDOMChain(any());
- Mockito.verify(this.rib, times(2)).getLocalAs();
- Mockito.verify(this.rib).getLocalTables();
+ verify(this.rib).createPeerDOMChain(any());
+ verify(this.rib, times(2)).getLocalAs();
+ verify(this.rib).getLocalTables();
this.bgpPeer.instantiateServiceInstance();
- Mockito.verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
- Mockito.verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
- anyInt(), any(KeyMapping.class));
+ verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
+ verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
+ any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
try {
this.bgpPeer.start(this.rib, neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
this.bgpPeer.setServiceRegistration(this.serviceRegistration);
this.bgpPeer.closeServiceInstance();
this.bgpPeer.close();
- Mockito.verify(this.future).cancel(true);
+ verify(this.future).cancel(true);
this.bgpPeer.restart(this.rib, null, this.peerGroupLoader, this.tableTypeRegistry);
this.bgpPeer.instantiateServiceInstance();
- Mockito.verify(this.rib, times(2)).createPeerDOMChain(any());
- Mockito.verify(this.rib, times(4)).getLocalAs();
- Mockito.verify(this.rib, times(2)).getLocalTables();
+ verify(this.rib, times(2)).createPeerDOMChain(any());
+ verify(this.rib, times(4)).getLocalAs();
+ verify(this.rib, times(2)).getLocalTables();
final Neighbor neighborExpected = createNeighborExpected(NEIGHBOR_ADDRESS);
assertTrue(this.bgpPeer.containsEqualConfiguration(neighborExpected));
assertFalse(this.bgpPeer.containsEqualConfiguration(createNeighborExpected(
new IpAddress(new Ipv4Address("127.0.0.2")))));
- Mockito.verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+ verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
this.bgpPeer.closeServiceInstance();
this.bgpPeer.close();
- Mockito.verify(this.serviceRegistration).unregister();
- Mockito.verify(this.future, times(2)).cancel(true);
+ verify(this.serviceRegistration).unregister();
+ verify(this.future, times(2)).cancel(true);
final Neighbor neighborDiffConfig = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
.setAfiSafis(createAfiSafi()).build();
import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.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.Ipv4Address;
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.multiprotocol.rev171207.BgpTableType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180321.PeerGroupTransportConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180321.PeerGroupTransportConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
private static final Ipv4Address ROUTER_ID = new Ipv4Address("1.2.3.4");
private static final Ipv4Address CLUSTER_ID = new Ipv4Address("4.3.2.1");
+ private static final Ipv4Address LOCAL_HOST = new Ipv4Address("127.0.0.1");
private static final Long ALL_PATHS = 0L;
private static final Long N_PATHS = 2L;
UnicastSubsequentAddressFamily.class);
private static final BgpTableType BGP_TABLE_TYPE_IPV6
= new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class);
- private static final AfiSafi AFISAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build();
- private static final TablesKey K4 = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
private static final AsNumber AS = new AsNumber(72L);
- private static final BgpId BGP_ID = new BgpId(NEIGHBOR_ADDRESS.getIpv4Address());
private static final List<AddressFamilies> FAMILIES;
private static final List<BgpTableType> TABLE_TYPES;
private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
.setTransport(transport.setConfig(portConfigGroup).build()).build()));
}
+ @Test
+ public void testGetLocalAddress() {
+ assertNull(OpenConfigMappingUtil.getLocalAddress(null));
+ final TransportBuilder transport = new TransportBuilder();
+ assertNull(OpenConfigMappingUtil.getLocalAddress(transport.build()));
+ assertNull(OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+ new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+ .ConfigBuilder().build()).build()));
+ assertEquals(new IpAddress(LOCAL_HOST), OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+ new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+ .ConfigBuilder().setLocalAddress(new BgpNeighborTransportConfig
+ .LocalAddress(new IpAddress(new Ipv4Address(LOCAL_HOST.getValue())))).build()).build()));
+ }
+
@Test
public void testGetAfiSafiWithDefault() {
final ImmutableList<AfiSafi> defaultValue