X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fserialization%2Ffactories%2FFlowModInputMessageFactory.java;h=683a301ce119388cd83ca2b08087c26d6dcdce54;hb=1adc52b6fedfc7ecdb03cb6cab5ae7da3bfb52e4;hp=8889339a2e45d767fbd32f23a0870492b9a02993;hpb=bc16c5466bdbc8b593b9b62853e4162d4aabc32b;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java index 8889339a..683a301c 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java @@ -1,91 +1,79 @@ -/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */ -package org.opendaylight.openflowjava.protocol.impl.serialization.factories; - -import io.netty.buffer.ByteBuf; - -import java.util.HashMap; -import java.util.Map; - -import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer; -import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils; -import org.opendaylight.openflowjava.protocol.impl.util.InstructionsSerializer; -import org.opendaylight.openflowjava.protocol.impl.util.MatchSerializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput; - -/** - * Translates FlowMod messages - * @author timotej.kubas - * @author michal.polkorab - */ -public class FlowModInputMessageFactory implements OFSerializer { - private static final byte MESSAGE_TYPE = 14; - private static final byte PADDING_IN_FLOW_MOD_MESSAGE = 2; - private static final int MESSAGE_LENGTH = 48; - private static FlowModInputMessageFactory instance; - - private FlowModInputMessageFactory() { - // singleton - } - - /** - * @return singleton factory - */ - public static synchronized FlowModInputMessageFactory getInstance() { - if(instance == null) { - instance = new FlowModInputMessageFactory(); - } - return instance; - } - - @Override - public void messageToBuffer(short version, ByteBuf out, FlowModInput message) { - ByteBufUtils.writeOFHeader(instance, message, out); - out.writeLong(message.getCookie().longValue()); - out.writeLong(message.getCookieMask().longValue()); - out.writeByte(message.getTableId().getValue().byteValue()); - out.writeByte(message.getCommand().getIntValue()); - out.writeShort(message.getIdleTimeout().intValue()); - out.writeShort(message.getHardTimeout().intValue()); - out.writeShort(message.getPriority()); - out.writeInt(message.getBufferId().intValue()); - if (message.getOutPort() != null) { - out.writeInt(message.getOutPort().getValue().intValue()); - } - - if (message.getOutGroup() != null) { - out.writeInt(message.getOutGroup().intValue()); - } - out.writeShort(createFlowModFlagsBitmask(message.getFlags())); - ByteBufUtils.padBuffer(PADDING_IN_FLOW_MOD_MESSAGE, out); - MatchSerializer.encodeMatch(message.getMatch(), out); - InstructionsSerializer.encodeInstructions(message.getInstructions(), out); - - } - - @Override - public int computeLength(FlowModInput message) { - return MESSAGE_LENGTH + MatchSerializer.computeMatchLength(message.getMatch()) - + InstructionsSerializer.computeInstructionsLength(message.getInstructions()); - } - - @Override - public byte getMessageType() { - return MESSAGE_TYPE; - } - - private static int createFlowModFlagsBitmask(FlowModFlags flags) { - int flowModFlagBitmask = 0; - Map flowModFlagsMap = new HashMap<>(); - flowModFlagsMap.put(0, flags.isOFPFFSENDFLOWREM()); - flowModFlagsMap.put(1, flags.isOFPFFCHECKOVERLAP()); - flowModFlagsMap.put(2, flags.isOFPFFRESETCOUNTS()); - flowModFlagsMap.put(3, flags.isOFPFFNOPKTCOUNTS()); - flowModFlagsMap.put(4, flags.isOFPFFNOBYTCOUNTS()); - - flowModFlagBitmask = ByteBufUtils.fillBitMaskFromMap(flowModFlagsMap); - return flowModFlagBitmask; - } - - -} +/* + * 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.serialization.factories; + +import io.netty.buffer.ByteBuf; + +import java.util.HashMap; +import java.util.Map; + +import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.RegistryInjector; +import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry; +import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils; +import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils; +import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput; + +/** + * Translates FlowMod messages + * @author timotej.kubas + * @author michal.polkorab + */ +public class FlowModInputMessageFactory implements OFSerializer, RegistryInjector { + private static final byte MESSAGE_TYPE = 14; + private static final byte PADDING_IN_FLOW_MOD_MESSAGE = 2; + private SerializerRegistry registry; + + @Override + public void serialize(FlowModInput message, ByteBuf outBuffer) { + ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH); + outBuffer.writeLong(message.getCookie().longValue()); + outBuffer.writeLong(message.getCookieMask().longValue()); + outBuffer.writeByte(message.getTableId().getValue().byteValue()); + outBuffer.writeByte(message.getCommand().getIntValue()); + outBuffer.writeShort(message.getIdleTimeout().intValue()); + outBuffer.writeShort(message.getHardTimeout().intValue()); + outBuffer.writeShort(message.getPriority()); + outBuffer.writeInt(message.getBufferId().intValue()); + outBuffer.writeInt(message.getOutPort().getValue().intValue()); + outBuffer.writeInt(message.getOutGroup().intValue()); + outBuffer.writeShort(createFlowModFlagsBitmask(message.getFlags())); + ByteBufUtils.padBuffer(PADDING_IN_FLOW_MOD_MESSAGE, outBuffer); + registry.>getSerializer(new MessageTypeKey<>(message.getVersion(), Match.class)) + .serialize(message.getMatch(), outBuffer); + OFSerializer instructionSerializer = + registry.getSerializer(new MessageTypeKey<>(message.getVersion(), Instruction.class)); + CodingUtils.serializeList(message.getInstruction(), instructionSerializer, outBuffer); + ByteBufUtils.updateOFHeaderLength(outBuffer); + } + + @Override + public void injectSerializerRegistry(SerializerRegistry serializerRegistry) { + this.registry = serializerRegistry; + } + + private static int createFlowModFlagsBitmask(FlowModFlags flags) { + int flowModFlagBitmask = 0; + Map flowModFlagsMap = new HashMap<>(); + flowModFlagsMap.put(0, flags.isOFPFFSENDFLOWREM()); + flowModFlagsMap.put(1, flags.isOFPFFCHECKOVERLAP()); + flowModFlagsMap.put(2, flags.isOFPFFRESETCOUNTS()); + flowModFlagsMap.put(3, flags.isOFPFFNOPKTCOUNTS()); + flowModFlagsMap.put(4, flags.isOFPFFNOBYTCOUNTS()); + + flowModFlagBitmask = ByteBufUtils.fillBitMaskFromMap(flowModFlagsMap); + return flowModFlagBitmask; + } + +}