BUG-199 : bgp negotiation now working without mentioning specific multiprotocol capab... 22/3722/1
authorDana Kutenicsova <dkutenic@cisco.com>
Fri, 13 Dec 2013 19:34:04 +0000 (20:34 +0100)
committerDana Kutenicsova <dkutenic@cisco.com>
Fri, 13 Dec 2013 19:38:21 +0000 (20:38 +0100)
Change-Id: I22287197daa0941e151f0dda81ab1e78cf00f199
Signed-off-by: Dana Kutenicsova <dkutenic@cisco.com>
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModule.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiator.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java
bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/Main.java
bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/BGPSpeakerMock.java

index 64b79605440eb17122b8c766a7abfa8f8f7df830..386ef96c26a3ce478733ea9b4ff5c0ef3873ca92 100644 (file)
@@ -9,6 +9,8 @@
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -17,63 +19,60 @@ import org.opendaylight.protocol.bgp.rib.impl.BGPSessionProposalImpl;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+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.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
 
 /**
 *
 */
-public final class BGPSessionProposalImplModule
-               extends
+public final class BGPSessionProposalImplModule extends
                org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPSessionProposalImplModule {
 
-       public BGPSessionProposalImplModule(
-                       org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+       public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
+                       final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
                super(name, dependencyResolver);
        }
 
-       public BGPSessionProposalImplModule(
-                       org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
-                       BGPSessionProposalImplModule oldModule,
-                       java.lang.AutoCloseable oldInstance) {
+       public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
+                       final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+                       final BGPSessionProposalImplModule oldModule, final java.lang.AutoCloseable oldInstance) {
                super(name, dependencyResolver, oldModule, oldInstance);
        }
 
        @Override
        public void validate() {
                super.validate();
-               JmxAttributeValidationException.checkNotNull(getBgpId(),
-                               "value is not set.", bgpIdJmxAttribute);
-               JmxAttributeValidationException.checkCondition(
-                               isValidIPv4Address(getBgpId()), "value " + getBgpId()
-                                               + " is not valid IPv4 address", bgpIdJmxAttribute);
-
-               JmxAttributeValidationException.checkNotNull(getAsNumber(),
-                               "value is not set.", asNumberJmxAttribute);
-               JmxAttributeValidationException.checkCondition(getAsNumber() >= 0,
-                               "value must be greather than 0", asNumberJmxAttribute);
-               
-               JmxAttributeValidationException.checkNotNull(getHoldtimer(),
-                               "value is not set.", holdtimerJmxAttribute);
-               JmxAttributeValidationException.checkCondition((getHoldtimer() == 0) || (getHoldtimer() >= 3),
-                               "value must be 0 or 3 and more", holdtimerJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getBgpId(), "value is not set.", this.bgpIdJmxAttribute);
+               JmxAttributeValidationException.checkCondition(isValidIPv4Address(getBgpId()),
+                               "value " + getBgpId() + " is not valid IPv4 address", this.bgpIdJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getAsNumber(), "value is not set.", this.asNumberJmxAttribute);
+               JmxAttributeValidationException.checkCondition(getAsNumber() >= 0, "value must be greather than 0", this.asNumberJmxAttribute);
+
+               JmxAttributeValidationException.checkNotNull(getHoldtimer(), "value is not set.", this.holdtimerJmxAttribute);
+               JmxAttributeValidationException.checkCondition((getHoldtimer() == 0) || (getHoldtimer() >= 3), "value must be 0 or 3 and more",
+                               this.holdtimerJmxAttribute);
        }
 
        @Override
        public java.lang.AutoCloseable createInstance() {
                final Ipv4Address bgpId = new Ipv4Address(getBgpId());
-               final BGPSessionProposalImpl bgpSessionProposal = new BGPSessionProposalImpl(
-                               getHoldtimer(), getAsNumber(), bgpId);
+               final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+               tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+               tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+               final BGPSessionProposalImpl bgpSessionProposal = new BGPSessionProposalImpl(getHoldtimer(), getAsNumber(), bgpId, tables);
                return new BgpSessionProposalCloseable(bgpSessionProposal);
        }
 
-       private static final class BgpSessionProposalCloseable implements
-                       BGPSessionProposal, AutoCloseable {
+       private static final class BgpSessionProposalCloseable implements BGPSessionProposal, AutoCloseable {
 
                private final BGPSessionProposalImpl inner;
 
-               public BgpSessionProposalCloseable(
-                               BGPSessionProposalImpl bgpSessionProposal) {
+               public BgpSessionProposalCloseable(final BGPSessionProposalImpl bgpSessionProposal) {
                        this.inner = bgpSessionProposal;
                }
 
@@ -84,13 +83,13 @@ public final class BGPSessionProposalImplModule
 
                @Override
                public BGPSessionPreferences getProposal() {
-                       return inner.getProposal();
+                       return this.inner.getProposal();
                }
        }
 
        private boolean isValidIPv4Address(final String address) {
-               Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
-               Matcher matcher = pattern.matcher(address);
+               final Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
+               final Matcher matcher = pattern.matcher(address);
                return matcher.matches();
        }
 }
index 5b9f02eec51222968123096deb75ff7f766d8ebc..4c2ff7c482b0058c3e773b98a70b2af4bf6e8c3f 100644 (file)
@@ -25,8 +25,6 @@ import org.opendaylight.protocol.bgp.parser.BGPError;
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.framework.AbstractSessionNegotiator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Keepalive;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.KeepaliveBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Notify;
@@ -34,8 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Open;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.MultiprotocolCase;
 import org.opendaylight.yangtools.yang.binding.Notification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -116,8 +112,8 @@ public final class BGPSessionNegotiator extends AbstractSessionNegotiator<Notifi
                        public void run(final Timeout timeout) throws Exception {
                                synchronized (lock) {
                                        if (BGPSessionNegotiator.this.state != State.Finished) {
-                                               BGPSessionNegotiator.this.writeMessage(new NotifyBuilder().setErrorCode(
-                                                               BGPError.HOLD_TIMER_EXPIRED.getCode()).setErrorSubcode(BGPError.HOLD_TIMER_EXPIRED.getSubcode()).build());
+                                               BGPSessionNegotiator.this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.HOLD_TIMER_EXPIRED.getCode()).setErrorSubcode(
+                                                               BGPError.HOLD_TIMER_EXPIRED.getSubcode()).build());
                                                negotiationFailed(new BGPDocumentedException("HoldTimer expired", BGPError.FSM_ERROR));
                                                BGPSessionNegotiator.this.state = State.Finished;
                                        }
@@ -156,8 +152,7 @@ public final class BGPSessionNegotiator extends AbstractSessionNegotiator<Notifi
 
                // Catch-all for unexpected message
                LOG.warn("Channel {} state {} unexpected message {}", this.channel, this.state, msg);
-               this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.FSM_ERROR.getCode()).setErrorSubcode(
-                               BGPError.FSM_ERROR.getSubcode()).build());
+               this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.FSM_ERROR.getCode()).setErrorSubcode(BGPError.FSM_ERROR.getSubcode()).build());
                negotiationFailed(new BGPDocumentedException("Unexpected message", BGPError.FSM_ERROR));
                this.state = State.Finished;
        }
