diff options
Diffstat (limited to 'tester/rt/tftpy/TftpPacketFactory.py')
-rw-r--r-- | tester/rt/tftpy/TftpPacketFactory.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tester/rt/tftpy/TftpPacketFactory.py b/tester/rt/tftpy/TftpPacketFactory.py new file mode 100644 index 0000000..928fe07 --- /dev/null +++ b/tester/rt/tftpy/TftpPacketFactory.py @@ -0,0 +1,42 @@ +"""This module implements the TftpPacketFactory class, which can take a binary +buffer, and return the appropriate TftpPacket object to represent it, via the +parse() method.""" + +from __future__ import absolute_import, division, print_function, unicode_literals +from .TftpShared import * +from .TftpPacketTypes import * + +class TftpPacketFactory(object): + """This class generates TftpPacket objects. It is responsible for parsing + raw buffers off of the wire and returning objects representing them, via + the parse() method.""" + def __init__(self): + self.classes = { + 1: TftpPacketRRQ, + 2: TftpPacketWRQ, + 3: TftpPacketDAT, + 4: TftpPacketACK, + 5: TftpPacketERR, + 6: TftpPacketOACK + } + + def parse(self, buffer): + """This method is used to parse an existing datagram into its + corresponding TftpPacket object. The buffer is the raw bytes off of + the network.""" + log.debug("parsing a %d byte packet" % len(buffer)) + (opcode,) = struct.unpack("!H", buffer[:2]) + log.debug("opcode is %d" % opcode) + packet = self.__create(opcode) + packet.buffer = buffer + return packet.decode() + + def __create(self, opcode): + """This method returns the appropriate class object corresponding to + the passed opcode.""" + tftpassert(opcode in self.classes, + "Unsupported opcode: %d" % opcode) + + packet = self.classes[opcode]() + + return packet |