\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;\r
\r
import com.google.common.base.Joiner;\r
\r
/**\r
+ * Deserializes ofp_match (OpenFlow v1.0) structure\r
* @author michal.polkorab\r
- *\r
*/\r
public abstract class OF10MatchDeserializer {\r
\r
- private static final byte MAC_ADDRESS_LENGTH = 6;\r
private static final byte PADDING_IN_MATCH = 1;\r
private static final byte PADDING_IN_MATCH_2 = 2;\r
- private static final byte GROUPS_IN_IPV4_ADDRESS = 4;\r
+ private static final byte NW_SRC_BITS = 6;\r
+ private static final byte NW_SRC_SHIFT = 8;\r
+ private static final int NW_SRC_MASK = ((1 << NW_SRC_BITS) - 1) << NW_SRC_SHIFT;\r
+ private static final byte NW_DST_BITS = 6;\r
+ private static final byte NW_DST_SHIFT = 14;\r
+ private static final int NW_DST_MASK = ((1 << NW_DST_BITS) - 1) << NW_DST_SHIFT;\r
\r
/**\r
- * Creates match \r
- * @param rawMessage\r
+ * Creates ofp_match (OpenFlow v1.0) structure\r
+ * @param rawMessage ByteBuf with input data\r
* @return ofp_match (OpenFlow v1.0)\r
*/\r
public static MatchV10 createMatchV10(ByteBuf rawMessage) {\r
MatchV10Builder builder = new MatchV10Builder();\r
- builder.setWildcards(rawMessage.readUnsignedInt());\r
+ long wildcards = rawMessage.readUnsignedInt();\r
+ builder.setWildcards(createWildcards(wildcards));\r
+ builder.setNwSrcMask(decodeNwSrcMask(wildcards));\r
+ builder.setNwDstMask(decodeNwDstMask(wildcards));\r
builder.setInPort(rawMessage.readUnsignedShort());\r
- StringBuffer dlSrc = new StringBuffer();\r
- for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){\r
- short mac = rawMessage.readUnsignedByte();\r
- dlSrc.append(String.format("%02X", mac));\r
- }\r
- builder.setDlSrc(new MacAddress(dlSrc.toString()));\r
- StringBuffer dlDst = new StringBuffer();\r
- for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){\r
- short mac = rawMessage.readUnsignedByte();\r
- dlDst.append(String.format("%02X", mac));\r
- }\r
- builder.setDlDst(new MacAddress(dlDst.toString()));\r
+ byte[] dlSrc = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
+ rawMessage.readBytes(dlSrc);\r
+ builder.setDlSrc(new MacAddress(ByteBufUtils.macAddressToString(dlSrc)));\r
+ byte[] dlDst = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
+ rawMessage.readBytes(dlDst);\r
+ builder.setDlDst(new MacAddress(ByteBufUtils.macAddressToString(dlDst)));\r
+\r
builder.setDlVlan(rawMessage.readUnsignedShort());\r
builder.setDlVlanPcp(rawMessage.readUnsignedByte());\r
rawMessage.skipBytes(PADDING_IN_MATCH);\r
builder.setNwProto(rawMessage.readUnsignedByte());\r
rawMessage.skipBytes(PADDING_IN_MATCH_2);\r
List<String> srcGroups = new ArrayList<>();\r
- for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {\r
+ for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {\r
srcGroups.add(Short.toString(rawMessage.readUnsignedByte()));\r
}\r
Joiner joiner = Joiner.on(".");\r
builder.setNwSrc(new Ipv4Address(joiner.join(srcGroups)));\r
List<String> dstGroups = new ArrayList<>();\r
- for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {\r
+ for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {\r
dstGroups.add(Short.toString(rawMessage.readUnsignedByte()));\r
}\r
- builder.setNwSrc(new Ipv4Address(joiner.join(dstGroups)));\r
+ builder.setNwDst(new Ipv4Address(joiner.join(dstGroups)));\r
builder.setTpSrc(rawMessage.readUnsignedShort());\r
builder.setTpDst(rawMessage.readUnsignedShort());\r
return builder.build();\r
}\r
\r
+ private static FlowWildcardsV10 createWildcards(long input) {\r
+ boolean _iNPORT = (input & (1 << 0)) != 0;\r
+ boolean _dLVLAN = (input & (1 << 1)) != 0;\r
+ boolean _dLSRC = (input & (1 << 2)) != 0;\r
+ boolean _dLDST = (input & (1 << 3)) != 0;\r
+ boolean _dLTYPE = (input & (1 << 4)) != 0;\r
+ boolean _nWPROTO = (input & (1 << 5)) != 0;\r
+ boolean _tPSRC = (input & (1 << 6)) != 0;\r
+ boolean _tPDST = (input & (1 << 7)) != 0;\r
+ boolean _dLVLANPCP = (input & (1 << 20)) != 0;\r
+ boolean _nWTOS = (input & (1 << 21)) != 0;\r
+ int allBits = (1 << 22) - 1;\r
+ boolean _aLL = (input & allBits) == allBits;\r
+ return new FlowWildcardsV10(_aLL, _dLDST, _dLSRC, _dLTYPE, _dLVLAN,\r
+ _dLVLANPCP, _iNPORT, _nWPROTO, _nWTOS, _tPDST, _tPSRC);\r
+ }\r
+ \r
+ private static short decodeNwSrcMask(long input) {\r
+ return (short) Math.max(32 - ((input & NW_SRC_MASK) >> NW_SRC_SHIFT), 0);\r
+ }\r
+ \r
+ private static short decodeNwDstMask(long input) {\r
+ return (short) Math.max(32 - ((input & NW_DST_MASK) >> NW_DST_SHIFT), 0);\r
+ }\r
+ \r
}\r