X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fdeserialization%2Ffactories%2FPacketInMessageFactory.java;h=a69baeea9164cde1d4e26915529341335a9851d0;hb=0b153ce18153b71fc7e5bb6de5338d5dbaf9b1a1;hp=e6e8e693e3226f9addb5032324bd94c4d3247818;hpb=d634962cad3b3adc75d452598493044ea7190c47;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java index e6e8e693..a69baeea 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/PacketInMessageFactory.java @@ -1,52 +1,64 @@ -package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; - -import io.netty.buffer.ByteBuf; - -import java.math.BigInteger; - -import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder; - -/** - * @author michal.polkorab - * @author timotej.kubas - */ -public class PacketInMessageFactory implements OFDeserializer { - - private static PacketInMessageFactory instance; - private static final byte PADDING_IN_PACKET_IN_HEADER = 2; - - private PacketInMessageFactory() { - // Singleton - } - - /** - * @return singleton factory - */ - public static synchronized PacketInMessageFactory getInstance(){ - if(instance == null){ - instance = new PacketInMessageFactory(); - } - return instance; - } - - @Override - public PacketInMessage bufferToMessage(ByteBuf rawMessage, short version) { - PacketInMessageBuilder builder = new PacketInMessageBuilder(); - builder.setVersion(version); - builder.setXid(rawMessage.readUnsignedInt()); - builder.setBufferId(rawMessage.readUnsignedInt()); - builder.setTotalLen(rawMessage.readUnsignedShort()); - builder.setReason(rawMessage.readUnsignedByte()); - builder.setTableId(new TableId((long)rawMessage.readUnsignedByte())); - byte[] cookie = new byte[Long.SIZE/Byte.SIZE]; - rawMessage.readBytes(cookie); - builder.setCookie(new BigInteger(cookie)); - // TODO - implement match factories to finish this factory - rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER); - builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); - return builder.build(); - } -} +/* + * 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.deserialization.factories; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder; + +/** + * Translates PacketIn messages + * @author michal.polkorab + * @author timotej.kubas + */ +public class PacketInMessageFactory implements OFDeserializer, + DeserializerRegistryInjector { + + private static final byte PADDING_IN_PACKET_IN_HEADER = 2; + private static final MessageCodeKey MATCH_KEY = new MessageCodeKey( + EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class); + private DeserializerRegistry registry; + + @Override + public PacketInMessage deserialize(final ByteBuf rawMessage) { + PacketInMessageBuilder builder = new PacketInMessageBuilder(); + builder.setVersion((short) EncodeConstants.OF13_VERSION_ID); + builder.setXid(rawMessage.readUnsignedInt()); + builder.setBufferId(rawMessage.readUnsignedInt()); + builder.setTotalLen(rawMessage.readUnsignedShort()); + builder.setReason(PacketInReason.forValue(rawMessage.readUnsignedByte())); + builder.setTableId(new TableId((long)rawMessage.readUnsignedByte())); + byte[] cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES]; + rawMessage.readBytes(cookie); + builder.setCookie(new BigInteger(1, cookie)); + OFDeserializer matchDeserializer = registry.getDeserializer(MATCH_KEY); + builder.setMatch(matchDeserializer.deserialize(rawMessage)); + rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER); + byte[] data = new byte[rawMessage.readableBytes()]; + rawMessage.readBytes(data); + builder.setData(data); + return builder.build(); + } + + @Override + public void injectDeserializerRegistry(final DeserializerRegistry deserializerRegistry) { + registry = deserializerRegistry; + } +}