Skip to content

Instantly share code, notes, and snippets.

@Arachnid
Last active December 29, 2015 07:49
Show Gist options
  • Save Arachnid/7639044 to your computer and use it in GitHub Desktop.
Save Arachnid/7639044 to your computer and use it in GitHub Desktop.
class MessageHeader(object):
def __init__(self, priority, protocol):
self.priority = priority
self.protocol = protocol
self.sender = None
def decode(bits):
priority = bits.read('uint:2')
broadcast = bits.read('bool')
if broadcast:
message = decodeBroadcast(priority, bits)
else:
message = decodeUnicast(priority, bits)
message.sender = bits.read('uint:8')
return message
broadcast_protocols = {
}
def decodeBroadcast(priority, bits):
protocol = bits.read('uint:4')
return broadcast_protocols.get(protocol, decodeUnknownBroadcast)(priority, protocol, bits)
def decodeUnknownBroadcast(priority, protocol, bits):
subfields = bits.read('bits:14')
return UnknownBroadcastHeader(priority, protocol, subfields)
class UnknownBroadcastHeader(MessageHeader):
def __init__(self, priority, protocol, subfields):
super(UnknownBroadcastHeader, self).__init__(priority, protocol)
self.subfields = subfields
unicast_protocols = {
0: decodeYARP,
1: decodeRAP,
}
def decodeUnicast(priority, bits):
protocol = bits.read('uint:4')
ret = unicast_protocols.get(protocol, decodeUnknownUnicast)(priority, protocol, bits)
ret.recipient = bits.read('uint:8')
def decodeUnknownUnicast(priority, protocol, bits):
subfields = bits.read('bits:6')
return UnknownUnicastHeader(priority, protocol, subfields)
class UnicastHeader(MessageHeader):
def __init__(self, priority, protocol):
super(UnicastHeader, self).__init__(priority, protocol)
class UnknownUnicastHeader(UnicastHeader):
def __init__(self, priority, protocol, subfields):
super(UnknownUnicastHeader, self).__init__(priority, protocol)
self.subfields = subfields
def decodeYARP(priority, protocol, bits):
query = bits.read('bool')
response = bits.read('bool')
has_hwid = bits.read('bool')
bits.read('pad:3')
return YARPHeader(priority, query, response, has_hwid)
class YARPHeader(UnicastHeader):
def __init__(self, priority, query, response, has_hwid):
super(YARPHeader, self).__init__(priority, 0)
self.query = query
self.response = response
self.has_hwid = has_hwid
def decodeRAP(priority, protocol, bits):
write = bits.read('bool')
response = bits.read('bool')
bits.read('pad:1')
size = bits.read('uint:3')
return RAPHeader(priority, write, response, size)
class RAPHeader(UnicastHeader):
def __init__(self, priority, write, response, size):
super(RAPHeader, self).__init__(priority, 1)
self.write = write
self.response = response
self.size = size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment