Skip to content

Commit

Permalink
decoder: support message offset and key format
Browse files Browse the repository at this point in the history
  • Loading branch information
svinota committed May 22, 2024
1 parent 5a8ebbb commit 3ebd73d
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
10 changes: 10 additions & 0 deletions pyroute2/decoder/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,14 @@ def parse_args():
argument_parser.add_argument(
'-m', '--match', help='match protocol family (only for pcap data)'
)
argument_parser.add_argument(
'-o',
'--offset',
help='message offset in the data',
default=0,
type=int,
)
argument_parser.add_argument(
'-k', '--key', help='key format (see struct)', default='H'
)
return argument_parser.parse_args()
25 changes: 17 additions & 8 deletions pyroute2/decoder/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,20 @@

class Message:

def __init__(self, packet_header, ll_header, met, data):
def __init__(self, packet_header, ll_header, met, key, data):
self.packet_header = packet_header
self.ll_header = ll_header
self.cls = None
self.met = met
self.key = key
self.kl = struct.calcsize(self.key)
self.data = data
self.exception = None
self.msg = None

def get_message_class(self):
if hasattr(self.met, 'msg_map'):
(msg_type,) = struct.unpack('H', self.data[4:6])
(msg_type,) = struct.unpack(self.key, self.data[4 : 4 + self.kl])
return self.met.msg_map[msg_type]
return self.met

Expand Down Expand Up @@ -231,17 +233,20 @@ def match(self, packet_header, ll_header, data, offset):

class LoaderHex:

def __init__(self, data, cls, script):
def __init__(self, data, cls, key, data_offset, script):
with open(data, 'r') as f:
self.raw = load_dump(f)
self.cls = cls
self.key = key
self.offset = 0
self.matcher = Matcher(script)

@property
def data(self):
while self.offset < len(self.raw):
msg = Message(None, None, self.cls, self.raw[self.offset :])
msg = Message(
None, None, self.cls, self.key, self.raw[self.offset :]
)
msg.decode()
if self.matcher.match(None, None, self.raw, self.offset):
yield msg
Expand All @@ -250,11 +255,13 @@ def data(self):

class LoaderPcap:

def __init__(self, data, cls, script):
def __init__(self, data, cls, key, data_offset, script):
with open(data, 'rb') as f:
self.raw = f.read()
self.metadata = PcapMetaData(*struct.unpack("IHHiIII", self.raw[:24]))
self.offset = 24
self.key = key
self.data_offset = data_offset
self.cls = cls
self.matcher = Matcher(script)

Expand All @@ -279,11 +286,13 @@ def data(self):
if self.matcher.match(
packet_header, ll_header, self.raw, self.offset
):
offset = self.offset + self.data_offset
msg = Message(
packet_header,
ll_header,
self.cls,
self.raw[self.offset : self.offset + length],
self.key,
self.raw[offset : offset + length],
)
msg.decode()
yield msg
Expand All @@ -299,8 +308,8 @@ def get_loader(args):
cls = getattr(module, cls_name)

if args.format == 'pcap':
return LoaderPcap(args.data, cls, args.match)
return LoaderPcap(args.data, cls, args.key, args.offset, args.match)
elif args.format == 'hex':
return LoaderHex(args.data, cls, args.match)
return LoaderHex(args.data, cls, args.key, args.offset, args.match)
else:
raise ValueError('data format not supported')

0 comments on commit 3ebd73d

Please sign in to comment.