--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, 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 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.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.RouteRefreshCapabilityBuilder;
+
+public final class MultiprotocolCapabilitiesUtil {
+
+ public static final CParameters RR_CAPABILITY = new CParametersBuilder().addAugmentation(CParameters1.class,
+ new CParameters1Builder().setRouteRefreshCapability(new RouteRefreshCapabilityBuilder().build()).build()).build();
+
+ // move common functionality will be added
+}
}
}
}
+ container route-refresh-capability {
+ presence "Route refresh capability";
+ reference "http://tools.ietf.org/html/rfc2918";
+ }
}
augment "/bgp-msg:update/bgp-msg:attributes" {
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.protocol.bgp.parser.impl.message.open.RouteRefreshCapabilityHandler;
import org.opendaylight.protocol.bgp.parser.impl.message.update.AS4AggregatorAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.AS4PathAttributeParser;
import org.opendaylight.protocol.bgp.parser.impl.message.update.AdvertizedRoutesSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.AddPathCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.RouteRefreshCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutes;
regs.add(context.registerCapabilityParser(AddPathCapabilityHandler.CODE, addPath));
regs.add(context.registerCapabilitySerializer(AddPathCapability.class, addPath));
+ final RouteRefreshCapabilityHandler routeRefresh = new RouteRefreshCapabilityHandler();
+ regs.add(context.registerCapabilityParser(RouteRefreshCapabilityHandler.CODE, routeRefresh));
+ regs.add(context.registerCapabilitySerializer(RouteRefreshCapability.class, routeRefresh));
+
final As4CapabilityHandler as4 = new As4CapabilityHandler();
regs.add(context.registerCapabilityParser(As4CapabilityHandler.CODE, as4));
regs.add(context.registerCapabilitySerializer(As4BytesCapability.class, as4));
private void registerExtendedCommunities(final List<AutoCloseable> regs, final BGPExtensionProviderContext context) {
final AsTwoOctetSpecificEcHandler twoOctetSpecificEcHandler = new AsTwoOctetSpecificEcHandler();
regs.add(context.registerExtendedCommunityParser(twoOctetSpecificEcHandler.getType(true), twoOctetSpecificEcHandler.getSubType(),
- twoOctetSpecificEcHandler));
+ twoOctetSpecificEcHandler));
regs.add(context.registerExtendedCommunityParser(twoOctetSpecificEcHandler.getType(false), twoOctetSpecificEcHandler.getSubType(),
- twoOctetSpecificEcHandler));
+ twoOctetSpecificEcHandler));
regs.add(context.registerExtendedCommunitySerializer(AsSpecificExtendedCommunityCase.class, twoOctetSpecificEcHandler));
final Ipv4SpecificEcHandler ipv4SpecificEcHandler = new Ipv4SpecificEcHandler();
regs.add(context.registerExtendedCommunityParser(ipv4SpecificEcHandler.getType(true), ipv4SpecificEcHandler.getSubType(),
- ipv4SpecificEcHandler));
+ ipv4SpecificEcHandler));
regs.add(context.registerExtendedCommunityParser(ipv4SpecificEcHandler.getType(false), ipv4SpecificEcHandler.getSubType(),
- ipv4SpecificEcHandler));
+ ipv4SpecificEcHandler));
regs.add(context.registerExtendedCommunitySerializer(Inet4SpecificExtendedCommunityCase.class, ipv4SpecificEcHandler));
final OpaqueEcHandler opaqueEcHandler = new OpaqueEcHandler();
regs.add(context.registerExtendedCommunityParser(opaqueEcHandler.getType(true), opaqueEcHandler.getSubType(),
- opaqueEcHandler));
+ opaqueEcHandler));
regs.add(context.registerExtendedCommunityParser(opaqueEcHandler.getType(false), opaqueEcHandler.getSubType(),
- opaqueEcHandler));
+ opaqueEcHandler));
regs.add(context.registerExtendedCommunitySerializer(OpaqueExtendedCommunityCase.class, opaqueEcHandler));
final RouteOriginAsTwoOctetEcHandler routeOriginAS2bEcHandler = new RouteOriginAsTwoOctetEcHandler();
regs.add(context.registerExtendedCommunityParser(routeOriginAS2bEcHandler.getType(true), routeOriginAS2bEcHandler.getSubType(),
- routeOriginAS2bEcHandler));
+ routeOriginAS2bEcHandler));
regs.add(context.registerExtendedCommunityParser(routeOriginAS2bEcHandler.getType(false), routeOriginAS2bEcHandler.getSubType(),
- routeOriginAS2bEcHandler));
+ routeOriginAS2bEcHandler));
regs.add(context.registerExtendedCommunitySerializer(RouteOriginExtendedCommunityCase.class, routeOriginAS2bEcHandler));
final RouteTargetAsTwoOctetEcHandler routeTargetAS2bEcHandler = new RouteTargetAsTwoOctetEcHandler();
regs.add(context.registerExtendedCommunityParser(routeTargetAS2bEcHandler.getType(true), routeTargetAS2bEcHandler.getSubType(),
- routeTargetAS2bEcHandler));
+ routeTargetAS2bEcHandler));
regs.add(context.registerExtendedCommunityParser(routeTargetAS2bEcHandler.getType(false), routeTargetAS2bEcHandler.getSubType(),
- routeTargetAS2bEcHandler));
+ routeTargetAS2bEcHandler));
regs.add(context.registerExtendedCommunitySerializer(RouteTargetExtendedCommunityCase.class, routeTargetAS2bEcHandler));
final RouteOriginIpv4EcHandler routeOriginIpv4EcHandler = new RouteOriginIpv4EcHandler();
regs.add(context.registerExtendedCommunityParser(routeOriginIpv4EcHandler.getType(true), routeOriginIpv4EcHandler.getSubType(),
- routeOriginIpv4EcHandler));
+ routeOriginIpv4EcHandler));
regs.add(context.registerExtendedCommunityParser(routeOriginIpv4EcHandler.getType(false), routeOriginIpv4EcHandler.getSubType(),
- routeOriginIpv4EcHandler));
+ routeOriginIpv4EcHandler));
regs.add(context.registerExtendedCommunitySerializer(RouteOriginIpv4Case.class, routeOriginIpv4EcHandler));
final RouteTargetIpv4EcHandler routeTargetIpv4EcHandler = new RouteTargetIpv4EcHandler();
regs.add(context.registerExtendedCommunityParser(routeTargetIpv4EcHandler.getType(true), routeTargetIpv4EcHandler.getSubType(),
- routeTargetIpv4EcHandler));
+ routeTargetIpv4EcHandler));
regs.add(context.registerExtendedCommunityParser(routeTargetIpv4EcHandler.getType(false), routeTargetIpv4EcHandler.getSubType(),
- routeTargetIpv4EcHandler));
+ routeTargetIpv4EcHandler));
regs.add(context.registerExtendedCommunitySerializer(RouteTargetIpv4Case.class, routeTargetIpv4EcHandler));
}
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, 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.MultiprotocolCapabilitiesUtil;
+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.multiprotocol.rev130919.CParameters1;
+
+public class RouteRefreshCapabilityHandler implements CapabilityParser, CapabilitySerializer {
+
+ // https://tools.ietf.org/html/rfc2918#section-2
+ public static final int CODE = 2;
+
+ @Override
+ public void serializeCapability(final CParameters capability, final ByteBuf byteAggregator) {
+ if (capability == null || (capability.getAugmentation(CParameters1.class) == null) ||
+ (capability.getAugmentation(CParameters1.class).getRouteRefreshCapability() == null) ) {
+ return;
+ }
+ CapabilityUtil.formatCapability(CODE, Unpooled.EMPTY_BUFFER, byteAggregator);
+ }
+
+ @Override
+ public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException {
+ return MultiprotocolCapabilitiesUtil.RR_CAPABILITY;
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, 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 static org.junit.Assert.assertEquals;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+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.RouteRefreshCapabilityHandler;
+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.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.RouteRefreshCapabilityBuilder;
+
+public class RouteRefreshCapabilityHandlerTest {
+
+ private static final RouteRefreshCapabilityHandler HANDLER = new RouteRefreshCapabilityHandler();
+
+ private static final byte[] WRONG_BYTES = new byte[] {1, 2};
+ private static final byte[] OK_BYTES = new byte[] {0};
+ private static final byte[] CAP_BYTES = new byte[] {2, 0};
+
+ @Test
+ public void testRRCapHandler() throws BGPDocumentedException, BGPParsingException {
+ final CParameters expectedParams = new CParametersBuilder().addAugmentation(CParameters1.class,new CParameters1Builder().setRouteRefreshCapability(
+ new RouteRefreshCapabilityBuilder().build()).build()).build();
+ assertEquals(expectedParams, HANDLER.parseCapability(Unpooled.copiedBuffer(OK_BYTES)));
+ assertEquals(expectedParams, HANDLER.parseCapability(Unpooled.copiedBuffer(WRONG_BYTES)));
+
+ final ByteBuf byteAggregator = Unpooled.buffer(2);
+ HANDLER.serializeCapability(expectedParams, byteAggregator);
+ assertEquals(Unpooled.copiedBuffer(CAP_BYTES), byteAggregator);
+
+ final CParameters missingCap = new CParametersBuilder().addAugmentation(CParameters1.class,new CParameters1Builder().setRouteRefreshCapability(
+ null).build()).build();
+ final ByteBuf byteAggregator2 = Unpooled.buffer(0);
+ HANDLER.serializeCapability(missingCap, byteAggregator2);
+ assertEquals(Unpooled.copiedBuffer(new byte[]{}), byteAggregator2);
+ }
+}
import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPPeerInstanceConfiguration;
+import org.opendaylight.protocol.bgp.parser.MultiprotocolCapabilitiesUtil;
import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
new CParameters1Builder().setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()).build()).build());
+ if (getRouteRefresh()) {
+ caps.add(new OptionalCapabilitiesBuilder().setCParameters(MultiprotocolCapabilitiesUtil.RR_CAPABILITY).build());
+ }
+
if (!getAddPathDependency().isEmpty()) {
final List<AddressFamilies> addPathFamilies = filterAddPathDependency(getAddPathDependency());
caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
if (cParam.getBgpExtendedMessageCapability() != null) {
pref.setBgpExtendedMessageCapability(true);
}
+ if (cParam.getAugmentation(CParameters1.class) != null &&
+ cParam.getAugmentation(CParameters1.class).getRouteRefreshCapability() != null) {
+ pref.setRouteRefreshCapability(true);
+ }
}
}
}
cParam.getAugmentation(CParameters1.class).getAddPathCapability() != null) {
pref.setAddPathCapability(true);
}
+ if (cParam.getAugmentation(CParameters1.class) != null &&
+ cParam.getAugmentation(CParameters1.class).getRouteRefreshCapability() != null) {
+ pref.setRouteRefreshCapability(true);
+ }
if (cParam.getBgpExtendedMessageCapability() != null) {
pref.setBgpExtendedMessageCapability(true);
}
}
}
+ leaf route-refresh {
+ type boolean;
+ default "true";
+ }
+
leaf remote-as {
description
"Expected remote AS number. If not present, it is assumed
default "false";
}
+ leaf route-refresh-capability {
+ reference "https://tools.ietf.org/html/rfc2918";
+ type boolean;
+ default "false";
+ }
+
list advertized-table-types {
description "The BGP Table-type capabilities advertized by the BGP peer.";
leaf afi {
mxBean.setHost(host);
mxBean.setPort(port);
mxBean.setAdvertizedTable(Collections.<ObjectName>emptyList());
+ mxBean.setRouteRefresh(false);
{
final ObjectName ribON = createRIBImplModuleInstance(transaction);
mxBean.setRib(ribON);