Extract and publish p4runtime protocol utils in separate artifact
For consumption by third-party apps built via mvn
Change-Id: Ic9c1eccb2519b2952cdb632e1f07ccefbba00396
diff --git a/protocols/p4runtime/ctl/BUILD b/protocols/p4runtime/ctl/BUILD
index 5fbbd68..dca5f38 100644
--- a/protocols/p4runtime/ctl/BUILD
+++ b/protocols/p4runtime/ctl/BUILD
@@ -4,6 +4,7 @@
"//protocols/grpc/ctl:onos-protocols-grpc-ctl",
"//protocols/p4runtime/api:onos-protocols-p4runtime-api",
"//protocols/p4runtime/proto:onos-protocols-p4runtime-proto",
+ "//protocols/p4runtime/utils:onos-protocols-p4runtime-utils",
"//deps:com_google_protobuf_protobuf_java",
"//deps:io_grpc_grpc_api_context",
"//deps:io_grpc_grpc_netty",
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractCodec.java
deleted file mode 100644
index 2bb75a3..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractCodec.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.common.collect.ImmutableList;
-import com.google.protobuf.Message;
-import com.google.protobuf.TextFormat;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import org.onosproject.p4runtime.ctl.utils.PipeconfHelper;
-import org.slf4j.Logger;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.lang.String.format;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Abstract implementation of a general codec that translates pipeconf-related
- * objects into protobuf messages and vice versa.
- *
- * @param <P> object
- * @param <M> protobuf message class
- * @param <X> metadata class
- */
-abstract class AbstractCodec<P, M extends Message, X> {
-
- protected final Logger log = getLogger(this.getClass());
-
- protected abstract M encode(P object, X metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException;
-
- protected abstract P decode(M message, X metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException;
-
- /**
- * Returns a protobuf message that is equivalent to the given object for the
- * given metadata and pipeconf.
- *
- * @param object object
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return protobuf message
- * @throws CodecException if the given object cannot be encoded (see
- * exception message)
- */
- public M encode(P object, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(object);
- try {
- return encode(object, metadata, pipeconf, browserOrFail(pipeconf));
- } catch (P4InfoBrowser.NotFoundException e) {
- throw new CodecException(e.getMessage());
- }
- }
-
- /**
- * Returns a object that is equivalent to the protobuf message for the given
- * metadata and pipeconf.
- *
- * @param message protobuf message
- * @param metadata metadata
- * @param pipeconf pipeconf pipeconf
- * @return object
- * @throws CodecException if the given protobuf message cannot be decoded
- * (see exception message)
- */
- public P decode(M message, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(message);
- try {
- return decode(message, metadata, pipeconf, browserOrFail(pipeconf));
- } catch (P4InfoBrowser.NotFoundException e) {
- throw new CodecException(e.getMessage());
- }
- }
-
- /**
- * Same as {@link #encode(Object, Object, PiPipeconf)} but returns null in
- * case of exceptions, while the error message is logged.
- *
- * @param object object
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return protobuf message
- */
- private M encodeOrNull(P object, X metadata, PiPipeconf pipeconf) {
- checkNotNull(object);
- try {
- return encode(object, metadata, pipeconf);
- } catch (CodecException e) {
- log.error("Unable to encode {}: {} [{}]",
- object.getClass().getSimpleName(),
- e.getMessage(), object.toString());
- return null;
- }
- }
-
- /**
- * Same as {@link #decode(Message, Object, PiPipeconf)} but returns null in
- * case of exceptions, while the error message is logged.
- *
- * @param message protobuf message
- * @param metadata metadata
- * @param pipeconf pipeconf pipeconf
- * @return object
- */
- private P decodeOrNull(M message, X metadata, PiPipeconf pipeconf) {
- checkNotNull(message);
- try {
- return decode(message, metadata, pipeconf);
- } catch (CodecException e) {
- log.error("Unable to decode {}: {} [{}]",
- message.getClass().getSimpleName(),
- e.getMessage(), TextFormat.shortDebugString(message));
- return null;
- }
- }
-
- /**
- * Encodes the given list of objects, skipping those that cannot be encoded,
- * in which case an error message is logged. For this reason, the returned
- * list might have different size than the returned one.
- *
- * @param objects list of objects
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return list of protobuf messages
- */
- private List<M> encodeAllSkipException(
- Collection<P> objects, X metadata, PiPipeconf pipeconf) {
- checkNotNull(objects);
- if (objects.isEmpty()) {
- return ImmutableList.of();
- }
- return objects.stream()
- .map(p -> encodeOrNull(p, metadata, pipeconf))
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- }
-
- /**
- * Decodes the given list of protobuf messages, skipping those that cannot
- * be decoded, on which case an error message is logged. For this reason,
- * the returned list might have different size than the returned one.
- *
- * @param messages list of protobuf messages
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return list of objects
- */
- private List<P> decodeAllSkipException(
- Collection<M> messages, X metadata, PiPipeconf pipeconf) {
- checkNotNull(messages);
- if (messages.isEmpty()) {
- return ImmutableList.of();
- }
- return messages.stream()
- .map(m -> decodeOrNull(m, metadata, pipeconf))
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- }
-
- /**
- * Encodes the given collection of objects. Throws an exception if one or
- * more of the given objects cannot be encoded. The returned list is
- * guaranteed to have same size and order as the given one.
- *
- * @param objects list of objects
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return list of protobuf messages
- * @throws CodecException if one or more of the given objects cannot be
- * encoded
- */
- List<M> encodeAll(Collection<P> objects, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(objects);
- if (objects.isEmpty()) {
- return ImmutableList.of();
- }
- final List<M> messages = encodeAllSkipException(objects, metadata, pipeconf);
- if (objects.size() != messages.size()) {
- throw new CodecException(format(
- "Unable to encode %d entities of %d given " +
- "(see previous logs for details)",
- objects.size() - messages.size(), objects.size()));
- }
- return messages;
- }
-
- /**
- * Decodes the given collection of protobuf messages. Throws an exception if
- * one or more of the given protobuf messages cannot be decoded. The
- * returned list is guaranteed to have same size and order as the given
- * one.
- *
- * @param messages list of protobuf messages
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return list of objects
- * @throws CodecException if one or more of the given protobuf messages
- * cannot be decoded
- */
- List<P> decodeAll(Collection<M> messages, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(messages);
- if (messages.isEmpty()) {
- return ImmutableList.of();
- }
- final List<P> objects = decodeAllSkipException(messages, metadata, pipeconf);
- if (messages.size() != objects.size()) {
- throw new CodecException(format(
- "Unable to decode %d messages of %d given " +
- "(see previous logs for details)",
- messages.size() - objects.size(), messages.size()));
- }
- return objects;
- }
-
- /**
- * Returns a P4Info browser for the given pipeconf or throws a
- * CodecException if not possible.
- *
- * @param pipeconf pipeconf
- * @return P4Info browser
- * @throws CodecException if a P4Info browser cannot be obtained
- */
- P4InfoBrowser browserOrFail(PiPipeconf pipeconf) throws CodecException {
- checkNotNull(pipeconf);
- final P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
- if (browser == null) {
- throw new CodecException(format(
- "Unable to get P4InfoBrowser for pipeconf %s", pipeconf.id()));
- }
- return browser;
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractEntityCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractEntityCodec.java
deleted file mode 100644
index 0b39367..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/AbstractEntityCodec.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.Message;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiEntity;
-import org.onosproject.net.pi.runtime.PiHandle;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Abstract implementation of a specialized codec that translates PI runtime
- * entities and their handles into P4Runtime protobuf messages and vice versa.
- * Supports also encoding to "key" P4Runtime Entity messages used in read and
- * delete operations.
- *
- * @param <P> PI runtime class
- * @param <H> PI handle class
- * @param <M> P4Runtime protobuf message class
- * @param <X> metadata class
- */
-public abstract class AbstractEntityCodec
- <P extends PiEntity, H extends PiHandle, M extends Message, X>
- extends AbstractCodec<P, M, X> {
-
- protected abstract M encodeKey(H handle, X metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException;
-
- protected abstract M encodeKey(P piEntity, X metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException;
-
- /**
- * Returns a P4Runtime protobuf message representing the P4Runtime.Entity
- * "key" for the given PI handle, metadata and pipeconf.
- *
- * @param handle PI handle instance
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return P4Runtime protobuf message
- * @throws CodecException if the given PI entity cannot be encoded (see
- * exception message)
- */
- public M encodeKey(H handle, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(handle);
- try {
- return encodeKey(handle, metadata, pipeconf, browserOrFail(pipeconf));
- } catch (P4InfoBrowser.NotFoundException e) {
- throw new CodecException(e.getMessage());
- }
- }
-
- /**
- * Returns a P4Runtime protobuf message representing the P4Runtime.Entity
- * "key" for the given PI entity, metadata and pipeconf.
- *
- * @param piEntity PI entity instance
- * @param metadata metadata
- * @param pipeconf pipeconf
- * @return P4Runtime protobuf message
- * @throws CodecException if the given PI entity cannot be encoded (see
- * exception message)
- */
- public M encodeKey(P piEntity, X metadata, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(piEntity);
- try {
- return encodeKey(piEntity, metadata, pipeconf, browserOrFail(pipeconf));
- } catch (P4InfoBrowser.NotFoundException e) {
- throw new CodecException(e.getMessage());
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionCodec.java
deleted file mode 100644
index 3ae46c9..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionCodec.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.net.pi.model.PiActionId;
-import org.onosproject.net.pi.model.PiActionParamId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionParam;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import static java.lang.String.format;
-import static org.onosproject.p4runtime.ctl.codec.Utils.assertSize;
-
-/**
- * Codec for P4Runtime Action.
- */
-public final class ActionCodec
- extends AbstractCodec<PiAction, P4RuntimeOuterClass.Action, Object> {
-
- @Override
- protected P4RuntimeOuterClass.Action encode(
- PiAction piAction, Object ignored, PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- final int actionId = browser.actions()
- .getByName(piAction.id().toString()).getPreamble().getId();
- final P4RuntimeOuterClass.Action.Builder actionMsgBuilder =
- P4RuntimeOuterClass.Action.newBuilder().setActionId(actionId);
- for (PiActionParam p : piAction.parameters()) {
- final P4InfoOuterClass.Action.Param paramInfo = browser.actionParams(actionId)
- .getByName(p.id().toString());
- final ByteString paramValue = ByteString.copyFrom(p.value().asReadOnlyBuffer());
- assertSize(format("param '%s' of action '%s'", p.id(), piAction.id()),
- paramValue, paramInfo.getBitwidth());
- actionMsgBuilder.addParams(P4RuntimeOuterClass.Action.Param.newBuilder()
- .setParamId(paramInfo.getId())
- .setValue(paramValue)
- .build());
- }
- return actionMsgBuilder.build();
- }
-
- @Override
- protected PiAction decode(
- P4RuntimeOuterClass.Action message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final P4InfoBrowser.EntityBrowser<P4InfoOuterClass.Action.Param> paramInfo =
- browser.actionParams(message.getActionId());
- final String actionName = browser.actions()
- .getById(message.getActionId())
- .getPreamble().getName();
- final PiAction.Builder builder = PiAction.builder()
- .withId(PiActionId.of(actionName));
- for (P4RuntimeOuterClass.Action.Param p : message.getParamsList()) {
- final String paramName = paramInfo.getById(p.getParamId()).getName();
- final ImmutableByteSequence value = ImmutableByteSequence.copyFrom(
- p.getValue().toByteArray());
- builder.withParameter(new PiActionParam(PiActionParamId.of(paramName), value));
- }
- return builder.build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileGroupCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileGroupCodec.java
deleted file mode 100644
index 5110274..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileGroupCodec.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiActionProfileId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionProfileGroup;
-import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
-import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
-import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass.ActionProfileGroup;
-
-/**
- * Codec for P4Runtime ActionProfileGroup.
- */
-public final class ActionProfileGroupCodec
- extends AbstractEntityCodec<PiActionProfileGroup, PiActionProfileGroupHandle, ActionProfileGroup, Object> {
-
- @Override
- public ActionProfileGroup encode(
- PiActionProfileGroup piGroup, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final ActionProfileGroup.Builder msgBuilder = keyMsgBuilder(
- piGroup.actionProfile(), piGroup.id(), browser)
- .setMaxSize(piGroup.maxSize());
- piGroup.members().forEach(m -> {
- // TODO: currently we don't set "watch" field
- ActionProfileGroup.Member member = ActionProfileGroup.Member.newBuilder()
- .setMemberId(m.id().id())
- .setWeight(m.weight())
- .build();
- msgBuilder.addMembers(member);
- });
- return msgBuilder.build();
- }
-
- @Override
- protected ActionProfileGroup encodeKey(
- PiActionProfileGroupHandle handle, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(handle.actionProfile(), handle.groupId(), browser)
- .build();
- }
-
- @Override
- protected ActionProfileGroup encodeKey(
- PiActionProfileGroup piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(piEntity.actionProfile(), piEntity.id(), browser)
- .build();
- }
-
- private ActionProfileGroup.Builder keyMsgBuilder(
- PiActionProfileId actProfId, PiActionProfileGroupId groupId,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return ActionProfileGroup.newBuilder()
- .setGroupId(groupId.id())
- .setActionProfileId(browser.actionProfiles()
- .getByName(actProfId.id())
- .getPreamble().getId());
- }
-
- @Override
- public PiActionProfileGroup decode(
- ActionProfileGroup msg, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final PiActionProfileGroup.Builder piGroupBuilder = PiActionProfileGroup.builder()
- .withActionProfileId(PiActionProfileId.of(
- browser.actionProfiles()
- .getById(msg.getActionProfileId())
- .getPreamble().getName()))
- .withId(PiActionProfileGroupId.of(msg.getGroupId()))
- .withMaxSize(msg.getMaxSize());
- msg.getMembersList().forEach(m -> {
- final int weight;
- if (m.getWeight() < 1) {
- log.warn("Decoding group with invalid weight '{}', will set to 1",
- m.getWeight());
- weight = 1;
- } else {
- weight = m.getWeight();
- }
- piGroupBuilder.addMember(
- PiActionProfileMemberId.of(m.getMemberId()), weight);
- });
- return piGroupBuilder.build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileMemberCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileMemberCodec.java
deleted file mode 100644
index 183d827..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/ActionProfileMemberCodec.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiActionProfileId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionProfileMember;
-import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
-import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-import p4.v1.P4RuntimeOuterClass.ActionProfileMember;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for ActionProfileMember.
- */
-public final class ActionProfileMemberCodec
- extends AbstractEntityCodec<PiActionProfileMember, PiActionProfileMemberHandle, ActionProfileMember, Object> {
-
- @Override
- public ActionProfileMember encode(
- PiActionProfileMember piEntity, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(
- piEntity.actionProfile(), piEntity.id(), browser)
- .setAction(CODECS.action().encode(
- piEntity.action(), null, pipeconf))
- .build();
- }
-
- @Override
- protected ActionProfileMember encodeKey(
- PiActionProfileMemberHandle handle, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(handle.actionProfileId(), handle.memberId(), browser)
- .build();
- }
-
- @Override
- protected ActionProfileMember encodeKey(
- PiActionProfileMember piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(
- piEntity.actionProfile(), piEntity.id(), browser)
- .build();
- }
-
- private P4RuntimeOuterClass.ActionProfileMember.Builder keyMsgBuilder(
- PiActionProfileId actProfId, PiActionProfileMemberId memberId,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return P4RuntimeOuterClass.ActionProfileMember.newBuilder()
- .setActionProfileId(browser.actionProfiles()
- .getByName(actProfId.id())
- .getPreamble().getId())
- .setMemberId(memberId.id());
- }
-
- @Override
- public PiActionProfileMember decode(
- ActionProfileMember message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException, CodecException {
- final PiActionProfileId actionProfileId = PiActionProfileId.of(
- browser.actionProfiles()
- .getById(message.getActionProfileId())
- .getPreamble()
- .getName());
- return PiActionProfileMember.builder()
- .forActionProfile(actionProfileId)
- .withId(PiActionProfileMemberId.of(message.getMemberId()))
- .withAction(CODECS.action().decode(
- message.getAction(), null, pipeconf))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CloneSessionEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CloneSessionEntryCodec.java
deleted file mode 100644
index 337d76a..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CloneSessionEntryCodec.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiCloneSessionEntry;
-import org.onosproject.net.pi.runtime.PiCloneSessionEntryHandle;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime CloneSessionEntry.
- */
-public final class CloneSessionEntryCodec
- extends AbstractEntityCodec<PiCloneSessionEntry, PiCloneSessionEntryHandle,
- P4RuntimeOuterClass.CloneSessionEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.CloneSessionEntry encode(
- PiCloneSessionEntry piEntity, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser) throws CodecException {
- return P4RuntimeOuterClass.CloneSessionEntry.newBuilder()
- .setSessionId(piEntity.sessionId())
- .addAllReplicas(
- CODECS.preReplica().encodeAll(
- piEntity.replicas(), null, pipeconf))
- .setClassOfService(piEntity.classOfService())
- .setPacketLengthBytes(piEntity.maxPacketLengthBytes())
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.CloneSessionEntry encodeKey(
- PiCloneSessionEntryHandle handle, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser) {
- return P4RuntimeOuterClass.CloneSessionEntry.newBuilder()
- .setSessionId(handle.sessionId()).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.CloneSessionEntry encodeKey(
- PiCloneSessionEntry piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser) {
- return P4RuntimeOuterClass.CloneSessionEntry.newBuilder()
- .setSessionId(piEntity.sessionId()).build();
- }
-
- @Override
- protected PiCloneSessionEntry decode(
- P4RuntimeOuterClass.CloneSessionEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser) throws CodecException {
- return PiCloneSessionEntry.builder()
- .withSessionId(message.getSessionId())
- .addReplicas(
- CODECS.preReplica().decodeAll(
- message.getReplicasList(), null, pipeconf))
- .withClassOfService(message.getClassOfService())
- .withMaxPacketLengthBytes(message.getPacketLengthBytes())
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CodecException.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CodecException.java
deleted file mode 100644
index 6ef77f2..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CodecException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-/**
- * Signals an error during encoding/decoding of a PI entity/protobuf message.
- */
-public final class CodecException extends Exception {
-
- /**
- * Creates a new exception with the given explanation message.
- *
- * @param explanation explanation
- */
- public CodecException(String explanation) {
- super(explanation);
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Codecs.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Codecs.java
deleted file mode 100644
index 30e8d9d..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Codecs.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-/**
- * Utility class that provides access to P4Runtime codec instances.
- */
-public final class Codecs {
-
- public static final Codecs CODECS = new Codecs();
-
- private final ActionCodec action;
- private final ActionProfileGroupCodec actionProfileGroup;
- private final ActionProfileMemberCodec actionProfileMember;
- private final CounterEntryCodec counterEntry;
- private final DirectCounterEntryCodec directCounterEntry;
- private final DirectMeterEntryCodec directMeterEntry;
- private final EntityCodec entity;
- private final FieldMatchCodec fieldMatch;
- private final HandleCodec handle;
- private final MeterEntryCodec meterEntry;
- private final MulticastGroupEntryCodec multicastGroupEntry;
- private final CloneSessionEntryCodec cloneSessionEntry;
- private final PreReplicaCodec preReplica;
- private final PacketInCodec packetIn;
- private final PacketMetadataCodec packetMetadata;
- private final PacketOutCodec packetOut;
- private final TableEntryCodec tableEntry;
-
- private Codecs() {
- this.action = new ActionCodec();
- this.actionProfileGroup = new ActionProfileGroupCodec();
- this.actionProfileMember = new ActionProfileMemberCodec();
- this.counterEntry = new CounterEntryCodec();
- this.directCounterEntry = new DirectCounterEntryCodec();
- this.directMeterEntry = new DirectMeterEntryCodec();
- this.entity = new EntityCodec();
- this.fieldMatch = new FieldMatchCodec();
- this.handle = new HandleCodec();
- this.meterEntry = new MeterEntryCodec();
- this.multicastGroupEntry = new MulticastGroupEntryCodec();
- this.cloneSessionEntry = new CloneSessionEntryCodec();
- this.preReplica = new PreReplicaCodec();
- this.packetIn = new PacketInCodec();
- this.packetMetadata = new PacketMetadataCodec();
- this.packetOut = new PacketOutCodec();
- this.tableEntry = new TableEntryCodec();
- }
-
- public EntityCodec entity() {
- return entity;
- }
-
- public HandleCodec handle() {
- return handle;
- }
-
- public PacketOutCodec packetOut() {
- return packetOut;
- }
-
- public PacketInCodec packetIn() {
- return packetIn;
- }
-
- TableEntryCodec tableEntry() {
- return tableEntry;
- }
-
- FieldMatchCodec fieldMatch() {
- return fieldMatch;
- }
-
- ActionCodec action() {
- return action;
- }
-
- ActionProfileMemberCodec actionProfileMember() {
- return actionProfileMember;
- }
-
- ActionProfileGroupCodec actionProfileGroup() {
- return actionProfileGroup;
- }
-
- PacketMetadataCodec packetMetadata() {
- return packetMetadata;
- }
-
- MulticastGroupEntryCodec multicastGroupEntry() {
- return multicastGroupEntry;
- }
-
- CloneSessionEntryCodec cloneSessionEntry() {
- return cloneSessionEntry;
- }
-
- PreReplicaCodec preReplica() {
- return preReplica;
- }
-
- DirectMeterEntryCodec directMeterEntry() {
- return directMeterEntry;
- }
-
- MeterEntryCodec meterEntry() {
- return meterEntry;
- }
-
- CounterEntryCodec counterEntry() {
- return counterEntry;
- }
-
- DirectCounterEntryCodec directCounterEntry() {
- return directCounterEntry;
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CounterEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CounterEntryCodec.java
deleted file mode 100644
index deac993..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/CounterEntryCodec.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiCounterId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiCounterCell;
-import org.onosproject.net.pi.runtime.PiCounterCellHandle;
-import org.onosproject.net.pi.runtime.PiCounterCellId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-/**
- * Codec for P4Runtime CounterEntry.
- */
-public final class CounterEntryCodec
- extends AbstractEntityCodec<PiCounterCell, PiCounterCellHandle,
- P4RuntimeOuterClass.CounterEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.CounterEntry encode(
- PiCounterCell piEntity, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(piEntity.cellId(), browser)
- .setData(P4RuntimeOuterClass.CounterData.newBuilder()
- .setByteCount(piEntity.data().bytes())
- .setPacketCount(piEntity.data().packets())
- .build())
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.CounterEntry encodeKey(
- PiCounterCellHandle handle, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(handle.cellId(), browser).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.CounterEntry encodeKey(
- PiCounterCell piEntity, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(piEntity.cellId(), browser).build();
- }
-
- private P4RuntimeOuterClass.CounterEntry.Builder keyMsgBuilder(
- PiCounterCellId cellId, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final int counterId = browser.counters().getByName(
- cellId.counterId().id()).getPreamble().getId();
- return P4RuntimeOuterClass.CounterEntry.newBuilder()
- .setCounterId(counterId)
- .setIndex(P4RuntimeOuterClass.Index.newBuilder()
- .setIndex(cellId.index()).build());
- }
-
- @Override
- protected PiCounterCell decode(
- P4RuntimeOuterClass.CounterEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final String counterName = browser.counters()
- .getById(message.getCounterId())
- .getPreamble()
- .getName();
- return new PiCounterCell(
- PiCounterCellId.ofIndirect(
- PiCounterId.of(counterName), message.getIndex().getIndex()),
- message.getData().getPacketCount(),
- message.getData().getByteCount());
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectCounterEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectCounterEntryCodec.java
deleted file mode 100644
index 46d0f3f..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectCounterEntryCodec.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiCounterCell;
-import org.onosproject.net.pi.runtime.PiCounterCellHandle;
-import org.onosproject.net.pi.runtime.PiCounterCellId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime DirectCounterEntryCodec.
- */
-public final class DirectCounterEntryCodec
- extends AbstractEntityCodec<PiCounterCell, PiCounterCellHandle,
- P4RuntimeOuterClass.DirectCounterEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.DirectCounterEntry encode(
- PiCounterCell piEntity, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- return keyMsgBuilder(piEntity.cellId(), pipeconf)
- .setData(P4RuntimeOuterClass.CounterData.newBuilder()
- .setByteCount(piEntity.data().bytes())
- .setPacketCount(piEntity.data().packets())
- .build())
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.DirectCounterEntry encodeKey(
- PiCounterCellHandle handle, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- return keyMsgBuilder(handle.cellId(), pipeconf).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.DirectCounterEntry encodeKey(
- PiCounterCell piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- return keyMsgBuilder(piEntity.cellId(), pipeconf).build();
- }
-
- private P4RuntimeOuterClass.DirectCounterEntry.Builder keyMsgBuilder(
- PiCounterCellId cellId, PiPipeconf pipeconf)
- throws CodecException {
- return P4RuntimeOuterClass.DirectCounterEntry.newBuilder()
- .setTableEntry(CODECS.tableEntry().encodeKey(
- cellId.tableEntry(), null, pipeconf));
- }
-
- @Override
- protected PiCounterCell decode(
- P4RuntimeOuterClass.DirectCounterEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- return new PiCounterCell(
- PiCounterCellId.ofDirect(
- CODECS.tableEntry().decode(
- message.getTableEntry(), null, pipeconf)),
- message.getData().getPacketCount(),
- message.getData().getByteCount());
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java
deleted file mode 100644
index 3bedfbf..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiMeterBand;
-import org.onosproject.net.pi.runtime.PiMeterCellConfig;
-import org.onosproject.net.pi.runtime.PiMeterCellHandle;
-import org.onosproject.net.pi.runtime.PiMeterCellId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime DirectMeterEntryCodec.
- */
-public final class DirectMeterEntryCodec
- extends AbstractEntityCodec<PiMeterCellConfig, PiMeterCellHandle,
- P4RuntimeOuterClass.DirectMeterEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.DirectMeterEntry encode(
- PiMeterCellConfig piEntity, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- return P4RuntimeOuterClass.DirectMeterEntry.newBuilder()
- .setTableEntry(CODECS.tableEntry().encode(
- piEntity.cellId().tableEntry(), null, pipeconf))
- .setConfig(MeterEntryCodec.getP4Config(piEntity))
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.DirectMeterEntry encodeKey(
- PiMeterCellHandle handle, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- return keyMsgBuilder(handle.cellId(), pipeconf).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.DirectMeterEntry encodeKey(
- PiMeterCellConfig piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- return keyMsgBuilder(piEntity.cellId(), pipeconf).build();
- }
-
- private P4RuntimeOuterClass.DirectMeterEntry.Builder keyMsgBuilder(
- PiMeterCellId cellId, PiPipeconf pipeconf)
- throws CodecException {
- return P4RuntimeOuterClass.DirectMeterEntry.newBuilder()
- .setTableEntry(CODECS.tableEntry().encodeKey(
- cellId.tableEntry(), null, pipeconf));
- }
-
- @Override
- protected PiMeterCellConfig decode(
- P4RuntimeOuterClass.DirectMeterEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- return PiMeterCellConfig.builder()
- .withMeterCellId(PiMeterCellId.ofDirect(
- CODECS.tableEntry().decode(
- message.getTableEntry(), null, pipeconf)))
- .withMeterBand(new PiMeterBand(message.getConfig().getCir(),
- message.getConfig().getCburst()))
- .withMeterBand(new PiMeterBand(message.getConfig().getPir(),
- message.getConfig().getPburst()))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/EntityCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/EntityCodec.java
deleted file mode 100644
index e063faa..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/EntityCodec.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionProfileGroup;
-import org.onosproject.net.pi.runtime.PiActionProfileMember;
-import org.onosproject.net.pi.runtime.PiCloneSessionEntry;
-import org.onosproject.net.pi.runtime.PiCounterCell;
-import org.onosproject.net.pi.runtime.PiEntity;
-import org.onosproject.net.pi.runtime.PiMeterCellConfig;
-import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
-import org.onosproject.net.pi.runtime.PiPreEntry;
-import org.onosproject.net.pi.runtime.PiTableEntry;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static java.lang.String.format;
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime Entity.
- */
-public final class EntityCodec extends AbstractCodec<PiEntity, P4RuntimeOuterClass.Entity, Object> {
-
- @Override
- protected P4RuntimeOuterClass.Entity encode(
- PiEntity piEntity, Object ignored, PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- final P4RuntimeOuterClass.Entity.Builder p4Entity = P4RuntimeOuterClass.Entity.newBuilder();
- switch (piEntity.piEntityType()) {
- case TABLE_ENTRY:
- return p4Entity.setTableEntry(
- CODECS.tableEntry().encode(
- (PiTableEntry) piEntity, null, pipeconf))
- .build();
- case ACTION_PROFILE_GROUP:
- return p4Entity.setActionProfileGroup(
- CODECS.actionProfileGroup().encode(
- (PiActionProfileGroup) piEntity, null, pipeconf))
- .build();
- case ACTION_PROFILE_MEMBER:
- return p4Entity.setActionProfileMember(
- CODECS.actionProfileMember().encode(
- (PiActionProfileMember) piEntity, null, pipeconf))
- .build();
- case PRE_ENTRY:
- final PiPreEntry preEntry = (PiPreEntry) piEntity;
- switch (preEntry.preEntryType()) {
- case MULTICAST_GROUP:
- return p4Entity.setPacketReplicationEngineEntry(
- P4RuntimeOuterClass.PacketReplicationEngineEntry.newBuilder()
- .setMulticastGroupEntry(CODECS.multicastGroupEntry().encode(
- (PiMulticastGroupEntry) piEntity, null, pipeconf))
- .build())
- .build();
- case CLONE_SESSION:
- return p4Entity.setPacketReplicationEngineEntry(
- P4RuntimeOuterClass.PacketReplicationEngineEntry.newBuilder()
- .setCloneSessionEntry(CODECS.cloneSessionEntry().encode(
- (PiCloneSessionEntry) piEntity, null, pipeconf))
- .build())
- .build();
- default:
- throw new CodecException(format(
- "Encoding of %s of type %s is not supported",
- piEntity.piEntityType(),
- preEntry.preEntryType()));
- }
- case METER_CELL_CONFIG:
- final PiMeterCellConfig meterCellConfig = (PiMeterCellConfig) piEntity;
- switch (meterCellConfig.cellId().meterType()) {
- case DIRECT:
- return p4Entity.setDirectMeterEntry(
- CODECS.directMeterEntry().encode(
- meterCellConfig, null, pipeconf))
- .build();
- case INDIRECT:
- return p4Entity.setMeterEntry(
- CODECS.meterEntry().encode(
- meterCellConfig, null, pipeconf))
- .build();
- default:
- throw new CodecException(format(
- "Encoding of %s of type %s is not supported",
- piEntity.piEntityType(),
- meterCellConfig.cellId().meterType()));
- }
- case COUNTER_CELL:
- final PiCounterCell counterCell = (PiCounterCell) piEntity;
- switch (counterCell.cellId().counterType()) {
- case DIRECT:
- return p4Entity.setDirectCounterEntry(
- CODECS.directCounterEntry().encode(
- counterCell, null, pipeconf))
- .build();
- case INDIRECT:
- return p4Entity.setCounterEntry(
- CODECS.counterEntry().encode(
- counterCell, null, pipeconf))
- .build();
- default:
- throw new CodecException(format(
- "Encoding of %s of type %s is not supported",
- piEntity.piEntityType(),
- counterCell.cellId().counterType()));
- }
- case REGISTER_CELL:
- default:
- throw new CodecException(format(
- "Encoding of %s not supported",
- piEntity.piEntityType()));
- }
- }
-
- @Override
- protected PiEntity decode(
- P4RuntimeOuterClass.Entity message, Object ignored, PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- switch (message.getEntityCase()) {
- case TABLE_ENTRY:
- return CODECS.tableEntry().decode(
- message.getTableEntry(), null, pipeconf);
- case ACTION_PROFILE_MEMBER:
- return CODECS.actionProfileMember().decode(
- message.getActionProfileMember(), null, pipeconf);
- case ACTION_PROFILE_GROUP:
- return CODECS.actionProfileGroup().decode(
- message.getActionProfileGroup(), null, pipeconf);
- case METER_ENTRY:
- return CODECS.meterEntry().decode(
- message.getMeterEntry(), null, pipeconf);
- case DIRECT_METER_ENTRY:
- return CODECS.directMeterEntry().decode(
- message.getDirectMeterEntry(), null, pipeconf);
- case COUNTER_ENTRY:
- return CODECS.counterEntry().decode(
- message.getCounterEntry(), null, pipeconf);
- case DIRECT_COUNTER_ENTRY:
- return CODECS.directCounterEntry().decode(
- message.getDirectCounterEntry(), null, pipeconf);
- case PACKET_REPLICATION_ENGINE_ENTRY:
- switch (message.getPacketReplicationEngineEntry().getTypeCase()) {
- case MULTICAST_GROUP_ENTRY:
- return CODECS.multicastGroupEntry().decode(
- message.getPacketReplicationEngineEntry()
- .getMulticastGroupEntry(), null, pipeconf);
- case CLONE_SESSION_ENTRY:
- return CODECS.cloneSessionEntry().decode(
- message.getPacketReplicationEngineEntry()
- .getCloneSessionEntry(), null, pipeconf);
- case TYPE_NOT_SET:
- default:
- throw new CodecException(format(
- "Decoding of %s of type %s not supported",
- message.getEntityCase(),
- message.getPacketReplicationEngineEntry().getTypeCase()));
- }
- case VALUE_SET_ENTRY:
- case REGISTER_ENTRY:
- case DIGEST_ENTRY:
- case EXTERN_ENTRY:
- case ENTITY_NOT_SET:
- default:
- throw new CodecException(format(
- "Decoding of %s not supported",
- message.getEntityCase()));
-
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/FieldMatchCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/FieldMatchCodec.java
deleted file mode 100644
index f289d5d..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/FieldMatchCodec.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.net.pi.model.PiMatchFieldId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiExactFieldMatch;
-import org.onosproject.net.pi.runtime.PiFieldMatch;
-import org.onosproject.net.pi.runtime.PiLpmFieldMatch;
-import org.onosproject.net.pi.runtime.PiRangeFieldMatch;
-import org.onosproject.net.pi.runtime.PiTernaryFieldMatch;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import static java.lang.String.format;
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.p4runtime.ctl.codec.Utils.assertPrefixLen;
-import static org.onosproject.p4runtime.ctl.codec.Utils.assertSize;
-
-/**
- * Codec for P4Runtime FieldMatch. Metadata is expected to be a Preamble for
- * P4Info.Table.
- */
-public final class FieldMatchCodec
- extends AbstractCodec<PiFieldMatch, P4RuntimeOuterClass.FieldMatch,
- P4InfoOuterClass.Preamble> {
-
- private static final String VALUE_OF_PREFIX = "value of ";
- private static final String MASK_OF_PREFIX = "mask of ";
- private static final String HIGH_RANGE_VALUE_OF_PREFIX = "high range value of ";
- private static final String LOW_RANGE_VALUE_OF_PREFIX = "low range value of ";
-
- @Override
- public P4RuntimeOuterClass.FieldMatch encode(
- PiFieldMatch piFieldMatch, P4InfoOuterClass.Preamble tablePreamble,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
-
- P4RuntimeOuterClass.FieldMatch.Builder messageBuilder = P4RuntimeOuterClass
- .FieldMatch.newBuilder();
-
- // FIXME: check how field names for stacked headers are constructed in P4Runtime.
- String fieldName = piFieldMatch.fieldId().id();
- P4InfoOuterClass.MatchField matchFieldInfo = browser.matchFields(
- tablePreamble.getId()).getByName(fieldName);
- String entityName = format("field match '%s' of table '%s'",
- matchFieldInfo.getName(), tablePreamble.getName());
- int fieldId = matchFieldInfo.getId();
- int fieldBitwidth = matchFieldInfo.getBitwidth();
-
- messageBuilder.setFieldId(fieldId);
-
- switch (piFieldMatch.type()) {
- case EXACT:
- PiExactFieldMatch fieldMatch = (PiExactFieldMatch) piFieldMatch;
- ByteString exactValue = ByteString.copyFrom(fieldMatch.value().asReadOnlyBuffer());
- assertSize(VALUE_OF_PREFIX + entityName, exactValue, fieldBitwidth);
- return messageBuilder.setExact(
- P4RuntimeOuterClass.FieldMatch.Exact
- .newBuilder()
- .setValue(exactValue)
- .build())
- .build();
- case TERNARY:
- PiTernaryFieldMatch ternaryMatch = (PiTernaryFieldMatch) piFieldMatch;
- ByteString ternaryValue = ByteString.copyFrom(ternaryMatch.value().asReadOnlyBuffer());
- ByteString ternaryMask = ByteString.copyFrom(ternaryMatch.mask().asReadOnlyBuffer());
- assertSize(VALUE_OF_PREFIX + entityName, ternaryValue, fieldBitwidth);
- assertSize(MASK_OF_PREFIX + entityName, ternaryMask, fieldBitwidth);
- return messageBuilder.setTernary(
- P4RuntimeOuterClass.FieldMatch.Ternary
- .newBuilder()
- .setValue(ternaryValue)
- .setMask(ternaryMask)
- .build())
- .build();
- case LPM:
- PiLpmFieldMatch lpmMatch = (PiLpmFieldMatch) piFieldMatch;
- ByteString lpmValue = ByteString.copyFrom(lpmMatch.value().asReadOnlyBuffer());
- int lpmPrefixLen = lpmMatch.prefixLength();
- assertSize(VALUE_OF_PREFIX + entityName, lpmValue, fieldBitwidth);
- assertPrefixLen(entityName, lpmPrefixLen, fieldBitwidth);
- return messageBuilder.setLpm(
- P4RuntimeOuterClass.FieldMatch.LPM.newBuilder()
- .setValue(lpmValue)
- .setPrefixLen(lpmPrefixLen)
- .build())
- .build();
- case RANGE:
- PiRangeFieldMatch rangeMatch = (PiRangeFieldMatch) piFieldMatch;
- ByteString rangeHighValue = ByteString.copyFrom(rangeMatch.highValue().asReadOnlyBuffer());
- ByteString rangeLowValue = ByteString.copyFrom(rangeMatch.lowValue().asReadOnlyBuffer());
- assertSize(HIGH_RANGE_VALUE_OF_PREFIX + entityName, rangeHighValue, fieldBitwidth);
- assertSize(LOW_RANGE_VALUE_OF_PREFIX + entityName, rangeLowValue, fieldBitwidth);
- return messageBuilder.setRange(
- P4RuntimeOuterClass.FieldMatch.Range.newBuilder()
- .setHigh(rangeHighValue)
- .setLow(rangeLowValue)
- .build())
- .build();
- default:
- throw new CodecException(format(
- "Building of match type %s not implemented", piFieldMatch.type()));
- }
- }
-
- @Override
- public PiFieldMatch decode(
- P4RuntimeOuterClass.FieldMatch message, P4InfoOuterClass.Preamble tablePreamble,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
-
- String fieldMatchName = browser.matchFields(tablePreamble.getId())
- .getById(message.getFieldId()).getName();
- PiMatchFieldId headerFieldId = PiMatchFieldId.of(fieldMatchName);
-
- P4RuntimeOuterClass.FieldMatch.FieldMatchTypeCase typeCase = message.getFieldMatchTypeCase();
-
- switch (typeCase) {
- case EXACT:
- P4RuntimeOuterClass.FieldMatch.Exact exactFieldMatch = message.getExact();
- ImmutableByteSequence exactValue = copyFrom(exactFieldMatch.getValue().asReadOnlyByteBuffer());
- return new PiExactFieldMatch(headerFieldId, exactValue);
- case TERNARY:
- P4RuntimeOuterClass.FieldMatch.Ternary ternaryFieldMatch = message.getTernary();
- ImmutableByteSequence ternaryValue = copyFrom(ternaryFieldMatch.getValue().asReadOnlyByteBuffer());
- ImmutableByteSequence ternaryMask = copyFrom(ternaryFieldMatch.getMask().asReadOnlyByteBuffer());
- return new PiTernaryFieldMatch(headerFieldId, ternaryValue, ternaryMask);
- case LPM:
- P4RuntimeOuterClass.FieldMatch.LPM lpmFieldMatch = message.getLpm();
- ImmutableByteSequence lpmValue = copyFrom(lpmFieldMatch.getValue().asReadOnlyByteBuffer());
- int lpmPrefixLen = lpmFieldMatch.getPrefixLen();
- return new PiLpmFieldMatch(headerFieldId, lpmValue, lpmPrefixLen);
- case RANGE:
- P4RuntimeOuterClass.FieldMatch.Range rangeFieldMatch = message.getRange();
- ImmutableByteSequence rangeHighValue = copyFrom(rangeFieldMatch.getHigh().asReadOnlyByteBuffer());
- ImmutableByteSequence rangeLowValue = copyFrom(rangeFieldMatch.getLow().asReadOnlyByteBuffer());
- return new PiRangeFieldMatch(headerFieldId, rangeLowValue, rangeHighValue);
- default:
- throw new CodecException(format(
- "Decoding of field match type '%s' not implemented", typeCase.name()));
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/HandleCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/HandleCodec.java
deleted file mode 100644
index 7a9c727..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/HandleCodec.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
-import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
-import org.onosproject.net.pi.runtime.PiCloneSessionEntryHandle;
-import org.onosproject.net.pi.runtime.PiCounterCellHandle;
-import org.onosproject.net.pi.runtime.PiHandle;
-import org.onosproject.net.pi.runtime.PiMeterCellHandle;
-import org.onosproject.net.pi.runtime.PiMulticastGroupEntryHandle;
-import org.onosproject.net.pi.runtime.PiPreEntryHandle;
-import org.onosproject.net.pi.runtime.PiTableEntryHandle;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static java.lang.String.format;
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-public final class HandleCodec extends AbstractCodec<PiHandle, P4RuntimeOuterClass.Entity, Object> {
-
- @Override
- protected P4RuntimeOuterClass.Entity encode(
- PiHandle piHandle, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- final P4RuntimeOuterClass.Entity.Builder p4Entity = P4RuntimeOuterClass.Entity.newBuilder();
-
- switch (piHandle.entityType()) {
- case TABLE_ENTRY:
- return p4Entity.setTableEntry(
- CODECS.tableEntry().encodeKey(
- (PiTableEntryHandle) piHandle, null, pipeconf))
- .build();
- case ACTION_PROFILE_GROUP:
- return p4Entity.setActionProfileGroup(
- CODECS.actionProfileGroup().encodeKey(
- (PiActionProfileGroupHandle) piHandle, null, pipeconf))
- .build();
- case ACTION_PROFILE_MEMBER:
- return p4Entity.setActionProfileMember(
- CODECS.actionProfileMember().encodeKey(
- (PiActionProfileMemberHandle) piHandle, null, pipeconf))
- .build();
- case PRE_ENTRY:
- final PiPreEntryHandle preEntryHandle = (PiPreEntryHandle) piHandle;
- switch (preEntryHandle.preEntryType()) {
- case MULTICAST_GROUP:
- return p4Entity.setPacketReplicationEngineEntry(
- P4RuntimeOuterClass.PacketReplicationEngineEntry.newBuilder()
- .setMulticastGroupEntry(CODECS.multicastGroupEntry().encodeKey(
- (PiMulticastGroupEntryHandle) piHandle, null, pipeconf))
- .build())
- .build();
- case CLONE_SESSION:
- return p4Entity.setPacketReplicationEngineEntry(
- P4RuntimeOuterClass.PacketReplicationEngineEntry.newBuilder()
- .setCloneSessionEntry(CODECS.cloneSessionEntry().encodeKey(
- (PiCloneSessionEntryHandle) piHandle, null, pipeconf))
- .build())
- .build();
- default:
- throw new CodecException(format(
- "Encoding of handle for %s of type %s is not supported",
- piHandle.entityType(),
- preEntryHandle.preEntryType()));
- }
- case METER_CELL_CONFIG:
- final PiMeterCellHandle meterCellHandle = (PiMeterCellHandle) piHandle;
- switch (meterCellHandle.cellId().meterType()) {
- case DIRECT:
- return p4Entity.setDirectMeterEntry(
- CODECS.directMeterEntry().encodeKey(
- meterCellHandle, null, pipeconf))
- .build();
- case INDIRECT:
- return p4Entity.setMeterEntry(
- CODECS.meterEntry().encodeKey(
- meterCellHandle, null, pipeconf))
- .build();
- default:
- throw new CodecException(format(
- "Encoding of handle for %s of type %s is not supported",
- piHandle.entityType(),
- meterCellHandle.cellId().meterType()));
- }
- case COUNTER_CELL:
- final PiCounterCellHandle counterCellHandle = (PiCounterCellHandle) piHandle;
- switch (counterCellHandle.cellId().counterType()) {
- case DIRECT:
- return p4Entity.setDirectCounterEntry(
- CODECS.directCounterEntry().encodeKey(
- counterCellHandle, null, pipeconf))
- .build();
- case INDIRECT:
- return p4Entity.setCounterEntry(
- CODECS.counterEntry().encodeKey(
- counterCellHandle, null, pipeconf))
- .build();
- default:
- throw new CodecException(format(
- "Encoding of handle for %s of type %s is not supported",
- piHandle.entityType(),
- counterCellHandle.cellId().counterType()));
- }
- case REGISTER_CELL:
- default:
- throw new CodecException(format(
- "Encoding of handle for %s not supported",
- piHandle.entityType()));
- }
- }
-
- @Override
- protected PiHandle decode(
- P4RuntimeOuterClass.Entity message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- throw new CodecException("Decoding of Entity to PiHandle is not supported");
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java
deleted file mode 100644
index b210709..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiMeterId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiMeterBand;
-import org.onosproject.net.pi.runtime.PiMeterCellConfig;
-import org.onosproject.net.pi.runtime.PiMeterCellHandle;
-import org.onosproject.net.pi.runtime.PiMeterCellId;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-/**
- * Codec for P4Runtime MeterEntry.
- */
-public final class MeterEntryCodec
- extends AbstractEntityCodec<PiMeterCellConfig, PiMeterCellHandle,
- P4RuntimeOuterClass.MeterEntry, Object> {
-
- static P4RuntimeOuterClass.MeterConfig getP4Config(PiMeterCellConfig piConfig)
- throws CodecException {
- if (piConfig.meterBands().size() != 2) {
- throw new CodecException("Number of meter bands should be 2");
- }
- final PiMeterBand[] bands = piConfig.meterBands().toArray(new PiMeterBand[0]);
- long cir, cburst, pir, pburst;
- // The band with bigger burst is peak if rate of them is equal.
- if (bands[0].rate() > bands[1].rate() ||
- (bands[0].rate() == bands[1].rate() &&
- bands[0].burst() >= bands[1].burst())) {
- cir = bands[1].rate();
- cburst = bands[1].burst();
- pir = bands[0].rate();
- pburst = bands[0].burst();
- } else {
- cir = bands[0].rate();
- cburst = bands[0].burst();
- pir = bands[1].rate();
- pburst = bands[1].burst();
- }
- return P4RuntimeOuterClass.MeterConfig.newBuilder()
- .setCir(cir)
- .setCburst(cburst)
- .setPir(pir)
- .setPburst(pburst)
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.MeterEntry encode(
- PiMeterCellConfig piEntity, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException, CodecException {
- final int meterId = browser.meters().getByName(
- piEntity.cellId().meterId().id()).getPreamble().getId();
- return P4RuntimeOuterClass.MeterEntry.newBuilder()
- .setMeterId(meterId)
- .setIndex(P4RuntimeOuterClass.Index.newBuilder()
- .setIndex(piEntity.cellId().index()).build())
- .setConfig(getP4Config(piEntity))
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.MeterEntry encodeKey(
- PiMeterCellHandle handle, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(handle.cellId(), browser).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.MeterEntry encodeKey(
- PiMeterCellConfig piEntity, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(piEntity.cellId(), browser).build();
- }
-
- private P4RuntimeOuterClass.MeterEntry.Builder keyMsgBuilder(
- PiMeterCellId cellId, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final int meterId = browser.meters().getByName(
- cellId.meterId().id()).getPreamble().getId();
- return P4RuntimeOuterClass.MeterEntry.newBuilder()
- .setMeterId(meterId)
- .setIndex(P4RuntimeOuterClass.Index.newBuilder()
- .setIndex(cellId.index()).build());
- }
-
- @Override
- protected PiMeterCellConfig decode(
- P4RuntimeOuterClass.MeterEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final String meterName = browser.meters()
- .getById(message.getMeterId())
- .getPreamble()
- .getName();
- return PiMeterCellConfig.builder()
- .withMeterCellId(PiMeterCellId.ofIndirect(
- PiMeterId.of(meterName), message.getIndex().getIndex()))
- .withMeterBand(new PiMeterBand(message.getConfig().getCir(),
- message.getConfig().getCburst()))
- .withMeterBand(new PiMeterBand(message.getConfig().getPir(),
- message.getConfig().getPburst()))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MulticastGroupEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MulticastGroupEntryCodec.java
deleted file mode 100644
index bcc4555..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/MulticastGroupEntryCodec.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
-import org.onosproject.net.pi.runtime.PiMulticastGroupEntryHandle;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime MulticastGroupEntry.
- */
-public final class MulticastGroupEntryCodec
- extends AbstractEntityCodec<PiMulticastGroupEntry, PiMulticastGroupEntryHandle,
- P4RuntimeOuterClass.MulticastGroupEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.MulticastGroupEntry encode(
- PiMulticastGroupEntry piEntity, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser) throws CodecException {
- return P4RuntimeOuterClass.MulticastGroupEntry.newBuilder()
- .setMulticastGroupId(piEntity.groupId())
- .addAllReplicas(
- CODECS.preReplica().encodeAll(
- piEntity.replicas(), null, pipeconf))
- .build();
- }
-
- @Override
- protected P4RuntimeOuterClass.MulticastGroupEntry encodeKey(
- PiMulticastGroupEntryHandle handle, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser) {
- return P4RuntimeOuterClass.MulticastGroupEntry.newBuilder()
- .setMulticastGroupId(handle.groupId()).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.MulticastGroupEntry encodeKey(
- PiMulticastGroupEntry piEntity, Object metadata,
- PiPipeconf pipeconf, P4InfoBrowser browser) {
- return P4RuntimeOuterClass.MulticastGroupEntry.newBuilder()
- .setMulticastGroupId(piEntity.groupId()).build();
- }
-
- @Override
- protected PiMulticastGroupEntry decode(
- P4RuntimeOuterClass.MulticastGroupEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser) throws CodecException {
- return PiMulticastGroupEntry.builder()
- .withGroupId(message.getMulticastGroupId())
- .addReplicas(
- CODECS.preReplica().decodeAll(
- message.getReplicasList(), null, pipeconf))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/P4DataCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/P4DataCodec.java
deleted file mode 100644
index d55b614..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/P4DataCodec.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.net.pi.model.PiData;
-import org.onosproject.net.pi.runtime.data.PiBitString;
-import org.onosproject.net.pi.runtime.data.PiBool;
-import org.onosproject.net.pi.runtime.data.PiEnumString;
-import org.onosproject.net.pi.runtime.data.PiErrorString;
-import org.onosproject.net.pi.runtime.data.PiHeader;
-import org.onosproject.net.pi.runtime.data.PiHeaderStack;
-import org.onosproject.net.pi.runtime.data.PiHeaderUnion;
-import org.onosproject.net.pi.runtime.data.PiHeaderUnionStack;
-import org.onosproject.net.pi.runtime.data.PiStruct;
-import org.onosproject.net.pi.runtime.data.PiTuple;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static p4.v1.P4DataOuterClass.P4Data;
-import static p4.v1.P4DataOuterClass.P4Header;
-import static p4.v1.P4DataOuterClass.P4HeaderStack;
-import static p4.v1.P4DataOuterClass.P4HeaderUnion;
-import static p4.v1.P4DataOuterClass.P4HeaderUnionStack;
-import static p4.v1.P4DataOuterClass.P4StructLike;
-
-/**
- * Encoder/decoder of PI Data entry to P4 Data entry protobuf messages, and vice
- * versa.
- * <p>
- * TODO: implement codec for each P4Data type using AbstractP4RuntimeCodec.
- */
-final class P4DataCodec {
-
- private P4DataCodec() {
- // Hides constructor.
- }
-
- private static P4Header encodeHeader(PiHeader piHeader) {
- P4Header.Builder builder = P4Header.newBuilder();
- int i = 0;
- for (ImmutableByteSequence bitString : piHeader.bitStrings()) {
- builder.setBitstrings(i, ByteString.copyFrom(bitString.asArray()));
- i++;
- }
- return builder.setIsValid(piHeader.isValid()).build();
- }
-
- private static PiHeader decodeHeader(P4Header p4Header) {
- List<ImmutableByteSequence> bitStrings = p4Header.getBitstringsList().stream()
- .map(bit -> ImmutableByteSequence.copyFrom(bit.asReadOnlyByteBuffer()))
- .collect(Collectors.toList());
-
- return PiHeader.of(p4Header.getIsValid(), bitStrings);
- }
-
- private static P4HeaderUnion encodeHeaderUnion(PiHeaderUnion headerUnion) {
-
- P4HeaderUnion.Builder builder = P4HeaderUnion.newBuilder();
- if (headerUnion.isValid()) {
- builder.setValidHeader(encodeHeader(headerUnion.header()));
- builder.setValidHeaderName(headerUnion.headerName());
- } else {
- // An empty string indicates that none of the union members are valid and
- // valid_header must therefore be unset.
- builder.setValidHeaderName("");
- }
-
- return builder.build();
- }
-
- private static PiHeaderUnion decodeHeaderUnion(P4HeaderUnion p4HeaderUnion) {
-
- return PiHeaderUnion.of(p4HeaderUnion.getValidHeaderName(),
- decodeHeader(p4HeaderUnion.getValidHeader()));
- }
-
- private static P4StructLike encodeStruct(PiStruct piStruct) {
- P4StructLike.Builder builder = P4StructLike.newBuilder();
- builder.addAllMembers(piStruct.struct().stream()
- .map(P4DataCodec::encodeP4Data)
- .collect(Collectors.toList()));
- return builder.build();
- }
-
- private static PiStruct decodeStruct(P4StructLike p4StructLike) {
-
- return PiStruct.of(p4StructLike.getMembersList().stream()
- .map(P4DataCodec::decodeP4Data)
- .collect(Collectors.toList()));
- }
-
- private static P4StructLike encodeTuple(PiTuple piTuple) {
- P4StructLike.Builder builder = P4StructLike.newBuilder();
- builder.addAllMembers(piTuple.tuple().stream()
- .map(P4DataCodec::encodeP4Data)
- .collect(Collectors.toList()));
- return builder.build();
- }
-
- private static PiTuple decodeTuple(P4StructLike p4StructLike) {
-
- return PiTuple.of(p4StructLike.getMembersList().stream()
- .map(P4DataCodec::decodeP4Data)
- .collect(Collectors.toList()));
- }
-
- static P4Data encodeP4Data(PiData piData) {
-
- P4Data.Builder builder = P4Data.newBuilder();
- switch (piData.type()) {
- case BITSTRING:
- builder.setBitstring(ByteString.copyFrom(((PiBitString) piData).bitString().asArray()));
- break;
- case ENUMSTRING:
- builder.setEnum(((PiEnumString) piData).enumString());
- break;
- case ERRORSTRING:
- builder.setError(((PiErrorString) piData).errorString());
- break;
- case BOOL:
- builder.setBool(((PiBool) piData).bool());
- break;
- case STRUCT:
- builder.setStruct(encodeStruct((PiStruct) piData));
- break;
- case TUPLE:
- builder.setTuple(encodeTuple((PiTuple) piData));
- break;
- case HEADER:
- builder.setHeader(encodeHeader((PiHeader) piData));
- break;
- case HEADERSTACK:
- P4HeaderStack.Builder headerStack = P4HeaderStack.newBuilder();
- int i = 0;
- for (PiHeader header : ((PiHeaderStack) piData).headers()) {
- headerStack.setEntries(i, encodeHeader(header));
- i++;
- }
- builder.setHeaderStack(headerStack.build());
- break;
- case HEADERUNION:
- builder.setHeaderUnion(encodeHeaderUnion((PiHeaderUnion) piData));
- break;
- case HEADERUNIONSTACK:
- P4HeaderUnionStack.Builder headerUnionStack = P4HeaderUnionStack.newBuilder();
- int j = 0;
- for (PiHeaderUnion headerUnion : ((PiHeaderUnionStack) piData).headerUnions()) {
- headerUnionStack.setEntries(j, encodeHeaderUnion(headerUnion));
- j++;
- }
- builder.setHeaderUnionStack(headerUnionStack.build());
- break;
- default:
- break;
- }
-
- return builder.build();
- }
-
- static PiData decodeP4Data(P4Data p4Data) {
- PiData piData = null;
-
- switch (p4Data.getDataCase()) {
- case BITSTRING:
- piData = PiBitString.of(ImmutableByteSequence.copyFrom(p4Data.getBitstring().asReadOnlyByteBuffer()));
- break;
- case BOOL:
- piData = PiBool.of(p4Data.getBool());
- break;
- case TUPLE:
- piData = decodeTuple(p4Data.getTuple());
- break;
- case STRUCT:
- piData = decodeStruct(p4Data.getStruct());
- break;
- case HEADER:
- piData = decodeHeader(p4Data.getHeader());
- break;
- case HEADER_UNION:
- piData = decodeHeaderUnion(p4Data.getHeaderUnion());
- break;
- case HEADER_STACK:
- piData = PiHeaderStack.of(p4Data.getHeaderStack().getEntriesList().stream()
- .map(P4DataCodec::decodeHeader)
- .collect(Collectors.toList()));
- break;
- case HEADER_UNION_STACK:
- piData = PiHeaderUnionStack.of(p4Data.getHeaderUnionStack()
- .getEntriesList().stream()
- .map(P4DataCodec::decodeHeaderUnion)
- .collect(Collectors.toList()));
- break;
- case ENUM:
- piData = PiEnumString.of(p4Data.getEnum());
- break;
- case ERROR:
- piData = PiErrorString.of(p4Data.getError());
- break;
- case DATA_NOT_SET:
- break;
- default:
- break;
- }
-
- return piData;
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketInCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketInCodec.java
deleted file mode 100644
index e4de896..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketInCodec.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPacketOperationType;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiPacketOperation;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime PacketIn. Only decoding is supported, as encoding is not
- * meaningful in this case (packet-ins are always generated by the server).
- */
-public final class PacketInCodec
- extends AbstractCodec<PiPacketOperation,
- P4RuntimeOuterClass.PacketIn, Object> {
-
- private static final String PACKET_IN = "packet_in";
-
- @Override
- protected P4RuntimeOuterClass.PacketIn encode(
- PiPacketOperation piEntity, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException {
- throw new CodecException("Encoding of packet-in is not supported");
- }
-
- @Override
- protected PiPacketOperation decode(
- P4RuntimeOuterClass.PacketIn message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- final P4InfoOuterClass.Preamble ctrlPktMetaPreamble = browser
- .controllerPacketMetadatas()
- .getByName(PACKET_IN)
- .getPreamble();
- return PiPacketOperation.builder()
- .withType(PiPacketOperationType.PACKET_IN)
- .withMetadatas(CODECS.packetMetadata().decodeAll(
- message.getMetadataList(), ctrlPktMetaPreamble, pipeconf))
- .withData(copyFrom(message.getPayload().asReadOnlyByteBuffer()))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketMetadataCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketMetadataCodec.java
deleted file mode 100644
index 3f78085..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketMetadataCodec.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-import org.onosproject.net.pi.model.PiPacketMetadataId;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiPacketMetadata;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-
-/**
- * Coded for P4Runtime PacketMetadata. The metadata is expected to be a Preamble
- * of a P4Info.ControllerPacketMetadata message.
- */
-public final class PacketMetadataCodec
- extends AbstractCodec<PiPacketMetadata,
- P4RuntimeOuterClass.PacketMetadata, P4InfoOuterClass.Preamble> {
-
- @Override
- protected P4RuntimeOuterClass.PacketMetadata encode(
- PiPacketMetadata piEntity, P4InfoOuterClass.Preamble ctrlPktMetaPreamble,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final int metadataId = browser
- .packetMetadatas(ctrlPktMetaPreamble.getId())
- .getByName(piEntity.id().id()).getId();
- return P4RuntimeOuterClass.PacketMetadata.newBuilder()
- .setMetadataId(metadataId)
- .setValue(ByteString.copyFrom(piEntity.value().asReadOnlyBuffer()))
- .build();
- }
-
- @Override
- protected PiPacketMetadata decode(
- P4RuntimeOuterClass.PacketMetadata message,
- P4InfoOuterClass.Preamble ctrlPktMetaPreamble,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException {
- final String packetMetadataName = browser
- .packetMetadatas(ctrlPktMetaPreamble.getId())
- .getById(message.getMetadataId()).getName();
- final PiPacketMetadataId metadataId = PiPacketMetadataId
- .of(packetMetadataName);
- return PiPacketMetadata.builder()
- .withId(metadataId)
- .withValue(copyFrom(message.getValue().asReadOnlyByteBuffer()))
- .build();
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketOutCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketOutCodec.java
deleted file mode 100644
index 6d020c3..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PacketOutCodec.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiPacketOperation;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime PacketOut. Only encoding is supported, as decoding is not
- * meaningful in this case (packet-outs are always generated by the client).
- */
-public final class PacketOutCodec
- extends AbstractCodec<PiPacketOperation,
- P4RuntimeOuterClass.PacketOut, Object> {
-
- private static final String PACKET_OUT = "packet_out";
-
- @Override
- protected P4RuntimeOuterClass.PacketOut encode(
- PiPacketOperation piPacket, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- final P4InfoOuterClass.Preamble ctrlPktMetaPreamble = browser
- .controllerPacketMetadatas()
- .getByName(PACKET_OUT)
- .getPreamble();
- return P4RuntimeOuterClass.PacketOut.newBuilder()
- .addAllMetadata(CODECS.packetMetadata().encodeAll(
- piPacket.metadatas(), ctrlPktMetaPreamble, pipeconf))
- .setPayload(ByteString.copyFrom(piPacket.data().asReadOnlyBuffer()))
- .build();
-
- }
-
- @Override
- protected PiPacketOperation decode(
- P4RuntimeOuterClass.PacketOut message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException {
- throw new CodecException("Decoding of packet-out is not supported");
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PreReplicaCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PreReplicaCodec.java
deleted file mode 100644
index 7402b14..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/PreReplicaCodec.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiPreReplica;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.v1.P4RuntimeOuterClass;
-
-import static java.lang.String.format;
-
-/**
- * Codec for P4Runtime PRE Replica.
- */
-public class PreReplicaCodec extends AbstractCodec<PiPreReplica,
- P4RuntimeOuterClass.Replica, Object> {
-
- @Override
- protected P4RuntimeOuterClass.Replica encode(
- PiPreReplica replica, Object ignore,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- final int p4PortId;
- try {
- p4PortId = Math.toIntExact(replica.egressPort().toLong());
- } catch (ArithmeticException e) {
- throw new CodecException(format(
- "Cannot cast 64 bit port value '%s' to 32 bit",
- replica.egressPort()));
- }
- return P4RuntimeOuterClass.Replica.newBuilder()
- .setEgressPort(p4PortId)
- .setInstance(replica.instanceId())
- .build();
- }
-
- @Override
- protected PiPreReplica decode(
- P4RuntimeOuterClass.Replica message, Object ignore,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- return new PiPreReplica(
- PortNumber.portNumber(message.getEgressPort()),
- message.getInstance());
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/TableEntryCodec.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/TableEntryCodec.java
deleted file mode 100644
index 513b4fa..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/TableEntryCodec.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.model.PiTableId;
-import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
-import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
-import org.onosproject.net.pi.runtime.PiCounterCellData;
-import org.onosproject.net.pi.runtime.PiMatchKey;
-import org.onosproject.net.pi.runtime.PiTableAction;
-import org.onosproject.net.pi.runtime.PiTableEntry;
-import org.onosproject.net.pi.runtime.PiTableEntryHandle;
-import org.onosproject.p4runtime.ctl.utils.P4InfoBrowser;
-import p4.config.v1.P4InfoOuterClass;
-import p4.v1.P4RuntimeOuterClass;
-
-import java.util.OptionalInt;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.lang.String.format;
-import static org.onosproject.p4runtime.ctl.codec.Codecs.CODECS;
-
-/**
- * Codec for P4Runtime TableEntry.
- */
-public final class TableEntryCodec
- extends AbstractEntityCodec<PiTableEntry, PiTableEntryHandle,
- P4RuntimeOuterClass.TableEntry, Object> {
-
- @Override
- protected P4RuntimeOuterClass.TableEntry encode(
- PiTableEntry piTableEntry, Object ignored, PiPipeconf pipeconf,
- P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- final P4RuntimeOuterClass.TableEntry.Builder tableEntryMsgBuilder =
- keyMsgBuilder(piTableEntry.table(), piTableEntry.matchKey(),
- piTableEntry.priority(), pipeconf, browser);
- // Controller metadata (cookie)
- tableEntryMsgBuilder.setControllerMetadata(piTableEntry.cookie());
- // Timeout.
- if (piTableEntry.timeout().isPresent()) {
- // FIXME: timeout is supported in P4Runtime v1.0
- log.warn("Found PI table entry with timeout set, " +
- "not supported in P4Runtime: {}", piTableEntry);
- }
- // Table action.
- if (piTableEntry.action() != null) {
- tableEntryMsgBuilder.setAction(
- encodePiTableAction(piTableEntry.action(), pipeconf));
- }
- // Counter.
- if (piTableEntry.counter() != null) {
- tableEntryMsgBuilder.setCounterData(encodeCounter(piTableEntry.counter()));
- }
- return tableEntryMsgBuilder.build();
- }
-
- @Override
- protected P4RuntimeOuterClass.TableEntry encodeKey(
- PiTableEntryHandle handle, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser) throws CodecException, P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(handle.tableId(), handle.matchKey(),
- handle.priority(), pipeconf, browser).build();
- }
-
- @Override
- protected P4RuntimeOuterClass.TableEntry encodeKey(
- PiTableEntry piEntity, Object metadata, PiPipeconf pipeconf,
- P4InfoBrowser browser) throws CodecException, P4InfoBrowser.NotFoundException {
- return keyMsgBuilder(piEntity.table(), piEntity.matchKey(),
- piEntity.priority(), pipeconf, browser).build();
- }
-
- @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
- private P4RuntimeOuterClass.TableEntry.Builder keyMsgBuilder(
- PiTableId tableId, PiMatchKey matchKey, OptionalInt priority,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws P4InfoBrowser.NotFoundException, CodecException {
- final P4RuntimeOuterClass.TableEntry.Builder tableEntryMsgBuilder =
- P4RuntimeOuterClass.TableEntry.newBuilder();
- final P4InfoOuterClass.Preamble tablePreamble = browser.tables()
- .getByName(tableId.id()).getPreamble();
- // Table id.
- tableEntryMsgBuilder.setTableId(tablePreamble.getId());
- // Field matches.
- if (matchKey.equals(PiMatchKey.EMPTY)) {
- tableEntryMsgBuilder.setIsDefaultAction(true);
- } else {
- tableEntryMsgBuilder.addAllMatch(
- CODECS.fieldMatch().encodeAll(
- matchKey.fieldMatches(),
- tablePreamble, pipeconf));
- }
- // Priority.
- priority.ifPresent(tableEntryMsgBuilder::setPriority);
- return tableEntryMsgBuilder;
- }
-
- @Override
- protected PiTableEntry decode(
- P4RuntimeOuterClass.TableEntry message, Object ignored,
- PiPipeconf pipeconf, P4InfoBrowser browser)
- throws CodecException, P4InfoBrowser.NotFoundException {
- PiTableEntry.Builder piTableEntryBuilder = PiTableEntry.builder();
-
- P4InfoOuterClass.Preamble tablePreamble = browser.tables()
- .getById(message.getTableId()).getPreamble();
-
- // Table id.
- piTableEntryBuilder.forTable(PiTableId.of(tablePreamble.getName()));
-
- // Priority.
- if (message.getPriority() > 0) {
- piTableEntryBuilder.withPriority(message.getPriority());
- }
-
- // Controller metadata (cookie)
- piTableEntryBuilder.withCookie(message.getControllerMetadata());
-
- // Table action.
- if (message.hasAction()) {
- piTableEntryBuilder.withAction(decodeTableActionMsg(
- message.getAction(), pipeconf));
- }
-
- // Timeout.
- // FIXME: how to decode table entry messages with timeout, given that
- // the timeout value is lost after encoding?
-
- // Match key for field matches.
- piTableEntryBuilder.withMatchKey(
- PiMatchKey.builder()
- .addFieldMatches(CODECS.fieldMatch().decodeAll(
- message.getMatchList(),
- tablePreamble, pipeconf))
- .build());
-
- // Counter.
- if (message.hasCounterData()) {
- piTableEntryBuilder.withCounterCellData(decodeCounter(message.getCounterData()));
- }
-
- return piTableEntryBuilder.build();
- }
-
- private P4RuntimeOuterClass.TableAction encodePiTableAction(
- PiTableAction piTableAction, PiPipeconf pipeconf)
- throws CodecException {
- checkNotNull(piTableAction, "Cannot encode null PiTableAction");
- final P4RuntimeOuterClass.TableAction.Builder tableActionMsgBuilder =
- P4RuntimeOuterClass.TableAction.newBuilder();
- switch (piTableAction.type()) {
- case ACTION:
- P4RuntimeOuterClass.Action theAction = CODECS.action()
- .encode((PiAction) piTableAction, null, pipeconf);
- tableActionMsgBuilder.setAction(theAction);
- break;
- case ACTION_PROFILE_GROUP_ID:
- tableActionMsgBuilder.setActionProfileGroupId(
- ((PiActionProfileGroupId) piTableAction).id());
- break;
- case ACTION_PROFILE_MEMBER_ID:
- tableActionMsgBuilder.setActionProfileMemberId(
- ((PiActionProfileMemberId) piTableAction).id());
- break;
- default:
- throw new CodecException(
- format("Building of table action type %s not implemented",
- piTableAction.type()));
- }
- return tableActionMsgBuilder.build();
- }
-
- private PiTableAction decodeTableActionMsg(
- P4RuntimeOuterClass.TableAction tableActionMsg, PiPipeconf pipeconf)
- throws CodecException {
- P4RuntimeOuterClass.TableAction.TypeCase typeCase = tableActionMsg.getTypeCase();
- switch (typeCase) {
- case ACTION:
- P4RuntimeOuterClass.Action actionMsg = tableActionMsg.getAction();
- return CODECS.action().decode(
- actionMsg, null, pipeconf);
- case ACTION_PROFILE_GROUP_ID:
- return PiActionProfileGroupId.of(
- tableActionMsg.getActionProfileGroupId());
- case ACTION_PROFILE_MEMBER_ID:
- return PiActionProfileMemberId.of(
- tableActionMsg.getActionProfileMemberId());
- default:
- throw new CodecException(
- format("Decoding of table action type %s not implemented",
- typeCase.name()));
- }
- }
-
- private P4RuntimeOuterClass.CounterData encodeCounter(
- PiCounterCellData piCounterCellData) {
- return P4RuntimeOuterClass.CounterData.newBuilder()
- .setPacketCount(piCounterCellData.packets())
- .setByteCount(piCounterCellData.bytes()).build();
- }
-
- private PiCounterCellData decodeCounter(
- P4RuntimeOuterClass.CounterData counterData) {
- return new PiCounterCellData(
- counterData.getPacketCount(), counterData.getByteCount());
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Utils.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Utils.java
deleted file mode 100644
index c72489a..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/Utils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.codec;
-
-import com.google.protobuf.ByteString;
-
-import static java.lang.String.format;
-
-/**
- * Codec utilities.
- */
-final class Utils {
-
- private Utils() {
- // Hide default construction
- }
-
- static void assertSize(String entityDescr, ByteString value, int bitWidth)
- throws CodecException {
-
- int byteWidth = (int) Math.ceil((float) bitWidth / 8);
- if (value.size() != byteWidth) {
- throw new CodecException(format(
- "Wrong size for %s, expected %d bytes, but found %d",
- entityDescr, byteWidth, value.size()));
- }
- }
-
- static void assertPrefixLen(String entityDescr, int prefixLength, int bitWidth)
- throws CodecException {
-
- if (prefixLength > bitWidth) {
- throw new CodecException(format(
- "wrong prefix length for %s, field size is %d bits, but found one is %d",
- entityDescr, bitWidth, prefixLength));
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/package-info.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/package-info.java
deleted file mode 100644
index 25cee2b..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/codec/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Classes to translates from PI framework-related objects to P4Runtime protobuf
- * messages, and vice versa.
- */
-package org.onosproject.p4runtime.ctl.codec;
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/P4InfoBrowser.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/P4InfoBrowser.java
deleted file mode 100644
index 29cddff..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/P4InfoBrowser.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.utils;
-
-
-import com.google.common.collect.Maps;
-import com.google.protobuf.Message;
-import p4.config.v1.P4InfoOuterClass.Action;
-import p4.config.v1.P4InfoOuterClass.ActionProfile;
-import p4.config.v1.P4InfoOuterClass.ControllerPacketMetadata;
-import p4.config.v1.P4InfoOuterClass.Counter;
-import p4.config.v1.P4InfoOuterClass.DirectCounter;
-import p4.config.v1.P4InfoOuterClass.DirectMeter;
-import p4.config.v1.P4InfoOuterClass.MatchField;
-import p4.config.v1.P4InfoOuterClass.Meter;
-import p4.config.v1.P4InfoOuterClass.P4Info;
-import p4.config.v1.P4InfoOuterClass.Preamble;
-import p4.config.v1.P4InfoOuterClass.Table;
-
-import java.util.Map;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.lang.String.format;
-
-/**
- * Utility class to easily retrieve information from a P4Info protobuf message.
- */
-public final class P4InfoBrowser {
-
- private final EntityBrowser<Table> tables = new EntityBrowser<>("table");
- private final EntityBrowser<Action> actions = new EntityBrowser<>("action");
- private final EntityBrowser<ActionProfile> actionProfiles = new EntityBrowser<>("action profile");
- private final EntityBrowser<Counter> counters = new EntityBrowser<>("counter");
- private final EntityBrowser<DirectCounter> directCounters = new EntityBrowser<>("direct counter");
- private final EntityBrowser<Meter> meters = new EntityBrowser<>("meter");
- private final EntityBrowser<DirectMeter> directMeters = new EntityBrowser<>("direct meter");
- private final EntityBrowser<ControllerPacketMetadata> ctrlPktMetadatas =
- new EntityBrowser<>("controller packet metadata");
- private final Map<Integer, EntityBrowser<Action.Param>> actionParams = Maps.newHashMap();
- private final Map<Integer, EntityBrowser<MatchField>> matchFields = Maps.newHashMap();
- private final Map<Integer, EntityBrowser<ControllerPacketMetadata.Metadata>> ctrlPktMetadatasMetadata =
- Maps.newHashMap();
-
- /**
- * Creates a new browser for the given P4Info.
- *
- * @param p4info P4Info protobuf message
- */
- public P4InfoBrowser(P4Info p4info) {
- parseP4Info(p4info);
- }
-
- private void parseP4Info(P4Info p4info) {
- p4info.getTablesList().forEach(
- entity -> {
- tables.addWithPreamble(entity.getPreamble(), entity);
- // Index match fields.
- int tableId = entity.getPreamble().getId();
- String tableName = entity.getPreamble().getName();
- EntityBrowser<MatchField> matchFieldBrowser = new EntityBrowser<>(format(
- "match field for table '%s'", tableName));
- entity.getMatchFieldsList().forEach(m -> matchFieldBrowser.add(m.getName(), null, m.getId(), m));
- matchFields.put(tableId, matchFieldBrowser);
- });
-
- p4info.getActionsList().forEach(
- entity -> {
- actions.addWithPreamble(entity.getPreamble(), entity);
- // Index action params.
- int actionId = entity.getPreamble().getId();
- String actionName = entity.getPreamble().getName();
- EntityBrowser<Action.Param> paramBrowser = new EntityBrowser<>(format(
- "param for action '%s'", actionName));
- entity.getParamsList().forEach(p -> paramBrowser.add(p.getName(), null, p.getId(), p));
- actionParams.put(actionId, paramBrowser);
- });
-
- p4info.getActionProfilesList().forEach(
- entity -> actionProfiles.addWithPreamble(entity.getPreamble(), entity));
-
- p4info.getCountersList().forEach(
- entity -> counters.addWithPreamble(entity.getPreamble(), entity));
-
- p4info.getDirectCountersList().forEach(
- entity -> directCounters.addWithPreamble(entity.getPreamble(), entity));
-
- p4info.getMetersList().forEach(
- entity -> meters.addWithPreamble(entity.getPreamble(), entity));
-
- p4info.getDirectMetersList().forEach(
- entity -> directMeters.addWithPreamble(entity.getPreamble(), entity));
-
- p4info.getControllerPacketMetadataList().forEach(
- entity -> {
- ctrlPktMetadatas.addWithPreamble(entity.getPreamble(), entity);
- // Index control packet metadata metadata.
- int ctrlPktMetadataId = entity.getPreamble().getId();
- String ctrlPktMetadataName = entity.getPreamble().getName();
- EntityBrowser<ControllerPacketMetadata.Metadata> metadataBrowser = new EntityBrowser<>(format(
- "metadata field for controller packet metadata '%s'", ctrlPktMetadataName));
- entity.getMetadataList().forEach(m -> metadataBrowser.add(m.getName(), null, m.getId(), m));
- ctrlPktMetadatasMetadata.put(ctrlPktMetadataId, metadataBrowser);
- });
- }
-
- /**
- * Returns a browser for tables.
- *
- * @return table browser
- */
- public EntityBrowser<Table> tables() {
- return tables;
- }
-
- /**
- * Returns a browser for actions.
- *
- * @return action browser
- */
- public EntityBrowser<Action> actions() {
- return actions;
- }
-
- /**
- * Returns a browser for action profiles.
- *
- * @return action profile browser
- */
- public EntityBrowser<ActionProfile> actionProfiles() {
- return actionProfiles;
- }
-
- /**
- * Returns a browser for counters.
- *
- * @return counter browser
- */
- public EntityBrowser<Counter> counters() {
- return counters;
- }
-
- /**
- * Returns a browser for direct counters.
- *
- * @return direct counter browser
- */
- public EntityBrowser<DirectCounter> directCounters() {
- return directCounters;
- }
-
- /**
- * Returns a browser for meters.
- *
- * @return meter browser
- */
- public EntityBrowser<Meter> meters() {
- return meters;
- }
-
- /**
- * Returns a browser for direct meters.
- *
- * @return table browser
- */
- public EntityBrowser<DirectMeter> directMeters() {
- return directMeters;
- }
-
- /**
- * Returns a browser for controller packet metadata.
- *
- * @return controller packet metadata browser
- */
- public EntityBrowser<ControllerPacketMetadata> controllerPacketMetadatas() {
- return ctrlPktMetadatas;
- }
-
- /**
- * Returns a browser for params of the given action.
- *
- * @param actionId action identifier
- * @return action params browser
- * @throws NotFoundException if the action cannot be found
- */
- public EntityBrowser<Action.Param> actionParams(int actionId) throws NotFoundException {
- // Throws exception if action id is not found.
- actions.getById(actionId);
- return actionParams.get(actionId);
- }
-
- /**
- * Returns a browser for match fields of the given table.
- *
- * @param tableId table identifier
- * @return match field browser
- * @throws NotFoundException if the table cannot be found
- */
- public EntityBrowser<MatchField> matchFields(int tableId) throws NotFoundException {
- // Throws exception if action id is not found.
- tables.getById(tableId);
- return matchFields.get(tableId);
- }
-
- /**
- * Returns a browser for metadata fields of the controller packet metadata.
- *
- * @param controllerPacketMetadataId controller packet metadata identifier
- * @return metadata browser
- * @throws NotFoundException controller packet metadata cannot be found
- */
- public EntityBrowser<ControllerPacketMetadata.Metadata> packetMetadatas(int controllerPacketMetadataId)
- throws NotFoundException {
- // Throws exception if controller packet metadata id is not found.
- ctrlPktMetadatas.getById(controllerPacketMetadataId);
- return ctrlPktMetadatasMetadata.get(controllerPacketMetadataId);
- }
-
- /**
- * Browser of P4Info entities.
- *
- * @param <T> protobuf message type
- */
- public static final class EntityBrowser<T extends Message> {
-
- private String entityName;
- private final Map<String, T> names = Maps.newHashMap();
- private final Map<String, String> aliasToNames = Maps.newHashMap();
- private final Map<Integer, T> ids = Maps.newHashMap();
-
- private EntityBrowser(String entityName) {
- this.entityName = entityName;
- }
-
- /**
- * Adds the given entity identified by the given name, alias (nullable) and id.
- *
- * @param name entity name
- * @param alias entity alias or null
- * @param id entity id
- * @param entity entity message
- */
- private void add(String name, String alias, int id, T entity) {
- checkNotNull(name);
- checkArgument(!name.isEmpty(), "Name cannot be empty");
- checkNotNull(entity);
- names.put(name, entity);
- ids.put(id, entity);
- if (alias != null && !alias.isEmpty()) {
- aliasToNames.put(alias, name);
- }
- }
-
- /**
- * Adds the given entity identified by the given P4Info preamble.
- *
- * @param preamble P4Info preamble protobuf message
- * @param entity entity message
- */
- private void addWithPreamble(Preamble preamble, T entity) {
- checkNotNull(preamble);
- add(preamble.getName(), preamble.getAlias(), preamble.getId(), entity);
- }
-
- /**
- * Returns true if the P4Info defines an entity with such name, false otherwise.
- *
- * @param name entity name
- * @return boolean
- */
- public boolean hasName(String name) {
- return names.containsKey(name);
- }
-
- /**
- * Returns the entity identified by the given name, if present, otherwise, throws an exception.
- *
- * @param name entity name or alias
- * @return entity message
- * @throws NotFoundException if the entity cannot be found
- */
- public T getByName(String name) throws NotFoundException {
- if (hasName(name)) {
- return names.get(name);
- } else {
- final String hint = aliasToNames.containsKey(name)
- ? format("Did you mean '%s'? Make sure to use entity names in PI IDs, not aliases",
- aliasToNames.get(name))
- : "";
- throw new NotFoundException(entityName, name, hint);
- }
- }
-
- /**
- * Returns true if the P4Info defines an entity with such id, false otherwise.
- *
- * @param id entity id
- * @return boolean
- */
- public boolean hasId(int id) {
- return ids.containsKey(id);
- }
-
- /**
- * Returns the entity identified by the given id, if present, otherwise, throws an exception.
- *
- * @param id entity id
- * @return entity message
- * @throws NotFoundException if the entity cannot be found
- */
- public T getById(int id) throws NotFoundException {
- if (!hasId(id)) {
- throw new NotFoundException(entityName, id);
- }
- return ids.get(id);
- }
- }
-
- /**
- * Signals tha an entity cannot be found in the P4Info.
- */
- public static final class NotFoundException extends Exception {
-
- public NotFoundException(String entityName, String key, String hint) {
- super(format(
- "No such %s in P4Info with name '%s'%s",
- entityName, key, hint.isEmpty() ? "" : " (" + hint + ")"));
- }
-
- public NotFoundException(String entityName, int id) {
- super(format("No such %s in P4Info with id '%d'", entityName, id));
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/PipeconfHelper.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/PipeconfHelper.java
deleted file mode 100644
index f5afd41..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/PipeconfHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.p4runtime.ctl.utils;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Maps;
-import com.google.protobuf.ExtensionRegistry;
-import com.google.protobuf.TextFormat;
-import org.onosproject.net.pi.model.PiPipeconf;
-import org.slf4j.Logger;
-import p4.config.v1.P4InfoOuterClass.P4Info;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.P4_INFO_TEXT;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Utility class to deal with pipeconfs in the context of P4Runtime.
- */
-public final class PipeconfHelper {
-
- private static final int P4INFO_BROWSER_EXPIRE_TIME_IN_MIN = 10;
- private static final Logger log = getLogger(PipeconfHelper.class);
-
- private static final Cache<Long, P4InfoBrowser> BROWSERS = CacheBuilder.newBuilder()
- .expireAfterAccess(P4INFO_BROWSER_EXPIRE_TIME_IN_MIN, TimeUnit.MINUTES)
- .build();
- private static final Map<Long, P4Info> P4INFOS = Maps.newConcurrentMap();
-
- private PipeconfHelper() {
- // hide.
- }
-
- /**
- * Extracts and returns a P4Info protobuf message from the given pipeconf. If the pipeconf does not define any
- * extension of type {@link PiPipeconf.ExtensionType#P4_INFO_TEXT}, returns null;
- *
- * @param pipeconf pipeconf
- * @return P4Info or null
- */
- public static P4Info getP4Info(PiPipeconf pipeconf) {
- return P4INFOS.computeIfAbsent(pipeconf.fingerprint(), piPipeconfId -> {
- if (!pipeconf.extension(P4_INFO_TEXT).isPresent()) {
- log.warn("Missing P4Info extension in pipeconf {}", pipeconf.id());
- return null;
- }
-
- InputStream p4InfoStream = pipeconf.extension(P4_INFO_TEXT).get();
- P4Info.Builder p4iInfoBuilder = P4Info.newBuilder();
- try {
- TextFormat.getParser().merge(new InputStreamReader(p4InfoStream), ExtensionRegistry.getEmptyRegistry(),
- p4iInfoBuilder);
- } catch (IOException ex) {
- log.warn("Unable to parse P4Info of pipeconf {}: {}", pipeconf.id(), ex.getMessage());
- return null;
- }
-
- return p4iInfoBuilder.build();
- });
- }
-
- /**
- * Returns a P4Info browser for the given pipeconf. If the pipeconf does not define any extension of type
- * {@link PiPipeconf.ExtensionType#P4_INFO_TEXT}, returns null;
- *
- * @param pipeconf pipeconf
- * @return P4Info browser or null
- */
- public static P4InfoBrowser getP4InfoBrowser(PiPipeconf pipeconf) {
- try {
- return BROWSERS.get(pipeconf.fingerprint(), () -> {
- P4Info p4info = PipeconfHelper.getP4Info(pipeconf);
- if (p4info == null) {
- return null;
- } else {
- return new P4InfoBrowser(p4info);
- }
- });
- } catch (ExecutionException e) {
- log.error("Exception while accessing the P4InfoBrowser cache", e);
- return null;
- }
- }
-}
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/package-info.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/package-info.java
deleted file mode 100644
index ae09455..0000000
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/utils/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Utility classes for the P4Runtime protocol subsystem.
- */
-package org.onosproject.p4runtime.ctl.utils;