import io.netty.buffer.ByteBuf;\r
\r
import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
\r
import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionTypeV10;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.CapabilitiesV10;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortStateV10;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPortBuilder;\r
\r
/**\r
+ * Translates FeaturesReply messages (OpenFlow v1.0)\r
* @author michal.polkorab\r
- *\r
*/\r
public class OF10FeaturesReplyMessageFactory implements OFDeserializer<GetFeaturesOutput> {\r
\r
- private static final byte MAC_ADDRESS_LENGTH = 6;\r
- private static final byte MAX_PORT_NAME_LENGTH = 16;\r
- \r
private static final byte PADDING_IN_FEATURES_REPLY_HEADER = 3;\r
\r
private static OF10FeaturesReplyMessageFactory instance;\r
rawMessage.skipBytes(PADDING_IN_FEATURES_REPLY_HEADER);\r
builder.setCapabilitiesV10(createCapabilitiesV10(rawMessage.readUnsignedInt()));\r
builder.setActionsV10(createActionsV10(rawMessage.readUnsignedInt()));\r
- deserializePort(rawMessage, builder);\r
+ List<PhyPort> ports = new ArrayList<>();\r
+ while (rawMessage.readableBytes() > 0) {\r
+ ports.add(deserializePort(rawMessage));\r
+ }\r
+ builder.setPhyPort(ports);\r
return builder.build();\r
}\r
\r
SET_VLAN_PCP, SET_VLAN_VID, STRIP_VLAN, VENDOR);\r
}\r
\r
- private static void deserializePort(ByteBuf rawMessage, GetFeaturesOutputBuilder builder) {\r
+ private static PhyPort deserializePort(ByteBuf rawMessage) {\r
+ PhyPortBuilder builder = new PhyPortBuilder();\r
builder.setPortNo((long) rawMessage.readUnsignedShort());\r
- StringBuffer macToString = new StringBuffer();\r
- for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){\r
- short mac = rawMessage.readUnsignedByte();\r
- macToString.append(String.format("%02X", mac));\r
- }\r
- builder.setHwAddr(new MacAddress(macToString.toString()));\r
- byte[] name = new byte[MAX_PORT_NAME_LENGTH];\r
- rawMessage.readBytes(name);\r
- builder.setName(name.toString());\r
+ byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
+ rawMessage.readBytes(address);\r
+ builder.setHwAddr(new MacAddress(ByteBufUtils.macAddressToString(address)));\r
+ builder.setName(ByteBufUtils.decodeNullTerminatedString(rawMessage, EncodeConstants.MAX_PORT_NAME_LENGTH));\r
builder.setConfigV10(createPortConfig(rawMessage.readUnsignedInt()));\r
builder.setStateV10(createPortState(rawMessage.readUnsignedInt()));\r
builder.setCurrentFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
builder.setAdvertisedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
builder.setSupportedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
builder.setPeerFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
+ return builder.build();\r
}\r
+\r
+ \r
\r
private static PortStateV10 createPortState(long input){\r
final Boolean _linkDown = ((input) & (1<<0)) != 0;\r