Impulsion
Impulsion is a bit-optimised format for communication between NeL server and client.
Impulsion Format
The basic header format for impulsions is simple:
packetNumber: 32-bit signed integer systemMode: 1-bit bool, if this is a system impulsion or not
For system-mode impulsions (which are used for connection and deconnection “meta” messages) there are 10 types, identified by the next number:
systemMessageType: 8-bit unsigned integer, meaning:
| 0 | SYSTEM_LOGIN_CODE | client → server |
| 1 | SYSTEM_SYNC_CODE | server → client |
| 2 | SYSTEM_ACK_SYNC_CODE | client → server |
| 3 | SYSTEM_PROBE_CODE | server → client |
| 4 | SYSTEM_ACK_PROBE_CODE | client → server |
| 5 | SYSTEM_DISCONNECTION_CODE | client → server |
| 6 | SYSTEM_STALLED_CODE | server → client |
| 7 | SYSTEM_SERVER_DOWN_CODE | server → client |
| 8 | SYSTEM_QUIT_CODE | client → server |
| 9 | SYSTEM_ACK_QUIT_CODE | server → client |
For normal impulsions:
ackNumber: 32-bit signed integer (packetNumber which is acked by this packet?)
Then there are three levels, each of which looks like follows:
channelPresent: 1-bit bool, if there is anything sent in this channel or not
shortCode: 1-bit bool, if the action code is only 2 bits or 8 bits
actionCode: either 2-bit or 8-bit unsigned integer, 2-bit if shortCode is true, meaning:
| 0 | ACTION_POSITION_CODE | for sending position of a creature (not checked) |
| 1 | ACTION_GENERIC_CODE | for sending generic data in just one impulsion |
| 2 | ACTION_GENERIC_MULTI_PART_CODE | for sending generic data split over impulsions |
| 3 | ACTION_SINT64 | for sending any properties, how to decode correct size? |
| 10 | ACTION_SYNC_CODE | ? |
| 11 | ACTION_DISCONNECTION_CODE | ? |
| 12 | ACTION_ASSOCIATION_CODE | ? |
| 13 | ACTION_LOGIN_CODE | ? |
| 40 | ACTION_TARGET_SLOT_CODE | ? |
| 99 | ACTION_DUMMY_CODE | ? |
Wireshark
The git repository with the layer5 (inter-service communication on server) lua dissector for wireshark, now also includes a start for impulsion dissection. For now it just dissects specified UDP port (47851) so you might have to change that for it to work (in nelimpulsion.lua:198). Also for now it just dissects some system messages (types 0-4) and a start for normal impulsion dissection.
Since it's somewhat complicated, and bit-wise dissection in wireshark is quite annoying to do, this is very much work in progress still. A lot has to be understood and correctly dissected still.





