diff --git a/src/uas/QGCUASFileManager.cc b/src/uas/QGCUASFileManager.cc index 3541deaf51038b925292b67efa70c8cc722ec43a..ad07f3033aad4c4918a2bbb4810bc6ed906d62c4 100644 --- a/src/uas/QGCUASFileManager.cc +++ b/src/uas/QGCUASFileManager.cc @@ -80,7 +80,7 @@ QGCUASFileManager::QGCUASFileManager(QObject* parent, UASInterface* uas, uint8_t _systemIdServer = _mav->getUASID(); // Make sure we don't have bad structure packing - Q_ASSERT(sizeof(RequestHeader) == 12); + Q_ASSERT(sizeof(RequestHeader) == 16); } /// @brief Calculates a 32 bit CRC for the specified request. @@ -95,6 +95,9 @@ quint32 QGCUASFileManager::crc32(Request* request, unsigned state) // Always calculate CRC with 0 initial CRC value quint32 crcSave = request->hdr.crc32; request->hdr.crc32 = 0; + request->hdr.padding[0] = 0; + request->hdr.padding[1] = 0; + request->hdr.padding[2] = 0; for (size_t i=0; i < cbData; i++) state = crctab[(state ^ data[i]) & 0xff] ^ (state >> 8); diff --git a/src/uas/QGCUASFileManager.h b/src/uas/QGCUASFileManager.h index 4c41eb34e120b7568a0d553a275dae12adb0dfe1..9571f11bff5a513b5b49cf6a75ae422146c4deef 100644 --- a/src/uas/QGCUASFileManager.h +++ b/src/uas/QGCUASFileManager.h @@ -75,16 +75,17 @@ public slots: protected: - /// @brief This is the fixed length portion of the protocol data. This structure is layed out such that it should not require - /// any special compiler packing to not consume extra space. + /// @brief This is the fixed length portion of the protocol data. Trying to pack structures across differing compilers is + /// questionable, so we pad the structure ourselves to 32 bit alignment which should get us what we want. struct RequestHeader { - uint16_t seqNumber; ///< sequence number for message - unsigned int session:4; ///< Session id for read and write commands - unsigned int opcode:4; ///< Command opcode - uint8_t size; ///< Size of data - uint32_t crc32; ///< CRC for entire Request structure, with crc32 set to 0 - uint32_t offset; ///< Offsets for List and Read commands + uint16_t seqNumber; ///< sequence number for message + uint8_t session; ///< Session id for read and write commands + uint8_t opcode; ///< Command opcode + uint8_t size; ///< Size of data + uint8_t padding[3]; + uint32_t crc32; ///< CRC for entire Request structure, with crc32 and padding set to 0 + uint32_t offset; ///< Offsets for List and Read commands }; struct Request