Checksum for GLES messages from host to guest
Add checksum for GLES messages from host to guest. This patch contains
generated code (gl_enc.cpp, gl2_enc.cpp, renderControl_enc.cpp) and
shared code with the host (ChecksumCalculator.cpp,
ChecksumCalculator.h).
Change-Id: I577a34cae5208d3f11a165f861a69fa0971cf864
diff --git a/shared/OpenglCodecCommon/ChecksumCalculator.h b/shared/OpenglCodecCommon/ChecksumCalculator.h
index 7884a8d..4cc231a 100644
--- a/shared/OpenglCodecCommon/ChecksumCalculator.h
+++ b/shared/OpenglCodecCommon/ChecksumCalculator.h
@@ -35,7 +35,9 @@
// (1) take a list of buffers one by one and compute their checksum string,
// in this case the checksum should be as the data in those buffers are
// concatenated;
-// (2) take a buffer and a checksum string, tell if they match;
+// (2) compute the checksum of the buffer list, then either write them into
+// a buffer provided by user, or compare it against a checksum provided
+// by user
// (3) support different checksum version in future.
//
// For backward compatibility, checksum version 0 behaves the same as there is
@@ -48,11 +50,11 @@
//
// To evaluate checksums from a list of data buffers buf1, buf2... Please call
// addBuffer(buf1, buf1len), addBuffer(buf2, buf2len) ... in order.
-// Then allocate a checksum buffer with size checksumByteSize(), and call
+// Then if the checksum needs to be encoded into a buffer, one needs to allocate
+// a checksum buffer with size checksumByteSize(), and call
// writeChecksum(checksumBuffer) to write the checksum to the buffer.
-//
-// To calculate if a data buffer match its checksum, please call
-// validate(buf, bufLen, checksumBuffer)
+// If the checksum needs to be validated against an existing one, one needs to
+// call validate(existChecksum, existChecksumLen).
//
// The checksum generator and validator must be set to the same version, and
// the validator must check ALL checksums in the order they are generated,
@@ -68,14 +70,15 @@
// ChecksumCalculator encoder;
// encoder.setVersion(1);
// encoder.addBuffer(buf, bufLen);
-// std::vector<unsigned char> message(bufLen + checksumByteSize());
+// std::vector<unsigned char> message(bufLen + encoder.checksumByteSize());
// memcpy(&message[0], buf, bufLen);
-// encoder.writeChecksum(&message[0] + bufLen, checksumByteSize());
+// encoder.writeChecksum(&message[0] + bufLen, encoder.checksumByteSize());
//
// // decoding message
// ChecksumCalculator decoder;
// decoder.setVersion(1);
-// return decoder.validate(&message[0], bufLen, &message[0] + bufLen);
+// decoder.addBuffer(&message[0], bufLen);
+// return decoder.validate(&message[0] + bufLen, decoder.checksumByteSize());
// }
// The return value is true.
//
@@ -87,28 +90,34 @@
// ChecksumCalculator encoder;
// encoder.setVersion(1);
//
-// std::vector<unsigned char> message1(bufLen1 + checksumByteSize());
-// std::vector<unsigned char> message2(bufLen2 + checksumByteSize());
+// std::vector<unsigned char> message1(bufLen1 + encoder.checksumByteSize());
+// std::vector<unsigned char> message2(bufLen2 + encoder.checksumByteSize());
//
// encoder.addBuffer(buf1, bufLen1);
-// std::vector<unsigned char> message1(bufLen1 + checksumByteSize());
+// std::vector<unsigned char> message1(bufLen1 + encoder.checksumByteSize());
// memcpy(&message1[0], buf1, bufLen1);
-// encoder.writeChecksum(&message1[0] + bufLen1, checksumByteSize());
+// encoder.writeChecksum(&message1[0] + bufLen1, encoder.checksumByteSize());
//
// encoder.addBuffer(buf2, bufLen2);
-// std::vector<unsigned char> message2(bufLen2 + checksumByteSize());
+// std::vector<unsigned char> message2(bufLen2 + encoder.checksumByteSize());
// memcpy(&message2[0], buf2, bufLen2);
-// encoder.writeChecksum(&message2[0] + bufLen2, checksumByteSize());
+// encoder.writeChecksum(&message2[0] + bufLen2, encoder.checksumByteSize());
//
// // decoding messages
// ChecksumCalculator decoder;
// decoder.setVersion(1);
+// decoder.addBuffer(&message2[0], bufLen2);
// // returns false because the decoding order is not consistent with
// // encoding order
-// if (decoder.validate(&message2[0], bufLen2, &message2[0] + bufLen2) &&
-// decoder.validate(&message1[0], bufLen1, &message1[0] + bufLen1) ) {
-// return true;
+// if (!decoder.validate(&message2[0]+bufLen2, decoder.checksumByteSize())) {
+// return false;
// }
+//
+// decoder.addBuffer(&message1[0], bufLen1);
+// if (!decoder.validate(&message1[0]+bufLen1, decoder.checksumByteSize())) {
+// return false;
+// }
+//
// return false;
// }
@@ -141,18 +150,20 @@
// the final checksum value and reset its state.
void addBuffer(const void* buf, size_t bufLen);
// Write the checksum from the list of buffers to outputChecksum
+ // Will reset the list of buffers by calling resetChecksum.
// Return false if the buffer is not long enough
// Please query buffer size from checksumByteSize()
bool writeChecksum(void* outputChecksum, size_t outputChecksumLen);
// Restore the states for computing checksums.
- // Automatically called at the end of writeChecksum.
+ // Automatically called at the end of writeChecksum and validate.
// Can also be used to abandon the current checksum being calculated.
// Notes: it doesn't update the internal read / write counter
void resetChecksum();
- // Calculate the checksum of a packet (with size specified by packetLen),
- // and compare it with the checksum encoded in expectedChecksum
- bool validate(const void* buf, size_t bufLen, const void* expectedChecksum);
+ // Calculate the checksum from the list of buffers and
+ // compare it with the checksum encoded in expectedChecksum
+ // Will reset the list of buffers by calling resetChecksum.
+ bool validate(const void* expectedChecksum, size_t expectedChecksumLen);
protected:
uint32_t m_version = 0;
// A temporary state used to compute the total length of a list of buffers,
@@ -164,7 +175,7 @@
private:
// Compute a 32bit checksum
// Used in protocol v1
- static uint32_t computeV1Checksum(const void* buf, size_t bufLen);
+ uint32_t computeV1Checksum();
// The buffer used in protocol version 1 to compute checksum.
uint32_t m_v1BufferTotalLength = 0;
};