Impulsion is a bit-optimised format for communication between NeL server and client.
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 | ? |
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.