X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Futil%2FOF10MatchSerializer.java;h=830753eab486c3bd3961a868c06f07eedf01bbc5;hb=29a2a074c78708f6d18583779ece96bb6573f0c6;hp=84023e24087659af25365e6a1ab38a2ae245f640;hpb=3d6680258cc25e4e8ec0476c947b2a6f3b1ce96d;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/OF10MatchSerializer.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/OF10MatchSerializer.java index 84023e24..830753ea 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/OF10MatchSerializer.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/OF10MatchSerializer.java @@ -1,76 +1,77 @@ -/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */ -package org.opendaylight.openflowjava.protocol.impl.util; - -import java.util.HashMap; -import java.util.Map; - -import io.netty.buffer.ByteBuf; - -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 { - - 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; - private static final int ALL = ((1 << 22) - 1); - - /** - * Encodes ofp_match (OpenFlow v1.0) - * @param out output ByteBuf that match will be written into - * @param match match to be encoded - */ - 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])); - } - String[] dstGroups = match.getNwDst().getValue().split("\\."); - for (int i = 0; i < dstGroups.length; i++) { - out.writeByte(Integer.parseInt(dstGroups[i])); - } - out.writeShort(match.getTpSrc()); - out.writeShort(match.getTpDst()); - } - - private static int encodeWildcards(FlowWildcardsV10 wildcards, short srcMask, short dstMask) { - int bitmask = 0; - if (wildcards.isALL()) { - bitmask |= ALL; - } else { - Map 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); - bitmask |= ((32 - srcMask) << NW_SRC_SHIFT); - bitmask |= ((32 - dstMask) << NW_DST_SHIFT); - } - return bitmask; - } - -} +/* + * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.openflowjava.protocol.impl.util; + +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.rev150225.match.v10.grouping.MatchV10; + +/** + * Serializes ofp_match (OpenFlow v1.0) structure + * @author michal.polkorab + */ +public class OF10MatchSerializer implements OFSerializer { + + 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; + + /** + * Serializes ofp_match (OpenFlow v1.0) + * @param outBuffer output ByteBuf + * @param match match to be serialized + */ + @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()); + outBuffer.writeZero(PADDING_IN_MATCH); + outBuffer.writeShort(match.getDlType()); + outBuffer.writeByte(match.getNwTos()); + outBuffer.writeByte(match.getNwProto()); + outBuffer.writeZero(PADDING_IN_MATCH_2); + Iterable srcGroups = ByteBufUtils.DOT_SPLITTER.split(match.getNwSrc().getValue()); + for (String group : srcGroups) { + outBuffer.writeByte(Short.parseShort(group)); + } + Iterable dstGroups = ByteBufUtils.DOT_SPLITTER.split(match.getNwDst().getValue()); + for (String group : dstGroups) { + outBuffer.writeByte(Short.parseShort(group)); + } + outBuffer.writeShort(match.getTpSrc()); + outBuffer.writeShort(match.getTpDst()); + } + + 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; + } + +}