@@ -165,26 +160,19 @@ public final class BGPSessionNegotiator extends AbstractSessionNegotiator<Notifi
        private void handleOpen(final Open openObj) {
                final List<BgpParameters> prefs = openObj.getBgpParameters();
                if (prefs != null && !prefs.isEmpty()) {
-                       for (final BgpParameters param : openObj.getBgpParameters()) {
-                               final CParameters cap = param.getCParameters();
-                               // FIXME: BUG-199: the reference to linkstate should be moved to config subsystem!
-
-                               if (cap instanceof MultiprotocolCase
-                                               && ((MultiprotocolCase) cap).getMultiprotocolCapability().getAfi() == LinkstateAddressFamily.class
-                                               && ((MultiprotocolCase) cap).getMultiprotocolCapability().getSafi() == LinkstateSubsequentAddressFamily.class) {
-                                       this.remotePref = openObj;
-                                       this.writeMessage(new KeepaliveBuilder().build());
-                                       this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, this.remotePref);
-                                       this.state = State.OpenConfirm;
-                                       LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, this.remotePref);
-                                       return;
-                               }
+                       if (prefs.containsAll(this.localPref.getParams())) {
+                               this.remotePref = openObj;
+                               this.writeMessage(new KeepaliveBuilder().build());
+                               this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, this.remotePref);
+                               this.state = State.OpenConfirm;
+                               LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, this.remotePref);
+                               return;
                        }
                }
                final Notify ntf = new NotifyBuilder().setErrorCode(BGPError.UNSPECIFIC_OPEN_ERROR.getCode()).setErrorSubcode(
                                BGPError.UNSPECIFIC_OPEN_ERROR.getSubcode()).build();
                this.writeMessage(ntf);
