use of org.onlab.packet.Ip6Prefix in project onos by opennetworkinglab.
the class FlowEntryBuilder method buildSelector.
// CHECKSTYLE IGNORE MethodLength FOR NEXT 1 LINES
private TrafficSelector buildSelector() {
MacAddress mac;
Ip4Prefix ip4Prefix;
Ip6Address ip6Address;
Ip6Prefix ip6Prefix;
Ip4Address ip;
ExtensionSelectorInterpreter selectorInterpreter;
if (driverHandler.hasBehaviour(ExtensionSelectorInterpreter.class)) {
selectorInterpreter = driverHandler.behaviour(ExtensionSelectorInterpreter.class);
} else {
selectorInterpreter = null;
}
TrafficSelector.Builder builder = DefaultTrafficSelector.builder();
for (MatchField<?> field : match.getMatchFields()) {
switch(field.id) {
case IN_PORT:
builder.matchInPort(PortNumber.portNumber(match.get(MatchField.IN_PORT).getPortNumber()));
break;
case IN_PHY_PORT:
builder.matchInPhyPort(PortNumber.portNumber(match.get(MatchField.IN_PHY_PORT).getPortNumber()));
break;
case METADATA:
long metadata = match.get(MatchField.METADATA).getValue().getValue();
builder.matchMetadata(metadata);
break;
case ETH_DST:
if (match.isPartiallyMasked(MatchField.ETH_DST)) {
Masked<org.projectfloodlight.openflow.types.MacAddress> maskedMac = match.getMasked(MatchField.ETH_DST);
builder.matchEthDstMasked(MacAddress.valueOf(maskedMac.getValue().getLong()), MacAddress.valueOf(maskedMac.getMask().getLong()));
} else {
mac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong());
builder.matchEthDst(mac);
}
break;
case ETH_SRC:
if (match.isPartiallyMasked(MatchField.ETH_SRC)) {
Masked<org.projectfloodlight.openflow.types.MacAddress> maskedMac = match.getMasked(MatchField.ETH_SRC);
builder.matchEthSrcMasked(MacAddress.valueOf(maskedMac.getValue().getLong()), MacAddress.valueOf(maskedMac.getMask().getLong()));
} else {
mac = MacAddress.valueOf(match.get(MatchField.ETH_SRC).getLong());
builder.matchEthSrc(mac);
}
break;
case ETH_TYPE:
int ethType = match.get(MatchField.ETH_TYPE).getValue();
builder.matchEthType((short) ethType);
break;
case VLAN_VID:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_VLAN_VID.type())) {
if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.VLAN_VID);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} else {
break;
}
} else {
VlanId vlanId = null;
if (match.isPartiallyMasked(MatchField.VLAN_VID)) {
Masked<OFVlanVidMatch> masked = match.getMasked(MatchField.VLAN_VID);
if (masked.getValue().equals(OFVlanVidMatch.PRESENT) && masked.getMask().equals(OFVlanVidMatch.PRESENT)) {
vlanId = VlanId.ANY;
}
} else {
if (!match.get(MatchField.VLAN_VID).isPresentBitSet()) {
vlanId = VlanId.NONE;
} else {
vlanId = VlanId.vlanId(match.get(MatchField.VLAN_VID).getVlan());
}
}
if (vlanId != null) {
builder.matchVlanId(vlanId);
}
}
break;
case VLAN_PCP:
byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue();
builder.matchVlanPcp(vlanPcp);
break;
case IP_DSCP:
byte ipDscp = match.get(MatchField.IP_DSCP).getDscpValue();
builder.matchIPDscp(ipDscp);
break;
case IP_ECN:
byte ipEcn = match.get(MatchField.IP_ECN).getEcnValue();
builder.matchIPEcn(ipEcn);
break;
case IP_PROTO:
short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber();
builder.matchIPProtocol((byte) proto);
break;
case IPV4_SRC:
if (match.isPartiallyMasked(MatchField.IPV4_SRC)) {
Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_SRC);
ip4Prefix = Ip4Prefix.valueOf(maskedIp.getValue().getInt(), maskedIp.getMask().asCidrMaskLength());
} else {
ip4Prefix = Ip4Prefix.valueOf(match.get(MatchField.IPV4_SRC).getInt(), Ip4Prefix.MAX_MASK_LENGTH);
}
builder.matchIPSrc(ip4Prefix);
break;
case IPV4_DST:
if (match.isPartiallyMasked(MatchField.IPV4_DST)) {
Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_DST);
ip4Prefix = Ip4Prefix.valueOf(maskedIp.getValue().getInt(), maskedIp.getMask().asCidrMaskLength());
} else {
ip4Prefix = Ip4Prefix.valueOf(match.get(MatchField.IPV4_DST).getInt(), Ip4Prefix.MAX_MASK_LENGTH);
}
builder.matchIPDst(ip4Prefix);
break;
case TCP_SRC:
if (match.isPartiallyMasked(MatchField.TCP_SRC)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.TCP_SRC);
builder.matchTcpSrcMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchTcpSrc(TpPort.tpPort(match.get(MatchField.TCP_SRC).getPort()));
}
break;
case TCP_DST:
if (match.isPartiallyMasked(MatchField.TCP_DST)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.TCP_DST);
builder.matchTcpDstMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchTcpDst(TpPort.tpPort(match.get(MatchField.TCP_DST).getPort()));
}
break;
case UDP_SRC:
if (match.isPartiallyMasked(MatchField.UDP_SRC)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.UDP_SRC);
builder.matchUdpSrcMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchUdpSrc(TpPort.tpPort(match.get(MatchField.UDP_SRC).getPort()));
}
break;
case UDP_DST:
if (match.isPartiallyMasked(MatchField.UDP_DST)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.UDP_DST);
builder.matchUdpDstMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchUdpDst(TpPort.tpPort(match.get(MatchField.UDP_DST).getPort()));
}
break;
case MPLS_LABEL:
builder.matchMplsLabel(MplsLabel.mplsLabel((int) match.get(MatchField.MPLS_LABEL).getValue()));
break;
case MPLS_BOS:
builder.matchMplsBos(match.get(MatchField.MPLS_BOS).getValue());
break;
case SCTP_SRC:
if (match.isPartiallyMasked(MatchField.SCTP_SRC)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.SCTP_SRC);
builder.matchSctpSrcMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchSctpSrc(TpPort.tpPort(match.get(MatchField.SCTP_SRC).getPort()));
}
break;
case SCTP_DST:
if (match.isPartiallyMasked(MatchField.SCTP_DST)) {
Masked<org.projectfloodlight.openflow.types.TransportPort> maskedPort = match.getMasked(MatchField.SCTP_DST);
builder.matchSctpDstMasked(TpPort.tpPort(maskedPort.getValue().getPort()), TpPort.tpPort(maskedPort.getMask().getPort()));
} else {
builder.matchSctpDst(TpPort.tpPort(match.get(MatchField.SCTP_DST).getPort()));
}
break;
case ICMPV4_TYPE:
byte icmpType = (byte) match.get(MatchField.ICMPV4_TYPE).getType();
builder.matchIcmpType(icmpType);
break;
case ICMPV4_CODE:
byte icmpCode = (byte) match.get(MatchField.ICMPV4_CODE).getCode();
builder.matchIcmpCode(icmpCode);
break;
case IPV6_SRC:
if (match.isPartiallyMasked(MatchField.IPV6_SRC)) {
Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_SRC);
ip6Prefix = Ip6Prefix.valueOf(maskedIp.getValue().getBytes(), maskedIp.getMask().asCidrMaskLength());
} else {
ip6Prefix = Ip6Prefix.valueOf(match.get(MatchField.IPV6_SRC).getBytes(), Ip6Prefix.MAX_MASK_LENGTH);
}
builder.matchIPv6Src(ip6Prefix);
break;
case IPV6_DST:
if (match.isPartiallyMasked(MatchField.IPV6_DST)) {
Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_DST);
ip6Prefix = Ip6Prefix.valueOf(maskedIp.getValue().getBytes(), maskedIp.getMask().asCidrMaskLength());
} else {
ip6Prefix = Ip6Prefix.valueOf(match.get(MatchField.IPV6_DST).getBytes(), Ip6Prefix.MAX_MASK_LENGTH);
}
builder.matchIPv6Dst(ip6Prefix);
break;
case IPV6_FLABEL:
int flowLabel = match.get(MatchField.IPV6_FLABEL).getIPv6FlowLabelValue();
builder.matchIPv6FlowLabel(flowLabel);
break;
case ICMPV6_TYPE:
byte icmpv6type = (byte) match.get(MatchField.ICMPV6_TYPE).getValue();
builder.matchIcmpv6Type(icmpv6type);
break;
case ICMPV6_CODE:
byte icmpv6code = (byte) match.get(MatchField.ICMPV6_CODE).getValue();
builder.matchIcmpv6Code(icmpv6code);
break;
case IPV6_ND_TARGET:
ip6Address = Ip6Address.valueOf(match.get(MatchField.IPV6_ND_TARGET).getBytes());
builder.matchIPv6NDTargetAddress(ip6Address);
break;
case IPV6_ND_SLL:
mac = MacAddress.valueOf(match.get(MatchField.IPV6_ND_SLL).getLong());
builder.matchIPv6NDSourceLinkLayerAddress(mac);
break;
case IPV6_ND_TLL:
mac = MacAddress.valueOf(match.get(MatchField.IPV6_ND_TLL).getLong());
builder.matchIPv6NDTargetLinkLayerAddress(mac);
break;
case IPV6_EXTHDR:
builder.matchIPv6ExthdrFlags((short) match.get(MatchField.IPV6_EXTHDR).getValue());
break;
case OCH_SIGID:
CircuitSignalID sigId = match.get(MatchField.OCH_SIGID);
builder.add(matchLambda(Lambda.ochSignal(lookupGridType(sigId.getGridType()), lookupChannelSpacing(sigId.getChannelSpacing()), sigId.getChannelNumber(), sigId.getSpectralWidth())));
break;
case OCH_SIGTYPE:
U8 sigType = match.get(MatchField.OCH_SIGTYPE);
builder.add(matchOchSignalType(lookupOchSignalType((byte) sigType.getValue())));
break;
case EXP_OCH_SIG_ID:
try {
CircuitSignalID expSigId = match.get(MatchField.EXP_OCH_SIG_ID);
builder.add(matchLambda(Lambda.ochSignal(lookupGridType(expSigId.getGridType()), lookupChannelSpacing(expSigId.getChannelSpacing()), expSigId.getChannelNumber(), expSigId.getSpectralWidth())));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
break;
}
break;
case EXP_OCH_SIGTYPE:
try {
U8 expOchSigType = match.get(MatchField.EXP_OCH_SIGTYPE);
builder.add(matchOchSignalType(lookupOchSignalType((byte) expOchSigType.getValue())));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
break;
}
break;
case EXP_ODU_SIG_ID:
OduSignalId oduSignalId = OduSignalId.oduSignalId(match.get(MatchField.EXP_ODU_SIG_ID).getTpn(), match.get(MatchField.EXP_ODU_SIG_ID).getTslen(), match.get(MatchField.EXP_ODU_SIG_ID).getTsmap());
builder.add(matchOduSignalId(oduSignalId));
break;
case EXP_ODU_SIGTYPE:
try {
U8 oduSigType = match.get(MatchField.EXP_ODU_SIGTYPE);
builder.add(matchOduSignalType(lookupOduSignalType((byte) oduSigType.getValue())));
} catch (NoMappingFoundException e) {
log.warn(e.getMessage());
break;
}
break;
case TUNNEL_ID:
long tunnelId = match.get(MatchField.TUNNEL_ID).getValue();
builder.matchTunnelId(tunnelId);
break;
case ARP_OP:
int arpOp = match.get(MatchField.ARP_OP).getOpcode();
builder.matchArpOp(arpOp);
break;
case ARP_SHA:
mac = MacAddress.valueOf(match.get(MatchField.ARP_SHA).getLong());
builder.matchArpSha(mac);
break;
case ARP_SPA:
ip = Ip4Address.valueOf(match.get(MatchField.ARP_SPA).getInt());
builder.matchArpSpa(ip);
break;
case ARP_THA:
mac = MacAddress.valueOf(match.get(MatchField.ARP_THA).getLong());
builder.matchArpTha(mac);
break;
case ARP_TPA:
ip = Ip4Address.valueOf(match.get(MatchField.ARP_TPA).getInt());
builder.matchArpTpa(ip);
break;
case NSP:
if (selectorInterpreter != null) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.NSP);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case NSI:
if (selectorInterpreter != null) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.NSI);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case ENCAP_ETH_TYPE:
if (selectorInterpreter != null) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.ENCAP_ETH_TYPE);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case CONNTRACK_STATE:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.NICIRA_MATCH_CONNTRACK_STATE.type())) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.CONNTRACK_STATE);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case CONNTRACK_ZONE:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.NICIRA_MATCH_CONNTRACK_ZONE.type())) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.CONNTRACK_ZONE);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case CONNTRACK_MARK:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.NICIRA_MATCH_CONNTRACK_MARK.type())) {
try {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.CONNTRACK_MARK);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} catch (UnsupportedOperationException e) {
log.debug(e.getMessage());
}
}
break;
case OFDPA_OVID:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_OVID);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} else {
break;
}
}
break;
case OFDPA_MPLS_L2_PORT:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_MPLS_L2_PORT);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} else {
break;
}
}
break;
case OFDPA_ALLOW_VLAN_TRANSLATION:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_ALLOW_VLAN_TRANSLATION);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} else {
break;
}
}
break;
case OFDPA_ACTSET_OUTPUT:
if (selectorInterpreter != null && selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
if (isOF13OrLater(match)) {
OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_ACTSET_OUTPUT);
builder.extension(selectorInterpreter.mapOxm(oxm), deviceId);
} else {
break;
}
}
break;
case MPLS_TC:
default:
log.warn("Match type {} not yet implemented.", field.id);
}
}
return builder.build();
}
use of org.onlab.packet.Ip6Prefix 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.onlab.packet.Ip6Prefix in project onos by opennetworkinglab.
the class ReactiveForwarding method installRule.
// Install a rule forwarding the packet to the specified port.
private void installRule(PacketContext context, PortNumber portNumber, ReactiveForwardMetrics macMetrics) {
//
// We don't support (yet) buffer IDs in the Flow Service so
// packet out first.
//
Ethernet inPkt = context.inPacket().parsed();
TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
// If PacketOutOnly or ARP packet than forward directly to output port
if (packetOutOnly || inPkt.getEtherType() == Ethernet.TYPE_ARP) {
packetOut(context, portNumber, macMetrics);
return;
}
//
if (matchDstMacOnly) {
selectorBuilder.matchEthDst(inPkt.getDestinationMAC());
} else {
selectorBuilder.matchInPort(context.inPacket().receivedFrom().port()).matchEthSrc(inPkt.getSourceMAC()).matchEthDst(inPkt.getDestinationMAC());
// If configured Match Vlan ID
if (matchVlanId && inPkt.getVlanID() != Ethernet.VLAN_UNTAGGED) {
selectorBuilder.matchVlanId(VlanId.vlanId(inPkt.getVlanID()));
}
//
if (matchIpv4Address && inPkt.getEtherType() == Ethernet.TYPE_IPV4) {
IPv4 ipv4Packet = (IPv4) inPkt.getPayload();
byte ipv4Protocol = ipv4Packet.getProtocol();
Ip4Prefix matchIp4SrcPrefix = Ip4Prefix.valueOf(ipv4Packet.getSourceAddress(), Ip4Prefix.MAX_MASK_LENGTH);
Ip4Prefix matchIp4DstPrefix = Ip4Prefix.valueOf(ipv4Packet.getDestinationAddress(), Ip4Prefix.MAX_MASK_LENGTH);
selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPSrc(matchIp4SrcPrefix).matchIPDst(matchIp4DstPrefix);
if (matchIpv4Dscp) {
byte dscp = ipv4Packet.getDscp();
byte ecn = ipv4Packet.getEcn();
selectorBuilder.matchIPDscp(dscp).matchIPEcn(ecn);
}
if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_TCP) {
TCP tcpPacket = (TCP) ipv4Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv4Protocol).matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort())).matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
}
if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_UDP) {
UDP udpPacket = (UDP) ipv4Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv4Protocol).matchUdpSrc(TpPort.tpPort(udpPacket.getSourcePort())).matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
}
if (matchIcmpFields && ipv4Protocol == IPv4.PROTOCOL_ICMP) {
ICMP icmpPacket = (ICMP) ipv4Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv4Protocol).matchIcmpType(icmpPacket.getIcmpType()).matchIcmpCode(icmpPacket.getIcmpCode());
}
}
//
if (matchIpv6Address && inPkt.getEtherType() == Ethernet.TYPE_IPV6) {
IPv6 ipv6Packet = (IPv6) inPkt.getPayload();
byte ipv6NextHeader = ipv6Packet.getNextHeader();
Ip6Prefix matchIp6SrcPrefix = Ip6Prefix.valueOf(ipv6Packet.getSourceAddress(), Ip6Prefix.MAX_MASK_LENGTH);
Ip6Prefix matchIp6DstPrefix = Ip6Prefix.valueOf(ipv6Packet.getDestinationAddress(), Ip6Prefix.MAX_MASK_LENGTH);
selectorBuilder.matchEthType(Ethernet.TYPE_IPV6).matchIPv6Src(matchIp6SrcPrefix).matchIPv6Dst(matchIp6DstPrefix);
if (matchIpv6FlowLabel) {
selectorBuilder.matchIPv6FlowLabel(ipv6Packet.getFlowLabel());
}
if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_TCP) {
TCP tcpPacket = (TCP) ipv6Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv6NextHeader).matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort())).matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
}
if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_UDP) {
UDP udpPacket = (UDP) ipv6Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv6NextHeader).matchUdpSrc(TpPort.tpPort(udpPacket.getSourcePort())).matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
}
if (matchIcmpFields && ipv6NextHeader == IPv6.PROTOCOL_ICMP6) {
ICMP6 icmp6Packet = (ICMP6) ipv6Packet.getPayload();
selectorBuilder.matchIPProtocol(ipv6NextHeader).matchIcmpv6Type(icmp6Packet.getIcmpType()).matchIcmpv6Code(icmp6Packet.getIcmpCode());
}
}
}
TrafficTreatment treatment;
if (inheritFlowTreatment) {
treatment = context.treatmentBuilder().setOutput(portNumber).build();
} else {
treatment = DefaultTrafficTreatment.builder().setOutput(portNumber).build();
}
ForwardingObjective forwardingObjective = DefaultForwardingObjective.builder().withSelector(selectorBuilder.build()).withTreatment(treatment).withPriority(flowPriority).withFlag(ForwardingObjective.Flag.VERSATILE).fromApp(appId).makeTemporary(flowTimeout).add();
flowObjectiveService.forward(context.inPacket().receivedFrom().deviceId(), forwardingObjective);
forwardPacket(macMetrics);
//
if (packetOutOfppTable) {
packetOut(context, PortNumber.TABLE, macMetrics);
} else {
packetOut(context, portNumber, macMetrics);
}
}
use of org.onlab.packet.Ip6Prefix in project TFG by mattinelorza.
the class Ipv6RoutingComponent method setUpSpineRoutes.
/**
* Insert routing rules on the given spine switch, matching on leaf
* interface subnets and forwarding packets to the corresponding leaf.
*
* @param spineId the spine device ID
*/
private void setUpSpineRoutes(DeviceId spineId) {
log.info("Adding up spine routes on {}...", spineId);
for (Device device : deviceService.getDevices()) {
if (isSpine(device.id())) {
// We only need routes to leaf switches. Ignore spines.
continue;
}
final DeviceId leafId = device.id();
final MacAddress leafMac = getMyStationMac(leafId);
final Set<Ip6Prefix> subnetsToRoute = getInterfaceIpv6Prefixes(leafId);
// Since we're here, we also add a route for SRv6 (Exercise 7), to
// forward packets with IPv6 dst the SID of a leaf switch.
final Ip6Address leafSid = getDeviceSid(leafId);
subnetsToRoute.add(Ip6Prefix.valueOf(leafSid, 128));
// Create a group with only one member.
int groupId = macToGroupId(leafMac);
GroupDescription group = createNextHopGroup(groupId, Collections.singleton(leafMac), spineId);
List<FlowRule> flowRules = subnetsToRoute.stream().map(subnet -> createRoutingRule(spineId, subnet, groupId)).collect(Collectors.toList());
insertInOrder(group, flowRules);
}
}
use of org.onlab.packet.Ip6Prefix in project TFG by mattinelorza.
the class Ipv6RoutingComponent method setUpLeafRoutes.
/**
* Insert routing rules on the given leaf switch, matching on interface
* subnets associated to other leaves and forwarding packets the spines
* using ECMP.
*
* @param leafId the leaf device ID
*/
private void setUpLeafRoutes(DeviceId leafId) {
log.info("Setting up leaf routes: {}", leafId);
// Get the set of subnets (interface IPv6 prefixes) associated to other
// leafs but not this one.
Set<Ip6Prefix> subnetsToRouteViaSpines = stream(deviceService.getDevices()).map(Device::id).filter(this::isLeaf).filter(deviceId -> !deviceId.equals(leafId)).map(this::getInterfaceIpv6Prefixes).flatMap(Collection::stream).collect(Collectors.toSet());
// Get myStationMac address of all spines.
Set<MacAddress> spineMacs = stream(deviceService.getDevices()).map(Device::id).filter(this::isSpine).map(this::getMyStationMac).collect(Collectors.toSet());
// Create an ECMP group to distribute traffic across all spines.
final int groupId = DEFAULT_ECMP_GROUP_ID;
final GroupDescription ecmpGroup = createNextHopGroup(groupId, spineMacs, leafId);
// Generate a flow rule for each subnet pointing to the ECMP group.
List<FlowRule> flowRules = subnetsToRouteViaSpines.stream().map(subnet -> createRoutingRule(leafId, subnet, groupId)).collect(Collectors.toList());
insertInOrder(ecmpGroup, flowRules);
// Since we're here, we also add a route for SRv6 (Exercise 7), to
// forward packets with IPv6 dst the SID of a spine switch, in this case
// using a single-member group.
stream(deviceService.getDevices()).map(Device::id).filter(this::isSpine).forEach(spineId -> {
MacAddress spineMac = getMyStationMac(spineId);
Ip6Address spineSid = getDeviceSid(spineId);
int spineGroupId = macToGroupId(spineMac);
GroupDescription group = createNextHopGroup(spineGroupId, Collections.singleton(spineMac), leafId);
FlowRule routingRule = createRoutingRule(leafId, Ip6Prefix.valueOf(spineSid, 128), spineGroupId);
insertInOrder(group, Collections.singleton(routingRule));
});
}
Aggregations