| /* |
| * Copyright 2015-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onlab.packet; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| /** |
| * Utilities for working with packet headers. |
| */ |
| public final class PacketUtils { |
| |
| private PacketUtils() { |
| } |
| |
| /** |
| * Check the length of the input buffer is appropriate given the offset and |
| * length parameters. |
| * |
| * @param byteLength length of the input buffer array |
| * @param offset offset given to begin reading bytes from |
| * @param length length given to read up until |
| * @throws DeserializationException if the input parameters don't match up (i.e |
| * we can't read that many bytes from the buffer at the given offest) |
| */ |
| public static void checkBufferLength(int byteLength, int offset, int length) |
| throws DeserializationException { |
| boolean ok = (offset >= 0 && offset < byteLength); |
| ok = ok & (length >= 0 && offset + length <= byteLength); |
| |
| if (!ok) { |
| throw new DeserializationException("Unable to read " + length + " bytes from a " |
| + byteLength + " byte array starting at offset " + offset); |
| } |
| } |
| |
| /** |
| * Check that there are enough bytes in the buffer to read some number of |
| * bytes that we need to read a full header. |
| * |
| * @param givenLength given size of the buffer |
| * @param requiredLength number of bytes we need to read some header fully |
| * @throws DeserializationException if there aren't enough bytes |
| */ |
| public static void checkHeaderLength(int givenLength, int requiredLength) |
| throws DeserializationException { |
| if (requiredLength > givenLength) { |
| throw new DeserializationException(requiredLength |
| + " bytes are needed to continue deserialization, however only " |
| + givenLength + " remain in buffer"); |
| } |
| } |
| |
| /** |
| * Check the input parameters are sane and there's enough bytes to read |
| * the required length. |
| * |
| * @param data input byte buffer |
| * @param offset offset of the start of the header |
| * @param length length given to deserialize the header |
| * @param requiredLength length needed to deserialize header |
| * @throws DeserializationException if we're unable to deserialize the |
| * packet based on the input parameters |
| */ |
| public static void checkInput(byte[] data, int offset, int length, int requiredLength) |
| throws DeserializationException { |
| checkNotNull(data); |
| checkBufferLength(data.length, offset, length); |
| checkHeaderLength(length, requiredLength); |
| } |
| } |