blob: 9c72e37fb39e3c030b16986f45ae3c22cee6536b [file] [log] [blame]
package org.projectfloodlight.protocol.match;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.util.Iterator;
import org.junit.Test;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFVersion;
import org.projectfloodlight.openflow.protocol.match.Match;
import org.projectfloodlight.openflow.protocol.match.MatchField;
import org.projectfloodlight.openflow.protocol.match.MatchFields;
import org.projectfloodlight.openflow.types.ArpOpcode;
import org.projectfloodlight.openflow.types.EthType;
import org.projectfloodlight.openflow.types.IPv4Address;
import org.projectfloodlight.openflow.types.IpProtocol;
import org.projectfloodlight.openflow.types.MacAddress;
import org.projectfloodlight.openflow.types.Masked;
import org.projectfloodlight.openflow.types.OFPort;
import org.projectfloodlight.openflow.types.TransportPort;
import com.google.common.collect.Iterables;
public class MatchFieldIterationBase {
private OFFactory factory;
protected MatchFieldIterationBase(OFFactory factory) {
this.factory = factory;
}
@Test
public void iterateEmptyMatch() {
Match match = factory.buildMatch().build();
Iterator<MatchField<?>> iter = match.getMatchFields().iterator();
assertThat(iter.hasNext(), is(false));
}
@Test
public void iterateSingleExactMatchField() {
OFPort port5 = OFPort.of(5);
Match match = factory.buildMatch()
.setExact(MatchField.IN_PORT, port5)
.build();
Iterator<MatchField<?>> iter = match.getMatchFields().iterator();
assertThat(iter.hasNext(), is(true));
MatchField<?> matchField = iter.next();
assertThat(matchField.id, is(MatchFields.IN_PORT));
assertThat(match.isExact(matchField), is(true));
@SuppressWarnings("unchecked")
MatchField<OFPort> portMatchField = (MatchField<OFPort>) matchField;
OFPort port = match.get(portMatchField);
assertThat(port, is(port5));
assertThat(iter.hasNext(), is(false));
}
@SuppressWarnings("unchecked")
@Test
public void iterateExactMatchFields() {
OFPort port5 = OFPort.of(5);
MacAddress macSrc = MacAddress.of("00:01:02:03:04:05");
MacAddress macDst = MacAddress.of("01:01:02:02:03:03");
IPv4Address ipSrc = IPv4Address.of("10.192.20.1");
IPv4Address ipDst = IPv4Address.of("10.192.20.2");
TransportPort tcpSrc = TransportPort.of(100);
TransportPort tcpDst = TransportPort.of(200);
Match match = factory.buildMatch()
.setExact(MatchField.IN_PORT, port5)
.setExact(MatchField.ETH_TYPE, EthType.IPv4)
.setExact(MatchField.ETH_SRC, macSrc)
.setExact(MatchField.ETH_DST, macDst)
.setExact(MatchField.IP_PROTO, IpProtocol.TCP)
.setExact(MatchField.IPV4_SRC, ipSrc)
.setExact(MatchField.IPV4_DST, ipDst)
.setExact(MatchField.TCP_SRC, tcpSrc)
.setExact(MatchField.TCP_DST, tcpDst)
.build();
assertThat(Iterables.size(match.getMatchFields()), is(9));
for (MatchField<?> matchField: match.getMatchFields()) {
switch (matchField.id) {
case IN_PORT:
OFPort port = match.get((MatchField<OFPort>) matchField);
assertThat(port, is(port5));
break;
case ETH_TYPE:
EthType ethType = match.get((MatchField<EthType>) matchField);
assertThat(ethType, is(EthType.IPv4));
break;
case ETH_SRC:
MacAddress mac = match.get((MatchField<MacAddress>) matchField);
assertThat(mac, is(macSrc));
break;
case ETH_DST:
mac = match.get((MatchField<MacAddress>) matchField);
assertThat(mac, is(macDst));
break;
case IP_PROTO:
IpProtocol ipProtocol = match.get((MatchField<IpProtocol>) matchField);
assertThat(ipProtocol, is(IpProtocol.TCP));
break;
case IPV4_SRC:
IPv4Address ip = match.get((MatchField<IPv4Address>) matchField);
assertThat(ip, is(ipSrc));
break;
case IPV4_DST:
ip = match.get((MatchField<IPv4Address>) matchField);
assertThat(ip, is(ipDst));
break;
case TCP_SRC:
TransportPort tcp = match.get((MatchField<TransportPort>) matchField);
assertThat(tcp, is(tcpSrc));
break;
case TCP_DST:
tcp = match.get((MatchField<TransportPort>) matchField);
assertThat(tcp, is(tcpDst));
break;
default:
fail("Unexpected match field returned from iterator");
}
}
}
@SuppressWarnings("unchecked")
@Test
public void iterateArpFields() {
MacAddress macSrc = MacAddress.of("00:01:02:03:04:05");
MacAddress macDst = MacAddress.of("01:01:02:02:03:03");
IPv4Address ipSrc = IPv4Address.of("10.192.20.1");
IPv4Address ipDst = IPv4Address.of("10.192.20.2");
OFVersion version = factory.getVersion();
boolean supportsArpHardwareAddress = (version != OFVersion.OF_10) &&
(version != OFVersion.OF_11) && (version != OFVersion.OF_12);
int matchFieldCount = 4;
Match.Builder builder = factory.buildMatch();
builder.setExact(MatchField.ETH_TYPE, EthType.ARP)
.setExact(MatchField.ARP_OP, ArpOpcode.REPLY)
.setExact(MatchField.ARP_SPA, ipSrc)
.setExact(MatchField.ARP_TPA, ipDst);
if (supportsArpHardwareAddress) {
builder.setExact(MatchField.ARP_SHA, macSrc);
builder.setExact(MatchField.ARP_THA, macDst);
matchFieldCount += 2;
}
Match match = builder.build();
assertThat(Iterables.size(match.getMatchFields()), is(matchFieldCount));
for (MatchField<?> matchField: match.getMatchFields()) {
switch (matchField.id) {
case ETH_TYPE:
EthType ethType = match.get((MatchField<EthType>) matchField);
assertThat(ethType, is(EthType.ARP));
break;
case ARP_OP:
ArpOpcode opcode = match.get((MatchField<ArpOpcode>) matchField);
assertThat(opcode, is(ArpOpcode.REPLY));
break;
case ARP_SHA:
MacAddress mac = match.get((MatchField<MacAddress>) matchField);
assertThat(mac, is(macSrc));
break;
case ARP_THA:
mac = match.get((MatchField<MacAddress>) matchField);
assertThat(mac, is(macDst));
break;
case ARP_SPA:
IPv4Address ip = match.get((MatchField<IPv4Address>) matchField);
assertThat(ip, is(ipSrc));
break;
case ARP_TPA:
ip = match.get((MatchField<IPv4Address>) matchField);
assertThat(ip, is(ipDst));
break;
default:
fail("Unexpected match field returned from iterator");
}
}
}
@SuppressWarnings("unchecked")
@Test
public void iterateMaskedFields() {
MacAddress macSrc = MacAddress.of("01:02:03:04:00:00");
MacAddress macSrcMask = MacAddress.of("FF:FF:FF:FF:00:00");
MacAddress macDst = MacAddress.of("11:22:33:00:00:00");
MacAddress macDstMask = MacAddress.of("FF:FF:FF:00:00:00");
IPv4Address ipSrc = IPv4Address.of("10.192.20.0");
IPv4Address ipSrcMask = IPv4Address.of("255.255.255.0");
IPv4Address ipDst = IPv4Address.of("10.192.20.0");
IPv4Address ipDstMask = IPv4Address.of("255.255.255.128");
TransportPort tcpSrcMask = TransportPort.of(0x01F0);
OFVersion version = factory.getVersion();
boolean supportsAllMasks = (version != OFVersion.OF_10) &&
(version != OFVersion.OF_11) && (version != OFVersion.OF_12);
int matchFieldCount = 4;
Match.Builder builder = factory.buildMatch()
.setExact(MatchField.ETH_TYPE, EthType.IPv4)
.setMasked(MatchField.IPV4_SRC, ipSrc, ipSrcMask)
.setMasked(MatchField.IPV4_DST, ipDst, ipDstMask)
.setExact(MatchField.IP_PROTO, IpProtocol.TCP);
if (supportsAllMasks) {
builder.setMasked(MatchField.ETH_SRC, macSrc, macSrcMask);
builder.setMasked(MatchField.ETH_DST, macDst, macDstMask);
builder.setMasked(MatchField.TCP_SRC, tcpSrcMask, tcpSrcMask);
matchFieldCount += 3;
}
Match match = builder.build();
assertThat(Iterables.size(match.getMatchFields()), is(matchFieldCount));
for (MatchField<?> matchField: match.getMatchFields()) {
switch (matchField.id) {
case ETH_TYPE:
EthType ethType = match.get((MatchField<EthType>) matchField);
assertThat(ethType, is(EthType.IPv4));
break;
case ETH_SRC:
Masked<MacAddress> mac = match.getMasked((MatchField<MacAddress>) matchField);
assertThat(mac.getValue(), is(macSrc));
assertThat(mac.getMask(), is(macSrcMask));
break;
case ETH_DST:
mac = match.getMasked((MatchField<MacAddress>) matchField);
assertThat(mac.getValue(), is(macDst));
assertThat(mac.getMask(), is(macDstMask));
break;
case IP_PROTO:
IpProtocol ipProtocol = match.get((MatchField<IpProtocol>) matchField);
assertThat(ipProtocol, is(IpProtocol.TCP));
break;
case IPV4_SRC:
Masked<IPv4Address> ip = match.getMasked((MatchField<IPv4Address>) matchField);
assertThat(ip.getValue(), is(ipSrc));
assertThat(ip.getMask(), is(ipSrcMask));
break;
case IPV4_DST:
ip = match.getMasked((MatchField<IPv4Address>) matchField);
assertThat(ip.getValue(), is(ipDst));
assertThat(ip.getMask(), is(ipDstMask));
break;
case TCP_SRC:
Masked<TransportPort> tcp = match.getMasked((MatchField<TransportPort>) matchField);
assertThat(tcp.getValue(), is(tcpSrcMask));
assertThat(tcp.getMask(), is(tcpSrcMask));
break;
default:
fail("Unexpected match field returned from iterator");
}
}
}
}