-package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-\r
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;\r
-\r
-/**\r
- * @author michal.polkorab\r
- * @author timotej.kubas\r
- */\r
-public class PortStatusMessageFactory implements OFDeserializer<PortStatusMessage> {\r
-\r
- private static PortStatusMessageFactory instance;\r
- private static final byte PADDING_IN_FEATURES_REPLY_HEADER = 7;\r
- \r
- private PortStatusMessageFactory() {\r
- // Singleton\r
- }\r
- \r
- /**\r
- * @return singleton factory\r
- */\r
- public static PortStatusMessageFactory getInstance(){\r
- if(instance == null){\r
- \r
- instance = new PortStatusMessageFactory();\r
- }\r
- \r
- return instance;\r
- }\r
- \r
- @Override\r
- public PortStatusMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
- PortStatusMessageBuilder psmb = new PortStatusMessageBuilder(); \r
- psmb.setVersion(version);\r
- psmb.setXid(rawMessage.readUnsignedInt());\r
- \r
-// TODO enum portReason\r
-// psmb.setReason(PortReason.values()[rawMessage.readInt()]);\r
- rawMessage.skipBytes(1); //instead of portReason enum\r
- \r
- rawMessage.skipBytes(PADDING_IN_FEATURES_REPLY_HEADER);\r
- return psmb.build();\r
- }\r
-\r
- \r
- \r
-}\r
+/*
+ * 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 org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;
+
+/**
+ * Translates PortStatus messages
+ * @author michal.polkorab
+ * @author timotej.kubas
+ */
+public class PortStatusMessageFactory implements OFDeserializer<PortStatusMessage> {
+
+ private static final byte PADDING_IN_PORT_STATUS_HEADER = 7;
+ private static final byte PADDING_IN_OFP_PORT_HEADER_1 = 4;
+ private static final byte PADDING_IN_OFP_PORT_HEADER_2 = 2;
+
+ @Override
+ public PortStatusMessage deserialize(ByteBuf rawMessage) {
+ PortStatusMessageBuilder builder = new PortStatusMessageBuilder();
+ builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
+ builder.setXid(rawMessage.readUnsignedInt());
+ builder.setReason(PortReason.forValue(rawMessage.readUnsignedByte()));
+ rawMessage.skipBytes(PADDING_IN_PORT_STATUS_HEADER);
+ builder.setPortNo(rawMessage.readUnsignedInt());
+ rawMessage.skipBytes(PADDING_IN_OFP_PORT_HEADER_1);
+ byte[] hwAddress = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];
+ rawMessage.readBytes(hwAddress);
+ builder.setHwAddr(new MacAddress(ByteBufUtils.macAddressToString(hwAddress)));
+ rawMessage.skipBytes(PADDING_IN_OFP_PORT_HEADER_2);
+ builder.setName(ByteBufUtils.decodeNullTerminatedString(rawMessage, EncodeConstants.MAX_PORT_NAME_LENGTH));
+ builder.setConfig(createPortConfig(rawMessage.readUnsignedInt()));
+ builder.setState(createPortState(rawMessage.readUnsignedInt()));
+ builder.setCurrentFeatures(createPortFeatures(rawMessage.readUnsignedInt()));
+ builder.setAdvertisedFeatures(createPortFeatures(rawMessage.readUnsignedInt()));
+ builder.setSupportedFeatures(createPortFeatures(rawMessage.readUnsignedInt()));
+ builder.setPeerFeatures(createPortFeatures(rawMessage.readUnsignedInt()));
+ builder.setCurrSpeed(rawMessage.readUnsignedInt());
+ builder.setMaxSpeed(rawMessage.readUnsignedInt());
+ return builder.build();
+ }
+
+ private static PortFeatures createPortFeatures(long input){
+ final Boolean pf10mbHd = ((input) & (1<<0)) != 0;
+ final Boolean pf10mbFd = ((input) & (1<<1)) != 0;
+ final Boolean pf100mbHd = ((input) & (1<<2)) != 0;
+ final Boolean pf100mbFd = ((input) & (1<<3)) != 0;
+ final Boolean pf1gbHd = ((input) & (1<<4)) != 0;
+ final Boolean pf1gbFd = ((input) & (1<<5)) != 0;
+ final Boolean pf10gbFd = ((input) & (1<<6)) != 0;
+ final Boolean pf40gbFd = ((input) & (1<<7)) != 0;
+ final Boolean pf100gbFd = ((input) & (1<<8)) != 0;
+ final Boolean pf1tbFd = ((input) & (1<<9)) != 0;
+ final Boolean pfOther = ((input) & (1<<10)) != 0;
+ final Boolean pfCopper = ((input) & (1<<11)) != 0;
+ final Boolean pfFiber = ((input) & (1<<12)) != 0;
+ final Boolean pfAutoneg = ((input) & (1<<13)) != 0;
+ final Boolean pfPause = ((input) & (1<<14)) != 0;
+ final Boolean pfPauseAsym = ((input) & (1<<15)) != 0;
+ return new PortFeatures(pf100gbFd, pf100mbFd, pf100mbHd, pf10gbFd, pf10mbFd, pf10mbHd, pf1gbFd,
+ pf1gbHd, pf1tbFd, pf40gbFd, pfAutoneg, pfCopper, pfFiber, pfOther, pfPause, pfPauseAsym);
+ }
+
+ private static PortState createPortState(long input){
+ final Boolean psLinkDown = ((input) & (1<<0)) != 0;
+ final Boolean psBblocked = ((input) & (1<<1)) != 0;
+ final Boolean psLive = ((input) & (1<<2)) != 0;
+ return new PortState(psBblocked, psLinkDown, psLive);
+ }
+
+ private static PortConfig createPortConfig(long input){
+ final Boolean pcPortDown = ((input) & (1<<0)) != 0;
+ final Boolean pcNoRecv = ((input) & (1<<2)) != 0;
+ final Boolean pcNoFwd = ((input) & (1<<5)) != 0;
+ final Boolean pcNoPacketIn = ((input) & (1<<6)) != 0;
+ return new PortConfig(pcNoFwd, pcNoPacketIn, pcNoRecv, pcPortDown);
+ }
+}