package org.opendaylight.openflowjava.protocol.impl.util;
-import java.util.HashMap;
-import java.util.Map;
-
import io.netty.buffer.ByteBuf;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
* Serializes ofp_match (OpenFlow v1.0) structure
* @author michal.polkorab
*/
-public abstract class OF10MatchSerializer {
+public class OF10MatchSerializer implements OFSerializer<MatchV10> {
private static final byte PADDING_IN_MATCH = 1;
private static final byte PADDING_IN_MATCH_2 = 2;
private static final byte NW_SRC_SHIFT = 8;
private static final byte NW_DST_SHIFT = 14;
-
+
/**
- * Encodes ofp_match (OpenFlow v1.0)
- * @param out output ByteBuf that match will be written into
- * @param match match to be encoded
+ * Serializes ofp_match (OpenFlow v1.0)
+ * @param outBuffer output ByteBuf
+ * @param match match to be serialized
*/
- public static void encodeMatchV10(ByteBuf out, MatchV10 match) {
- out.writeInt(encodeWildcards(match.getWildcards(), match.getNwSrcMask(), match.getNwDstMask()));
- out.writeShort(match.getInPort());
- out.writeBytes(ByteBufUtils.macAddressToBytes(match.getDlSrc().getValue()));
- out.writeBytes(ByteBufUtils.macAddressToBytes(match.getDlDst().getValue()));
- out.writeShort(match.getDlVlan());
- out.writeByte(match.getDlVlanPcp());
- ByteBufUtils.padBuffer(PADDING_IN_MATCH, out);
- out.writeShort(match.getDlType());
- out.writeByte(match.getNwTos());
- out.writeByte(match.getNwProto());
- ByteBufUtils.padBuffer(PADDING_IN_MATCH_2, out);
- String[] srcGroups = match.getNwSrc().getValue().split("\\.");
- for (int i = 0; i < srcGroups.length; i++) {
- out.writeByte(Integer.parseInt(srcGroups[i]));
+ @Override
+ public void serialize(final MatchV10 match, final ByteBuf outBuffer) {
+ outBuffer.writeInt(encodeWildcards(match.getWildcards(), match.getNwSrcMask(), match.getNwDstMask()));
+ outBuffer.writeShort(match.getInPort());
+ outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(match.getDlSrc().getValue()));
+ outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(match.getDlDst().getValue()));
+ outBuffer.writeShort(match.getDlVlan());
+ outBuffer.writeByte(match.getDlVlanPcp());
+ ByteBufUtils.padBuffer(PADDING_IN_MATCH, outBuffer);
+ outBuffer.writeShort(match.getDlType());
+ outBuffer.writeByte(match.getNwTos());
+ outBuffer.writeByte(match.getNwProto());
+ ByteBufUtils.padBuffer(PADDING_IN_MATCH_2, outBuffer);
+ Iterable<String> srcGroups = ByteBufUtils.DOT_SPLITTER.split(match.getNwSrc().getValue());
+ for (String group : srcGroups) {
+ outBuffer.writeByte(Short.parseShort(group));
}
- String[] dstGroups = match.getNwDst().getValue().split("\\.");
- for (int i = 0; i < dstGroups.length; i++) {
- out.writeByte(Integer.parseInt(dstGroups[i]));
+ Iterable<String> dstGroups = ByteBufUtils.DOT_SPLITTER.split(match.getNwDst().getValue());
+ for (String group : dstGroups) {
+ outBuffer.writeByte(Short.parseShort(group));
}
- out.writeShort(match.getTpSrc());
- out.writeShort(match.getTpDst());
+ outBuffer.writeShort(match.getTpSrc());
+ outBuffer.writeShort(match.getTpDst());
}
-
- private static int encodeWildcards(FlowWildcardsV10 wildcards, short srcMask, short dstMask) {
- int bitmask = 0;
- Map<Integer, Boolean> wildcardsMap = new HashMap<>();
- wildcardsMap.put(0, wildcards.isINPORT());
- wildcardsMap.put(1, wildcards.isDLVLAN());
- wildcardsMap.put(2, wildcards.isDLSRC());
- wildcardsMap.put(3, wildcards.isDLDST());
- wildcardsMap.put(4, wildcards.isDLTYPE());
- wildcardsMap.put(5, wildcards.isNWPROTO());
- wildcardsMap.put(6, wildcards.isTPSRC());
- wildcardsMap.put(7, wildcards.isTPDST());
- wildcardsMap.put(20, wildcards.isDLVLANPCP());
- wildcardsMap.put(21, wildcards.isNWTOS());
- bitmask = ByteBufUtils.fillBitMaskFromMap(wildcardsMap);
+
+ private static int encodeWildcards(final FlowWildcardsV10 wildcards, final short srcMask, final short dstMask) {
+ int bitmask = ByteBufUtils.fillBitMask(0,
+ wildcards.isINPORT(),
+ wildcards.isDLVLAN(),
+ wildcards.isDLSRC(),
+ wildcards.isDLDST(),
+ wildcards.isDLTYPE(),
+ wildcards.isNWPROTO(),
+ wildcards.isTPSRC(),
+ wildcards.isTPDST());
+ bitmask |= ByteBufUtils.fillBitMask(20,
+ wildcards.isDLVLANPCP(),
+ wildcards.isNWTOS());
bitmask |= ((32 - srcMask) << NW_SRC_SHIFT);
bitmask |= ((32 - dstMask) << NW_DST_SHIFT);
return bitmask;
}
-
+
}