Balance of generality and simplicity is essential and I recommend glancing at PCIe TLP packages. Possibly a much-simplified version of this would work here.