use of org.onosproject.net.pi.model.PiActionId in project onos by opennetworkinglab.
the class InstructionCodecTest method piInstructionEncodingTest.
/**
* Tests the encoding of protocol-independent instructions.
*/
@Test
public void piInstructionEncodingTest() {
PiActionId actionId = PiActionId.of("set_egress_port");
PiActionParamId actionParamId = PiActionParamId.of("port");
PiActionParam actionParam = new PiActionParam(actionParamId, ImmutableByteSequence.copyFrom(10));
PiTableAction action = PiAction.builder().withId(actionId).withParameter(actionParam).build();
final PiInstruction actionInstruction = Instructions.piTableAction(action);
final ObjectNode actionInstructionJson = instructionCodec.encode(actionInstruction, context);
assertThat(actionInstructionJson, matchesInstruction(actionInstruction));
PiTableAction actionGroupId = PiActionProfileGroupId.of(10);
final PiInstruction actionGroupIdInstruction = Instructions.piTableAction(actionGroupId);
final ObjectNode actionGroupIdInstructionJson = instructionCodec.encode(actionGroupIdInstruction, context);
assertThat(actionGroupIdInstructionJson, matchesInstruction(actionGroupIdInstruction));
PiTableAction actionProfileMemberId = PiActionProfileMemberId.of(10);
final PiInstruction actionProfileMemberIdInstruction = Instructions.piTableAction(actionProfileMemberId);
final ObjectNode actionProfileMemberIdInstructionJson = instructionCodec.encode(actionProfileMemberIdInstruction, context);
assertThat(actionProfileMemberIdInstructionJson, matchesInstruction(actionProfileMemberIdInstruction));
}
use of org.onosproject.net.pi.model.PiActionId in project onos by opennetworkinglab.
the class MyTunnelApp method insertTunnelIngressRule.
/**
* Generates and insert a flow rule to perform the tunnel INGRESS function
* for the given switch, destination IP address and tunnel ID.
*
* @param switchId switch ID
* @param dstIpAddr IP address to forward inside the tunnel
* @param tunId tunnel ID
*/
private void insertTunnelIngressRule(DeviceId switchId, IpAddress dstIpAddr, int tunId) {
PiTableId tunnelIngressTableId = PiTableId.of("c_ingress.t_tunnel_ingress");
// Longest prefix match on IPv4 dest address.
PiMatchFieldId ipDestMatchFieldId = PiMatchFieldId.of("hdr.ipv4.dst_addr");
PiCriterion match = PiCriterion.builder().matchLpm(ipDestMatchFieldId, dstIpAddr.toOctets(), 32).build();
PiActionParam tunIdParam = new PiActionParam(PiActionParamId.of("tun_id"), tunId);
PiActionId ingressActionId = PiActionId.of("c_ingress.my_tunnel_ingress");
PiAction action = PiAction.builder().withId(ingressActionId).withParameter(tunIdParam).build();
log.info("Inserting INGRESS rule on switch {}: table={}, match={}, action={}", switchId, tunnelIngressTableId, match, action);
insertPiFlowRule(switchId, tunnelIngressTableId, match, action);
}
use of org.onosproject.net.pi.model.PiActionId in project onos by opennetworkinglab.
the class MyTunnelApp method insertTunnelForwardRule.
/**
* Generates and insert a flow rule to perform the tunnel FORWARD/EGRESS
* function for the given switch, output port address and tunnel ID.
*
* @param switchId switch ID
* @param outPort output port where to forward tunneled packets
* @param tunId tunnel ID
* @param isEgress if true, perform tunnel egress action, otherwise forward
* packet as is to port
*/
private void insertTunnelForwardRule(DeviceId switchId, PortNumber outPort, int tunId, boolean isEgress) {
PiTableId tunnelForwardTableId = PiTableId.of("c_ingress.t_tunnel_fwd");
// Exact match on tun_id
PiMatchFieldId tunIdMatchFieldId = PiMatchFieldId.of("hdr.my_tunnel.tun_id");
PiCriterion match = PiCriterion.builder().matchExact(tunIdMatchFieldId, tunId).build();
// Action depend on isEgress parameter.
// if true, perform tunnel egress action on the given outPort, otherwise
// simply forward packet as is (set_out_port action).
PiActionParamId portParamId = PiActionParamId.of("port");
PiActionParam portParam = new PiActionParam(portParamId, (short) outPort.toLong());
final PiAction action;
if (isEgress) {
// Tunnel egress action.
// Remove MyTunnel header and forward to outPort.
PiActionId egressActionId = PiActionId.of("c_ingress.my_tunnel_egress");
action = PiAction.builder().withId(egressActionId).withParameter(portParam).build();
} else {
// Tunnel transit action.
// Forward the packet as is to outPort.
/*
* TODO EXERCISE: create action object for the transit case.
* Look at the t_tunnel_fwd table in the P4 program. Which of the 3
* actions can be used to simply set the output port? Get the full
* action name from the P4Info file, and use that when creating the
* PiActionId object. When creating the PiAction object, remember to
* add all action parameters as defined in the P4 program.
*
* Hint: the code will be similar to the case when isEgress is true.
*/
// Replace null with your solution.
action = null;
}
log.info("Inserting {} rule on switch {}: table={}, match={}, action={}", isEgress ? "EGRESS" : "TRANSIT", switchId, tunnelForwardTableId, match, action);
insertPiFlowRule(switchId, tunnelForwardTableId, match, action);
}
use of org.onosproject.net.pi.model.PiActionId in project fabric-tna by stratum.
the class FabricIntProgrammable method setUpIntWatchlistRules.
private void setUpIntWatchlistRules(List<IpPrefix> watchSubnets) {
FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
final PiActionId reportActionId = P4InfoConstants.FABRIC_INGRESS_INT_WATCHLIST_MARK_TO_REPORT;
Streams.stream(flowRuleService.getFlowEntriesById(appId)).filter(entry -> entry.deviceId().equals(deviceId)).filter(entry -> entryWithActionId(entry, reportActionId)).forEach(ops::remove);
ops.newStage();
for (IpPrefix subnet : watchSubnets) {
if (subnet.prefixLength() == 0) {
ops.add(buildWatchlistEntry(buildCollectorSelector(Collections.emptySet())));
continue;
}
ops.add(buildWatchlistEntry(buildCollectorSelector(ImmutableSet.of(Criteria.matchIPSrc(subnet)))));
ops.add(buildWatchlistEntry(buildCollectorSelector(ImmutableSet.of(Criteria.matchIPDst(subnet)))));
}
flowRuleService.apply(ops.build());
}
use of org.onosproject.net.pi.model.PiActionId in project fabric-tna by stratum.
the class FabricUpfTranslator method interfaceToFabricEntry.
/**
* Translate a UpfInterface to a FlowRule to be inserted into the fabric.p4 pipeline.
*
* @param upfInterface The interface to be translated
* @param deviceId the ID of the device the FlowRule should be installed on
* @param appId the ID of the application that will insert the FlowRule
* @param priority the FlowRule's priority
* @return the UPF interface translated to a FlowRule
* @throws UpfProgrammableException if the interface cannot be translated
*/
public FlowRule interfaceToFabricEntry(UpfInterface upfInterface, DeviceId deviceId, ApplicationId appId, int priority) throws UpfProgrammableException {
int gtpuValidity;
PiActionId actionId;
if (upfInterface.isDbufReceiver()) {
actionId = FABRIC_INGRESS_UPF_IFACE_DBUF;
gtpuValidity = 1;
} else if (upfInterface.isAccess()) {
actionId = FABRIC_INGRESS_UPF_IFACE_ACCESS;
gtpuValidity = 1;
} else if (upfInterface.isCore()) {
actionId = FABRIC_INGRESS_UPF_IFACE_CORE;
gtpuValidity = 0;
} else {
throw new UpfProgrammableException("Unknown interface type");
}
PiCriterion match = PiCriterion.builder().matchLpm(HDR_IPV4_DST_ADDR, upfInterface.prefix().address().toInt(), upfInterface.prefix().prefixLength()).matchExact(HDR_GTPU_IS_VALID, gtpuValidity).build();
PiAction action = PiAction.builder().withId(actionId).withParameter(new PiActionParam(SLICE_ID, SliceId.of(upfInterface.sliceId()).id())).build();
return DefaultFlowRule.builder().forDevice(deviceId).fromApp(appId).makePermanent().forTable(FABRIC_INGRESS_UPF_INTERFACES).withSelector(DefaultTrafficSelector.builder().matchPi(match).build()).withTreatment(DefaultTrafficTreatment.builder().piTableAction(action).build()).withPriority(priority).build();
}
Aggregations