import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Map;
import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
import org.opendaylight.protocol.bgp.parser.spi.CapabilityUtil;
import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.types.rev171204.Uint24;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.Tables;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.SubsequentAddressFamily;
+import org.opendaylight.yangtools.yang.binding.util.BindingMap;
+import org.opendaylight.yangtools.yang.common.Uint32;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public CParameters parseCapability(final ByteBuf buffer) {
- final List<Tables> tables = new ArrayList<>();
+ final BindingMap.Builder<TablesKey, Tables> tables = BindingMap.builder();
while (buffer.isReadable()) {
final short afival = buffer.readShort();
- final Class<? extends AddressFamily> afi = this.afiReg.classForFamily(afival);
+ final AddressFamily afi = this.afiReg.classForFamily(afival);
if (afi == null) {
LOG.debug("Ignoring GR capability for unknown address family {}", afival);
buffer.skipBytes(PER_TABLE_SIZE - 2);
}
final byte safival = buffer.readByte();
- final Class<? extends SubsequentAddressFamily> safi = this.safiReg.classForFamily(safival);
+ final SubsequentAddressFamily safi = this.safiReg.classForFamily(safival);
if (safi == null) {
LOG.debug("Ignoring GR capability for unknown subsequent address family {}", safival);
- buffer.skipBytes(1);
+ buffer.skipBytes(PER_TABLE_SIZE - 3);
continue;
}
final Tables table = new TablesBuilder()
.setAfi(afi)
.setSafi(safi)
- .setAfiFlags(new Tables.AfiFlags(Boolean.valueOf(afiFlags == AFI_FLAG_FORWARDING_STATE)))
- .setLongLiveStaleTime(Long.valueOf(staleTime))
+ .setAfiFlags(new Tables.AfiFlags(afiFlags == AFI_FLAG_FORWARDING_STATE))
+ .setLongLivedStaleTime(new Uint24(Uint32.valueOf(staleTime)))
.build();
tables.add(table);
}
return new CParametersBuilder()
- .addAugmentation(CParameters1.class, new CParameters1Builder()
- .setLlGracefulRestartCapability(new LlGracefulRestartCapabilityBuilder()
- .setTables(tables)
- .build())
+ .addAugmentation(new CParameters1Builder()
+ .setLlGracefulRestartCapability(new LlGracefulRestartCapabilityBuilder()
+ .setTables(tables.build())
.build())
+ .build())
.build();
}
}
private ByteBuf serializeCapability(final LlGracefulRestartCapability cap) {
- final List<Tables> tables = cap.getTables();
+ final Map<TablesKey, Tables> tables = cap.getTables();
if (tables == null || tables.isEmpty()) {
return Unpooled.EMPTY_BUFFER;
}
final ByteBuf buffer = Unpooled.buffer(PER_TABLE_SIZE * tables.size());
- for (Tables table : tables) {
- final Class<? extends AddressFamily> afi = table.getAfi();
- final Class<? extends SubsequentAddressFamily> safi = table.getSafi();
+ for (Tables table : tables.values()) {
+ final AddressFamily afi = table.getAfi();
final Integer afival = this.afiReg.numberForClass(afi);
checkArgument(afival != null, "Unhandled address family %s", afi);
buffer.writeShort(afival);
+ final SubsequentAddressFamily safi = table.getSafi();
final Integer safival = this.safiReg.numberForClass(safi);
checkArgument(safival != null, "Unhandled subsequent address family %s", safi);
buffer.writeByte(safival);
- if (table.getAfiFlags() != null && table.getAfiFlags().isForwardingState()) {
+ if (table.getAfiFlags() != null && table.getAfiFlags().getForwardingState()) {
buffer.writeByte(AFI_FLAG_FORWARDING_STATE);
} else {
- buffer.writeZero(1);
+ buffer.writeByte(0);
}
- final Long staleTime = table.getLongLiveStaleTime();
- final int timeval = staleTime != null ? staleTime.intValue() : 0;
+ final Uint24 staleTime = table.getLongLivedStaleTime();
+ final int timeval = staleTime != null ? staleTime.getValue().intValue() : 0;
checkArgument(timeval >= 0 && timeval <= MAX_STALE_TIME, "Restart time is %s", staleTime);
buffer.writeMedium(timeval);
}