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 <op317q@att.com>
--- /dev/null
+/*
+ * 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<BgpParameters> 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;
+ }
+}
type inet:as-number;
}
}
+ container bgp-extended-message-capability {
+ reference "https://www.ietf.org/archive/id/draft-ietf-idr-bgp-extended-messages-11.txt";
+ }
}
}
}
type binary;
}
}
-}
+}
\ No newline at end of file
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;
assertEquals(10, AsNumberUtil.advertizedAsNumber(open2).getValue().intValue());
}
+ @Test
+ public void testBgpExtendedMessageUtil() {
+ final List<BgpParameters> params = new ArrayList<>();
+ final List<OptionalCapabilities> 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<AsNumberUtil> c = AsNumberUtil.class.getDeclaredConstructor();
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;
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;
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<AutoCloseable> regs, final BGPExtensionProviderContext context) {
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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());
+ }
+
+}
}
public ChannelHandler[] getDecoders() {
- return new ChannelHandler[] { new BGPMessageHeaderDecoder(), new BGPByteToMessageDecoder(this.registry), };
+ return new ChannelHandler[] { BGPMessageHeaderDecoder.getBGPMessageHeaderDecoder(), new BGPByteToMessageDecoder(this.registry), };
}
}
*/
public final class BGPMessageHeaderDecoder extends LengthFieldBasedFrameDecoder {
- private static final int MAX_FRAME_SIZE = 4096;
-
private static final int MARKER_SIZE = 16;
/*
*/
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
*/
- 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);
+ }
+
+
}
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;
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.";
/**
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<TablesKey> tts = Sets.newHashSet();
final Set<BgpTableType> tats = Sets.newHashSet();
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();
}
} 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
@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) {
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;
}
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());
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);
+ }
}
}
}
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);
+ }
}
}
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;
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;
private void setOptionalCapabilities(final List<OptionalCapabilities> 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());
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;
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);
}
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;
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;
@Mock
private ChannelPipeline pipeline;
+ @Mock
+ private ChannelHandler channelHandler;
+
private final BgpTableType ipv4tt = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
private final List<Notification> receivedMsgs = Lists.newArrayList();
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());
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.<Class<ChannelHandler>>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();
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());
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;
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;
@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);
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());
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.<Class<ChannelHandler>>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();
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(
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<BgpParameters> tlvs = Lists.newArrayList();
+ final List<OptionalCapabilities> 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);
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 {
final List<BgpParameters> 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();
}
public AsNumber getAsNumber() {
return new AsNumber(AS);
}
+
});
}
}