if (nextHop.getLinkLocal() != null) {
byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getLinkLocal()));
}
+ } else {
+ throw new IllegalArgumentException("Cannot serialize NEXT_HOP. Class not supported: " + cnextHop);
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
public class NextHopUtilTest {
assertArrayEquals(ipv6lB, ByteArray.readAllBytes(buffer));
buffer.clear();
- NextHopUtil.serializeNextHop(new CNextHop() {
-
- @Override
- public Class<? extends DataContainer> getImplementedInterface() {
- return null;
- }
- }, buffer);
- assertEquals(0, buffer.readableBytes());
hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setLinkLocal(ipv6l).build()).build();
buffer.clear();
}
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testSerializeNextHopException() {
+ NextHopUtil.serializeNextHop(() -> null, null);
+ }
+
@Test
public void testParseNextHop() {
CNextHop hop = null;
import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.ESImpRouteTargetExtCom;
import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.Layer2AttributesExtCom;
import org.opendaylight.protocol.bgp.evpn.impl.extended.communities.MACMobExtCom;
+import org.opendaylight.protocol.bgp.evpn.impl.nlri.EvpnNlriParser;
import org.opendaylight.protocol.bgp.evpn.impl.nlri.NlriActivator;
import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.EvpnRoutes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.evpn.routes.evpn.route.attributes.extended.communities.extended.community.DefaultGatewayExtendedCommunityCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.routes.evpn.routes.evpn.route.attributes.extended.communities.extended.community.Layer2AttributesExtendedCommunityCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.EsImportRouteExtendedCommunityCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.EsiLabelExtendedCommunityCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.update.attributes.extended.communities.extended.community.MacMobilityExtendedCommunityCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
private static final int L2VPN_AFI = 25;
regs.add(context.registerSubsequentAddressFamily(EvpnSubsequentAddressFamily.class, EVPN_SAFI));
regs.add(context.registerAddressFamily(L2vpnAddressFamily.class, L2VPN_AFI));
+ registerNlriHandler(context, regs);
NlriActivator.registerNlriParsers(regs);
registerExtendedCommunities(context, regs);
ESIActivator.registerEsiTypeParsers(regs);
return regs;
}
+ private void registerNlriHandler(final BGPExtensionProviderContext context, final List<AutoCloseable> regs) {
+ final NextHopParserSerializer nextHopParser = new NextHopParserSerializer() {};
+ final EvpnNlriParser nlriHandler = new EvpnNlriParser();
+ regs.add(context.registerNlriParser(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class,
+ nlriHandler, nextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
+ regs.add(context.registerNlriSerializer(EvpnRoutes.class, nlriHandler));
+ }
+
private void registerExtendedCommunities(final BGPExtensionProviderContext context, final List<AutoCloseable> regs) {
final DefaultGatewayExtCom defGEC = new DefaultGatewayExtCom();
regs.add(context.registerExtendedCommunityParser(defGEC.getType(true), defGEC.getSubType(), defGEC));
import java.util.ArrayList;
import java.util.List;
import org.opendaylight.protocol.bgp.linkstate.attribute.LinkstateAttributeParser;
-import org.opendaylight.protocol.bgp.linkstate.attribute.next.hop.LinkstateNextHopParser;
import org.opendaylight.protocol.bgp.linkstate.nlri.LinkNlriParser;
import org.opendaylight.protocol.bgp.linkstate.nlri.LinkstateNlriParser;
import org.opendaylight.protocol.bgp.linkstate.nlri.NodeNlriParser;
import org.opendaylight.protocol.bgp.linkstate.nlri.TeLspNlriSerializer;
import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
import org.opendaylight.protocol.rsvp.parser.spi.RSVPTeObjectRegistry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Attributes1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily;
regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI));
regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI));
- LinkstateNextHopParser linkstateNextHopParser = new LinkstateNextHopParser();
+ final NextHopParserSerializer linkstateNextHopParser = new NextHopParserSerializer(){};
regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class,
new LinkstateNlriParser(false), linkstateNextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
+++ /dev/null
-/*
- * Copyright (c) 2015 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.linkstate.attribute.next.hop;
-
-import io.netty.buffer.ByteBuf;
-import org.opendaylight.bgp.concepts.NextHopUtil;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
-import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-
-public class LinkstateNextHopParser implements NextHopParserSerializer {
- @Override
- public CNextHop parseNextHop(final ByteBuf buffer) throws BGPParsingException {
- return NextHopUtil.parseNextHop(buffer);
- }
-
- @Override
- public void serializeNextHop(final CNextHop cNextHop, final ByteBuf byteAggregator) {
- NextHopUtil.serializeNextHop(cNextHop, byteAggregator);
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2015 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.linkstate.attribute.next.hop;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
-import org.opendaylight.protocol.util.ByteArray;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-
-public class LinkstateNextHopParserTest {
-
- public static final byte[] ipv6B = {0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
- public static final byte[] ipv6lB = {0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, (byte) 0xfe, (byte) 0x80, 0, 0, 0, 0, 0, 0, (byte) 0xc0, 1, 0x0b, (byte) 0xff, (byte) 0xfe, 0x7e, 0, 0};
-
- public static final Ipv6Address ipv6 = new Ipv6Address("2001:db8::1");
- public static final Ipv6Address ipv6l = new Ipv6Address("fe80::c001:bff:fe7e:0");
-
- LinkstateNextHopParser linkstateNextHopParser;
- CNextHop hop;
- ByteBuf buffer;
-
- @Before
- public final void setUp() {
- linkstateNextHopParser = new LinkstateNextHopParser();
- buffer = Unpooled.buffer();
- }
-
- @Test
- public void testSerializeIpv4NextHopCase() throws BGPParsingException {
- final byte[] ipv4B = {42, 42, 42, 42};
- hop = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
- .setGlobal(new Ipv4Address("42.42.42.42")).build()).build();
-
- linkstateNextHopParser.serializeNextHop(hop, buffer);
- assertArrayEquals(ipv4B, ByteArray.readAllBytes(buffer));
-
- final CNextHop parsedHop = linkstateNextHopParser.parseNextHop(Unpooled.wrappedBuffer(ipv4B));
- assertTrue(parsedHop instanceof Ipv4NextHopCase);
- assertEquals(hop, parsedHop);
- }
-
- @Test
- public void testSerializeIpv6NextHopCase() throws BGPParsingException {
- hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(ipv6).setLinkLocal(ipv6l).build()).build();
- buffer.clear();
- linkstateNextHopParser.serializeNextHop(hop, buffer);
- assertArrayEquals(ipv6lB, ByteArray.readAllBytes(buffer));
-
- final CNextHop parsedHop = linkstateNextHopParser.parseNextHop(Unpooled.wrappedBuffer(ipv6B));
- assertTrue(parsedHop instanceof Ipv6NextHopCase);
- final Ipv6NextHop nextHopIpv6 = ((Ipv6NextHopCase) parsedHop).getIpv6NextHop();
- assertEquals(ipv6, nextHopIpv6.getGlobal());
- assertNull(nextHopIpv6.getLinkLocal());
- }
-
- @Test
- public void testSerializeNextHopEmpty() {
- buffer.clear();
- try {
- linkstateNextHopParser.serializeNextHop(new CNextHop() {
- @Override
- public Class<? extends DataContainer> getImplementedInterface() {
- return null;
- }
- }, buffer);
- } catch (final IllegalArgumentException e) {
- assertEquals("cNextHop is not a Linkstate Ipv6 NextHop object.", e.getMessage());
- }
- }
-
- @Test
- public void testSerializeNextHopGlobalAddressEmpty() {
- hop = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setLinkLocal(ipv6l).build()).build();
- buffer.clear();
- try {
- linkstateNextHopParser.serializeNextHop(hop, buffer);
- fail("Exception should happen");
- } catch (final IllegalArgumentException e) {
- assertEquals("Ipv6 Next Hop is missing Global address.", e.getMessage());
- }
- }
-}
\ No newline at end of file
package org.opendaylight.protocol.bgp.parser.spi;
import io.netty.buffer.ByteBuf;
+import javax.annotation.Nonnull;
+import org.opendaylight.bgp.concepts.NextHopUtil;
import org.opendaylight.protocol.bgp.parser.BGPParsingException;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
+/**
+ * Handles Next Hop, by default use {@link NextHopUtil}
+ * which is handles Ipv4 and Ipv6 Next hop.
+ */
public interface NextHopParserSerializer {
- CNextHop parseNextHop(ByteBuf buffer) throws BGPParsingException;
+ /**
+ * Parse Next hop from buffer,
+ *
+ * @param buffer Encoded Next Hop in ByteBuf.
+ * @return CNextHop
+ * @throws BGPParsingException
+ */
+ default CNextHop parseNextHop(@Nonnull ByteBuf buffer) throws BGPParsingException {
+ return NextHopUtil.parseNextHop(buffer);
+ }
- void serializeNextHop(CNextHop cNextHop, final ByteBuf byteAggregator);
+ /**
+ * Serialize Next Hop
+ *
+ * @param cNextHop Next Hop container
+ * @param byteAggregator return Encoded Next Hop in ByteBuf
+ */
+ default void serializeNextHop(@Nonnull CNextHop cNextHop, @Nonnull final ByteBuf byteAggregator) {
+ NextHopUtil.serializeNextHop(cNextHop, byteAggregator);
+ }
}
private static final int RESERVED = 1;
private static final int NEXT_HOP_LENGHT = 1;
+ private static final String PARSER_NOT_FOUND = "Nlri parser not found for table type {}";
private static final Logger LOG = LoggerFactory.getLogger(SimpleNlriRegistry.class);
private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
final ByteBuf nlri = buffer.slice();
final BgpTableType key = createKey(builder.getAfi(), builder.getSafi());
final NlriParser parser = this.handlers.get(key);
- parser.parseNlri(nlri, builder, constraint);
+ if (parser == null) {
+ LOG.warn(PARSER_NOT_FOUND, key);
+ } else {
+ parser.parseNlri(nlri, builder, constraint);
+ }
return builder.build();
}
final ByteBuf nlri = buffer.slice();
final NlriParser parser = this.handlers.get(key);
- parser.parseNlri(nlri, builder, constraint);
+ if (parser == null) {
+ LOG.warn(PARSER_NOT_FOUND, key);
+ } else {
+ parser.parseNlri(nlri, builder, constraint);
+ }
return builder.build();
}
}