Blame source/vdo/base/header.c

Packit Service 310c69
/*
Packit Service 310c69
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service 310c69
 *
Packit Service 310c69
 * This program is free software; you can redistribute it and/or
Packit Service 310c69
 * modify it under the terms of the GNU General Public License
Packit Service 310c69
 * as published by the Free Software Foundation; either version 2
Packit Service 310c69
 * of the License, or (at your option) any later version.
Packit Service 310c69
 * 
Packit Service 310c69
 * This program is distributed in the hope that it will be useful,
Packit Service 310c69
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 310c69
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 310c69
 * GNU General Public License for more details.
Packit Service 310c69
 * 
Packit Service 310c69
 * You should have received a copy of the GNU General Public License
Packit Service 310c69
 * along with this program; if not, write to the Free Software
Packit Service 310c69
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 310c69
 * 02110-1301, USA. 
Packit Service 310c69
 *
Packit Service 310c69
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/header.c#5 $
Packit Service 310c69
 */
Packit Service 310c69
Packit Service 310c69
#include "header.h"
Packit Service 310c69
Packit Service 310c69
#include "logger.h"
Packit Service 310c69
#include "permassert.h"
Packit Service 310c69
#include "statusCodes.h"
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int validateVersion(VersionNumber  expectedVersion,
Packit Service 310c69
                    VersionNumber  actualVersion,
Packit Service 310c69
                    const char    *componentName)
Packit Service 310c69
{
Packit Service 310c69
  if (!areSameVersion(expectedVersion, actualVersion)) {
Packit Service 310c69
    return logErrorWithStringError(VDO_UNSUPPORTED_VERSION,
Packit Service 310c69
                                   "%s version mismatch,"
Packit Service 310c69
                                   " expected %d.%d, got %d.%d",
Packit Service 310c69
                                   componentName,
Packit Service 310c69
                                   expectedVersion.majorVersion,
Packit Service 310c69
                                   expectedVersion.minorVersion,
Packit Service 310c69
                                   actualVersion.majorVersion,
Packit Service 310c69
                                   actualVersion.minorVersion);
Packit Service 310c69
  }
Packit Service 310c69
  return VDO_SUCCESS;
Packit Service 310c69
}
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int validateHeader(const Header *expectedHeader,
Packit Service 310c69
                   const Header *actualHeader,
Packit Service 310c69
                   bool          exactSize,
Packit Service 310c69
                   const char   *componentName)
Packit Service 310c69
{
Packit Service 310c69
  if (expectedHeader->id != actualHeader->id) {
Packit Service 310c69
    return logErrorWithStringError(VDO_INCORRECT_COMPONENT,
Packit Service 310c69
                                   "%s ID mismatch, expected %d, got %d",
Packit Service 310c69
                                   componentName,
Packit Service 310c69
                                   expectedHeader->id,
Packit Service 310c69
                                   actualHeader->id);
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  int result = validateVersion(expectedHeader->version,
Packit Service 310c69
                               actualHeader->version,
Packit Service 310c69
                               componentName);
Packit Service 310c69
  if (result != VDO_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  if ((expectedHeader->size > actualHeader->size)
Packit Service 310c69
      || (exactSize && (expectedHeader->size < actualHeader->size))) {
Packit Service 310c69
    return logErrorWithStringError(VDO_UNSUPPORTED_VERSION,
Packit Service 310c69
                                   "%s size mismatch, expected %zu, got %zu",
Packit Service 310c69
                                   componentName,
Packit Service 310c69
                                   expectedHeader->size,
Packit Service 310c69
                                   actualHeader->size);
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  return VDO_SUCCESS;
Packit Service 310c69
}
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int encodeHeader(const Header *header, Buffer *buffer)
Packit Service 310c69
{
Packit Service 310c69
  if (!ensureAvailableSpace(buffer, ENCODED_HEADER_SIZE)) {
Packit Service 310c69
    return UDS_BUFFER_ERROR;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  int result = putUInt32LEIntoBuffer(buffer, header->id);
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  result = encodeVersionNumber(header->version, buffer);
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  return putUInt64LEIntoBuffer(buffer, header->size);
Packit Service 310c69
}
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int encodeVersionNumber(VersionNumber version, Buffer *buffer)
Packit Service 310c69
{
Packit Service 310c69
  PackedVersionNumber packed = packVersionNumber(version);
Packit Service 310c69
  return putBytes(buffer, sizeof(packed), &packed);
Packit Service 310c69
}
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int decodeHeader(Buffer *buffer, Header *header)
Packit Service 310c69
{
Packit Service 310c69
  ComponentID id;
Packit Service 310c69
  int result = getUInt32LEFromBuffer(buffer, &id;;
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  VersionNumber version;
Packit Service 310c69
  result = decodeVersionNumber(buffer, &version);
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  uint64_t size;
Packit Service 310c69
  result = getUInt64LEFromBuffer(buffer, &size);
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  *header = (Header) {
Packit Service 310c69
    .id      = id,
Packit Service 310c69
    .version = version,
Packit Service 310c69
    .size    = size,
Packit Service 310c69
  };
Packit Service 310c69
  return UDS_SUCCESS;
Packit Service 310c69
}
Packit Service 310c69
Packit Service 310c69
/**********************************************************************/
Packit Service 310c69
int decodeVersionNumber(Buffer *buffer, VersionNumber *version)
Packit Service 310c69
{
Packit Service 310c69
  PackedVersionNumber packed;
Packit Service 310c69
  int result = getBytesFromBuffer(buffer, sizeof(packed), &packed);
Packit Service 310c69
  if (result != UDS_SUCCESS) {
Packit Service 310c69
    return result;
Packit Service 310c69
  }
Packit Service 310c69
Packit Service 310c69
  *version = unpackVersionNumber(packed);
Packit Service 310c69
  return UDS_SUCCESS;
Packit Service 310c69
}