design help/questions

Donn Cave donn at u.washington.edu
Wed Jan 17 16:25:17 EST 2001


Quoth "Amritansh Raghav" <amritansh at mobilian.com>:

| So here is what I need to do. I'm trying to write a scripting tool for our
| test team. They wish to send arbitrary packets over the network.  What I'd
| like to do is allow the testers to specify any packet in a text file - say
| something like this:
| <IP>
|     "VersionLength"          0        1    # Name of field, Starting offset,
| Length in bytes
|     "TOS"                        1        1
|     "Length"                     2        2
|     "Id"                            4        2
|     "Offset"                      6        2
|     "TTL"                        8        1
|     "ProtoId"                    9        1
|     CheckSum"                10        2
|     "Source"                   12        4
|     "Dest"                        16        4
| </IP>
|
| Once they have specified this, the tester should be able to create a packet
| an assign values to the field, or receive a packet and parse out its
| contents.
| so a script should be able to say
| p = read()
| if p["ProtoId"] == 17:
|     # do something here for UDP packets
|
| Solution
|     I have written a DLL  which can open/close/read/write to an ethernet
| device. I've got it interfacing to Python. It can accept a buffer and return
| a buffer. I've looked at socketmodule.c to get most of that figured out. I
| assume what I need to do is build a dictionary whose keys are the field
| names of a packet and then write a parser to fill in the values into the
| dictionary. I also need something to parse the text file description.
|
| If someone has done something like this before, or can point me to helpful
| scripts and source, I would be grateful.

If I understand this, I think at the lowest level the options are few.
I think since you're already writing C extensions, you might find it
simpler to make the buffer into a tuple there, but if you want to do
it in Python, you can use struct.unpack.  See your documentation, or
print struct.__doc__.

Then it's up to you how to map this tuple to the field names.  I think
one candidate would be a class ...

   class Packet:
       def __init__(self, buffer = None):
           if buffer is None:
               self.VersionLength = 1
               ... # default values
           else:
               self.unpack(buffer)
       def unpack(self, buffer):
           self.VersionLength, ... = struct.unpack('B...', buffer)
       def pack(self):
           return struct.pack('B...', self.VersionLength, ...)

   packet = Packet(buffer)
   packet.ProtoId = 17
   buffer = packet.pack()

	Donn Cave, donn at u.washington.edu



More information about the Python-list mailing list