use of org.onosproject.net.flow.criteria.EthCriterion in project onos by opennetworkinglab.
the class FlowModBuilder method buildMatch.
/**
* Builds the match for the flow mod.
*
* @return the match
*/
// CHECKSTYLE IGNORE MethodLength FOR NEXT 300 LINES
protected Match buildMatch() {
Match.Builder mBuilder = factory.buildMatch();
Ip6Address ip6Address;
Ip4Prefix ip4Prefix;
Ip6Prefix ip6Prefix;
EthCriterion ethCriterion;
IPCriterion ipCriterion;
TcpPortCriterion tcpPortCriterion;
UdpPortCriterion udpPortCriterion;
SctpPortCriterion sctpPortCriterion;
IPv6NDLinkLayerAddressCriterion llAddressCriterion;
ArpHaCriterion arpHaCriterion;
ArpPaCriterion arpPaCriterion;
for (Criterion c : selector.criteria()) {
switch(c.type()) {
case IN_PORT:
PortCriterion inPort = (PortCriterion) c;
mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inPort.port().toLong()));
break;
case IN_PHY_PORT:
PortCriterion inPhyPort = (PortCriterion) c;
mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inPhyPort.port().toLong()));
break;
case METADATA:
MetadataCriterion metadata = (MetadataCriterion) c;
mBuilder.setExact(MatchField.METADATA, OFMetadata.ofRaw(metadata.metadata()));
break;
case ETH_DST:
ethCriterion = (EthCriterion) c;
mBuilder.setExact(MatchField.ETH_DST, MacAddress.of(ethCriterion.mac().toLong()));
break;
case ETH_DST_MASKED:
ethCriterion = (EthCriterion) c;
mBuilder.setMasked(MatchField.ETH_DST, MacAddress.of(ethCriterion.mac().toLong()), MacAddress.of(ethCriterion.mask().toLong()));
break;
case ETH_SRC:
ethCriterion = (EthCriterion) c;
mBuilder.setExact(MatchField.ETH_SRC, MacAddress.of(ethCriterion.mac().toLong()));
break;
case ETH_SRC_MASKED:
ethCriterion = (EthCriterion) c;
mBuilder.setMasked(MatchField.ETH_SRC, MacAddress.of(ethCriterion.mac().toLong()), MacAddress.of(ethCriterion.mask().toLong()));
break;
case ETH_TYPE:
EthTypeCriterion ethType = (EthTypeCriterion) c;
mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType().toShort()));
break;
case VLAN_VID:
VlanIdCriterion vid = (VlanIdCriterion) c;
if (vid.vlanId().equals(VlanId.ANY)) {
mBuilder.setMasked(MatchField.VLAN_VID, OFVlanVidMatch.PRESENT, OFVlanVidMatch.PRESENT);
} else if (vid.vlanId().equals(VlanId.NONE)) {
mBuilder.setExact(MatchField.VLAN_VID, OFVlanVidMatch.NONE);
} else {
mBuilder.setExact(MatchField.VLAN_VID, OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vid.vlanId().toShort())));
}
break;
case VLAN_PCP:
VlanPcpCriterion vpcp = (VlanPcpCriterion) c;
mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority()));
break;
case IP_DSCP:
IPDscpCriterion ipDscpCriterion = (IPDscpCriterion) c;
mBuilder.setExact(MatchField.IP_DSCP, IpDscp.of(ipDscpCriterion.ipDscp()));
break;
case IP_ECN:
IPEcnCriterion ipEcnCriterion = (IPEcnCriterion) c;
mBuilder.setExact(MatchField.IP_ECN, IpEcn.of(ipEcnCriterion.ipEcn()));
break;
case IP_PROTO:
IPProtocolCriterion p = (IPProtocolCriterion) c;
mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol()));
break;
case IPV4_SRC:
ipCriterion = (IPCriterion) c;
ip4Prefix = ipCriterion.ip().getIp4Prefix();
if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) {
Ip4Address maskAddr = Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength());
Masked<IPv4Address> maskedIp = Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), IPv4Address.of(maskAddr.toInt()));
mBuilder.setMasked(MatchField.IPV4_SRC, maskedIp);
} else {
mBuilder.setExact(MatchField.IPV4_SRC, IPv4Address.of(ip4Prefix.address().toInt()));
}
break;
case IPV4_DST:
ipCriterion = (IPCriterion) c;
ip4Prefix = ipCriterion.ip().getIp4Prefix();
if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) {
Ip4Address maskAddr = Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength());
Masked<IPv4Address> maskedIp = Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), IPv4Address.of(maskAddr.toInt()));
mBuilder.setMasked(MatchField.IPV4_DST, maskedIp);
} else {
mBuilder.setExact(MatchField.IPV4_DST, IPv4Address.of(ip4Prefix.address().toInt()));
}
break;
case TCP_SRC:
tcpPortCriterion = (TcpPortCriterion) c;
mBuilder.setExact(MatchField.TCP_SRC, TransportPort.of(tcpPortCriterion.tcpPort().toInt()));
break;
case TCP_SRC_MASKED:
tcpPortCriterion = (TcpPortCriterion) c;
mBuilder.setMasked(MatchField.TCP_SRC, TransportPort.of(tcpPortCriterion.tcpPort().toInt()), TransportPort.of(tcpPortCriterion.mask().toInt()));
break;
case TCP_DST:
tcpPortCriterion = (TcpPortCriterion) c;
mBuilder.setExact(MatchField.TCP_DST, TransportPort.of(tcpPortCriterion.tcpPort().toInt()));
break;
case TCP_DST_MASKED:
tcpPortCriterion = (TcpPortCriterion) c;
mBuilder.setMasked(MatchField.TCP_DST, TransportPort.of(tcpPortCriterion.tcpPort().toInt()), TransportPort.of(tcpPortCriterion.mask().toInt()));
break;
case UDP_SRC:
udpPortCriterion = (UdpPortCriterion) c;
mBuilder.setExact(MatchField.UDP_SRC, TransportPort.of(udpPortCriterion.udpPort().toInt()));
break;
case UDP_SRC_MASKED:
udpPortCriterion = (UdpPortCriterion) c;
mBuilder.setMasked(MatchField.UDP_SRC, TransportPort.of(udpPortCriterion.udpPort().toInt()), TransportPort.of(udpPortCriterion.mask().toInt()));
break;
case UDP_DST:
udpPortCriterion = (UdpPortCriterion) c;
mBuilder.setExact(MatchField.UDP_DST, TransportPort.of(udpPortCriterion.udpPort().toInt()));
break;
case UDP_DST_MASKED:
udpPortCriterion = (UdpPortCriterion) c;
mBuilder.setMasked(MatchField.UDP_DST, TransportPort.of(udpPortCriterion.udpPort().toInt()), TransportPort.of(udpPortCriterion.mask().toInt()));
break;
case SCTP_SRC:
sctpPortCriterion = (SctpPortCriterion) c;
mBuilder.setExact(MatchField.SCTP_SRC, TransportPort.of(sctpPortCriterion.sctpPort().toInt()));
break;
case SCTP_SRC_MASKED:
sctpPortCriterion = (SctpPortCriterion) c;
mBuilder.setMasked(MatchField.SCTP_SRC, TransportPort.of(sctpPortCriterion.sctpPort().toInt()), TransportPort.of(sctpPortCriterion.mask().toInt()));
break;
case SCTP_DST:
sctpPortCriterion = (SctpPortCriterion) c;
mBuilder.setExact(MatchField.SCTP_DST, TransportPort.of(sctpPortCriterion.sctpPort().toInt()));
break;
case SCTP_DST_MASKED:
sctpPortCriterion = (SctpPortCriterion) c;
mBuilder.setMasked(MatchField.SCTP_DST, TransportPort.of(sctpPortCriterion.sctpPort().toInt()), TransportPort.of(sctpPortCriterion.mask().toInt()));
break;
case ICMPV4_TYPE:
IcmpTypeCriterion icmpType = (IcmpTypeCriterion) c;
mBuilder.setExact(MatchField.ICMPV4_TYPE, ICMPv4Type.of(icmpType.icmpType()));
break;
case ICMPV4_CODE:
IcmpCodeCriterion icmpCode = (IcmpCodeCriterion) c;
mBuilder.setExact(MatchField.ICMPV4_CODE, ICMPv4Code.of(icmpCode.icmpCode()));
break;
case IPV6_SRC:
ipCriterion = (IPCriterion) c;
ip6Prefix = ipCriterion.ip().getIp6Prefix();
if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) {
Ip6Address maskAddr = Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength());
Masked<IPv6Address> maskedIp = Masked.of(IPv6Address.of(ip6Prefix.address().toString()), IPv6Address.of(maskAddr.toString()));
mBuilder.setMasked(MatchField.IPV6_SRC, maskedIp);
} else {
mBuilder.setExact(MatchField.IPV6_SRC, IPv6Address.of(ip6Prefix.address().toString()));
}
break;
case IPV6_DST:
ipCriterion = (IPCriterion) c;
ip6Prefix = ipCriterion.ip().getIp6Prefix();
if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) {
Ip6Address maskAddr = Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength());
Masked<IPv6Address> maskedIp = Masked.of(IPv6Address.of(ip6Prefix.address().toString()), IPv6Address.of(maskAddr.toString()));
mBuilder.setMasked(MatchField.IPV6_DST, maskedIp);
} else {
mBuilder.setExact(MatchField.IPV6_DST, IPv6Address.of(ip6Prefix.address().toString()));
}
break;
case IPV6_FLABEL:
IPv6FlowLabelCriterion flowLabelCriterion = (IPv6FlowLabelCriterion) c;
mBuilder.setExact(MatchField.IPV6_FLABEL, IPv6FlowLabel.of(flowLabelCriterion.flowLabel()));
break;
case ICMPV6_TYPE:
Icmpv6TypeCriterion icmpv6Type = (Icmpv6TypeCriterion) c;
mBuilder.setExact(MatchField.ICMPV6_TYPE, U8.of(icmpv6Type.icmpv6Type()));
break;
case ICMPV6_CODE:
Icmpv6CodeCriterion icmpv6Code = (Icmpv6CodeCriterion) c;
mBuilder.setExact(MatchField.ICMPV6_CODE, U8.of(icmpv6Code.icmpv6Code()));
break;
case IPV6_ND_TARGET:
IPv6NDTargetAddressCriterion targetAddressCriterion = (IPv6NDTargetAddressCriterion) c;
ip6Address = targetAddressCriterion.targetAddress();
mBuilder.setExact(MatchField.IPV6_ND_TARGET, IPv6Address.of(ip6Address.toOctets()));
break;
case IPV6_ND_SLL:
llAddressCriterion = (IPv6NDLinkLayerAddressCriterion) c;
mBuilder.setExact(MatchField.IPV6_ND_SLL, MacAddress.of(llAddressCriterion.mac().toLong()));
break;
case IPV6_ND_TLL:
llAddressCriterion = (IPv6NDLinkLayerAddressCriterion) c;
mBuilder.setExact(MatchField.IPV6_ND_TLL, MacAddress.of(llAddressCriterion.mac().toLong()));
break;
case MPLS_LABEL:
MplsCriterion mp = (MplsCriterion) c;
mBuilder.setExact(MatchField.MPLS_LABEL, U32.of(mp.label().toInt()));
break;
case IPV6_EXTHDR:
IPv6ExthdrFlagsCriterion exthdrFlagsCriterion = (IPv6ExthdrFlagsCriterion) c;
mBuilder.setExact(MatchField.IPV6_EXTHDR, U16.of(exthdrFlagsCriterion.exthdrFlags()));
break;
case OCH_SIGID:
try {
OchSignalCriterion ochSignalCriterion = (OchSignalCriterion) c;
OchSignal signal = ochSignalCriterion.lambda();
byte gridType = OpenFlowValueMapper.lookupGridType(signal.gridType());
byte channelSpacing = OpenFlowValueMapper.lookupChannelSpacing(signal.channelSpacing());
mBuilder.setExact(MatchField.EXP_OCH_SIG_ID, new CircuitSignalID(gridType, channelSpacing, (short) signal.spacingMultiplier(), (short) signal.slotGranularity()));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
}
break;
case OCH_SIGTYPE:
try {
OchSignalTypeCriterion sc = (OchSignalTypeCriterion) c;
byte signalType = OpenFlowValueMapper.lookupOchSignalType(sc.signalType());
mBuilder.setExact(MatchField.EXP_OCH_SIGTYPE, U8.of(signalType));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
}
break;
case ODU_SIGID:
OduSignalIdCriterion oduSignalIdCriterion = (OduSignalIdCriterion) c;
OduSignalId oduSignalId = oduSignalIdCriterion.oduSignalId();
mBuilder.setExact(MatchField.EXP_ODU_SIG_ID, new OduSignalID((short) oduSignalId.tributaryPortNumber(), (short) oduSignalId.tributarySlotLength(), oduSignalId.tributarySlotBitmap()));
break;
case ODU_SIGTYPE:
try {
OduSignalTypeCriterion oduSignalTypeCriterion = (OduSignalTypeCriterion) c;
byte oduSigType = OpenFlowValueMapper.lookupOduSignalType(oduSignalTypeCriterion.signalType());
mBuilder.setExact(MatchField.EXP_ODU_SIGTYPE, U8.of(oduSigType));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
}
break;
case TUNNEL_ID:
TunnelIdCriterion tunnelId = (TunnelIdCriterion) c;
mBuilder.setExact(MatchField.TUNNEL_ID, U64.of(tunnelId.tunnelId()));
break;
case MPLS_BOS:
MplsBosCriterion mplsBos = (MplsBosCriterion) c;
mBuilder.setExact(MatchField.MPLS_BOS, mplsBos.mplsBos() ? OFBooleanValue.TRUE : OFBooleanValue.FALSE);
break;
case ARP_OP:
ArpOpCriterion arpOp = (ArpOpCriterion) c;
mBuilder.setExact(MatchField.ARP_OP, ArpOpcode.of(arpOp.arpOp()));
break;
case ARP_SHA:
arpHaCriterion = (ArpHaCriterion) c;
mBuilder.setExact(MatchField.ARP_SHA, MacAddress.of(arpHaCriterion.mac().toLong()));
break;
case ARP_SPA:
arpPaCriterion = (ArpPaCriterion) c;
mBuilder.setExact(MatchField.ARP_SPA, IPv4Address.of(arpPaCriterion.ip().toInt()));
break;
case ARP_THA:
arpHaCriterion = (ArpHaCriterion) c;
mBuilder.setExact(MatchField.ARP_THA, MacAddress.of(arpHaCriterion.mac().toLong()));
break;
case ARP_TPA:
arpPaCriterion = (ArpPaCriterion) c;
mBuilder.setExact(MatchField.ARP_TPA, IPv4Address.of(arpPaCriterion.ip().toInt()));
break;
case EXTENSION:
ExtensionCriterion extensionCriterion = (ExtensionCriterion) c;
OFOxm oxm = buildExtensionOxm(extensionCriterion.extensionSelector());
if (oxm == null) {
log.warn("Unable to build extension selector");
break;
}
if (oxm.isMasked()) {
mBuilder.setMasked(oxm.getMatchField(), oxm.getValue(), oxm.getMask());
} else {
mBuilder.setExact(oxm.getMatchField(), oxm.getValue());
}
break;
case MPLS_TC:
case PBB_ISID:
// TODO: need to implement PBB-ISID case when OpenFlowJ is ready
default:
log.warn("Match type {} not yet implemented.", c.type());
}
}
return mBuilder.build();
}
use of org.onosproject.net.flow.criteria.EthCriterion in project fabric-tna by stratum.
the class FilteringObjectiveTranslator method doTranslate.
@Override
public ObjectiveTranslation doTranslate(FilteringObjective obj) throws FabricPipelinerException {
final ObjectiveTranslation.Builder resultBuilder = ObjectiveTranslation.builder();
if (obj.key() == null || obj.key().type() != Criterion.Type.IN_PORT) {
throw new FabricPipelinerException(format("Unsupported or missing filtering key: key=%s", obj.key()), ObjectiveError.BADPARAMS);
}
if (!isValidSrMetadata(obj)) {
throw new FabricPipelinerException(format("Unsupported metadata configuration: metadata=%s", obj.meta()), ObjectiveError.BADPARAMS);
}
final PortCriterion inPort = (PortCriterion) obj.key();
final VlanIdCriterion outerVlan = (VlanIdCriterion) criterion(obj.conditions(), Criterion.Type.VLAN_VID);
final VlanIdCriterion innerVlan = (VlanIdCriterion) criterion(obj.conditions(), Criterion.Type.INNER_VLAN_VID);
final EthCriterion ethDst = (EthCriterion) criterion(obj.conditions(), Criterion.Type.ETH_DST);
final EthCriterion ethDstMasked = (EthCriterion) criterion(obj.conditions(), Criterion.Type.ETH_DST_MASKED);
ingressPortVlanRule(obj, inPort, outerVlan, innerVlan, resultBuilder);
if (shouldModifyFwdClassifierTable(obj)) {
fwdClassifierRules(obj, inPort, ethDst, ethDstMasked, resultBuilder);
} else {
log.debug("Skipping fwd classifier rules for device {}.", deviceId);
}
return resultBuilder.build();
}
use of org.onosproject.net.flow.criteria.EthCriterion in project fabric-tna by stratum.
the class ForwardingObjectiveTranslator method bridgingRule.
private void bridgingRule(ForwardingObjective obj, Set<Criterion> criteriaWithMeta, ObjectiveTranslation.Builder resultBuilder, boolean broadcast) throws FabricPipelinerException {
final VlanIdCriterion vlanIdCriterion = (VlanIdCriterion) criterionNotNull(criteriaWithMeta, Criterion.Type.VLAN_VID);
final TrafficSelector.Builder selector = DefaultTrafficSelector.builder().add(vlanIdCriterion);
if (!broadcast) {
final EthCriterion ethDstCriterion = (EthCriterion) criterionNotNull(obj.selector(), Criterion.Type.ETH_DST);
selector.matchEthDstMasked(ethDstCriterion.mac(), MacAddress.EXACT_MASK);
}
resultBuilder.addFlowRule(flowRule(obj, P4InfoConstants.FABRIC_INGRESS_FORWARDING_BRIDGING, selector.build()));
}
use of org.onosproject.net.flow.criteria.EthCriterion in project onos by opennetworkinglab.
the class ForwardingObjectiveTranslator method bridgingRule.
private void bridgingRule(ForwardingObjective obj, Set<Criterion> criteriaWithMeta, ObjectiveTranslation.Builder resultBuilder, boolean broadcast) throws FabricPipelinerException {
final VlanIdCriterion vlanIdCriterion = (VlanIdCriterion) criterionNotNull(criteriaWithMeta, Criterion.Type.VLAN_VID);
final TrafficSelector.Builder selector = DefaultTrafficSelector.builder().add(vlanIdCriterion);
if (!broadcast) {
final EthCriterion ethDstCriterion = (EthCriterion) criterionNotNull(obj.selector(), Criterion.Type.ETH_DST);
selector.matchEthDstMasked(ethDstCriterion.mac(), MacAddress.EXACT_MASK);
}
resultBuilder.addFlowRule(flowRule(obj, FabricConstants.FABRIC_INGRESS_FORWARDING_BRIDGING, selector.build()));
}
use of org.onosproject.net.flow.criteria.EthCriterion in project onos by opennetworkinglab.
the class LinkCollectionIntentFlowObjectiveCompiler method createRules.
@Override
protected List<Objective> createRules(LinkCollectionIntent intent, DeviceId deviceId, Set<PortNumber> inPorts, Set<PortNumber> outPorts, Map<ConnectPoint, Identifier<?>> labels) {
List<Objective> objectives = new ArrayList<>(inPorts.size() * 2);
/*
* Looking for the encapsulation constraint
*/
Optional<EncapsulationConstraint> encapConstraint = this.getIntentEncapConstraint(intent);
inPorts.forEach(inPort -> {
ForwardingInstructions instructions = this.createForwardingInstruction(encapConstraint, intent, inPort, outPorts, deviceId, labels);
Set<TrafficTreatment> treatmentsWithDifferentPort = Sets.newHashSet();
TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
for (Instruction inst : instructions.treatment().allInstructions()) {
if (inst.type() == OUTPUT) {
treatmentBuilder.add(inst);
treatmentsWithDifferentPort.add(treatmentBuilder.build());
treatmentBuilder = DefaultTrafficTreatment.builder();
} else {
treatmentBuilder.add(inst);
}
}
EthCriterion ethDst = (EthCriterion) intent.selector().getCriterion(Criterion.Type.ETH_DST);
boolean broadcastObjective = ethDst != null && (ethDst.mac().isBroadcast() || ethDst.mac().isMulticast());
FilteringObjective filteringObjective = buildFilteringObjective(intent, instructions.selector(), deviceId, inPort);
if (filteringObjective != null) {
objectives.add(filteringObjective);
}
if (treatmentsWithDifferentPort.size() < 2 && !broadcastObjective) {
objectives.addAll(createSimpleNextObjective(instructions, intent));
} else {
objectives.addAll(createBroadcastObjective(instructions, treatmentsWithDifferentPort, intent));
}
});
return objectives;
}
Aggregations