From: Deepthi V V Date: Sun, 15 Dec 2013 07:29:50 +0000 (+0530) Subject: 1. Corrected Pbb-Isis match value length to 3 bytes as per OF 1.3 spec. X-Git-Tag: jenkins-openflowjava-bulk-release-prepare-only-1~26 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=a9e7cf7e14ae8d2763a3a15fca0145d2dd3e0fbc;p=openflowjava.git 1. Corrected Pbb-Isis match value length to 3 bytes as per OF 1.3 spec. 2. Corrected mac address length in match deserializer. Signed-off-by: Deepthi V V Change-Id: I5be0c8356d46191bf6430b7b8f855e419d5162f3 --- diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/EncodeConstants.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/EncodeConstants.java index 098ba8d9..c07ae1de 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/EncodeConstants.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/EncodeConstants.java @@ -20,7 +20,7 @@ public abstract class EncodeConstants { public static final byte OF10_VERSION_ID = 0x01; /** OpenFlow v1.0 wire protocol number */ public static final byte OF13_VERSION_ID = 0x04; - + /** Length of mac address */ public static final byte MAC_ADDRESS_LENGTH = 6; /** Number of groups in ipv4 address */ @@ -29,7 +29,7 @@ public abstract class EncodeConstants { public static final byte GROUPS_IN_IPV6_ADDRESS = 8; /** Length of ipv6 address in bytes */ public static final byte SIZE_OF_IPV6_ADDRESS_IN_BYTES = (8 * Short.SIZE) / Byte.SIZE; - + /** Length of long in bytes */ public static final byte SIZE_OF_LONG_IN_BYTES = Long.SIZE / Byte.SIZE; /** Length of int in bytes */ @@ -38,8 +38,10 @@ public abstract class EncodeConstants { public static final byte SIZE_OF_SHORT_IN_BYTES = Short.SIZE / Byte.SIZE; /** Length of byte in bytes */ public static final byte SIZE_OF_BYTE_IN_BYTES = Byte.SIZE / Byte.SIZE; + /** Length of 3 bytes */ + public static final byte SIZE_OF_3_BYTES = 3; + - /** OF v1.0 maximal port name length */ public static final byte MAX_PORT_NAME_LENGTH = 16; } diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializer.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializer.java index 668d6e41..640fc9f5 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializer.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializer.java @@ -132,7 +132,7 @@ import com.google.common.base.Joiner; public abstract class MatchDeserializer { private static final Logger LOGGER = LoggerFactory.getLogger(MatchDeserializer.class); - + /** * Creates match * @param in input ByteBuf @@ -162,7 +162,7 @@ public abstract class MatchDeserializer { } return null; } - + /** * Deserializes single match entry (oxm_field) * @param in input ByteBuf @@ -172,7 +172,7 @@ public abstract class MatchDeserializer { public static List createMatchEntry(ByteBuf in, int matchLength) { return createMatchEntriesInternal(in, matchLength, true); } - + /** * @param in input ByteBuf * @param matchLength length of match entries @@ -181,13 +181,13 @@ public abstract class MatchDeserializer { public static List createMatchEntries(ByteBuf in, int matchLength) { return createMatchEntriesInternal(in, matchLength, false); } - + private static List createMatchEntriesInternal(ByteBuf in, int matchLength, boolean oneEntry) { List matchEntriesList = new ArrayList<>(); int currLength = 0; while(currLength < matchLength) { - MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); - switch (in.readUnsignedShort()) { + MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); + switch (in.readUnsignedShort()) { case 0x0000: matchEntriesBuilder.setOxmClass(Nxm0Class.class); break; @@ -211,18 +211,18 @@ public abstract class MatchDeserializer { int matchEntryLength = in.readUnsignedByte(); currLength += EncodeConstants.SIZE_OF_SHORT_IN_BYTES + (2 * EncodeConstants.SIZE_OF_BYTE_IN_BYTES) + matchEntryLength; - + switch(matchField) { - case 0: + case 0: matchEntriesBuilder.setOxmMatchField(InPort.class); PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder(); - port.setPortNumber(new PortNumber(in.readUnsignedInt())); + port.setPortNumber(new PortNumber(in.readUnsignedInt())); matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build()); break; case 1: matchEntriesBuilder.setOxmMatchField(InPhyPort.class); PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder(); - phyPort.setPortNumber(new PortNumber(in.readUnsignedInt())); + phyPort.setPortNumber(new PortNumber(in.readUnsignedInt())); matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build()); break; case 2: @@ -236,14 +236,14 @@ public abstract class MatchDeserializer { matchEntriesBuilder.setOxmMatchField(EthDst.class); addMacAddressAugmentation(matchEntriesBuilder, in); if (hasMask) { - addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES); + addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH); } break; case 4: matchEntriesBuilder.setOxmMatchField(EthSrc.class); addMacAddressAugmentation(matchEntriesBuilder, in); if (hasMask) { - addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES); + addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH); } break; case 5: @@ -365,14 +365,14 @@ public abstract class MatchDeserializer { matchEntriesBuilder.setOxmMatchField(ArpSha.class); addMacAddressAugmentation(matchEntriesBuilder, in); if (hasMask) { - addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES); + addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH); } break; case 25: matchEntriesBuilder.setOxmMatchField(ArpTha.class); addMacAddressAugmentation(matchEntriesBuilder, in); if (hasMask) { - addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES); + addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH); } break; case 26: @@ -453,10 +453,11 @@ public abstract class MatchDeserializer { case 37: matchEntriesBuilder.setOxmMatchField(PbbIsid.class); IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder(); - isidBuilder.setIsid(in.readUnsignedInt()); + Integer isid = in.readUnsignedMedium(); + isidBuilder.setIsid(isid.longValue()); matchEntriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build()); if (hasMask) { - addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES); + addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_3_BYTES); } break; case 38: @@ -485,7 +486,7 @@ public abstract class MatchDeserializer { addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_SHORT_IN_BYTES); } break; - default: + default: break; } matchEntriesList.add(matchEntriesBuilder.build()); @@ -517,12 +518,12 @@ public abstract class MatchDeserializer { ipv6AddressBuilder.setIpv6Address(new Ipv6Address(joiner.join(groups))); builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build()); } - + private static void addMetadataAugmentation(MatchEntriesBuilder builder, ByteBuf in) { MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder(); byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE]; in.readBytes(metadataBytes); - metadata.setMetadata(metadataBytes); + metadata.setMetadata(metadataBytes); builder.addAugmentation(MetadataMatchEntry.class, metadata.build()); } @@ -544,7 +545,7 @@ public abstract class MatchDeserializer { macAddress.setMacAddress(new MacAddress(ByteBufUtils.macAddressToString(address))); builder.addAugmentation(MacAddressMatchEntry.class, macAddress.build()); } - + private static void addPortAugmentation(MatchEntriesBuilder builder, ByteBuf in) { PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder(); portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params. diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializer.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializer.java index 74ace299..b22ec0de 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializer.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializer.java @@ -198,8 +198,8 @@ public class MatchSerializer { short cfi = 1 << 12; // 13-th bit vlanVidValue = vlanVidValue | cfi; } - - writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), + + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_SHORT_IN_BYTES); out.writeShort(vlanVidValue); writeMask(entry, out, EncodeConstants.SIZE_OF_SHORT_IN_BYTES); @@ -281,7 +281,7 @@ public class MatchSerializer { writeIpv6AddressRelatedEntry(entry, out, fieldValue); } else if (field.isAssignableFrom(Ipv6Flabel.class)) { fieldValue = 28; - writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_INT_IN_BYTES); out.writeInt(entry.getAugmentation(Ipv6FlabelMatchEntry.class).getIpv6Flabel().getValue().intValue()); writeMask(entry, out, EncodeConstants.SIZE_OF_INT_IN_BYTES); @@ -317,10 +317,9 @@ public class MatchSerializer { out.writeBoolean(entry.getAugmentation(BosMatchEntry.class).isBos().booleanValue()); } else if (field.isAssignableFrom(PbbIsid.class)) { fieldValue = 37; - writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), - EncodeConstants.SIZE_OF_LONG_IN_BYTES); - out.writeInt(entry.getAugmentation(IsidMatchEntry.class).getIsid().intValue()); - writeMask(entry, out, EncodeConstants.SIZE_OF_LONG_IN_BYTES); + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_3_BYTES); + out.writeMedium(entry.getAugmentation(IsidMatchEntry.class).getIsid().intValue()); + writeMask(entry, out, EncodeConstants.SIZE_OF_3_BYTES); } else if (field.isAssignableFrom(TunnelId.class)) { fieldValue = 38; writeMetadataRelatedEntry(entry, out, fieldValue); @@ -339,7 +338,7 @@ public class MatchSerializer { map.put(7, pseudoField.isUnrep()); map.put(8, pseudoField.isUnseq()); int bitmap = ByteBufUtils.fillBitMaskFromMap(map); - + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_SHORT_IN_BYTES); out.writeShort(bitmap); @@ -370,10 +369,10 @@ public class MatchSerializer { fieldAndMask |= 1; length *= 2; } - + out.writeByte(fieldAndMask); out.writeByte(length); - + } private static void writeMetadataRelatedEntry(MatchEntries entry, ByteBuf out, int value) { @@ -386,7 +385,7 @@ public class MatchSerializer { private static void writeMacAddressRelatedEntry(MatchEntries entry, ByteBuf out, int value) { int fieldValue = value; - + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.MAC_ADDRESS_LENGTH); String macAddress = entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue(); @@ -396,7 +395,7 @@ public class MatchSerializer { private static void writeIpv4AddressRelatedEntry(MatchEntries entry, ByteBuf out, int value) { int fieldValue = value; - + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_INT_IN_BYTES); writeIpv4Address(entry, out); @@ -420,7 +419,7 @@ public class MatchSerializer { } else { address = parseIpv6Address(textAddress.split(":")); } - + writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES); for (int i = 0; i < address.length; i++) { @@ -579,7 +578,7 @@ public class MatchSerializer { } else if (field.isAssignableFrom(MplsBos.class)) { length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES; } else if (field.isAssignableFrom(PbbIsid.class)) { - length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES); + length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_3_BYTES); } else if (field.isAssignableFrom(TunnelId.class)) { length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_LONG_IN_BYTES); } else if (field.isAssignableFrom(Ipv6Exthdr.class)) {