summaryrefslogtreecommitdiff
path: root/net/dispatcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'net/dispatcher.py')
-rw-r--r--net/dispatcher.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/net/dispatcher.py b/net/dispatcher.py
new file mode 100644
index 0000000..115212c
--- /dev/null
+++ b/net/dispatcher.py
@@ -0,0 +1,27 @@
+from construct import Struct, ULInt16, MetaField
+from loggers import netlog
+from packetlen import packet_lengths
+
+
+def dispatch(stream, protodef):
+ opcode = ULInt16("opcode").parse_stream(stream)
+
+ if opcode in protodef:
+ func, macro = protodef[opcode]
+ data = macro.parse_stream(stream)
+ func(data)
+ else:
+ data = ''
+ pktlen = packet_lengths.get(opcode, -1)
+
+ if pktlen > 0:
+ data = stream.read(pktlen - 2)
+ elif pktlen == -1:
+ datadef = Struct("data",
+ ULInt16("length"),
+ MetaField("ignore",
+ lambda ctx: ctx["length"] - 4))
+ data = datadef.parse_stream(stream)
+
+ netlog.warning('UNIMPLEMENTED opcode={:04x} data={}'.format(
+ opcode, data))