use of org.onosproject.net.flow.criteria.IPProtocolCriterion in project onos by opennetworkinglab.
the class TsLoopPacket method copyPacketMatch.
/**
* Creates and returns a new packet instance with the copied match fields.
*
* With hard-copied match fields, references to path flows and path links.
*
* @return new loop packet instance with the copied match fields
*/
public TsLoopPacket copyPacketMatch() {
TsLoopPacket newOne = new TsLoopPacket();
newOne.pathFlow = this.pathFlow;
newOne.pathLink = this.pathLink;
Map<Criterion.Type, Criterion> m = newOne.match;
for (Map.Entry<Criterion.Type, Criterion> entry : this.match.entrySet()) {
Criterion.Type k = entry.getKey();
Criterion v = entry.getValue();
switch(k) {
case IN_PORT:
m.put(k, matchInPort(((PortCriterion) v).port()));
break;
case // At present, not support Ethernet mask (ONOS?)
ETH_SRC:
m.put(k, matchEthSrc(((EthCriterion) v).mac()));
break;
case // At present, not support Ethernet mask (ONOS?)
ETH_DST:
m.put(k, matchEthDst(((EthCriterion) v).mac()));
break;
case ETH_TYPE:
m.put(k, matchEthType(((EthTypeCriterion) v).ethType()));
break;
case // At present, not support VLAN mask (ONOS?)
VLAN_VID:
m.put(k, matchVlanId(((VlanIdCriterion) v).vlanId()));
break;
case VLAN_PCP:
m.put(k, matchVlanPcp(((VlanPcpCriterion) v).priority()));
break;
case IPV4_SRC:
m.put(k, matchIPSrc(((IPCriterion) v).ip()));
break;
case IPV4_DST:
m.put(k, matchIPDst(((IPCriterion) v).ip()));
break;
case IP_PROTO:
m.put(k, matchIPProtocol(((IPProtocolCriterion) v).protocol()));
break;
case // can't be supported by now
IP_DSCP:
m.put(k, matchIPDscp(((IPDscpCriterion) v).ipDscp()));
break;
case // can't be supported by now
IP_ECN:
m.put(k, matchIPEcn(((IPEcnCriterion) v).ipEcn()));
break;
case TCP_SRC:
m.put(k, matchTcpSrc(((TcpPortCriterion) v).tcpPort()));
break;
case TCP_DST:
m.put(k, matchTcpDst(((TcpPortCriterion) v).tcpPort()));
break;
case UDP_SRC:
m.put(k, matchUdpSrc(((UdpPortCriterion) v).udpPort()));
break;
case UDP_DST:
m.put(k, matchUdpDst(((UdpPortCriterion) v).udpPort()));
break;
default:
// can't be supported by OF1.0
log.debug("{} can't be supported by OF1.0", k);
break;
}
}
return newOne;
}
use of org.onosproject.net.flow.criteria.IPProtocolCriterion in project onos by opennetworkinglab.
the class DefaultCheckLoop method matchAndAddFlowEntry.
private boolean matchAndAddFlowEntry(FlowEntry flowEntry, TsLoopPacket pkt, TsReturn<Boolean> isBigger) {
isBigger.setValue(false);
List<Criterion> criterionArray = sortCriteria(flowEntry.selector().criteria());
for (Criterion criterion : criterionArray) {
// TODO - advance
switch(criterion.type()) {
case IN_PORT:
case ETH_SRC:
// At present, not support Ethernet mask (ONOS?)
case ETH_DST:
// At present, not support Ethernet mask (ONOS?)
case ETH_TYPE:
if (!matchAddExactly(pkt, criterion, isBigger)) {
return false;
}
break;
case VLAN_VID:
// At present, not support VLAN mask (ONOS?)
case VLAN_PCP:
if (!pkt.headerExists(ETH_TYPE) || !((EthTypeCriterion) pkt.getHeader(ETH_TYPE)).ethType().equals(VLAN.ethType())) {
return false;
}
if (!matchAddExactly(pkt, criterion, isBigger)) {
return false;
}
break;
case IPV4_SRC:
case IPV4_DST:
if (!pkt.headerExists(ETH_TYPE) || !((EthTypeCriterion) pkt.getHeader(ETH_TYPE)).ethType().equals(IPV4.ethType())) {
return false;
}
if (!matchAddIPV4(pkt, criterion, isBigger)) {
return false;
}
break;
case IP_PROTO:
if (!pkt.headerExists(ETH_TYPE) || !((EthTypeCriterion) pkt.getHeader(ETH_TYPE)).ethType().equals(IPV4.ethType())) {
return false;
}
if (!matchAddExactly(pkt, criterion, isBigger)) {
return false;
}
break;
case IP_DSCP:
// TODO: 10/28/16 support IP_DSCP match field
break;
case IP_ECN:
// TODO: 10/28/16 support IP_DSCP match field
break;
case TCP_SRC:
case TCP_DST:
if (!pkt.headerExists(IP_PROTO) || IP_PROTO_TCP_TS != ((IPProtocolCriterion) pkt.getHeader(IP_PROTO)).protocol()) {
// has TCP match requirement, but can't afford TCP
return false;
}
// avoid IP_PROTO locates after TCP_*
if (!matchAddExactly(pkt, criterion, isBigger)) {
return false;
}
break;
case UDP_SRC:
case UDP_DST:
if (!pkt.headerExists(IP_PROTO) || IP_PROTO_UDP_TS != ((IPProtocolCriterion) pkt.getHeader(IP_PROTO)).protocol()) {
// has UDP match requirement, but can't afford UDP
return false;
}
// avoid IP_PROTO locates after UDP_*
if (!matchAddExactly(pkt, criterion, isBigger)) {
return false;
}
break;
default:
log.debug("{} can't be supported by OF1.0", criterion.type());
return false;
}
}
return true;
}
use of org.onosproject.net.flow.criteria.IPProtocolCriterion in project onos by opennetworkinglab.
the class TelemetryVflowListCommand method doExecute.
@Override
protected void doExecute() {
CoreService coreService = get(CoreService.class);
FlowRuleService flowService = get(FlowRuleService.class);
ApplicationId appId = coreService.getAppId(OPENSTACK_TELEMETRY_APP_ID);
List<FlowEntry> flows = Lists.newArrayList(flowService.getFlowEntriesById(appId));
print(FORMAT, "SrcIp", "SrcPort", "DstIp", "DstPort", "Protocol");
for (FlowEntry entry : flows) {
TrafficSelector selector = entry.selector();
IpPrefix srcIp = ((IPCriterion) selector.getCriterion(IPV4_SRC)).ip();
IpPrefix dstIp = ((IPCriterion) selector.getCriterion(IPV4_DST)).ip();
TpPort srcPort = TpPort.tpPort(0);
TpPort dstPort = TpPort.tpPort(0);
String protocolStr = "ANY";
Criterion ipProtocolCriterion = selector.getCriterion(IP_PROTO);
if (ipProtocolCriterion != null) {
short protocol = ((IPProtocolCriterion) selector.getCriterion(IP_PROTO)).protocol();
if (protocol == PROTOCOL_TCP) {
srcPort = ((TcpPortCriterion) selector.getCriterion(TCP_SRC)).tcpPort();
dstPort = ((TcpPortCriterion) selector.getCriterion(TCP_DST)).tcpPort();
protocolStr = TCP;
}
if (protocol == PROTOCOL_UDP) {
srcPort = ((UdpPortCriterion) selector.getCriterion(UDP_SRC)).udpPort();
dstPort = ((UdpPortCriterion) selector.getCriterion(UDP_SRC)).udpPort();
protocolStr = UDP;
}
}
print(FORMAT, srcIp.toString(), srcPort.toString(), dstIp.toString(), dstPort.toString(), protocolStr);
}
}
use of org.onosproject.net.flow.criteria.IPProtocolCriterion in project onos by opennetworkinglab.
the class PiCriterionTranslatorsTest method testIPProtocolCriterion.
@Test
public void testIPProtocolCriterion() throws Exception {
short proto = (short) random.nextInt(256);
int bitWidth = 16;
IPProtocolCriterion criterion = (IPProtocolCriterion) Criteria.matchIPProtocol(proto);
PiExactFieldMatch exactMatch = (PiExactFieldMatch) translateCriterion(criterion, fieldId, EXACT, bitWidth);
assertThat(exactMatch.value().asReadOnlyBuffer().getShort(), is(criterion.protocol()));
}
use of org.onosproject.net.flow.criteria.IPProtocolCriterion in project onos by opennetworkinglab.
the class OvsCorsaPipeline method processIpTraffic.
@Override
protected Collection<FlowRule> processIpTraffic(ForwardingObjective fwd, FlowRule.Builder rule) {
IPCriterion ipSrc = (IPCriterion) fwd.selector().getCriterion(Criterion.Type.IPV4_SRC);
if (ipSrc != null) {
log.warn("Driver does not currently handle matching Src IP");
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
IPCriterion ipDst = (IPCriterion) fwd.selector().getCriterion(Criterion.Type.IPV4_DST);
if (ipDst != null) {
log.error("Driver handles Dst IP matching as specific forwarding " + "objective, not versatile");
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
IPProtocolCriterion ipProto = (IPProtocolCriterion) fwd.selector().getCriterion(Criterion.Type.IP_PROTO);
if (ipProto != null && ipProto.protocol() == IPv4.PROTOCOL_TCP) {
log.warn("Driver automatically punts all packets reaching the " + "LOCAL table to the controller");
pass(fwd);
return Collections.emptySet();
}
return Collections.emptySet();
}
Aggregations