diff --git a/apps/p4runtime-test/BUCK b/apps/p4runtime-test/BUCK index 842fe2d689..3ba5b5e37a 100644 --- a/apps/p4runtime-test/BUCK +++ b/apps/p4runtime-test/BUCK @@ -8,6 +8,7 @@ COMPILE_DEPS = [ '//protocols/p4runtime/api:onos-protocols-p4runtime-api', '//protocols/p4runtime/ctl:onos-protocols-p4runtime-ctl', '//protocols/p4runtime/proto:onos-protocols-p4runtime-proto', + '//drivers/bmv2:onos-drivers-bmv2', '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER, '//lib:grpc-stub-' + GRPC_VER, '//lib:protobuf-java-' + PROTOBUF_VER, diff --git a/apps/p4runtime-test/src/test/java/org/onosproject/p4runtime/test/P4RuntimeTest.java b/apps/p4runtime-test/src/test/java/org/onosproject/p4runtime/test/P4RuntimeTest.java index 0f8d238f43..ab0a57e4e1 100644 --- a/apps/p4runtime-test/src/test/java/org/onosproject/p4runtime/test/P4RuntimeTest.java +++ b/apps/p4runtime-test/src/test/java/org/onosproject/p4runtime/test/P4RuntimeTest.java @@ -18,66 +18,165 @@ package org.onosproject.p4runtime.test; import io.grpc.ManagedChannelBuilder; import io.grpc.netty.NettyChannelBuilder; +import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import org.onlab.util.ImmutableByteSequence; import org.onosproject.bmv2.model.Bmv2PipelineModelParser; +import org.onosproject.drivers.bmv2.Bmv2DefaultInterpreter; import org.onosproject.grpc.ctl.GrpcControllerImpl; import org.onosproject.net.DeviceId; import org.onosproject.net.pi.model.DefaultPiPipeconf; import org.onosproject.net.pi.model.PiPipeconf; import org.onosproject.net.pi.model.PiPipeconfId; import org.onosproject.net.pi.model.PiPipelineInterpreter; -import org.onosproject.p4runtime.api.P4RuntimeClient; +import org.onosproject.net.pi.runtime.PiPacketMetadata; +import org.onosproject.net.pi.runtime.PiPacketMetadataId; +import org.onosproject.net.pi.runtime.PiPacketOperation; +import org.onosproject.net.pi.runtime.PiTableId; +import org.onosproject.p4runtime.ctl.P4RuntimeClientImpl; import org.onosproject.p4runtime.ctl.P4RuntimeControllerImpl; +import p4.P4RuntimeGrpc; +import p4.P4RuntimeOuterClass; import java.net.URL; import java.util.concurrent.ExecutionException; +import static org.onlab.util.ImmutableByteSequence.copyFrom; +import static org.onlab.util.ImmutableByteSequence.fit; import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.BMV2_JSON; import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.P4_INFO_TEXT; +import static org.onosproject.net.pi.runtime.PiPacketOperation.Type.PACKET_OUT; +import static p4.P4RuntimeOuterClass.ActionProfileGroup.Type.SELECT; +import static p4.P4RuntimeOuterClass.Update.Type.INSERT; /** * Class used for quick testing of P4Runtime with real devices. To be removed before release. */ public class P4RuntimeTest { - private final URL p4InfoUrl = this.getClass().getResource("/default.p4info"); - private final URL jsonUrl = this.getClass().getResource("/default.json"); + private static final String GRPC_SERVER_ADDR = "192.168.56.102"; + private static final int GRPC_SERVER_PORT = 55044; + + private final URL p4InfoUrl = this.getClass().getResource("/bmv2/default.p4info"); + private final URL jsonUrl = this.getClass().getResource("/bmv2/default.json"); private final PiPipeconf bmv2DefaultPipeconf = DefaultPiPipeconf.builder() - .withId(new PiPipeconfId("mock")) + .withId(new PiPipeconfId("mock-bmv2")) .withPipelineModel(Bmv2PipelineModelParser.parse(jsonUrl)) -// .addBehaviour(PiPipelineInterpreter.class, Bmv2DefaultInterpreter.class) + .addBehaviour(PiPipelineInterpreter.class, Bmv2DefaultInterpreter.class) .addExtension(P4_INFO_TEXT, p4InfoUrl) .addExtension(BMV2_JSON, jsonUrl) .build(); + private final P4RuntimeControllerImpl controller = new P4RuntimeControllerImpl(); + private final GrpcControllerImpl grpcController = new GrpcControllerImpl(); + private final DeviceId deviceId = DeviceId.deviceId("dummy:1"); + private final ManagedChannelBuilder channelBuilder = NettyChannelBuilder + .forAddress(GRPC_SERVER_ADDR, GRPC_SERVER_PORT) + .usePlaintext(true); + private P4RuntimeClientImpl client; - @Test - @Ignore - public void testRuntime() throws ExecutionException, InterruptedException, - PiPipelineInterpreter.PiInterpreterException, IllegalAccessException, InstantiationException { - - // FIXME: remove me. - - P4RuntimeControllerImpl controller = new P4RuntimeControllerImpl(); - GrpcControllerImpl grpcController = new GrpcControllerImpl(); + @Before + public void setUp() throws Exception { controller.grpcController = grpcController; GrpcControllerImpl.enableMessageLog = true; grpcController.activate(); - DeviceId deviceId = DeviceId.deviceId("dummy:1"); + } - ManagedChannelBuilder channelBuilder = NettyChannelBuilder - .forAddress("192.168.56.102", 59975) - .usePlaintext(true); + private void createClientAndSetPipelineConfig(PiPipeconf pipeconf, PiPipeconf.ExtensionType extensionType) + throws ExecutionException, InterruptedException, PiPipelineInterpreter.PiInterpreterException, + IllegalAccessException, InstantiationException { assert (controller.createClient(deviceId, 1, channelBuilder)); - P4RuntimeClient client = controller.getClient(deviceId); - - assert (client.setPipelineConfig(bmv2DefaultPipeconf, PiPipeconf.ExtensionType.BMV2_JSON).get()); + client = (P4RuntimeClientImpl) controller.getClient(deviceId); + assert (client.setPipelineConfig(pipeconf, extensionType).get()); assert (client.initStreamChannel().get()); + } + private void testActionProfile(int actionProfileId) { + + P4RuntimeGrpc.P4RuntimeBlockingStub stub = client.blockingStub(); + + P4RuntimeOuterClass.ActionProfileMember profileMemberMsg = P4RuntimeOuterClass.ActionProfileMember.newBuilder() + .setActionProfileId(actionProfileId) + // .setMemberId(1) + .setAction(P4RuntimeOuterClass.Action.newBuilder() + .setActionId(16793508) + .build()) + .build(); + + P4RuntimeOuterClass.ActionProfileGroup groupMsg = P4RuntimeOuterClass.ActionProfileGroup.newBuilder() + .setActionProfileId(actionProfileId) + .setGroupId(1) + .setType(SELECT) + .addMembers(P4RuntimeOuterClass.ActionProfileGroup.Member.newBuilder() + .setMemberId(1) + .setWeight(1) + .build()) + .setMaxSize(3) + .build(); + + P4RuntimeOuterClass.WriteRequest writeRequest = P4RuntimeOuterClass.WriteRequest.newBuilder() + .setDeviceId(client.p4DeviceId()) + .addUpdates(P4RuntimeOuterClass.Update.newBuilder() + .setType(INSERT) + .setEntity(P4RuntimeOuterClass.Entity.newBuilder() + .setActionProfileGroup(groupMsg) + .build()) + .build()) + .addUpdates(P4RuntimeOuterClass.Update.newBuilder() + .setType(INSERT) + .setEntity(P4RuntimeOuterClass.Entity.newBuilder() + .setActionProfileMember(profileMemberMsg) + .build()) + .build()) + .build(); + + stub.write(writeRequest); + } + + private void testPacketOut() throws IllegalAccessException, InstantiationException, ExecutionException, + InterruptedException, ImmutableByteSequence.ByteSequenceTrimException { + + PiPacketOperation packetOperation = PiPacketOperation.builder() + .withData(ImmutableByteSequence.ofOnes(10)) + .withType(PACKET_OUT) + .withMetadata(PiPacketMetadata.builder() + .withId(PiPacketMetadataId.of("egress_port")) + .withValue(fit(copyFrom(1), 9)) + .build()) + .build(); + + assert (client.packetOut(packetOperation, bmv2DefaultPipeconf).get()); + } + + private void testDumpTable(String tableName, PiPipeconf pipeconf) throws ExecutionException, InterruptedException { + assert (client.dumpTable(PiTableId.of(tableName), pipeconf).get().size() == 0); + } + + @Test + @Ignore + public void testBmv2() throws Exception { + + createClientAndSetPipelineConfig(bmv2DefaultPipeconf, BMV2_JSON); + + testDumpTable("table0", bmv2DefaultPipeconf); + + // testPacketOut(); + + testActionProfile(285261835); + } + + @Test + @Ignore + public void testTofino() throws Exception { + + createClientAndSetPipelineConfig(bmv2DefaultPipeconf, null); + } + +// OLD STUFF // log.info("++++++++++++++++++++++++++++"); // // PiPipelineInterpreter interpreter = (PiPipelineInterpreter) defaultPipeconf @@ -110,5 +209,4 @@ public class P4RuntimeTest { // assert(client.writeTableEntries(Lists.newArrayList(piTableEntry), INSERT, defaultPipeconf).get()); // assert(client.dumpTable(PiTableId.of(TABLE_0), defaultPipeconf).get().size() == 1); - } } diff --git a/apps/p4runtime-test/src/test/resources/bmv2/default.json b/apps/p4runtime-test/src/test/resources/bmv2/default.json new file mode 120000 index 0000000000..f2a3e07861 --- /dev/null +++ b/apps/p4runtime-test/src/test/resources/bmv2/default.json @@ -0,0 +1 @@ +../../../../../../tools/test/p4src/p4-16/p4c-out/default.json \ No newline at end of file diff --git a/apps/p4runtime-test/src/test/resources/bmv2/default.p4info b/apps/p4runtime-test/src/test/resources/bmv2/default.p4info new file mode 120000 index 0000000000..4dda3814d6 --- /dev/null +++ b/apps/p4runtime-test/src/test/resources/bmv2/default.p4info @@ -0,0 +1 @@ +../../../../../../tools/test/p4src/p4-16/p4c-out/default.p4info \ No newline at end of file diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java new file mode 100644 index 0000000000..57fab9dd56 --- /dev/null +++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java @@ -0,0 +1,190 @@ +/* + * Copyright 2017-present Open Networking Laboratory + * + * 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.net.pi.runtime; + +import com.google.common.annotations.Beta; +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; + +import java.util.Collection; +import java.util.Map; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Action group of a protocol-independent pipeline. + */ +@Beta +public final class PiActionGroup { + + /** + * Type of action group. + */ + public enum Type { + /** + * Load-balancing among different members in a group. + */ + SELECT + } + + private final PiActionGroupId id; + private final Type type; + private final ImmutableSet members; + + private PiActionGroup(PiActionGroupId id, Type type, ImmutableSet members) { + this.id = id; + this.type = type; + this.members = members; + } + + /** + * Returns the identifier of this action group. + * + * @return action group identifier + */ + public PiActionGroupId id() { + return id; + } + + /** + * Returns the type of this action group. + * + * @return action group type + */ + public Type type() { + return type; + } + + /** + * Returns the members of this action group. + * + * @return collection of action members. + */ + public Collection members() { + return members; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PiActionGroup that = (PiActionGroup) o; + return id == that.id && + Objects.equal(type, that.type) && + Objects.equal(members, that.members); + } + + @Override + public int hashCode() { + return Objects.hashCode(id, type, members); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("groupId", id) + .add("type", type) + .add("members", members) + .toString(); + } + + /** + * Returns a new builder of action groups. + * + * @return action group builder + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Builder of action groups. + */ + public static final class Builder { + + private PiActionGroupId id; + private Type type; + private Map members = Maps.newHashMap(); + + private Builder() { + // hides constructor. + } + + /** + * Sets the identifier of this action group. + * + * @param id action group identifier + * @return this + */ + public Builder withId(PiActionGroupId id) { + this.id = id; + return this; + } + + /** + * Sets the type of this action group. + * + * @param type action group type + * @return this + */ + public Builder withType(Type type) { + this.type = type; + return this; + } + + /** + * Adds one member to this action group. + * + * @param member action group member + * @return this + */ + public Builder addMember(PiActionGroupMember member) { + members.put(member.id(), member); + return this; + } + + /** + * Adds many members to this action group. + * + * @param members action group members + * @return this + */ + public Builder addMembers(Collection members) { + members.forEach(this::addMember); + return this; + } + + /** + * Creates a new action group. + * + * @return action group + */ + public PiActionGroup build() { + checkNotNull(id); + checkNotNull(type); + checkArgument(members.size() > 0, "Members cannot be empty"); + return new PiActionGroup(id, type, ImmutableSet.copyOf(members.values())); + } + } +} diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java new file mode 100644 index 0000000000..675ef59850 --- /dev/null +++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java @@ -0,0 +1,51 @@ +/* + * Copyright 2017-present Open Networking Laboratory + * + * 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.net.pi.runtime; + +import com.google.common.annotations.Beta; +import org.onlab.util.Identifier; + +/** + * Identifier of an action group in a protocol-independent pipeline. + */ +@Beta +public final class PiActionGroupId extends Identifier implements PiTableAction { + + private PiActionGroupId(int id) { + super(id); + } + + /** + * Returns an action group identifier for the given integer value. + * + * @param id identifier + * @return action group + */ + public static PiActionGroupId of(int id) { + return new PiActionGroupId(id); + } + + /* + In P4Runtime, groups can be referenced directly as table actions (i.e. without invoking the selector). + In future we should consider having a more appropriate wrapper class for group IDs, instead of implementing + the PiTableAction interface. + */ + @Override + public Type type() { + return Type.ACTION_GROUP_ID; + } +} diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java new file mode 100644 index 0000000000..67566d6d8d --- /dev/null +++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java @@ -0,0 +1,165 @@ +/* + * Copyright 2017-present Open Networking Laboratory + * + * 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.net.pi.runtime; + +import com.google.common.annotations.Beta; +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Member of an action group in a protocol-independent pipeline. + */ +@Beta +public final class PiActionGroupMember { + + private final PiActionGroupMemberId id; + private final PiAction action; + private final int weight; + + private PiActionGroupMember(PiActionGroupMemberId id, PiAction action, int weight) { + this.id = id; + this.action = action; + this.weight = weight; + } + + /** + * Returns the identifier of this member. + * + * @return member identifier + */ + public PiActionGroupMemberId id() { + return id; + } + + /** + * Returns the action associated to this member. + * + * @return action + */ + public PiAction action() { + return action; + } + + /** + * Returns the weight associated to this member. Valid if the action group is of type {@link + * PiActionGroup.Type#SELECT}. + * + * @return weight + */ + public int weight() { + return weight; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PiActionGroupMember)) { + return false; + } + PiActionGroupMember that = (PiActionGroupMember) o; + return weight == that.weight && + Objects.equal(id, that.id) && + Objects.equal(action, that.action); + } + + @Override + public int hashCode() { + return Objects.hashCode(id, action, weight); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("id", id) + .add("action", action) + .add("weight", weight) + .toString(); + } + + /** + * Returns a new builder of action group members. + * + * @return member builder + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Builder of action group members. + */ + public static final class Builder { + + private PiActionGroupMemberId id; + private PiAction action; + private int weight; + + private Builder() { + // Hides constructor. + } + + /** + * Sets the identifier of this member. + * + * @param id member identifier + * @return this + */ + public Builder withId(PiActionGroupMemberId id) { + this.id = id; + return this; + } + + /** + * Sets the action of this member. + * + * @param action action + * @return this + */ + public Builder withAction(PiAction action) { + this.action = action; + return this; + } + + /** + * Sets the weight of this member. Valid if the action group is of type {@link PiActionGroup.Type#SELECT}. + *

+ * Default value is 0. + * + * @param weight weight + * @return this + */ + public Builder withWeight(int weight) { + this.weight = weight; + return this; + } + + /** + * Creates a new action group member. + * + * @return action group member + */ + public PiActionGroupMember build() { + checkNotNull(id); + checkNotNull(action); + return new PiActionGroupMember(id, action, weight); + } + } +} diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java new file mode 100644 index 0000000000..866938830b --- /dev/null +++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java @@ -0,0 +1,51 @@ +/* + * Copyright 2017-present Open Networking Laboratory + * + * 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.net.pi.runtime; + +import com.google.common.annotations.Beta; +import org.onlab.util.Identifier; + +/** + * Identifier of a member of an action group in a protocol-independent pipeline. + */ +@Beta +public final class PiActionGroupMemberId extends Identifier implements PiTableAction { + + private PiActionGroupMemberId(int id) { + super(id); + } + + /** + * Returns an action group identifier for the given integer value. + * + * @param id identifier + * @return action group + */ + public static PiActionGroupMemberId of(int id) { + return new PiActionGroupMemberId(id); + } + + /* + In P4Runtime, group members can be referenced directly as table actions. + In future we should consider having a more appropriate wrapper class for group member IDs, instead of implementing + the PiTableAction interface. + */ + @Override + public Type type() { + return Type.GROUP_MEMBER_ID; + } +} diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java index a4d40389ab..eb842d4c7d 100644 --- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java +++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java @@ -38,15 +38,14 @@ public interface PiTableAction { */ ACTION, - // TODO: in P4Runtime a table action can be any of the following 3. - // How to represent action profiles? - /* message TableAction { - oneof type { - Action action = 1; - uint32 action_profile_member_id = 2; - uint32 action_profile_group_id = 3; - } - } - */ + /** + * Executes the action group specified by the given identifier. + */ + ACTION_GROUP_ID, + + /** + * Executes the action member group specified by the given identifier. + */ + GROUP_MEMBER_ID } } diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2GroupProgrammable.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2GroupProgrammable.java new file mode 100644 index 0000000000..0bca13b5d8 --- /dev/null +++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2GroupProgrammable.java @@ -0,0 +1,151 @@ +/* + * Copyright 2017-present Open Networking Laboratory + * + * 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.drivers.bmv2; + +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.driver.AbstractHandlerBehaviour; +import org.onosproject.net.group.GroupBucket; +import org.onosproject.net.group.GroupDescription; +import org.onosproject.net.group.GroupOperation; +import org.onosproject.net.group.GroupOperations; +import org.onosproject.net.group.GroupProgrammable; +import org.onosproject.net.pi.model.PiPipelineInterpreter; +import org.onosproject.net.pi.runtime.PiAction; +import org.onosproject.net.pi.runtime.PiActionGroup; +import org.onosproject.net.pi.runtime.PiActionGroupId; +import org.onosproject.net.pi.runtime.PiActionGroupMember; +import org.onosproject.net.pi.runtime.PiActionGroupMemberId; +import org.onosproject.net.pi.runtime.PiTableId; + +import java.nio.ByteBuffer; + +public class Bmv2GroupProgrammable extends AbstractHandlerBehaviour implements GroupProgrammable { + + /* + Work in progress. + */ + + private Device device; + + /* + About action groups in P4runtime: + The type field is a place holder in p4runtime.proto right now, and we haven't defined it yet. You can assume all + the groups are "select" as per the OF spec. As a remainder, in the P4 terminology a member corresponds to an OF + bucket. Each member can also be used directly in the match table (kind of like an OF indirect group). + */ + + @Override + public void performGroupOperation(DeviceId deviceId, GroupOperations groupOps) { + + for (GroupOperation groupOp : groupOps.operations()) { + switch (groupOp.opType()) { + case ADD: + addGroup(deviceId, groupOp); + break; + default: + throw new UnsupportedOperationException(); + } + } + } + + private void addGroup(DeviceId deviceId, GroupOperation groupOp) { + + // Most of this logic can go in a core service, e.g. PiGroupTranslationService + + // From a P4Runtime perspective, we need first to insert members, then the group. + + PiActionGroupId piActionGroupId = PiActionGroupId.of(groupOp.groupId().id()); + + PiActionGroup.Builder piActionGroupBuilder = PiActionGroup.builder() + .withId(piActionGroupId) + .withType(PiActionGroup.Type.SELECT); + + if (groupOp.groupType() != GroupDescription.Type.SELECT) { + // log error + } + + int bucketIdx = 0; + for (GroupBucket bucket : groupOp.buckets().buckets()) { + /* + Problem: + In P4Runtime action group members, i.e. action buckets, are associated to a numeric ID chosen + at member insertion time. This ID must be unique for the whole action profile (i.e. the group table in + OpenFlow). In ONOS, GroupBucket doesn't specify any ID. + + Solutions: + - Change GroupBucket API to force application wanting to perform group operations to specify a member id. + - Maintain state to dynamically allocate/deallocate member IDs, e.g. in a dedicated service, or in a + P4Runtime Group Provider. + + Hack: + Statically derive member ID by combining groupId and position of the bucket in the list. + */ + int memberId = ByteBuffer.allocate(4) + .putShort((short) (piActionGroupId.id() % 2 ^ 16)) + .putShort((short) (bucketIdx % 2 ^ 16)) + .getInt(); + + // Need an interpreter to map the bucket treatment to a PI action + + if (!device.is(PiPipelineInterpreter.class)) { + // log error + } + + PiPipelineInterpreter interpreter = device.as(PiPipelineInterpreter.class); + + /* + Problem: + In P4Runtime, action profiles (i.e. group tables) are specific to one or more tables. + Mapping of treatments depends on the target table. How do we derive the target table from here? + + Solution: + - Change GroupDescription to allow applications to specify a table where this group will be called from. + + Hack: + Assume we support pipelines with only one action profile associated to only one table, i.e. derive the + table ID by looking at the P4Info. + */ + + PiTableId piTableId = PiTableId.of("derive from P4Info"); + + + PiAction action = null; + try { + action = interpreter.mapTreatment(bucket.treatment(), piTableId); + } catch (PiPipelineInterpreter.PiInterpreterException e) { + // log error + } + + PiActionGroupMember member = PiActionGroupMember.builder() + .withId(PiActionGroupMemberId.of(memberId)) + .withAction(action) + .withWeight(bucket.weight()) + .build(); + + piActionGroupBuilder.addMember(member); + + // Use P4RuntimeClient to install member; + // TODO: implement P4RuntimeClient method. + } + + PiActionGroup piActionGroup = piActionGroupBuilder.build(); + + // Use P4RuntimeClient to insert group. + // TODO: implement P4RuntimeClient method. + } +} diff --git a/drivers/bmv2/src/main/resources/default.json b/drivers/bmv2/src/main/resources/default.json deleted file mode 100644 index 3a46dcc5c7..0000000000 --- a/drivers/bmv2/src/main/resources/default.json +++ /dev/null @@ -1,2697 +0,0 @@ -{ - "program" : "default.p4", - "__meta__" : { - "version" : [2, 7], - "compiler" : "https://github.com/p4lang/p4c" - }, - "header_types" : [ - { - "name" : "scalars_0", - "id" : 0, - "fields" : [ - ["tmp", 32, false], - ["tmp_0", 32, false] - ] - }, - { - "name" : "standard_metadata", - "id" : 1, - "fields" : [ - ["ingress_port", 9, false], - ["egress_spec", 9, false], - ["egress_port", 9, false], - ["clone_spec", 32, false], - ["instance_type", 32, false], - ["drop", 1, false], - ["recirculate_port", 16, false], - ["packet_length", 32, false], - ["enq_timestamp", 32, false], - ["enq_qdepth", 19, false], - ["deq_timedelta", 32, false], - ["deq_qdepth", 19, false], - ["ingress_global_timestamp", 48, false], - ["lf_field_list", 32, false], - ["mcast_grp", 16, false], - ["resubmit_flag", 1, false], - ["egress_rid", 16, false], - ["_padding", 5, false] - ] - }, - { - "name" : "ethernet_t", - "id" : 2, - "fields" : [ - ["dstAddr", 48, false], - ["srcAddr", 48, false], - ["etherType", 16, false] - ] - }, - { - "name" : "ipv4_t", - "id" : 3, - "fields" : [ - ["version", 4, false], - ["ihl", 4, false], - ["diffserv", 8, false], - ["totalLen", 16, false], - ["identification", 16, false], - ["flags", 3, false], - ["fragOffset", 13, false], - ["ttl", 8, false], - ["protocol", 8, false], - ["hdrChecksum", 16, false], - ["srcAddr", 32, false], - ["dstAddr", 32, false] - ] - }, - { - "name" : "tcp_t", - "id" : 4, - "fields" : [ - ["srcPort", 16, false], - ["dstPort", 16, false], - ["seqNo", 32, false], - ["ackNo", 32, false], - ["dataOffset", 4, false], - ["res", 3, false], - ["ecn", 3, false], - ["ctrl", 6, false], - ["window", 16, false], - ["checksum", 16, false], - ["urgentPtr", 16, false] - ] - }, - { - "name" : "udp_t", - "id" : 5, - "fields" : [ - ["srcPort", 16, false], - ["dstPort", 16, false], - ["length_", 16, false], - ["checksum", 16, false] - ] - }, - { - "name" : "ecmp_metadata_t", - "id" : 6, - "fields" : [ - ["groupId", 16, false], - ["selector", 16, false] - ] - }, - { - "name" : "wcmp_meta_t", - "id" : 7, - "fields" : [ - ["groupId", 16, false], - ["numBits", 8, false], - ["selector", 64, false] - ] - }, - { - "name" : "intrinsic_metadata_t", - "id" : 8, - "fields" : [ - ["ingress_global_timestamp", 32, false], - ["lf_field_list", 32, false], - ["mcast_grp", 16, false], - ["egress_rid", 16, false] - ] - } - ], - "headers" : [ - { - "name" : "standard_metadata_3", - "id" : 0, - "header_type" : "standard_metadata", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "standard_metadata_4", - "id" : 1, - "header_type" : "standard_metadata", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "standard_metadata_5", - "id" : 2, - "header_type" : "standard_metadata", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "scalars", - "id" : 3, - "header_type" : "scalars_0", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "standard_metadata", - "id" : 4, - "header_type" : "standard_metadata", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "ethernet", - "id" : 5, - "header_type" : "ethernet_t", - "metadata" : false, - "pi_omit" : true - }, - { - "name" : "ipv4", - "id" : 6, - "header_type" : "ipv4_t", - "metadata" : false, - "pi_omit" : true - }, - { - "name" : "tcp", - "id" : 7, - "header_type" : "tcp_t", - "metadata" : false, - "pi_omit" : true - }, - { - "name" : "udp", - "id" : 8, - "header_type" : "udp_t", - "metadata" : false, - "pi_omit" : true - }, - { - "name" : "ecmp_metadata", - "id" : 9, - "header_type" : "ecmp_metadata_t", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "wcmp_meta", - "id" : 10, - "header_type" : "wcmp_meta_t", - "metadata" : true, - "pi_omit" : true - }, - { - "name" : "intrinsic_metadata", - "id" : 11, - "header_type" : "intrinsic_metadata_t", - "metadata" : true, - "pi_omit" : true - } - ], - "header_stacks" : [], - "header_union_types" : [], - "header_unions" : [], - "header_union_stacks" : [], - "field_lists" : [], - "errors" : [ - ["NoError", 1], - ["PacketTooShort", 2], - ["NoMatch", 3], - ["StackOutOfBounds", 4], - ["HeaderTooShort", 5], - ["ParserTimeout", 6] - ], - "enums" : [], - "parsers" : [ - { - "name" : "parser", - "id" : 0, - "init_state" : "start", - "parse_states" : [ - { - "name" : "parse_ipv4", - "id" : 0, - "parser_ops" : [ - { - "parameters" : [ - { - "type" : "regular", - "value" : "ipv4" - } - ], - "op" : "extract" - } - ], - "transitions" : [ - { - "value" : "0x06", - "mask" : null, - "next_state" : "parse_tcp" - }, - { - "value" : "0x11", - "mask" : null, - "next_state" : "parse_udp" - }, - { - "value" : "default", - "mask" : null, - "next_state" : null - } - ], - "transition_key" : [ - { - "type" : "field", - "value" : ["ipv4", "protocol"] - } - ] - }, - { - "name" : "parse_tcp", - "id" : 1, - "parser_ops" : [ - { - "parameters" : [ - { - "type" : "regular", - "value" : "tcp" - } - ], - "op" : "extract" - } - ], - "transitions" : [ - { - "value" : "default", - "mask" : null, - "next_state" : null - } - ], - "transition_key" : [] - }, - { - "name" : "parse_udp", - "id" : 2, - "parser_ops" : [ - { - "parameters" : [ - { - "type" : "regular", - "value" : "udp" - } - ], - "op" : "extract" - } - ], - "transitions" : [ - { - "value" : "default", - "mask" : null, - "next_state" : null - } - ], - "transition_key" : [] - }, - { - "name" : "start", - "id" : 3, - "parser_ops" : [ - { - "parameters" : [ - { - "type" : "regular", - "value" : "ethernet" - } - ], - "op" : "extract" - } - ], - "transitions" : [ - { - "value" : "0x0800", - "mask" : null, - "next_state" : "parse_ipv4" - }, - { - "value" : "default", - "mask" : null, - "next_state" : null - } - ], - "transition_key" : [ - { - "type" : "field", - "value" : ["ethernet", "etherType"] - } - ] - } - ] - } - ], - "deparsers" : [ - { - "name" : "deparser", - "id" : 0, - "source_info" : { - "filename" : "include/parsers.p4", - "line" : 43, - "column" : 8, - "source_fragment" : "DeparserImpl" - }, - "order" : ["ethernet", "ipv4", "udp", "tcp"] - } - ], - "meter_arrays" : [], - "counter_arrays" : [ - { - "name" : "table0_counter", - "id" : 0, - "is_direct" : true, - "binding" : "table0" - }, - { - "name" : "port_counters_control.egress_port_counter", - "id" : 1, - "source_info" : { - "filename" : "include/port_counters.p4", - "line" : 6, - "column" : 38, - "source_fragment" : "egress_port_counter" - }, - "size" : 254, - "is_direct" : false - }, - { - "name" : "port_counters_control.ingress_port_counter", - "id" : 2, - "source_info" : { - "filename" : "include/port_counters.p4", - "line" : 7, - "column" : 38, - "source_fragment" : "ingress_port_counter" - }, - "size" : 254, - "is_direct" : false - } - ], - "register_arrays" : [], - "calculations" : [], - "learn_lists" : [], - "actions" : [ - { - "name" : "set_egress_port", - "id" : 0, - "runtime_data" : [ - { - "name" : "port", - "bitwidth" : 9 - } - ], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_spec"] - }, - { - "type" : "runtime_data", - "value" : 0 - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 9, - "column" : 4, - "source_fragment" : "standard_metadata.egress_spec = port" - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata_3", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 8, - "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." - } - } - ] - }, - { - "name" : "send_to_cpu", - "id" : 1, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_spec"] - }, - { - "type" : "hexstr", - "value" : "0x00ff" - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 5, - "column" : 4, - "source_fragment" : "standard_metadata.egress_spec = 9w255" - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata_4", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 4, - "column" : 45, - "source_fragment" : "standard_metadata) { ..." - } - } - ] - }, - { - "name" : "drop", - "id" : 2, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_spec"] - }, - { - "type" : "hexstr", - "value" : "0x01ff" - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 13, - "column" : 4, - "source_fragment" : "standard_metadata.egress_spec = 9w511" - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "ingress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "clone_spec"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "clone_spec"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "instance_type"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "instance_type"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "drop"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "drop"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "recirculate_port"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "recirculate_port"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "packet_length"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "packet_length"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "enq_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "enq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "enq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_timedelta"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "deq_timedelta"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "deq_qdepth"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "deq_qdepth"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "ingress_global_timestamp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "ingress_global_timestamp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "lf_field_list"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "lf_field_list"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "mcast_grp"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "mcast_grp"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "resubmit_flag"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "resubmit_flag"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_rid"] - }, - { - "type" : "field", - "value" : ["standard_metadata_5", "egress_rid"] - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 12, - "column" : 38, - "source_fragment" : "standard_metadata) { ..." - } - } - ] - }, - { - "name" : "NoAction", - "id" : 3, - "runtime_data" : [], - "primitives" : [] - }, - { - "name" : "act", - "id" : 4, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["scalars", "tmp"] - }, - { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "&", - "left" : { - "type" : "field", - "value" : ["standard_metadata", "ingress_port"] - }, - "right" : { - "type" : "hexstr", - "value" : "0xffffffff" - } - } - } - } - ] - }, - { - "op" : "count", - "parameters" : [ - { - "type" : "counter_array", - "value" : "port_counters_control.ingress_port_counter" - }, - { - "type" : "field", - "value" : ["scalars", "tmp"] - } - ], - "source_info" : { - "filename" : "include/port_counters.p4", - "line" : 11, - "column" : 12, - "source_fragment" : "ingress_port_counter.count((bit<32>)standard_metadata.ingress_port)" - } - }, - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["scalars", "tmp_0"] - }, - { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "&", - "left" : { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - "right" : { - "type" : "hexstr", - "value" : "0xffffffff" - } - } - } - } - ] - }, - { - "op" : "count", - "parameters" : [ - { - "type" : "counter_array", - "value" : "port_counters_control.egress_port_counter" - }, - { - "type" : "field", - "value" : ["scalars", "tmp_0"] - } - ], - "source_info" : { - "filename" : "include/port_counters.p4", - "line" : 12, - "column" : 12, - "source_fragment" : "egress_port_counter.count((bit<32>)standard_metadata.egress_spec)" - } - } - ] - } - ], - "pipelines" : [ - { - "name" : "ingress", - "id" : 0, - "source_info" : { - "filename" : "default.p4", - "line" : 10, - "column" : 8, - "source_fragment" : "ingress" - }, - "init_table" : "table0", - "tables" : [ - { - "name" : "table0", - "id" : 0, - "source_info" : { - "filename" : "default.p4", - "line" : 13, - "column" : 10, - "source_fragment" : "table0" - }, - "key" : [ - { - "match_type" : "ternary", - "target" : ["standard_metadata", "ingress_port"], - "mask" : null - }, - { - "match_type" : "ternary", - "target" : ["ethernet", "dstAddr"], - "mask" : null - }, - { - "match_type" : "ternary", - "target" : ["ethernet", "srcAddr"], - "mask" : null - }, - { - "match_type" : "ternary", - "target" : ["ethernet", "etherType"], - "mask" : null - } - ], - "match_type" : "ternary", - "type" : "simple", - "max_size" : 1024, - "support_timeout" : false, - "direct_meters" : null, - "action_ids" : [0, 1, 2, 3], - "actions" : ["set_egress_port", "send_to_cpu", "drop", "NoAction"], - "base_default_next" : "node_3", - "next_tables" : { - "set_egress_port" : "node_3", - "send_to_cpu" : "node_3", - "drop" : "node_3", - "NoAction" : "node_3" - }, - "default_entry" : { - "action_id" : 3, - "action_const" : false, - "action_data" : [], - "action_entry_const" : false - } - }, - { - "name" : "tbl_act", - "id" : 1, - "key" : [], - "match_type" : "exact", - "type" : "simple", - "max_size" : 1024, - "with_counters" : false, - "support_timeout" : false, - "direct_meters" : null, - "action_ids" : [4], - "actions" : ["act"], - "base_default_next" : null, - "next_tables" : { - "act" : null - }, - "default_entry" : { - "action_id" : 4, - "action_const" : true, - "action_data" : [], - "action_entry_const" : true - } - } - ], - "action_profiles" : [], - "conditionals" : [ - { - "name" : "node_3", - "id" : 0, - "source_info" : { - "filename" : "include/port_counters.p4", - "line" : 10, - "column" : 12, - "source_fragment" : "standard_metadata.egress_spec < 254" - }, - "expression" : { - "type" : "expression", - "value" : { - "op" : "<", - "left" : { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - "right" : { - "type" : "hexstr", - "value" : "0x00fe" - } - } - }, - "false_next" : null, - "true_next" : "tbl_act" - } - ] - }, - { - "name" : "egress", - "id" : 1, - "source_info" : { - "filename" : "default.p4", - "line" : 36, - "column" : 8, - "source_fragment" : "egress" - }, - "init_table" : null, - "tables" : [], - "action_profiles" : [], - "conditionals" : [] - } - ], - "checksums" : [], - "force_arith" : [], - "extern_instances" : [], - "field_aliases" : [ - [ - "queueing_metadata.enq_timestamp", - ["standard_metadata", "enq_timestamp"] - ], - [ - "queueing_metadata.enq_qdepth", - ["standard_metadata", "enq_qdepth"] - ], - [ - "queueing_metadata.deq_timedelta", - ["standard_metadata", "deq_timedelta"] - ], - [ - "queueing_metadata.deq_qdepth", - ["standard_metadata", "deq_qdepth"] - ], - [ - "intrinsic_metadata.ingress_global_timestamp", - ["standard_metadata", "ingress_global_timestamp"] - ], - [ - "intrinsic_metadata.lf_field_list", - ["standard_metadata", "lf_field_list"] - ], - [ - "intrinsic_metadata.mcast_grp", - ["standard_metadata", "mcast_grp"] - ], - [ - "intrinsic_metadata.resubmit_flag", - ["standard_metadata", "resubmit_flag"] - ], - [ - "intrinsic_metadata.egress_rid", - ["standard_metadata", "egress_rid"] - ] - ] -} \ No newline at end of file diff --git a/drivers/bmv2/src/main/resources/default.json b/drivers/bmv2/src/main/resources/default.json new file mode 120000 index 0000000000..c5028d878b --- /dev/null +++ b/drivers/bmv2/src/main/resources/default.json @@ -0,0 +1 @@ +../../../../../tools/test/p4src/p4-16/p4c-out/default.json \ No newline at end of file diff --git a/drivers/bmv2/src/main/resources/default.p4info b/drivers/bmv2/src/main/resources/default.p4info deleted file mode 100644 index bd3649dfa6..0000000000 --- a/drivers/bmv2/src/main/resources/default.p4info +++ /dev/null @@ -1,113 +0,0 @@ -tables { - preamble { - id: 33617813 - name: "table0" - alias: "table0" - } - match_fields { - id: 1 - name: "standard_metadata.ingress_port" - bitwidth: 9 - match_type: TERNARY - } - match_fields { - id: 2 - name: "hdr.ethernet.dstAddr" - bitwidth: 48 - match_type: TERNARY - } - match_fields { - id: 3 - name: "hdr.ethernet.srcAddr" - bitwidth: 48 - match_type: TERNARY - } - match_fields { - id: 4 - name: "hdr.ethernet.etherType" - bitwidth: 16 - match_type: TERNARY - } - action_refs { - id: 16794308 - } - action_refs { - id: 16829080 - } - action_refs { - id: 16793508 - } - action_refs { - id: 16800567 - annotations: "@defaultonly()" - } - direct_resource_ids: 301990488 - size: 1024 - with_entry_timeout: true -} -actions { - preamble { - id: 16794308 - name: "set_egress_port" - alias: "set_egress_port" - } - params { - id: 1 - name: "port" - bitwidth: 9 - } -} -actions { - preamble { - id: 16829080 - name: "send_to_cpu" - alias: "send_to_cpu" - } -} -actions { - preamble { - id: 16793508 - name: "drop" - alias: "drop" - } -} -actions { - preamble { - id: 16800567 - name: "NoAction" - alias: "NoAction" - } -} -counters { - preamble { - id: 302025528 - name: "port_counters_control.egress_port_counter" - alias: "egress_port_counter" - } - spec { - unit: PACKETS - } - size: 254 -} -counters { - preamble { - id: 301999025 - name: "port_counters_control.ingress_port_counter" - alias: "ingress_port_counter" - } - spec { - unit: PACKETS - } - size: 254 -} -direct_counters { - preamble { - id: 301990488 - name: "table0_counter" - alias: "table0_counter" - } - spec { - unit: PACKETS - } - direct_table_id: 33617813 -} diff --git a/drivers/bmv2/src/main/resources/default.p4info b/drivers/bmv2/src/main/resources/default.p4info new file mode 120000 index 0000000000..8f71cbe52f --- /dev/null +++ b/drivers/bmv2/src/main/resources/default.p4info @@ -0,0 +1 @@ +../../../../../tools/test/p4src/p4-16/p4c-out/default.p4info \ No newline at end of file diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java index bb2d16bcb6..78a02229c0 100644 --- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java +++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java @@ -349,6 +349,24 @@ public final class P4RuntimeClientImpl implements P4RuntimeClient { return true; } + /** + * Returns the internal P4 device ID associated with this client. + * + * @return P4 device ID + */ + public int p4DeviceId() { + return p4DeviceId; + } + + /** + * For testing purpose only. TODO: remove before release. + * + * @return blocking stub + */ + public P4RuntimeGrpc.P4RuntimeBlockingStub blockingStub() { + return this.blockingStub; + } + @Override public void shutdown() { diff --git a/tools/test/p4src/p4-16/default.p4 b/tools/test/p4src/p4-16/default.p4 index 13243b2bbb..2bee27fe4e 100644 --- a/tools/test/p4src/p4-16/default.p4 +++ b/tools/test/p4src/p4-16/default.p4 @@ -11,21 +11,32 @@ control ingress(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) { direct_counter(CounterType.packets) table0_counter; + action_selector(HashAlgorithm.crc16, 32w64, 32w16) ecmp_selector; table table0 { support_timeout = true; + key = { + standard_metadata.ingress_port : ternary; + hdr.ethernet.dstAddr : ternary; + hdr.ethernet.srcAddr : ternary; + hdr.ethernet.etherType : ternary; + // Not for matching. + // Inputs to the hash function of the action selector. + hdr.ipv4.srcAddr : selector; + hdr.ipv4.dstAddr : selector; + hdr.ipv4.protocol : selector; + hdr.tcp.srcPort : selector; + hdr.tcp.dstPort : selector; + hdr.udp.srcPort : selector; + hdr.udp.dstPort : selector; + } actions = { set_egress_port(standard_metadata); send_to_cpu(standard_metadata); drop(standard_metadata); } - key = { - standard_metadata.ingress_port: ternary; - hdr.ethernet.dstAddr : ternary; - hdr.ethernet.srcAddr : ternary; - hdr.ethernet.etherType : ternary; - } counters = table0_counter; + implementation = ecmp_selector; } PacketIoIngressControl() packet_io_ingress_control; diff --git a/tools/test/p4src/p4-16/p4c-out/.gitignore b/tools/test/p4src/p4-16/p4c-out/.gitignore deleted file mode 100644 index dfbb6b2304..0000000000 --- a/tools/test/p4src/p4-16/p4c-out/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.json -*.p4info diff --git a/apps/p4runtime-test/src/test/resources/default.json b/tools/test/p4src/p4-16/p4c-out/default.json similarity index 81% rename from apps/p4runtime-test/src/test/resources/default.json rename to tools/test/p4src/p4-16/p4c-out/default.json index 3a46dcc5c7..8b9070c083 100644 --- a/apps/p4runtime-test/src/test/resources/default.json +++ b/tools/test/p4src/p4-16/p4c-out/default.json @@ -92,25 +92,41 @@ ] }, { - "name" : "ecmp_metadata_t", + "name" : "packet_out_header_t", "id" : 6, "fields" : [ - ["groupId", 16, false], + ["egress_port", 9, false], + ["_padding_0", 7, false] + ] + }, + { + "name" : "packet_in_header_t", + "id" : 7, + "fields" : [ + ["ingress_port", 9, false], + ["_padding_1", 7, false] + ] + }, + { + "name" : "ecmp_metadata_t", + "id" : 8, + "fields" : [ + ["group_id", 16, false], ["selector", 16, false] ] }, { - "name" : "wcmp_meta_t", - "id" : 7, + "name" : "wcmp_metadata_t", + "id" : 9, "fields" : [ - ["groupId", 16, false], + ["group_id", 16, false], ["numBits", 8, false], ["selector", 64, false] ] }, { "name" : "intrinsic_metadata_t", - "id" : 8, + "id" : 10, "fields" : [ ["ingress_global_timestamp", 32, false], ["lf_field_list", 32, false], @@ -184,22 +200,36 @@ "pi_omit" : true }, { - "name" : "ecmp_metadata", + "name" : "packet_out", "id" : 9, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "packet_in", + "id" : 10, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "ecmp_metadata", + "id" : 11, "header_type" : "ecmp_metadata_t", "metadata" : true, "pi_omit" : true }, { "name" : "wcmp_meta", - "id" : 10, - "header_type" : "wcmp_meta_t", + "id" : 12, + "header_type" : "wcmp_metadata_t", "metadata" : true, "pi_omit" : true }, { "name" : "intrinsic_metadata", - "id" : 11, + "id" : 13, "header_type" : "intrinsic_metadata_t", "metadata" : true, "pi_omit" : true @@ -226,8 +256,64 @@ "init_state" : "start", "parse_states" : [ { - "name" : "parse_ipv4", + "name" : "parse_packet_out", "id" : 0, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "packet_out" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "value" : "default", + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_ethernet", + "id" : 1, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "ethernet" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "value" : "default", + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["ethernet", "etherType"] + } + ] + }, + { + "name" : "parse_ipv4", + "id" : 2, "parser_ops" : [ { "parameters" : [ @@ -265,7 +351,7 @@ }, { "name" : "parse_tcp", - "id" : 1, + "id" : 3, "parser_ops" : [ { "parameters" : [ @@ -288,7 +374,7 @@ }, { "name" : "parse_udp", - "id" : 2, + "id" : 4, "parser_ops" : [ { "parameters" : [ @@ -311,34 +397,24 @@ }, { "name" : "start", - "id" : 3, - "parser_ops" : [ - { - "parameters" : [ - { - "type" : "regular", - "value" : "ethernet" - } - ], - "op" : "extract" - } - ], + "id" : 5, + "parser_ops" : [], "transitions" : [ { - "value" : "0x0800", + "value" : "0xff", "mask" : null, - "next_state" : "parse_ipv4" + "next_state" : "parse_packet_out" }, { "value" : "default", "mask" : null, - "next_state" : null + "next_state" : "parse_ethernet" } ], "transition_key" : [ { "type" : "field", - "value" : ["ethernet", "etherType"] + "value" : ["standard_metadata", "ingress_port"] } ] } @@ -351,11 +427,11 @@ "id" : 0, "source_info" : { "filename" : "include/parsers.p4", - "line" : 43, + "line" : 49, "column" : 8, "source_fragment" : "DeparserImpl" }, - "order" : ["ethernet", "ipv4", "udp", "tcp"] + "order" : ["packet_in", "ethernet", "ipv4", "udp", "tcp"] } ], "meter_arrays" : [], @@ -419,9 +495,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -438,9 +514,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -457,9 +533,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -476,9 +552,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -495,9 +571,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -514,9 +590,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -533,9 +609,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -552,9 +628,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -571,9 +647,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -590,9 +666,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -609,9 +685,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -628,9 +704,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -647,9 +723,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -666,9 +742,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -685,9 +761,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -704,9 +780,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -723,9 +799,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -742,7 +818,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 9, + "line" : 11, "column" : 4, "source_fragment" : "standard_metadata.egress_spec = port" } @@ -761,9 +837,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -780,9 +856,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -799,9 +875,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -818,9 +894,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -837,9 +913,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -856,9 +932,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -875,9 +951,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -894,9 +970,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -913,9 +989,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -932,9 +1008,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -951,9 +1027,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -970,9 +1046,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -989,9 +1065,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -1008,9 +1084,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -1027,9 +1103,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -1046,9 +1122,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } }, { @@ -1065,9 +1141,9 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 8, + "line" : 10, "column" : 49, - "source_fragment" : "standard_metadata, Port port) { ..." + "source_fragment" : "standard_metadata, port_t port) { ..." } } ] @@ -1091,7 +1167,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1110,7 +1186,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1129,7 +1205,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1148,7 +1224,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1167,7 +1243,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1186,7 +1262,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1205,7 +1281,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1224,7 +1300,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1243,7 +1319,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1262,7 +1338,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1281,7 +1357,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1300,7 +1376,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1319,7 +1395,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1338,7 +1414,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1357,7 +1433,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1376,7 +1452,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1395,7 +1471,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1414,7 +1490,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 5, + "line" : 7, "column" : 4, "source_fragment" : "standard_metadata.egress_spec = 9w255" } @@ -1433,7 +1509,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1452,7 +1528,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1471,7 +1547,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1490,7 +1566,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1509,7 +1585,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1528,7 +1604,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1547,7 +1623,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1566,7 +1642,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1585,7 +1661,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1604,7 +1680,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1623,7 +1699,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1642,7 +1718,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1661,7 +1737,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1680,7 +1756,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1699,7 +1775,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1718,7 +1794,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1737,7 +1813,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 4, + "line" : 6, "column" : 45, "source_fragment" : "standard_metadata) { ..." } @@ -1763,7 +1839,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1782,7 +1858,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1801,7 +1877,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1820,7 +1896,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1839,7 +1915,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1858,7 +1934,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1877,7 +1953,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1896,7 +1972,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1915,7 +1991,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1934,7 +2010,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1953,7 +2029,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1972,7 +2048,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -1991,7 +2067,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2010,7 +2086,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2029,7 +2105,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2048,7 +2124,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2067,7 +2143,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2086,7 +2162,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 13, + "line" : 15, "column" : 4, "source_fragment" : "standard_metadata.egress_spec = 9w511" } @@ -2105,7 +2181,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2124,7 +2200,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2143,7 +2219,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2162,7 +2238,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2181,7 +2257,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2200,7 +2276,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2219,7 +2295,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2238,7 +2314,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2257,7 +2333,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2276,7 +2352,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2295,7 +2371,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2314,7 +2390,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2333,7 +2409,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2352,7 +2428,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2371,7 +2447,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2390,7 +2466,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2409,7 +2485,7 @@ ], "source_info" : { "filename" : "include/actions.p4", - "line" : 12, + "line" : 14, "column" : 38, "source_fragment" : "standard_metadata) { ..." } @@ -2426,6 +2502,32 @@ "name" : "act", "id" : 4, "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "field", + "value" : ["packet_out", "egress_port"] + } + ], + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 7, + "column" : 12, + "source_fragment" : "standard_metadata.egress_spec = hdr.packet_out.egress_port" + } + } + ] + }, + { + "name" : "act_0", + "id" : 5, + "runtime_data" : [], "primitives" : [ { "op" : "assign", @@ -2518,6 +2620,69 @@ } } ] + }, + { + "name" : "act_1", + "id" : 6, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "packet_in" + } + ], + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 16, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["packet_in", "ingress_port"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 17, + "column" : 12, + "source_fragment" : "hdr.packet_in.ingress_port = standard_metadata.ingress_port" + } + } + ] + }, + { + "name" : "act_2", + "id" : 7, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "packet_out" + } + ], + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 14, + "column" : 8, + "source_fragment" : "hdr.packet_out.setInvalid()" + } + } + ] } ], "pipelines" : [ @@ -2526,18 +2691,41 @@ "id" : 0, "source_info" : { "filename" : "default.p4", - "line" : 10, + "line" : 11, "column" : 8, "source_fragment" : "ingress" }, - "init_table" : "table0", + "init_table" : "node_2", "tables" : [ { - "name" : "table0", + "name" : "tbl_act", "id" : 0, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [4], + "actions" : ["act"], + "base_default_next" : "node_4", + "next_tables" : { + "act" : "node_4" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "table0", + "id" : 1, "source_info" : { "filename" : "default.p4", - "line" : 13, + "line" : 16, "column" : 10, "source_fragment" : "table0" }, @@ -2564,29 +2752,24 @@ } ], "match_type" : "ternary", - "type" : "simple", + "type" : "indirect_ws", + "action_profile" : "ecmp_selector", "max_size" : 1024, "support_timeout" : false, "direct_meters" : null, "action_ids" : [0, 1, 2, 3], "actions" : ["set_egress_port", "send_to_cpu", "drop", "NoAction"], - "base_default_next" : "node_3", + "base_default_next" : "node_6", "next_tables" : { - "set_egress_port" : "node_3", - "send_to_cpu" : "node_3", - "drop" : "node_3", - "NoAction" : "node_3" - }, - "default_entry" : { - "action_id" : 3, - "action_const" : false, - "action_data" : [], - "action_entry_const" : false + "set_egress_port" : "node_6", + "send_to_cpu" : "node_6", + "drop" : "node_6", + "NoAction" : "node_6" } }, { - "name" : "tbl_act", - "id" : 1, + "name" : "tbl_act_0", + "id" : 2, "key" : [], "match_type" : "exact", "type" : "simple", @@ -2594,25 +2777,116 @@ "with_counters" : false, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [4], - "actions" : ["act"], + "action_ids" : [5], + "actions" : ["act_0"], "base_default_next" : null, "next_tables" : { - "act" : null + "act_0" : null }, "default_entry" : { - "action_id" : 4, + "action_id" : 5, "action_const" : true, "action_data" : [], "action_entry_const" : true } } ], - "action_profiles" : [], + "action_profiles" : [ + { + "name" : "ecmp_selector", + "id" : 0, + "max_size" : 64, + "selector" : { + "algo" : "crc16", + "input" : [ + { + "type" : "field", + "value" : ["ipv4", "srcAddr"] + }, + { + "type" : "field", + "value" : ["ipv4", "dstAddr"] + }, + { + "type" : "field", + "value" : ["ipv4", "protocol"] + }, + { + "type" : "field", + "value" : ["tcp", "srcPort"] + }, + { + "type" : "field", + "value" : ["tcp", "dstPort"] + }, + { + "type" : "field", + "value" : ["udp", "srcPort"] + }, + { + "type" : "field", + "value" : ["udp", "dstPort"] + } + ] + } + } + ], "conditionals" : [ { - "name" : "node_3", + "name" : "node_2", "id" : 0, + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 6, + "column" : 12, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["packet_out", "$valid$"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "tbl_act", + "false_next" : "node_4" + }, + { + "name" : "node_4", + "id" : 1, + "source_info" : { + "filename" : "default.p4", + "line" : 47, + "column" : 13, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["packet_out", "$valid$"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "table0", + "false_next" : "node_6" + }, + { + "name" : "node_6", + "id" : 2, "source_info" : { "filename" : "include/port_counters.p4", "line" : 10, @@ -2634,7 +2908,7 @@ } }, "false_next" : null, - "true_next" : "tbl_act" + "true_next" : "tbl_act_0" } ] }, @@ -2643,14 +2917,88 @@ "id" : 1, "source_info" : { "filename" : "default.p4", - "line" : 36, + "line" : 55, "column" : 8, "source_fragment" : "egress" }, - "init_table" : null, - "tables" : [], + "init_table" : "tbl_act_1", + "tables" : [ + { + "name" : "tbl_act_1", + "id" : 3, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [7], + "actions" : ["act_2"], + "base_default_next" : "node_11", + "next_tables" : { + "act_2" : "node_11" + }, + "default_entry" : { + "action_id" : 7, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_act_2", + "id" : 4, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [6], + "actions" : ["act_1"], + "base_default_next" : null, + "next_tables" : { + "act_1" : null + }, + "default_entry" : { + "action_id" : 6, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], "action_profiles" : [], - "conditionals" : [] + "conditionals" : [ + { + "name" : "node_11", + "id" : 3, + "source_info" : { + "filename" : "include/packet_io.p4", + "line" : 15, + "column" : 12, + "source_fragment" : "standard_metadata.egress_spec == 9w255" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00ff" + } + } + }, + "false_next" : null, + "true_next" : "tbl_act_2" + } + ] } ], "checksums" : [], diff --git a/apps/p4runtime-test/src/test/resources/default.p4info b/tools/test/p4src/p4-16/p4c-out/default.p4info similarity index 91% rename from apps/p4runtime-test/src/test/resources/default.p4info rename to tools/test/p4src/p4-16/p4c-out/default.p4info index b224b875f9..f898190df3 100644 --- a/apps/p4runtime-test/src/test/resources/default.p4info +++ b/tools/test/p4src/p4-16/p4c-out/default.p4info @@ -41,6 +41,7 @@ tables { id: 16800567 annotations: "@defaultonly()" } + implementation_id: 285227860 direct_resource_ids: 301990488 size: 1024 with_entry_timeout: true @@ -78,6 +79,16 @@ actions { alias: "NoAction" } } +action_profiles { + preamble { + id: 285227860 + name: "ecmp_selector" + alias: "ecmp_selector" + } + table_ids: 33617813 + with_selector: true + size: 64 +} counters { preamble { id: 302025528 @@ -122,11 +133,6 @@ controller_packet_metadata { name: "ingress_port" bitwidth: 9 } - metadata { - id: 2 - name: "other1" - bitwidth: 32 - } } controller_packet_metadata { preamble { @@ -139,9 +145,4 @@ controller_packet_metadata { name: "egress_port" bitwidth: 9 } - metadata { - id: 2 - name: "other2" - bitwidth: 32 - } }