design help/questions
Amritansh Raghav
amritansh at mobilian.com
Wed Jan 17 16:58:11 EST 2001
More information about the Python-list mailing list
Wed Jan 17 16:58:11 EST 2001
- Previous message (by thread): design help/questions
- Next message (by thread): Python and Industry
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Thanks The reason I didnt want to do it in C was to allow the parser to be extended easily. I did look at the pack and unpack and they seem to do what I want. I just need to build the dictionary now "Donn Cave" <donn at u.washington.edu> wrote in message news:9452jt$s8e$1 at nntp6.u.washington.edu... > 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
- Previous message (by thread): design help/questions
- Next message (by thread): Python and Industry
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list