Code Review
/
controller.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Fixed a bug that failed specifying the value 0 on VLAN ID field for a match condition...
[controller.git]
/
opendaylight
/
protocol_plugins
/
openflow
/
src
/
main
/
java
/
org
/
opendaylight
/
controller
/
protocol_plugin
/
openflow
/
internal
/
FlowConverter.java
diff --git
a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java
b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java
index 45c92aa91a6b806e310f1e62bfeb3e75bf6a92a8..2b8f6553d61cb6202f0576b92b4b5890bc30e7f5 100644
(file)
--- a/
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java
+++ b/
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java
@@
-51,6
+51,7
@@
import org.openflow.protocol.OFPacketOut;
import org.openflow.protocol.OFPort;
import org.openflow.protocol.OFVendor;
import org.openflow.protocol.action.OFAction;
import org.openflow.protocol.OFPort;
import org.openflow.protocol.OFVendor;
import org.openflow.protocol.action.OFAction;
+import org.openflow.protocol.action.OFActionDataLayer;
import org.openflow.protocol.action.OFActionDataLayerDestination;
import org.openflow.protocol.action.OFActionDataLayerSource;
import org.openflow.protocol.action.OFActionNetworkLayerAddress;
import org.openflow.protocol.action.OFActionDataLayerDestination;
import org.openflow.protocol.action.OFActionDataLayerSource;
import org.openflow.protocol.action.OFActionNetworkLayerAddress;
@@
-75,6
+76,13
@@
import org.slf4j.LoggerFactory;
public class FlowConverter {
protected static final Logger logger = LoggerFactory
.getLogger(FlowConverter.class);
public class FlowConverter {
protected static final Logger logger = LoggerFactory
.getLogger(FlowConverter.class);
+
+ /*
+ * The value 0xffff (OFP_VLAN_NONE) is used to indicate
+ * that no VLAN ID is set for OF Flow.
+ */
+ private static final short OFP_VLAN_NONE = (short) 0xffff;
+
private Flow flow; // SAL Flow
private OFMatch ofMatch; // OF 1.0 match or OF 1.0 + IPv6 extension match
private List<OFAction> actionsList; // OF 1.0 actions
private Flow flow; // SAL Flow
private OFMatch ofMatch; // OF 1.0 match or OF 1.0 + IPv6 extension match
private List<OFAction> actionsList; // OF 1.0 actions
@@
-142,6
+150,9
@@
public class FlowConverter {
if (match.isPresent(MatchType.DL_VLAN)) {
short vlan = (Short) match.getField(MatchType.DL_VLAN)
.getValue();
if (match.isPresent(MatchType.DL_VLAN)) {
short vlan = (Short) match.getField(MatchType.DL_VLAN)
.getValue();
+ if (vlan == MatchType.DL_VLAN_NONE) {
+ vlan = OFP_VLAN_NONE;
+ }
if (!isIPv6) {
ofMatch.setDataLayerVirtualLan(vlan);
wildcards &= ~OFMatch.OFPFW_DL_VLAN;
if (!isIPv6) {
ofMatch.setDataLayerVirtualLan(vlan);
wildcards &= ~OFMatch.OFPFW_DL_VLAN;
@@
-177,7
+188,7
@@
public class FlowConverter {
* actually the DSCP field followed by a zero ECN
*/
byte tos = (Byte) match.getField(MatchType.NW_TOS).getValue();
* actually the DSCP field followed by a zero ECN
*/
byte tos = (Byte) match.getField(MatchType.NW_TOS).getValue();
- byte dscp = (byte) (
(int)
tos << 2);
+ byte dscp = (byte) (tos << 2);
if (!isIPv6) {
ofMatch.setNetworkTypeOfService(dscp);
wildcards &= ~OFMatch.OFPFW_NW_TOS;
if (!isIPv6) {
ofMatch.setNetworkTypeOfService(dscp);
wildcards &= ~OFMatch.OFPFW_NW_TOS;
@@
-196,35
+207,23
@@
public class FlowConverter {
}
}
if (match.isPresent(MatchType.NW_SRC)) {
}
}
if (match.isPresent(MatchType.NW_SRC)) {
- InetAddress address = (InetAddress) match.getField(
- MatchType.NW_SRC).getValue();
- InetAddress mask = (InetAddress) match.getField(
- MatchType.NW_SRC).getMask();
+ InetAddress address = (InetAddress) match.getField(MatchType.NW_SRC).getValue();
+ InetAddress mask = (InetAddress) match.getField(MatchType.NW_SRC).getMask();
if (!isIPv6) {
if (!isIPv6) {
- ofMatch.setNetworkSource(NetUtils.byteArray4ToInt(address
- .getAddress()));
- int maskLength = NetUtils
- .getSubnetMaskLength((mask == null) ? null : mask
- .getAddress());
- wildcards = (wildcards & ~OFMatch.OFPFW_NW_SRC_MASK)
- | (maskLength << OFMatch.OFPFW_NW_SRC_SHIFT);
+ ofMatch.setNetworkSource(NetUtils.byteArray4ToInt(address.getAddress()));
+ int maskLength = (mask == null) ? 32 : NetUtils.getSubnetMaskLength(mask);
+ wildcards = (wildcards & ~OFMatch.OFPFW_NW_SRC_MASK) | ((32 - maskLength) << OFMatch.OFPFW_NW_SRC_SHIFT);
} else {
((V6Match) ofMatch).setNetworkSource(address, mask);
}
}
if (match.isPresent(MatchType.NW_DST)) {
} else {
((V6Match) ofMatch).setNetworkSource(address, mask);
}
}
if (match.isPresent(MatchType.NW_DST)) {
- InetAddress address = (InetAddress) match.getField(
- MatchType.NW_DST).getValue();
- InetAddress mask = (InetAddress) match.getField(
- MatchType.NW_DST).getMask();
+ InetAddress address = (InetAddress) match.getField(MatchType.NW_DST).getValue();
+ InetAddress mask = (InetAddress) match.getField(MatchType.NW_DST).getMask();
if (!isIPv6) {
if (!isIPv6) {
- ofMatch.setNetworkDestination(NetUtils
- .byteArray4ToInt(address.getAddress()));
- int maskLength = NetUtils
- .getSubnetMaskLength((mask == null) ? null : mask
- .getAddress());
- wildcards = (wildcards & ~OFMatch.OFPFW_NW_DST_MASK)
- | (maskLength << OFMatch.OFPFW_NW_DST_SHIFT);
+ ofMatch.setNetworkDestination(NetUtils.byteArray4ToInt(address.getAddress()));
+ int maskLength = (mask == null) ? 32 : NetUtils.getSubnetMaskLength(mask);
+ wildcards = (wildcards & ~OFMatch.OFPFW_NW_DST_MASK) | ((32 - maskLength) << OFMatch.OFPFW_NW_DST_SHIFT);
} else {
((V6Match) ofMatch).setNetworkDestination(address, mask);
}
} else {
((V6Match) ofMatch).setNetworkDestination(address, mask);
}
@@
-354,7
+353,7
@@
public class FlowConverter {
OFActionDataLayerSource ofAction = new OFActionDataLayerSource();
ofAction.setDataLayerAddress(a.getDlAddress());
actionsList.add(ofAction);
OFActionDataLayerSource ofAction = new OFActionDataLayerSource();
ofAction.setDataLayerAddress(a.getDlAddress());
actionsList.add(ofAction);
- actionsLength += OFActionDataLayer
Source
.MINIMUM_LENGTH;
+ actionsLength += OFActionDataLayer.MINIMUM_LENGTH;
continue;
}
if (action.getType() == ActionType.SET_DL_DST) {
continue;
}
if (action.getType() == ActionType.SET_DL_DST) {
@@
-362,7
+361,7
@@
public class FlowConverter {
OFActionDataLayerDestination ofAction = new OFActionDataLayerDestination();
ofAction.setDataLayerAddress(a.getDlAddress());
actionsList.add(ofAction);
OFActionDataLayerDestination ofAction = new OFActionDataLayerDestination();
ofAction.setDataLayerAddress(a.getDlAddress());
actionsList.add(ofAction);
- actionsLength += OFActionDataLayer
Destination
.MINIMUM_LENGTH;
+ actionsLength += OFActionDataLayer.MINIMUM_LENGTH;
continue;
}
if (action.getType() == ActionType.SET_NW_SRC) {
continue;
}
if (action.getType() == ActionType.SET_NW_SRC) {
@@
-411,7
+410,7
@@
public class FlowConverter {
continue;
}
if (action.getType() == ActionType.SET_NEXT_HOP) {
continue;
}
if (action.getType() == ActionType.SET_NEXT_HOP) {
- // TODO
+ logger.info("Unsupported action: {}", action);
continue;
}
}
continue;
}
}
@@
-502,10
+501,10
@@
public class FlowConverter {
if (ofMatch != null) {
if (!isIPv6) {
// Compute OF1.0 Match
if (ofMatch != null) {
if (!isIPv6) {
// Compute OF1.0 Match
- if (ofMatch.getInputPort() != 0) {
+ if (ofMatch.getInputPort() != 0
&& ofMatch.getInputPort() != OFPort.OFPP_LOCAL.getValue()
) {
salMatch.setField(new MatchField(MatchType.IN_PORT,
NodeConnectorCreator.createNodeConnector(
salMatch.setField(new MatchField(MatchType.IN_PORT,
NodeConnectorCreator.createNodeConnector(
-
(Short)
ofMatch.getInputPort(), node)));
+ ofMatch.getInputPort(), node)));
}
if (ofMatch.getDataLayerSource() != null
&& !NetUtils
}
if (ofMatch.getDataLayerSource() != null
&& !NetUtils
@@
-525,9
+524,13
@@
public class FlowConverter {
salMatch.setField(new MatchField(MatchType.DL_TYPE,
ofMatch.getDataLayerType()));
}
salMatch.setField(new MatchField(MatchType.DL_TYPE,
ofMatch.getDataLayerType()));
}
- if (ofMatch.getDataLayerVirtualLan() != 0) {
+ short vlan = ofMatch.getDataLayerVirtualLan();
+ if (vlan != 0) {
+ if (vlan == OFP_VLAN_NONE) {
+ vlan = MatchType.DL_VLAN_NONE;
+ }
salMatch.setField(new MatchField(MatchType.DL_VLAN,
salMatch.setField(new MatchField(MatchType.DL_VLAN,
-
ofMatch.getDataLayerVirtualLan()
));
+
vlan
));
}
if (ofMatch.getDataLayerVirtualLanPriorityCodePoint() != 0) {
salMatch.setField(MatchType.DL_VLAN_PR, ofMatch
}
if (ofMatch.getDataLayerVirtualLanPriorityCodePoint() != 0) {
salMatch.setField(MatchType.DL_VLAN_PR, ofMatch
@@
-560,20
+563,20
@@
public class FlowConverter {
}
if (ofMatch.getTransportSource() != 0) {
salMatch.setField(MatchType.TP_SRC,
}
if (ofMatch.getTransportSource() != 0) {
salMatch.setField(MatchType.TP_SRC,
-
((Short) ofMatch.getTransportSource()
));
+
ofMatch.getTransportSource(
));
}
if (ofMatch.getTransportDestination() != 0) {
salMatch.setField(MatchType.TP_DST,
}
if (ofMatch.getTransportDestination() != 0) {
salMatch.setField(MatchType.TP_DST,
-
((Short) ofMatch.getTransportDestination()
));
+
ofMatch.getTransportDestination(
));
}
} else {
// Compute OF1.0 + IPv6 extensions Match
V6Match v6Match = (V6Match) ofMatch;
}
} else {
// Compute OF1.0 + IPv6 extensions Match
V6Match v6Match = (V6Match) ofMatch;
- if (v6Match.getInputPort() != 0) {
+ if (v6Match.getInputPort() != 0
&& v6Match.getInputPort() != OFPort.OFPP_LOCAL.getValue()
) {
// Mask on input port is not defined
salMatch.setField(new MatchField(MatchType.IN_PORT,
NodeConnectorCreator.createOFNodeConnector(
// Mask on input port is not defined
salMatch.setField(new MatchField(MatchType.IN_PORT,
NodeConnectorCreator.createOFNodeConnector(
-
(Short)
v6Match.getInputPort(), node)));
+ v6Match.getInputPort(), node)));
}
if (v6Match.getDataLayerSource() != null
&& !NetUtils
}
if (v6Match.getDataLayerSource() != null
&& !NetUtils
@@
-593,23
+596,42
@@
public class FlowConverter {
salMatch.setField(new MatchField(MatchType.DL_TYPE,
v6Match.getDataLayerType()));
}
salMatch.setField(new MatchField(MatchType.DL_TYPE,
v6Match.getDataLayerType()));
}
- if (v6Match.getDataLayerVirtualLan() != 0) {
+ short vlan = v6Match.getDataLayerVirtualLan();
+ if (vlan != 0) {
+ if (vlan == OFP_VLAN_NONE) {
+ vlan = MatchType.DL_VLAN_NONE;
+ }
salMatch.setField(new MatchField(MatchType.DL_VLAN,
salMatch.setField(new MatchField(MatchType.DL_VLAN,
- v
6Match.getDataLayerVirtualLan()
));
+ v
lan
));
}
if (v6Match.getDataLayerVirtualLanPriorityCodePoint() != 0) {
salMatch.setField(MatchType.DL_VLAN_PR, v6Match
.getDataLayerVirtualLanPriorityCodePoint());
}
}
if (v6Match.getDataLayerVirtualLanPriorityCodePoint() != 0) {
salMatch.setField(MatchType.DL_VLAN_PR, v6Match
.getDataLayerVirtualLanPriorityCodePoint());
}
+ // V6Match may carry IPv4 address
if (v6Match.getNetworkSrc() != null) {
salMatch.setField(MatchType.NW_SRC,
v6Match.getNetworkSrc(),
v6Match.getNetworkSourceMask());
if (v6Match.getNetworkSrc() != null) {
salMatch.setField(MatchType.NW_SRC,
v6Match.getNetworkSrc(),
v6Match.getNetworkSourceMask());
+ } else if (v6Match.getNetworkSource() != 0) {
+ salMatch.setField(MatchType.NW_SRC, NetUtils
+ .getInetAddress(v6Match.getNetworkSource()),
+ NetUtils.getInetNetworkMask(
+ v6Match.getNetworkSourceMaskLen(),
+ false));
}
}
+ // V6Match may carry IPv4 address
if (v6Match.getNetworkDest() != null) {
salMatch.setField(MatchType.NW_DST,
v6Match.getNetworkDest(),
v6Match.getNetworkDestinationMask());
if (v6Match.getNetworkDest() != null) {
salMatch.setField(MatchType.NW_DST,
v6Match.getNetworkDest(),
v6Match.getNetworkDestinationMask());
+ } else if (v6Match.getNetworkDestination() != 0) {
+ salMatch.setField(MatchType.NW_DST,
+ NetUtils.getInetAddress(v6Match
+ .getNetworkDestination()),
+ NetUtils.getInetNetworkMask(
+ v6Match.getNetworkDestinationMaskLen(),
+ false));
}
if (v6Match.getNetworkTypeOfService() != 0) {
int dscp = NetUtils.getUnsignedByte(v6Match
}
if (v6Match.getNetworkTypeOfService() != 0) {
int dscp = NetUtils.getUnsignedByte(v6Match
@@
-623,11
+645,11
@@
public class FlowConverter {
}
if (v6Match.getTransportSource() != 0) {
salMatch.setField(MatchType.TP_SRC,
}
if (v6Match.getTransportSource() != 0) {
salMatch.setField(MatchType.TP_SRC,
- (
(Short)
v6Match.getTransportSource()));
+ (v6Match.getTransportSource()));
}
if (v6Match.getTransportDestination() != 0) {
salMatch.setField(MatchType.TP_DST,
}
if (v6Match.getTransportDestination() != 0) {
salMatch.setField(MatchType.TP_DST,
- (
(Short)
v6Match.getTransportDestination()));
+ (v6Match.getTransportDestination()));
}
}
}
}
}
}