Struct - Unbekannte Größe eines Arrays - Was mache ich Falsch ?

Übertragen (Serialisieren) von Objekten ist nicht trivial.
Den Zeiger uint8_t * payload brauchst du nicht zu übertragen, wohl aber die Größe der payload ( und den Inhalt, natürlich ).
Dwer Zeiger muss dann beim Erzeugen eines PACKET neu erstellt werden.

In C macht man es alternativ gern auch mal so, dass die struct packet ihre eigene variable Größe enthält und die payload Daten selbst, statt eines Zeigers darauf:

struct PACKET {
  uint8_t size;     // Gesamtgröße eines PACKET incl. payload
  uint8_t header;
  uint8_t length;    // mir unklar, ob das redundant ist 
  uint8_t function;
  uint8_t multivar;
  uint8_t source[4];
  uint8_t destination[4];
  uint8_t payload[1];  // variable Größe
};

size kannst du beim Empfangen nehmen um dir den erforderlichen Speicher zu besorgen,
und um zu wissen, wieviele bytes ( inkl. payload ) kopiert werden müssen.

sizeof macht dann natürlich nicht viel Sinn...