/** * Parses BGP Route Refresh message to bytes. * * @param body ByteBuf to be parsed * @param messageLength the length of the message * @return {@link RouteRefresh} which represents BGP notification message * @throws BGPDocumentedException if parsing goes wrong */ @Override public RouteRefresh parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { Preconditions.checkArgument(body != null, "Body buffer cannot be null."); if (body.readableBytes() < TRIPLET_BYTE_SIZE) { throw BGPDocumentedException.badMessageLength("RouteRefresh message is too small.", messageLength); } 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(); } }
/** * Serializes BGP Route Refresh message. * * @param message to be serialized * @param bytes ByteBuf where the message will be serialized */ @Override public void serializeMessage(final Notification message, final ByteBuf bytes) { Preconditions.checkArgument(message instanceof RouteRefresh, "Message is not of type RouteRefresh."); final RouteRefresh msg = (RouteRefresh) message; final ByteBuf msgBuf = Unpooled.buffer(TRIPLET_BYTE_SIZE); MultiprotocolCapabilitiesUtil.serializeMPAfiSafi(this.afiReg, this.safiReg, msg.getAfi(), msg.getSafi(), msgBuf); LOG.trace("RouteRefresh message serialized to: {}", ByteBufUtil.hexDump(msgBuf)); MessageUtil.formatMessage(TYPE, msgBuf, bytes); }
@Override public void serializeCapability(final CParameters capability, final ByteBuf byteAggregator) { if ( capability.getAugmentation(CParameters1.class) == null || capability.getAugmentation(CParameters1.class).getMultiprotocolCapability() == null ) { return; } final MultiprotocolCapability mp = capability.getAugmentation(CParameters1.class).getMultiprotocolCapability(); final ByteBuf capBuffer = Unpooled.buffer(); MultiprotocolCapabilitiesUtil.serializeMPAfiSafi(this.afiReg, this.safiReg, mp.getAfi(), mp.getSafi(), capBuffer); CapabilityUtil.formatCapability(CODE, capBuffer, byteAggregator); }
@Override public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { 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(parsedAfiSafiOptional.get()).build()).build()).build(); }