private void serializeTables(final List<Tables> tables, final ByteBuf bytes) { if (tables == null) { return; } for (final Tables t : tables) { final Class<? extends AddressFamily> afi = t.getAfi(); final Integer afival = this.afiReg.numberForClass(afi); Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); bytes.writeShort(afival); final Class<? extends SubsequentAddressFamily> safi = t.getSafi(); final Integer safival = this.safiReg.numberForClass(safi); Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); bytes.writeByte(safival); if (t.getAfiFlags() != null && t.getAfiFlags().isForwardingState()) { bytes.writeByte(AFI_FLAG_FORWARDING_STATE); } else { bytes.writeZero(1); } } }
while (buffer.readableBytes() != 0) { final int afiVal = buffer.readShort(); final Class<? extends AddressFamily> afi = this.afiReg.classForFamily(afiVal); if (afi == null) { LOG.debug("Ignoring GR capability for unknown address family {}", afiVal);
@Override public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { final List<AddressFamilies> families = new ArrayList<>(); while (buffer.isReadable()) { final int afiVal = buffer.readUnsignedShort(); final Class<? extends AddressFamily> afi = this.afiReg.classForFamily(afiVal); if (afi == null) { throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported."); } final int safiVal = buffer.readUnsignedByte(); final Class<? extends SubsequentAddressFamily> safi = this.safiReg.classForFamily(safiVal); if (safi == null) { throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported."); } final SendReceive sendReceive = SendReceive.forValue(buffer.readUnsignedByte()); if (sendReceive != null) { families.add(new AddressFamiliesBuilder().setAfi(afi).setSafi(safi).setSendReceive(sendReceive).build()); } } return new CParametersBuilder().addAugmentation(CParameters1.class,new CParameters1Builder().setAddPathCapability( new AddPathCapabilityBuilder().setAddressFamilies(families).build()).build()).build(); }
@Override public void serializeCapability(final CParameters capability, final ByteBuf byteAggregator) { if ( (capability.getAugmentation(CParameters1.class) == null) || (capability.getAugmentation(CParameters1.class).getAddPathCapability() == null) ) { return; } final AddPathCapability addPathCap = capability.getAugmentation(CParameters1.class).getAddPathCapability(); final List<AddressFamilies> families = addPathCap.getAddressFamilies(); if (families != null) { final ByteBuf capBuffer = Unpooled.buffer(families.size() * TRIPLET_BYTE_SIZE); for (final AddressFamilies addressFamily : families) { final Class<? extends AddressFamily> afi = addressFamily.getAfi(); final Integer afival = this.afiReg.numberForClass(afi); Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); capBuffer.writeShort(afival); final Class<? extends SubsequentAddressFamily> safi = addressFamily.getSafi(); final Integer safival = this.safiReg.numberForClass(safi); Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); capBuffer.writeByte(safival); final SendReceive sendReceive = addressFamily.getSendReceive(); Preconditions.checkArgument(sendReceive != null, "Unhandled Send/Receive value"); capBuffer.writeByte(sendReceive.getIntValue()); } CapabilityUtil.formatCapability(CODE, capBuffer, byteAggregator); } }