import org.opendaylight.protocol.pcep.PCEPTerminationReason;
import org.opendaylight.protocol.pcep.TerminationReason;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Stateful1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.LspObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Path1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.StatefulTlv1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.Stateful;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.MessageHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Object;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLsp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLspBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLspKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.StatefulTlvBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.reported.lsp.Path;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.reported.lsp.PathKey;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
}
};
+ private final AtomicBoolean statefulCapability = new AtomicBoolean(false);
+ private final AtomicBoolean lspUpdateCapability = new AtomicBoolean(false);
+ private final AtomicBoolean initiationCapability = new AtomicBoolean(false);
+
@GuardedBy("this")
final Map<PlspId, String> lsps = new HashMap<>();
@GuardedBy("this")
.setIpAddress(IetfInetUtil.INSTANCE.ipAddressNoZoneFor(peerAddress));
// Let subclass fill the details
- onSessionUp(pccBuilder, peerAddress, psession.getRemoteTlvs());
+ updateStatefulCapabilities(pccBuilder, peerAddress, psession.getRemoteTlvs());
synced.set(isSynchronized());
}
}
- protected abstract void onSessionUp(PathComputationClientBuilder pccBuilder, InetAddress peerAddress,
- @Nullable Tlvs remoteTlvs);
+ @Holding("this")
+ private void updateStatefulCapabilities(final PathComputationClientBuilder pccBuilder,
+ final InetAddress peerAddress, final @Nullable Tlvs remoteTlvs) {
+ if (remoteTlvs != null) {
+ final Tlvs1 statefulTlvs = remoteTlvs.augmentation(Tlvs1.class);
+ if (statefulTlvs != null) {
+ final Stateful stateful = statefulTlvs.getStateful();
+ if (stateful != null) {
+ statefulCapability.set(true);
+ final var updateCap = stateful.getLspUpdateCapability();
+ if (updateCap != null) {
+ lspUpdateCapability.set(updateCap);
+ }
+ final Stateful1 stateful1 = stateful.augmentation(Stateful1.class);
+ if (stateful1 != null) {
+ final var initiation = stateful1.getInitiation();
+ if (initiation != null) {
+ initiationCapability.set(initiation);
+ }
+ }
+
+ pccBuilder.setReportedLsp(Map.of());
+ if (isSynchronized()) {
+ pccBuilder.setStateSync(PccSyncState.Synchronized);
+ } else if (isTriggeredInitialSynchro()) {
+ pccBuilder.setStateSync(PccSyncState.TriggeredInitialSync);
+ } else if (isIncrementalSynchro()) {
+ pccBuilder.setStateSync(PccSyncState.IncrementalSync);
+ } else {
+ pccBuilder.setStateSync(PccSyncState.InitialResync);
+ }
+ pccBuilder.setStatefulTlv(new StatefulTlvBuilder()
+ .addAugmentation(new StatefulTlv1Builder(statefulTlvs).build())
+ .build());
+ return;
+ }
+ }
+ }
+ LOG.debug("Peer {} does not advertise stateful TLV", peerAddress);
+ }
synchronized void updatePccState(final PccSyncState pccSyncState) {
if (nodeState == null) {
}
@Override
- public int getDelegatedLspsCount() {
+ public final int getDelegatedLspsCount() {
return Math.toIntExact(lspData.values().stream()
.map(ReportedLsp::getPath).filter(pathList -> pathList != null && !pathList.isEmpty())
// pick the first path, as delegate status should be same in each path
}
@Override
- public boolean isSessionSynchronized() {
+ public final boolean isSessionSynchronized() {
return synced.get();
}
+ @Override
+ public final boolean isInitiationCapability() {
+ return initiationCapability.get();
+ }
+
+ @Override
+ public final boolean isStatefulCapability() {
+ return statefulCapability.get();
+ }
+
+ @Override
+ public final boolean isLspUpdateCapability() {
+ return lspUpdateCapability.get();
+ }
+
+
@Override
public synchronized ListenableFuture<RpcResult<Void>> tearDownSession(final TearDownSessionInput input) {
close();
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import org.checkerframework.checker.lock.qual.GuardedBy;
import org.checkerframework.checker.lock.qual.Holding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.PcinitiateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Stateful1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.PcinitiateMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.Requests;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.RequestsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PcupdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.StatefulTlv1Builder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SymbolicPathName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.LspBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.lsp.TlvsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcupd.message.pcupd.message.updates.PathBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.Srp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.SrpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.Stateful;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.symbolic.path.name.tlv.SymbolicPathNameBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.Pcerr;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.PcerrBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.PcerrMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.RequestId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.EroBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.Tlvs;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcep.error.object.ErrorObjectBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.PcerrMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.PathComputationClientBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLsp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.ReportedLspBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.StatefulTlvBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.pcep.client.attributes.path.computation.client.reported.lsp.Path;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
class PCEPTopologySessionListener extends AbstractTopologySessionListener {
private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologySessionListener.class);
private static final PlspId PLSPID_ZERO = new PlspId(Uint32.ZERO);
+ private static final SrpIdNumber SRPID_ZERO = new SrpIdNumber(Uint32.ZERO);
private final AtomicLong requestId = new AtomicLong(1L);
@GuardedBy("this")
private final List<PlspId> staleLsps = new ArrayList<>();
- private final AtomicBoolean statefulCapability = new AtomicBoolean(false);
- private final AtomicBoolean lspUpdateCapability = new AtomicBoolean(false);
- private final AtomicBoolean initiationCapability = new AtomicBoolean(false);
-
private final PceServerProvider pceServerProvider;
/**
}
private static LspDbVersion geLspDbVersionTlv(final Lsp lsp) {
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object
- .lsp.Tlvs tlvs = lsp.getTlvs();
- if (tlvs != null && tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
- .controller.pcep.sync.optimizations.rev200720.Tlvs1.class) != null) {
- return tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller
- .pcep.sync.optimizations.rev200720.Tlvs1.class).getLspDbVersion();
- }
- return null;
- }
-
- @Override
- protected void onSessionUp(final PathComputationClientBuilder pccBuilder, final InetAddress peerAddress,
- final Tlvs remoteTlvs) {
- if (remoteTlvs != null) {
- final Tlvs1 statefulTlvs = remoteTlvs.augmentation(Tlvs1.class);
- if (statefulTlvs != null) {
- final Stateful stateful = statefulTlvs.getStateful();
- if (stateful != null) {
- setStatefulCapabilities(stateful);
- pccBuilder.setReportedLsp(Map.of());
- if (isSynchronized()) {
- pccBuilder.setStateSync(PccSyncState.Synchronized);
- } else if (isTriggeredInitialSynchro()) {
- pccBuilder.setStateSync(PccSyncState.TriggeredInitialSync);
- } else if (isIncrementalSynchro()) {
- pccBuilder.setStateSync(PccSyncState.IncrementalSync);
- } else {
- pccBuilder.setStateSync(PccSyncState.InitialResync);
- }
- pccBuilder.setStatefulTlv(new StatefulTlvBuilder()
- .addAugmentation(new StatefulTlv1Builder(statefulTlvs).build())
- .build());
- return;
- }
+ final var tlvs = lsp.getTlvs();
+ if (tlvs != null) {
+ final var tlvs1 = tlvs.augmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
+ .controller.pcep.sync.optimizations.rev200720.Tlvs1.class);
+ if (tlvs1 != null) {
+ return tlvs1.getLspDbVersion();
}
}
- LOG.debug("Peer {} does not advertise stateful TLV", peerAddress);
+ return null;
}
@Override
}
private boolean handleErrorMessage(final PcerrMessage message) {
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message
- .PcerrMessage errMsg = message.getPcerrMessage();
+ final var errMsg = message.getPcerrMessage();
if (errMsg.getErrorType() instanceof StatefulCase) {
final StatefulCase stat = (StatefulCase) errMsg.getErrorType();
- for (final Srps srps : stat.getStateful().getSrps()) {
+ for (final Srps srps : stat.getStateful().nonnullSrps()) {
final SrpIdNumber id = srps.getSrp().getOperationId();
- if (id.getValue().toJava() != 0) {
+ if (!SRPID_ZERO.equals(id)) {
final PCEPRequest req = removeRequest(id);
if (req != null) {
req.done(OperationResults.createFailed(errMsg.getErrors()));
return false;
}
final SrpIdNumber id = srp.getOperationId();
- if (id.getValue().toJava() == 0) {
+ if (SRPID_ZERO.equals(id)) {
return false;
}
switch (lsp.getOperational()) {
final PlspId plspid = lsp.getPlspId();
final Srp srp = report.getSrp();
- if (!lsp.getSync() && (plspid == null || plspid.getValue().toJava() == 0)) {
+ if (!lsp.getSync() && (plspid == null || PLSPID_ZERO.equals(plspid))) {
purgeStaleLsps(ctx);
if (isTriggeredSyncInProcess()) {
if (srp == null) {
return false;
}
final SrpIdNumber id = srp.getOperationId();
- if (id.getValue().toJava() == 0) {
+ if (SRPID_ZERO.equals(id)) {
return false;
}
final PCEPRequest req = removeRequest(id);
pst = null;
}
pb.addAugmentation(p1Builder.build());
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp
- .object.lsp.Tlvs tlvs = report.getLsp().getTlvs();
+ final var tlvs = report.getLsp().getTlvs();
if (tlvs != null) {
if (tlvs.getLspIdentifiers() != null) {
pb.setLspId(tlvs.getLspIdentifiers().getLspId());
sendMessage(rep, new SrpIdNumber(Uint32.ZERO), null);
return false;
}
- for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq
- .message.Requests req : message.getRequests()) {
+ for (var req : message.nonnullRequests()) {
LOG.debug("Process request {}", req);
rep = pathComputation.computePath(req);
SrpIdNumber repId = null;
return true;
}
listenerState.updateLastReceivedRptMsg();
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt
- .message.PcrptMessage rpt = ((PcrptMessage) message).getPcrptMessage();
- for (final Reports report : rpt.getReports()) {
+ final var rpt = ((PcrptMessage) message).getPcrptMessage();
+ for (final Reports report : rpt.nonnullReports()) {
if (!manageNextReport(report, ctx)) {
return false;
}
staleLsps.clear();
}
- @Override
- public boolean isInitiationCapability() {
- return initiationCapability.get();
- }
-
- @Override
- public boolean isStatefulCapability() {
- return statefulCapability.get();
- }
-
- @Override
- public boolean isLspUpdateCapability() {
- return lspUpdateCapability.get();
- }
-
- private synchronized void setStatefulCapabilities(final Stateful stateful) {
- statefulCapability.set(true);
- if (stateful.getLspUpdateCapability() != null) {
- lspUpdateCapability.set(stateful.getLspUpdateCapability());
- }
- final Stateful1 stateful1 = stateful.augmentation(Stateful1.class);
- if (stateful1 != null && stateful1.getInitiation() != null) {
- initiationCapability.set(stateful1.getInitiation());
- }
- }
-
private class ResyncLspFunction implements AsyncFunction<Optional<ReportedLsp>, OperationResult> {
-
private final TriggerSyncArgs input;
ResyncLspFunction(final TriggerSyncArgs input) {
}
private Message createPcepUpd(final Srp srp, final Lsp lsp) {
- final UpdatesBuilder rb = new UpdatesBuilder();
- rb.setSrp(srp);
- rb.setLsp(lsp);
- final PathBuilder pb = new PathBuilder();
- rb.setPath(pb.build());
- final PcupdMessageBuilder ub = new PcupdMessageBuilder(MESSAGE_HEADER);
- ub.setUpdates(List.of(rb.build()));
- return new PcupdBuilder().setPcupdMessage(ub.build()).build();
+ return new PcupdBuilder()
+ .setPcupdMessage(new PcupdMessageBuilder(MESSAGE_HEADER)
+ .setUpdates(List.of(new UpdatesBuilder()
+ .setSrp(srp)
+ .setLsp(lsp)
+ .setPath(new PathBuilder().build())
+ .build()))
+ .build())
+ .build();
}
}
LOG.debug("Node {} already contains lsp {} at {}", input.getNode(), input.getName(), lsp);
return OperationResults.createUnsent(PCEPErrors.USED_SYMBOLIC_PATH_NAME).future();
}
- if (!initiationCapability.get()) {
+ if (!isInitiationCapability()) {
return OperationResults.createUnsent(PCEPErrors.CAPABILITY_NOT_SUPPORTED).future();
}
// Build the request
final RequestsBuilder rb = new RequestsBuilder();
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120
- .add.lsp.args.Arguments args = input.getArguments();
+ final var args = input.getArguments();
final Arguments2 args2 = args.augmentation(Arguments2.class);
final Lsp inputLsp = args2 != null ? args2.getLsp() : null;
if (inputLsp == null) {
/* Call Path Computation if an ERO was not provided */
boolean segmentRouting = !PSTUtil.isDefaultPST(args2.getPathSetupType());
- if (rb.getEro() == null
- || rb.getEro().getSubobject() == null
- || rb.getEro().getSubobject().size() == 0) {
-
+ if (rb.getEro() == null || rb.getEro().nonnullSubobject().isEmpty()) {
/* Get a Path Computation to compute the Path from the Arguments */
PathComputation pathComputation = pceServerProvider.getPathComputation();
if (pathComputation == null) {
private static Pcerr createErrorMsg(@NonNull final PCEPErrors pcepErrors, final Uint32 reqID) {
return new PcerrBuilder()
- .setPcerrMessage(new PcerrMessageBuilder()
- .setErrorType(new RequestCaseBuilder()
- .setRequest(new RequestBuilder()
- .setRps(List.of(new RpsBuilder()
- .setRp(new RpBuilder()
- .setProcessingRule(false)
- .setIgnore(false)
- .setRequestId(new RequestId(reqID))
- .build())
- .build()))
- .build())
+ .setPcerrMessage(new PcerrMessageBuilder()
+ .setErrorType(new RequestCaseBuilder()
+ .setRequest(new RequestBuilder()
+ .setRps(List.of(new RpsBuilder()
+ .setRp(new RpBuilder()
+ .setProcessingRule(false)
+ .setIgnore(false)
+ .setRequestId(new RequestId(reqID))
+ .build())
+ .build()))
.build())
- .setErrors(List.of(new ErrorsBuilder()
- .setErrorObject(new ErrorObjectBuilder()
- .setType(pcepErrors.getErrorType())
- .setValue(pcepErrors.getErrorValue())
- .build())
- .build()))
.build())
- .build();
+ .setErrors(List.of(new ErrorsBuilder()
+ .setErrorObject(new ErrorObjectBuilder()
+ .setType(pcepErrors.getErrorType())
+ .setValue(pcepErrors.getErrorValue())
+ .build())
+ .build()))
+ .build())
+ .build();
}
}