From: Om Prakash Date: Sat, 20 Feb 2016 19:45:30 +0000 (-0500) Subject: BUG: 4831 X-Git-Tag: release/boron~278 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=a55aec9a898aea78d13ac61c30747693f579e756;p=bgpcep.git BUG: 4831 The BGP specification mandates a maximum BGP message size of 4096 octets. As BGP is extended to support newer AFI/SAFIs, there is a need to extend the maximum message size beyond 4096 octets. This code fix will update the BGP specification by providing an extension to BGP to extend its current message size from 4096 octets to 65535 octets. The major Design/code change for this fix is to modify Bgp-Message yang to add bgp-extended-message-capability in BGP Message. BgpExtendedMessageUtil class is written to looks for Bgp Extended Message Capability in capabilities.odl-bgp-rib-impl-cfg.yang is modifed to add extended message capability preference for Speaker and Peer.BGPSessionImpl class has been enhanced to inject extended message capability of maximun frame size 65535. BUG: 4831 Change-Id: Icb8731395106bc8164b830e57ea316e31702a4a7 Signed-off-by: Om Prakash --- diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpExtendedMessageUtil.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpExtendedMessageUtil.java new file mode 100644 index 0000000000..09071e1b12 --- /dev/null +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpExtendedMessageUtil.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 AT&T Services, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.protocol.bgp.parser; + +import java.util.List; +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.open.message.BgpParameters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilities; + +public final class BgpExtendedMessageUtil { + + private BgpExtendedMessageUtil() { + throw new UnsupportedOperationException(); + } + + /** + * Looks for Bgp Extended Message Capability in capabilities . + * + * @param open remote BGP open message + * @return flag + */ + public static boolean advertizedBgpExtendedMessageCapability(final Open open) { + // Look for Bgp Extended Message capability very defensively + final List params = open.getBgpParameters(); + if (params != null) { + for (final BgpParameters p : params) { + for (final OptionalCapabilities oc : p.getOptionalCapabilities()) { + if (oc.getCParameters() != null && oc.getCParameters().getBgpExtendedMessageCapability() != null) { + return true; + } + } + } + } + return false; + } +} diff --git a/bgp/parser-api/src/main/yang/bgp-message.yang b/bgp/parser-api/src/main/yang/bgp-message.yang index 4b7088ba08..89b92c0768 100644 --- a/bgp/parser-api/src/main/yang/bgp-message.yang +++ b/bgp/parser-api/src/main/yang/bgp-message.yang @@ -92,6 +92,9 @@ module bgp-message { type inet:as-number; } } + container bgp-extended-message-capability { + reference "https://www.ietf.org/archive/id/draft-ietf-idr-bgp-extended-messages-11.txt"; + } } } } @@ -221,4 +224,4 @@ module bgp-message { type binary; } } -} +} \ No newline at end of file diff --git a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java index 56a5165cf7..12cfe6f217 100644 --- a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java +++ b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java @@ -24,6 +24,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapabilityBuilder; @@ -73,6 +74,20 @@ public class APITest { assertEquals(10, AsNumberUtil.advertizedAsNumber(open2).getValue().intValue()); } + @Test + public void testBgpExtendedMessageUtil() { + final List params = new ArrayList<>(); + final List capas = new ArrayList<>(); + capas.add(new OptionalCapabilitiesBuilder().setCParameters( new CParametersBuilder().addAugmentation( + CParameters1.class, new CParameters1Builder().setMultiprotocolCapability( new MultiprotocolCapabilityBuilder() + .build()).build()).build()).build()); + capas.add(new OptionalCapabilitiesBuilder().setCParameters( + new CParametersBuilder().setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()).build()).build()); + params.add(new BgpParametersBuilder().setOptionalCapabilities(capas).build()); + final Open open1 = new OpenBuilder().setBgpParameters(params).build(); + assertEquals(true, BgpExtendedMessageUtil.advertizedBgpExtendedMessageCapability(open1)); + } + @Test(expected=UnsupportedOperationException.class) public void testAsNumberUtilPrivateConstructor() throws Throwable { final Constructor c = AsNumberUtil.class.getDeclaredConstructor(); diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java index 0c26f09fda..d78f8a3fd0 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java @@ -15,6 +15,7 @@ import org.opendaylight.protocol.bgp.parser.impl.message.BGPOpenMessageParser; import org.opendaylight.protocol.bgp.parser.impl.message.BGPUpdateMessageParser; import org.opendaylight.protocol.bgp.parser.impl.message.open.AddPathCapabilityHandler; import org.opendaylight.protocol.bgp.parser.impl.message.open.As4CapabilityHandler; +import org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler; import org.opendaylight.protocol.bgp.parser.impl.message.open.CapabilityParameterParser; import org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler; import org.opendaylight.protocol.bgp.parser.impl.message.open.MultiProtocolCapabilityHandler; @@ -58,6 +59,7 @@ 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.Update; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapability; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Aggregator; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Aigp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AsPath; @@ -150,6 +152,10 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator { final CapabilityParameterParser cpp = new CapabilityParameterParser(context.getCapabilityRegistry()); regs.add(context.registerParameterParser(CapabilityParameterParser.TYPE, cpp)); regs.add(context.registerParameterSerializer(BgpParameters.class, cpp)); + + final BgpExtendedMessageCapabilityHandler bgpextmessage = new BgpExtendedMessageCapabilityHandler(); + regs.add(context.registerCapabilityParser(BgpExtendedMessageCapabilityHandler.CODE, bgpextmessage)); + regs.add(context.registerCapabilitySerializer(BgpExtendedMessageCapability.class, bgpextmessage)); } private void registerAttributeParsers(final List regs, final BGPExtensionProviderContext context) { diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/BgpExtendedMessageCapabilityHandler.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/BgpExtendedMessageCapabilityHandler.java new file mode 100644 index 0000000000..29e09c5db3 --- /dev/null +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/BgpExtendedMessageCapabilityHandler.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016 AT&T Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.protocol.bgp.parser.impl.message.open; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; +import org.opendaylight.protocol.bgp.parser.BGPParsingException; +import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser; +import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer; +import org.opendaylight.protocol.bgp.parser.spi.CapabilityUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParameters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapability; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; + +public final class BgpExtendedMessageCapabilityHandler implements CapabilityParser, CapabilitySerializer { + public static final int CODE = 6; + @Override + public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + return new CParametersBuilder().setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()).build(); + } + + @Override + public void serializeCapability(final CParameters capability, final ByteBuf byteAggregator) { + final BgpExtendedMessageCapability bgpMessageSize = capability.getBgpExtendedMessageCapability(); + if (bgpMessageSize != null) { + CapabilityUtil.formatCapability(CODE, Unpooled.EMPTY_BUFFER, byteAggregator); + } + } +} \ No newline at end of file diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BgpExtendedMessageCapabilityHandlerTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BgpExtendedMessageCapabilityHandlerTest.java new file mode 100644 index 0000000000..d79f5be797 --- /dev/null +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BgpExtendedMessageCapabilityHandlerTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016 AT&T Services, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.protocol.bgp.parser.impl; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; +import org.opendaylight.protocol.bgp.parser.BGPParsingException; +import org.opendaylight.protocol.bgp.parser.impl.message.open.BgpExtendedMessageCapabilityHandler; +import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext; +import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; + +public class BgpExtendedMessageCapabilityHandlerTest { + + private BGPExtensionProviderContext ctx; + + @Before + public void setUp() { + this.ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance(); + } + + @Test + public void testBgpExtendedMessageCapabilityHandler() throws BGPDocumentedException, BGPParsingException { + final BgpExtendedMessageCapabilityHandler handler = new BgpExtendedMessageCapabilityHandler(); + + final byte[] bgpExeBytes = {(byte) 0x06, (byte) 0x00}; + final BgpExtendedMessageCapabilityBuilder bgpExtBuilder = new BgpExtendedMessageCapabilityBuilder(); + + final ByteBuf buffer = Unpooled.buffer(bgpExeBytes.length); + handler.serializeCapability( new CParametersBuilder().setBgpExtendedMessageCapability(bgpExtBuilder.build()).build(), buffer); + Assert.assertArrayEquals(bgpExeBytes, buffer.array()); + Assert.assertEquals(handler.parseCapability(Unpooled.wrappedBuffer(bgpExeBytes)), new CParametersBuilder().setBgpExtendedMessageCapability(bgpExtBuilder.build()).build()); + + final byte[] bgpExeBytes2 = {(byte) 0x40, (byte) 0x06}; + buffer.clear(); + handler.serializeCapability(new CParametersBuilder().setBgpExtendedMessageCapability(bgpExtBuilder.build()).build(), buffer); + Assert.assertNotSame(bgpExeBytes2, buffer.array()); + } + +} diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java index d364ed97d1..a59033a895 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java @@ -31,6 +31,6 @@ public class BGPHandlerFactory { } public ChannelHandler[] getDecoders() { - return new ChannelHandler[] { new BGPMessageHeaderDecoder(), new BGPByteToMessageDecoder(this.registry), }; + return new ChannelHandler[] { BGPMessageHeaderDecoder.getBGPMessageHeaderDecoder(), new BGPByteToMessageDecoder(this.registry), }; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java index 0db26f9671..b22e3fbb7b 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java @@ -14,8 +14,6 @@ import io.netty.handler.codec.LengthFieldBasedFrameDecoder; */ public final class BGPMessageHeaderDecoder extends LengthFieldBasedFrameDecoder { - private static final int MAX_FRAME_SIZE = 4096; - private static final int MARKER_SIZE = 16; /* @@ -23,6 +21,10 @@ public final class BGPMessageHeaderDecoder extends LengthFieldBasedFrameDecoder */ private static final int LENGTH_SIZE = 2; + private static final int MAX_FRAME_SIZE = 4096; + + private static final int EXTENDED_MAX_FRAME_SIZE = 65535; + /* 0 1 2 3 @@ -41,7 +43,18 @@ public final class BGPMessageHeaderDecoder extends LengthFieldBasedFrameDecoder */ - public BGPMessageHeaderDecoder() { - super(MAX_FRAME_SIZE, MARKER_SIZE, LENGTH_SIZE, -MARKER_SIZE - LENGTH_SIZE, 0); + + private BGPMessageHeaderDecoder(final int maxFrameSize) { + super(maxFrameSize, MARKER_SIZE, LENGTH_SIZE, -MARKER_SIZE - LENGTH_SIZE, 0); } + + public static BGPMessageHeaderDecoder getBGPMessageHeaderDecoder() { + return new BGPMessageHeaderDecoder(MAX_FRAME_SIZE); + } + + public static BGPMessageHeaderDecoder getExtendedBGPMessageHeaderDecoder() { + return new BGPMessageHeaderDecoder(EXTENDED_MAX_FRAME_SIZE); + } + + } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java index cfc01e536d..f5ca215fac 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java @@ -26,6 +26,7 @@ import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpSessionState; import org.opendaylight.protocol.bgp.parser.AsNumberUtil; import org.opendaylight.protocol.bgp.parser.BGPError; +import org.opendaylight.protocol.bgp.parser.BgpExtendedMessageUtil; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences; @@ -61,6 +62,8 @@ public class BGPSessionImpl extends SimpleChannelInboundHandler im private static final int KA_TO_DEADTIMER_RATIO = 3; + private static final String EXTENDED_MSG_DECODER = "EXTENDED_MSG_DECODER"; + static final String END_OF_INPUT = "End of input detected. Close the session."; /** @@ -132,6 +135,10 @@ public class BGPSessionImpl extends SimpleChannelInboundHandler im this.keepAlive = this.holdTimerValue / KA_TO_DEADTIMER_RATIO; this.asNumber = AsNumberUtil.advertizedAsNumber(remoteOpen); this.peerRegistry = peerRegistry; + final boolean enableExMess = BgpExtendedMessageUtil.advertizedBgpExtendedMessageCapability(remoteOpen); + if (enableExMess) { + this.channel.pipeline().replace(BGPMessageHeaderDecoder.class, EXTENDED_MSG_DECODER, BGPMessageHeaderDecoder.getExtendedBGPMessageHeaderDecoder()); + } final Set tts = Sets.newHashSet(); final Set tats = Sets.newHashSet(); @@ -179,7 +186,7 @@ public class BGPSessionImpl extends SimpleChannelInboundHandler im public synchronized void close() { if (this.state != State.IDLE && this.channel.isActive()) { this.writeAndFlush(new NotifyBuilder().setErrorCode(BGPError.CEASE.getCode()).setErrorSubcode( - BGPError.CEASE.getSubcode()).build()); + BGPError.CEASE.getSubcode()).build()); } this.closeWithoutMessage(); } @@ -200,10 +207,10 @@ public class BGPSessionImpl extends SimpleChannelInboundHandler im } else if (msg instanceof Notify) { // Notifications are handled internally LOG.info("Session closed because Notification message received: {} / {}", ((Notify) msg).getErrorCode(), - ((Notify) msg).getErrorSubcode()); + ((Notify) msg).getErrorSubcode()); this.closeWithoutMessage(); this.listener.onSessionTerminated(this, new BGPTerminationReason(BGPError.forValue(((Notify) msg).getErrorCode(), - ((Notify) msg).getErrorSubcode()))); + ((Notify) msg).getErrorSubcode()))); this.sessionStats.updateReceivedMsgErr((Notify) msg); } else if (msg instanceof Keepalive) { // Keepalives are handled internally @@ -231,16 +238,16 @@ public class BGPSessionImpl extends SimpleChannelInboundHandler im @GuardedBy("this") private void writeEpilogue(final ChannelFuture future, final Notification msg) { future.addListener( - new ChannelFutureListener() { - @Override - public void operationComplete(final ChannelFuture f) { - if (!f.isSuccess()) { - LOG.warn("Failed to send message {} to socket {}", msg, f.cause(), BGPSessionImpl.this.channel); - } else { - LOG.trace("Message {} sent to socket {}", msg, BGPSessionImpl.this.channel); + new ChannelFutureListener() { + @Override + public void operationComplete(final ChannelFuture f) { + if (!f.isSuccess()) { + LOG.warn("Failed to send message {} to socket {}", msg, f.cause(), BGPSessionImpl.this.channel); + } else { + LOG.trace("Message {} sent to socket {}", msg, BGPSessionImpl.this.channel); + } } - } - }); + }); this.lastMessageSentAt = System.nanoTime(); this.sessionStats.updateSentMsgTotal(); if (msg instanceof Update) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java index 4bb881ef67..ddab64ee32 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java @@ -21,6 +21,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapabilityBuilder; @@ -56,6 +57,8 @@ public final class BGPSessionProposalImpl implements BGPSessionProposal { } caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability( new As4BytesCapabilityBuilder().setAsNumber(as).build()).build()).build()); + caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setBgpExtendedMessageCapability( + new BgpExtendedMessageCapabilityBuilder().build()).build()).build()); caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation( CParameters1.class, new CParameters1Builder().setGracefulRestartCapability( new GracefulRestartCapabilityBuilder().build()).build()).build()).build()); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionStats.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionStats.java index 15894e0989..1a2c725269 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionStats.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionStats.java @@ -182,6 +182,9 @@ final class BGPSessionStats { pref.setGrCapability(cParam.getAugmentation(CParameters1.class).getGracefulRestartCapability() != null); pref.setFourOctetAsCapability(cParam.getAs4BytesCapability() != null); pref.setAddPathCapability(cParam.getAugmentation(CParameters1.class).getAddPathCapability() != null); + if (cParam.getBgpExtendedMessageCapability() !=null) { + pref.setBgpExtendedMessageCapability(true); + } } } } @@ -214,6 +217,9 @@ final class BGPSessionStats { cParam.getAugmentation(CParameters1.class).getGracefulRestartCapability() != null); pref.setAddPathCapability(cParam.getAugmentation(CParameters1.class) != null && cParam.getAugmentation(CParameters1.class).getAddPathCapability() != null); + if (cParam.getBgpExtendedMessageCapability() !=null) { + pref.setBgpExtendedMessageCapability(true); + } } } diff --git a/bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang b/bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang index e5be6c7f20..6d872e8eb6 100644 --- a/bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang +++ b/bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang @@ -484,6 +484,12 @@ module odl-bgp-rib-impl-cfg { default "false"; } + leaf bgp-extended-message-capability { + description "The bgp extended message support capability."; + type boolean; + default "false"; + } + leaf gr-capability { description "BGP graceful restart support capability."; type boolean; diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java index 651aded837..8f2c06c2c6 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java @@ -27,6 +27,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapabilityBuilder; @@ -77,6 +78,8 @@ public class ApiTest { private void setOptionalCapabilities(final List list) { list.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability( new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(58L)).build()).build()).build()); + list.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setBgpExtendedMessageCapability( + new BgpExtendedMessageCapabilityBuilder().build()).build()).build()); list.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation( CParameters1.class, new CParameters1Builder().setGracefulRestartCapability( new GracefulRestartCapabilityBuilder().build()).build()).build()).build()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImplTest.java index 940da922ab..1f9b125698 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImplTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImplTest.java @@ -42,6 +42,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; @@ -135,7 +136,9 @@ public class BGPDispatcherImplTest { capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation( CParameters1.class, new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder() .setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()).build()) - .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(30L)).build()).build()).build()); + .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(30L)).build()) + .setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()) + .build()).build()); tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(capas).build()); return new BGPSessionPreferences(AS_NUMBER, (short) 4, new Ipv4Address(socketAddress.getAddress().getHostAddress()), AS_NUMBER, tlvs); } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImplTest.java index 06fdec8914..16ae56c365 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImplTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImplTest.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -56,6 +57,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; @@ -82,6 +84,9 @@ public class BGPSessionImplTest { @Mock private ChannelPipeline pipeline; + @Mock + private ChannelHandler channelHandler; + private final BgpTableType ipv4tt = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); private final List receivedMsgs = Lists.newArrayList(); @@ -104,7 +109,8 @@ public class BGPSessionImplTest { new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder() .setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()) .setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()) - .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(AS_NUMBER).build()).build()).build() + .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(AS_NUMBER).build()) + .setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()).build()).build() ); tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(capa).build()); @@ -136,6 +142,7 @@ public class BGPSessionImplTest { doReturn(new InetSocketAddress(InetAddress.getByName(LOCAL_IP), LOCAL_PORT)).when(this.speakerListener).localAddress(); doReturn(this.pipeline).when(this.speakerListener).pipeline(); doReturn(this.pipeline).when(this.pipeline).replace(any(ChannelHandler.class), any(String.class), any(ChannelHandler.class)); + doReturn(this.channelHandler).when(this.pipeline).replace(Matchers.>any(), any(String.class), any(ChannelHandler.class)); doReturn(this.pipeline).when(this.pipeline).addLast(any(ChannelHandler.class)); doReturn(mock(ChannelFuture.class)).when(this.speakerListener).close(); this.listener = new SimpleSessionListener(); @@ -157,10 +164,12 @@ public class BGPSessionImplTest { assertEquals(BGPSessionImpl.State.UP.name(), state.getSessionState()); assertEquals(BGP_ID.getValue(), state.getPeerPreferences().getAddress()); assertEquals(AS_NUMBER.getValue(), state.getPeerPreferences().getAs()); + assertEquals(true, state.getPeerPreferences().getBgpExtendedMessageCapability()); assertEquals(BGP_ID.getValue(), state.getPeerPreferences().getBgpId()); assertEquals(1, state.getPeerPreferences().getAdvertizedTableTypes().size()); assertEquals(HOLD_TIMER, state.getPeerPreferences().getHoldtime().intValue()); assertTrue(state.getPeerPreferences().getFourOctetAsCapability().booleanValue()); + assertTrue(state.getPeerPreferences().getBgpExtendedMessageCapability().booleanValue()); assertTrue(state.getPeerPreferences().getGrCapability()); assertEquals(LOCAL_IP, state.getSpeakerPreferences().getAddress()); assertEquals(LOCAL_PORT, state.getSpeakerPreferences().getPort().intValue()); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java index 823a7f920c..7ab05891ff 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java @@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; @@ -56,6 +57,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder; @@ -79,6 +81,9 @@ public class FSMTest { @Mock private ChannelPipeline pipeline; + @Mock + private ChannelHandler channelHandler; + private final BgpTableType ipv4tt = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); private final BgpTableType linkstatett = new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); @@ -100,7 +105,9 @@ public class FSMTest { new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder() .setAfi(this.linkstatett.getAfi()).setSafi(this.linkstatett.getSafi()).build()).build()).build()).build()); capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability( - new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(30L)).build()).build()).build()); + new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(30L)).build()).build()).build()); + capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setBgpExtendedMessageCapability( + new BgpExtendedMessageCapabilityBuilder().build()).build()).build()); capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder().setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()).build()).build()); @@ -127,6 +134,7 @@ public class FSMTest { doReturn(new InetSocketAddress(peerAddress, 179)).when(this.speakerListener).localAddress(); doReturn(this.pipeline).when(this.speakerListener).pipeline(); doReturn(this.pipeline).when(this.pipeline).replace(any(ChannelHandler.class), any(String.class), any(ChannelHandler.class)); + doReturn(this.channelHandler).when(this.pipeline).replace(Matchers.>any(), any(String.class), any(ChannelHandler.class)); doReturn(this.pipeline).when(this.pipeline).addLast(any(ChannelHandler.class)); doReturn(mock(ChannelFuture.class)).when(this.speakerListener).close(); @@ -184,6 +192,8 @@ public class FSMTest { capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder() .setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()).build()).build()).build()); + capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setBgpExtendedMessageCapability( + new BgpExtendedMessageCapabilityBuilder().build()).build()).build()); tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(capas).build()); // Open Message without advertised four-octet AS Number capability this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(1).setVersion( @@ -195,6 +205,27 @@ public class FSMTest { assertNotNull(((Notify) m).getData()); } + @Test + public void testBgpExtendedMessageCapability() { + this.clientSession.channelActive(null); + assertEquals(1, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(0) instanceof Open); + + final List tlvs = Lists.newArrayList(); + final List capas = Lists.newArrayList(); + capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class, + new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder() + .setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()).build()).build()).build()); + capas.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability( + new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(30L)).build()).build()).build()); + tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(capas).build()); + this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(1).setVersion( + new ProtocolVersion((short) 4)).setBgpParameters(tlvs).setBgpIdentifier(new Ipv4Address("1.1.1.2")).build()); + assertEquals(2, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(1) instanceof Keepalive); + + } + @Test public void sendNotification() { this.clientSession.channelActive(null); diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistryTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistryTest.java index fd48d6581d..98420a5b4b 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistryTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/StrictBGPPeerRegistryTest.java @@ -32,6 +32,7 @@ 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.message.bgp.parameters.OptionalCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.BgpExtendedMessageCapabilityBuilder; public class StrictBGPPeerRegistryTest { @@ -50,7 +51,8 @@ public class StrictBGPPeerRegistryTest { final List params = Lists.newArrayList(new BgpParametersBuilder() .setOptionalCapabilities(Lists.newArrayList(new OptionalCapabilitiesBuilder() .setCParameters(new CParametersBuilder() - .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build()).build()).build())).build()); + .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build()) + .setBgpExtendedMessageCapability(new BgpExtendedMessageCapabilityBuilder().build()).build()).build())).build()); return new OpenBuilder().setBgpIdentifier(bgpId).setBgpParameters(params).build(); } diff --git a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java index efb2adef7a..8ca478e5f3 100644 --- a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java +++ b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java @@ -156,6 +156,7 @@ final class EventBusRegistration extends AbstractListenerRegistration