Maestro is great. However it lacks so many important features you might need
For example, Maestro does not let you to coordinate multiple flow tests together. One test case I had is one phone initiating a call, and another answers it. Instead, Maestro prefers that every flow is self contained and will not run both in parallel reliably
I found many such limitations in its design only after writing a whole lot of their custom flow syntax
If you want to play with packet sockets you might find my notebook useful where I was going to implement TCP/IP from scratch (well, from layer 2 up): https://github.com/georgek/notebooks/blob/master/internet.ip... I did ICMP over IP but got bored before I got to TCP, though (it's way more complicated than IP). You could drop in your custom protocol in place of ICMP.
For example, Maestro does not let you to coordinate multiple flow tests together. One test case I had is one phone initiating a call, and another answers it. Instead, Maestro prefers that every flow is self contained and will not run both in parallel reliably
I found many such limitations in its design only after writing a whole lot of their custom flow syntax