-               negotiationFailed(new BGPDocumentedException("Linkstate capability is not configured on router. Check the configuration of BGP speaker.", BGPError.forValue(
+               negotiationFailed(new BGPDocumentedException("Open message unacceptable. Check the configuration of BGP speaker.", BGPError.forValue(
                                ntf.getErrorCode(), ntf.getErrorSubcode())));
                this.state = State.Finished;
        }
index e223f7d5ad4f47a053221fedb0487b1a50191a16..bbff88737813f59c2d491b6b3240a8b3292c1479 100644 (file)
@@ -8,21 +8,21 @@
 package org.opendaylight.protocol.bgp.rib.impl;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.MultiprotocolCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
-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.UnicastSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
 
 import com.google.common.collect.Lists;
 
@@ -39,20 +39,18 @@ public final class BGPSessionProposalImpl implements BGPSessionProposal {
 
        private final BGPSessionPreferences prefs;
 
-       public BGPSessionProposalImpl(final short holdTimer, final int as, final Ipv4Address bgpId) {
+       public BGPSessionProposalImpl(final short holdTimer, final int as, final Ipv4Address bgpId,
+                       final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables) {
                this.holdTimer = holdTimer;
                this.as = as;
                this.bgpId = bgpId;
 
-               // FIXME: BUG-199: the reference to linkstate should be moved to config subsystem!
                final List<BgpParameters> tlvs = Lists.newArrayList();
-               tlvs.add(new BgpParametersBuilder().setCParameters(
-                               new MultiprotocolCaseBuilder().setMultiprotocolCapability(
-                                               new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build());
-               tlvs.add(new BgpParametersBuilder().setCParameters(
-                               new MultiprotocolCaseBuilder().setMultiprotocolCapability(
-                                               new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi(
-                                                               LinkstateSubsequentAddressFamily.class).build()).build()).build());
+               for (final Entry<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> e : tables.entrySet()) {
+                       tlvs.add(new BgpParametersBuilder().setCParameters(
+                                       new MultiprotocolCaseBuilder().setMultiprotocolCapability(
+                                                       new MultiprotocolCapabilityBuilder().setAfi(e.getKey()).setSafi(e.getValue()).build()).build()).build());
+               }
                tlvs.add(new BgpParametersBuilder().setCParameters(
                                new As4BytesCaseBuilder().setAs4BytesCapability(
                                                new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) as)).build()).build()).build());
index 288ee53f8efb3c96ff46770b281a6d83209731c5..873329909694af0ef8e779d2fa3ddd31101b40ec 100644 (file)
@@ -12,6 +12,8 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
@@ -21,6 +23,12 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.framework.NeverReconnectStrategy;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+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.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -89,7 +97,11 @@ public final class Main {
 
                final BGPSessionListener sessionListener = new TestingListener();
 
-               final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as.getValue().intValue(), new Ipv4Address("25.25.25.2"));
+               final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+               tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+               tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+
+               final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as.getValue().intValue(), new Ipv4Address("25.25.25.2"), tables);
 
                final BGPSessionPreferences proposal = prop.getProposal();
 
index 243bde1c802c2a3ae87527cd3165f6d3b8a7fa9a..3700ea664eb661b1721ddeb88f82edbacdd9b3a9 100644 (file)
@@ -15,6 +15,8 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 import io.netty.util.concurrent.Promise;
 
 import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
@@ -29,6 +31,12 @@ import org.opendaylight.protocol.framework.SessionListener;
 import org.opendaylight.protocol.framework.SessionListenerFactory;
 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+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.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
 import org.opendaylight.yangtools.yang.binding.Notification;
 
 import com.google.common.base.Preconditions;
@@ -67,13 +75,15 @@ public class BGPSpeakerMock<M, S extends ProtocolSession<M>, L extends SessionLi
                        }
                };
 
-               final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, 25, new Ipv4Address("127.0.0.2")).getProposal();
+               final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+               tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+               tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+
+               final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, 72, new Ipv4Address("127.0.0.2"), tables).getProposal();
 
                final SessionNegotiatorFactory<Notification, BGPSessionImpl, BGPSessionListener> snf = new BGPSessionNegotiatorFactory(new HashedWheelTimer(), prefs);
 
-               final BGPSpeakerMock<Notification, BGPSessionImpl, BGPSessionListener> mock = new BGPSpeakerMock<>(snf,
-                               new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry()),
-                               new DefaultPromise<BGPSessionImpl>(GlobalEventExecutor.INSTANCE));
+               final BGPSpeakerMock<Notification, BGPSessionImpl, BGPSessionListener> mock = new BGPSpeakerMock<>(snf, new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry()), new DefaultPromise<BGPSessionImpl>(GlobalEventExecutor.INSTANCE));
 
                mock.createServer(new InetSocketAddress("127.0.0.2", 12345), f);
        }