final class SimpleNlriRegistry implements NlriRegistry {
private static final int RESERVED = 1;
+ private static final int NEXT_HOP_LENGHT = 1;
private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
private final ConcurrentMap<Class<? extends DataObject>, NlriSerializer> serializers = new ConcurrentHashMap<>();
byteAggregator.writeShort(this.afiReg.numberForClass(mpReachNlri.getAfi()));
byteAggregator.writeByte(this.safiReg.numberForClass(mpReachNlri.getSafi()));
- final ByteBuf nextHopBuffer = Unpooled.buffer();
- NextHopUtil.serializeNextHop(mpReachNlri.getCNextHop(), nextHopBuffer);
-
- byteAggregator.writeByte(nextHopBuffer.writerIndex());
- byteAggregator.writeBytes(nextHopBuffer);
+ if (mpReachNlri.getCNextHop() != null) {
+ final ByteBuf nextHopBuffer = Unpooled.buffer();
+ NextHopUtil.serializeNextHop(mpReachNlri.getCNextHop(), nextHopBuffer);
+ byteAggregator.writeByte(nextHopBuffer.writerIndex());
+ byteAggregator.writeBytes(nextHopBuffer);
+ } else {
+ byteAggregator.writeZero(NEXT_HOP_LENGHT);
+ }
byteAggregator.writeZero(RESERVED);
}
final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi()));
final int nextHopLength = buffer.readUnsignedByte();
- builder.setCNextHop(NextHopUtil.parseNextHop(buffer.readSlice(nextHopLength)));
+ if (nextHopLength != 0) {
+ builder.setCNextHop(NextHopUtil.parseNextHop(buffer.readSlice(nextHopLength)));
+ }
buffer.skipBytes(RESERVED);
final ByteBuf nlri = buffer.slice();
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.Notification;
regs.add(context.registerMessageSerializer(Notification.class, this.msgSerializer));
regs.add(context.registerAddressFamily(Ipv4AddressFamily.class, 1));
+ regs.add(context.registerAddressFamily(Ipv6AddressFamily.class, 2));
regs.add(context.registerSubsequentAddressFamily(UnicastSubsequentAddressFamily.class, 1));
regs.add(context.registerNlriParser(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, this.nlriParser));
+ regs.add(context.registerNlriParser(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, this.nlriParser));
regs.add(context.registerNlriSerializer(DataObject.class, this.nlriSerializer));
return regs;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.After;
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.MpUnreachNlriBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.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.ipv4.next.hop._case.Ipv4NextHopBuilder;
verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpReachNlriBuilder.class));
}
+ @Test
+ public void testMpReachWithZeroNextHop() throws BGPParsingException {
+ final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
+ final byte[] mpReachBytes = {
+ 0x00, 0x01, 0x01, 0x00, 0x00
+ };
+ final MpReachNlri mpReach = new MpReachNlriBuilder()
+ .setAfi(Ipv4AddressFamily.class)
+ .setSafi(UnicastSubsequentAddressFamily.class)
+ .build();
+ final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
+ nlriReg.serializeMpReach(mpReach, buffer);
+ assertArrayEquals(mpReachBytes, buffer.array());
+ assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes)));
+ }
+
+ @Test
+ public void testMpReachIpv6() throws BGPParsingException {
+ final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
+ final byte[] mpReachBytes = {
+ 0x00, 0x02, 0x01, 0x00, 0x00
+ };
+ final MpReachNlri mpReach = new MpReachNlriBuilder()
+ .setAfi(Ipv6AddressFamily.class)
+ .setSafi(UnicastSubsequentAddressFamily.class)
+ .build();
+ final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
+ nlriReg.serializeMpReach(mpReach, buffer);
+ assertArrayEquals(mpReachBytes, buffer.array());
+ assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes)));
+ }
+
@Test
public void testMpUnReachParser() throws BGPParsingException {
final NlriRegistry nlriReg = this.ctx.getNlriRegistry();