import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
+import java.util.Optional;
import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
import org.opendaylight.protocol.bgp.parser.BGPError;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
import org.opendaylight.protocol.bgp.parser.spi.MessageSerializer;
if (body.readableBytes() < TRIPLET_BYTE_SIZE) {
throw BGPDocumentedException.badMessageLength("RouteRefresh message is too small.", messageLength);
}
- try {
- final BgpTableType parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(body, this.afiReg, this.safiReg);
- return new RouteRefreshBuilder().setAfi(parsedAfiSafi.getAfi()).setSafi(parsedAfiSafi.getSafi()).build();
- } catch (final BGPParsingException e) {
- LOG.warn("Fail to parse BGP RouteRefresh message.", e);
+ final Optional<BgpTableType> parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(body, this.afiReg, this.safiReg);
+ if (!parsedAfiSafi.isPresent()) {
throw new BGPDocumentedException("Unsupported afi/safi in Route Refresh message.", BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED);
}
+ return new RouteRefreshBuilder(parsedAfiSafi.get()).build();
}
}
final ByteBuf paramBody = buffer.readSlice(capLength);
final CParameters ret = this.reg.parseCapability(capCode, paramBody);
if (ret == null) {
- LOG.debug("Ignoring unsupported capability {}", capCode);
+ LOG.info("Ignoring unsupported capability {}", capCode);
return null;
}
return new OptionalCapabilitiesBuilder().setCParameters(ret).build();
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
+import java.util.Optional;
import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
import org.opendaylight.protocol.bgp.parser.BGPParsingException;
import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.MultiprotocolCapabilityBuilder;
public final class MultiProtocolCapabilityHandler implements CapabilityParser, CapabilitySerializer {
+
public static final int CODE = 1;
private final AddressFamilyRegistry afiReg;
@Override
public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException {
- final BgpTableType parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(buffer, this.afiReg, this.safiReg);
-
+ final Optional<BgpTableType> parsedAfiSafiOptional = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(buffer, this.afiReg, this.safiReg);
+ if (!parsedAfiSafiOptional.isPresent()) {
+ return null;
+ }
return new CParametersBuilder().addAugmentation(CParameters1.class,new CParameters1Builder().setMultiprotocolCapability(
- new MultiprotocolCapabilityBuilder().setAfi(parsedAfiSafi.getAfi()).setSafi(parsedAfiSafi.getSafi()).build()).build()).build();
+ new MultiprotocolCapabilityBuilder(parsedAfiSafiOptional.get()).build()).build()).build();
}
@Override
assertEquals(capabilityToSerialize.hashCode(), newCaps.hashCode());
}
- @Test(expected=BGPParsingException.class)
- public void testAfiException() throws BGPDocumentedException, BGPParsingException {
- final ByteBuf bytes = this.serializedBytes.copy();
- final MultiProtocolCapabilityHandler handler = new MultiProtocolCapabilityHandler(this.afirExpection, this.safir);
- handler.parseCapability(bytes);
- }
-
- @Test(expected=BGPParsingException.class)
- public void testSafiException() throws BGPDocumentedException, BGPParsingException {
- final ByteBuf bytes = this.serializedBytes.copy();
- final MultiProtocolCapabilityHandler handler = new MultiProtocolCapabilityHandler(this.afir, this.safirException);
- handler.parseCapability(bytes);
- }
-
@Test(expected=IllegalArgumentException.class)
public void testUnhandledAfi() {
final CParameters capabilityToSerialize = new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder().setMultiprotocolCapability(
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
-import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import java.util.Optional;
import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
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.mp.capabilities.RouteRefreshCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public final class MultiprotocolCapabilitiesUtil {
+ private static final Logger LOG = LoggerFactory.getLogger(MultiprotocolCapabilitiesUtil.class);
+
public static final CParameters RR_CAPABILITY = new CParametersBuilder().addAugmentation(CParameters1.class,
new CParameters1Builder().setRouteRefreshCapability(new RouteRefreshCapabilityBuilder().build()).build()).build();
capBuffer.writeByte(safival);
}
- public static BgpTableType parseMPAfiSafi(final ByteBuf buffer, final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) throws BGPParsingException {
+ public static Optional<BgpTableType> parseMPAfiSafi(final ByteBuf buffer, final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) {
final int afiVal = buffer.readUnsignedShort();
final Class<? extends AddressFamily> afi = afiReg.classForFamily(afiVal);
if (afi == null) {
- throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported.");
+ LOG.info("Unsupported AFI {} parsed.", afiVal);
+ return Optional.empty();
}
// skip reserved
buffer.skipBytes(RESERVED);
final int safiVal = buffer.readUnsignedByte();
final Class<? extends SubsequentAddressFamily> safi = safiReg.classForFamily(safiVal);
if (safi == null) {
- throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported.");
+ LOG.info("Unsupported SAFI {} parsed.", safiVal);
+ return Optional.empty();
}
- return new BgpTableTypeImpl(afi, safi);
+ return Optional.of(new BgpTableTypeImpl(afi, safi));
}
}
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+
import com.google.common.primitives.UnsignedBytes;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
+import java.util.Optional;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
MockitoAnnotations.initMocks(this);
Mockito.doReturn(1).when(this.afiReg).numberForClass(Ipv4AddressFamily.class);
Mockito.doReturn(Ipv4AddressFamily.class).when(this.afiReg).classForFamily(1);
+ Mockito.doReturn(null).when(this.afiReg).classForFamily(2);
Mockito.doReturn(1).when(this.safiReg).numberForClass(UnicastSubsequentAddressFamily.class);
Mockito.doReturn(UnicastSubsequentAddressFamily.class).when(this.safiReg).classForFamily(1);
+ Mockito.doReturn(null).when(this.safiReg).classForFamily(3);
}
@Test
public void testMultiprotocolCapabilitiesUtil() throws BGPParsingException {
final byte[] bytes = new byte[] {0, 1, 0, 1};
final ByteBuf bytesBuf = Unpooled.copiedBuffer(bytes);
- final BgpTableType parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(bytesBuf, this.afiReg, this.safiReg);
+ final BgpTableType parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(bytesBuf, this.afiReg, this.safiReg).get();
assertEquals(Ipv4AddressFamily.class, parsedAfiSafi.getAfi());
assertEquals(UnicastSubsequentAddressFamily.class, parsedAfiSafi.getSafi());
assertArrayEquals(bytes, serializedAfiSafi.array());
}
+ @Test
+ public void testUnsupportedAfi() {
+ final byte[] bytes = new byte[] {0, 2, 0, 1};
+ final ByteBuf bytesBuf = Unpooled.copiedBuffer(bytes);
+ final Optional<BgpTableType> parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(bytesBuf, this.afiReg, this.safiReg);
+ Assert.assertFalse(parsedAfiSafi.isPresent());
+ }
+
+ @Test
+ public void testUnsupportedSafi() {
+ final byte[] bytes = new byte[] {0, 1, 0, 3};
+ final ByteBuf bytesBuf = Unpooled.copiedBuffer(bytes);
+ final Optional<BgpTableType> parsedAfiSafi = MultiprotocolCapabilitiesUtil.parseMPAfiSafi(bytesBuf, this.afiReg, this.safiReg);
+ Assert.assertFalse(parsedAfiSafi.isPresent());
+ }
+
@Test(expected=UnsupportedOperationException.class)
public void testAttributeUtilPrivateConstructor() throws Throwable {
final Constructor<AttributeUtil> c = AttributeUtil.class.getDeclaredConstructor();