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