I don't understand why you dedicate 36 bytes to callsigns in all packets? Given the super low data rates of lora packets length is at a premium. You could easily use 1 byte to encode a few callsign lengths for all three callsigns followed by the variable-length callsign chars. E.g. 2 bits per callsign to select lengths [5, 8, 10, 12]. Use one of the extra bits to encode whether a digipeter callsign is present at all. In many situations you'd end up with 17 bytes instead of 36, e.g. messages between callsigns of the style n1xyz-11. Just a thought...
Also, do you repeat the packet length and a CRC in the packet payload? LoRa framing already gives you both...
I don't understand why you dedicate 36 bytes to callsigns in all packets? Given the super low data rates of lora packets length is at a premium. You could easily use 1 byte to encode a few callsign lengths for all three callsigns followed by the variable-length callsign chars. E.g. 2 bits per callsign to select lengths [5, 8, 10, 12]. Use one of the extra bits to encode whether a digipeter callsign is present at all. In many situations you'd end up with 17 bytes instead of 36, e.g. messages between callsigns of the style n1xyz-11. Just a thought...
Also, do you repeat the packet length and a CRC in the packet payload? LoRa framing already gives you both...