aboutsummaryrefslogtreecommitdiff
path: root/decode/packet.py
diff options
context:
space:
mode:
Diffstat (limited to 'decode/packet.py')
-rw-r--r--decode/packet.py232
1 files changed, 0 insertions, 232 deletions
diff --git a/decode/packet.py b/decode/packet.py
deleted file mode 100644
index 97daee1e..00000000
--- a/decode/packet.py
+++ /dev/null
@@ -1,232 +0,0 @@
-#!/usr/bin/python
-# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details:
-#
-# Copyright (C) 2011 Red Hat, Inc.
-#
-
-import binascii
-import string
-import sys
-
-import defs
-
-import wmc
-
-URBF_UNKNOWN = 0
-URBF_GET_DESC = 1
-URBF_SEL_CONF = 2
-URBF_RESET_PIPE = 3
-URBF_TRANSFER = 4
-URBF_GET_STATUS = 5
-URBF_CONTROL = 6
-URBF_SET_FEATURE = 7
-URBF_ABORT_PIPE = 8
-URBF_CLASS_IFACE = 9
-URBF_CLEAR_FEATURE = 10
-URBF_VENDOR_DEVICE = 11
-
-funcs = {
- "-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:": (URBF_GET_DESC, False, None),
- "-- URB_FUNCTION_SELECT_CONFIGURATION:": (URBF_SEL_CONF, False, None),
- "-- URB_FUNCTION_RESET_PIPE:": (URBF_RESET_PIPE, False, None),
- "-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:": (URBF_TRANSFER, True, "T"),
- "-- URB_FUNCTION_GET_STATUS_FROM_DEVICE:": (URBF_GET_STATUS, False, None),
- "-- URB_FUNCTION_CONTROL_TRANSFER:": (URBF_CONTROL, True, "C"),
- "-- URB_FUNCTION_SET_FEATURE_TO_DEVICE:": (URBF_SET_FEATURE, False, None),
- "-- URB_FUNCTION_ABORT_PIPE:": (URBF_SET_FEATURE, False, None),
- "-- URB_FUNCTION_CLASS_INTERFACE:": (URBF_CLASS_IFACE, True, "C"),
- "-- URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE:": (URBF_CLEAR_FEATURE, False, None),
- "-- URB_FUNCTION_VENDOR_DEVICE:": (URBF_VENDOR_DEVICE, False, None)
-}
-
-def get_urb_info(l):
- direction = defs.TO_UNKNOWN
-
- tsstr = ""
- if l[0] == '[':
- idx = l.find(" ms]")
- if idx <= 0:
- return (defs.TO_UNKNOWN, -1, -1)
- tsstr = l[1:idx]
-
- idx = string.find(l, ">>> URB ")
- if idx >= 0:
- direction = defs.TO_MODEM
- else:
- idx = string.find(l, "<<< URB ")
- if idx >= 0:
- direction = defs.TO_HOST
- else:
- return (defs.TO_UNKNOWN, -1, -1)
-
- # Yay, valid packet, grab URB number
- numstr = ""
- for c in l[idx + 9:]:
- if c.isdigit():
- numstr = numstr + c
- else:
- break
-
- if not len(numstr):
- raise Exception("Failed to get URB number ('%s')" % l)
-
- return (direction, int(numstr), int(tsstr))
-
-class Packet:
- def __init__(self, line, control_prot, transfer_prot):
- self.direction = defs.TO_UNKNOWN
- self.func = URBF_UNKNOWN
- self.control_prot = control_prot
- self.transfer_prot = transfer_prot
- self.data = None
- self.urbnum = 0
- self.timestamp = 0
- self.protocol = None
- self.has_data = False
- self.typecode = None
- self.lines = []
- self.in_data = False
- self.data_complete = False
- self.tmpdata = ""
- self.fcomplete = None
- self.funpack = None
- self.fshow = None
-
- # Check if this is actually a packet
- self.lines.append(line)
- (self.direction, self.urbnum, self.timestamp) = get_urb_info(line)
-
- def add_line(self, line):
- line = line.strip()
- if not len(line):
- return
- self.lines.append(line)
-
- if line[0] == '[':
- # Usually the end of a packet, but if we need data from the next
- # packet keep going
- if self.has_data and not self.data_complete:
- return False
- return True
-
- if not self.typecode:
- # haven't gotten our "-- URB_FUNCTION_xxxx" line yet
- if line.find("-- URB_FUNCTION_") >= 0:
- try:
- (self.func, self.has_data, self.typecode) = funcs[line]
- except KeyError:
- raise KeyError("URB function %s not handled" % line)
-
- if self.func == URBF_TRANSFER:
- self.protocol = self.transfer_prot
- elif self.func == URBF_CONTROL or self.func == URBF_CLASS_IFACE:
- self.protocol = self.control_prot
-
- if self.protocol:
- exec "from %s import get_funcs" % self.protocol
- (self.fcomplete, self.funpack, self.fshow) = get_funcs()
- else:
- return False # not done; need more lines
-
- if line.find("TransferBufferMDL = ") >= 0 and self.has_data:
- self.in_data = True
- return False # not done; need more lines
-
- if line.find("UrbLink = ") >= 0 or line.find("UrbLink =") >= 0:
- if self.in_data:
- self.in_data = False
-
- # special case: zero-length data means complete
- if len(self.tmpdata) == 0:
- self.data_complete = True
- return True
-
- if self.fcomplete:
- self.data_complete = self.fcomplete(self.tmpdata, self.direction)
- if self.data_complete:
- self.data = self.funpack(self.tmpdata, self.direction)
- return self.data_complete
- else:
- self.data = binascii.unhexlify(self.tmpdata)
- self.data_complete = True
- return False # not done; need more lines
-
- if self.in_data:
- if len(line) and not "no data supplied" in line:
- d = line[line.index(": ") + 2:] # get data alone
- self.tmpdata += d.replace(" ", "")
-
- return False # not done; need more lines
-
- def add_ascii(self, line, items):
- if len(line) < 53:
- line += " " * (53 - len(line))
- for i in items:
- if chr(i) in string.printable and i >= 32:
- line += chr(i)
- else:
- line += "."
- return line
-
- def show(self):
- if not self.has_data or not self.data:
- return
-
- # Ignore URBF_TRANSFER packets that appear to be returning SetupPacket data
- if self.data == chr(0xa1) + chr(0x01) + chr(0x00) + chr(0x00) + chr(0x05) + chr(0x00) + chr(0x00) + chr(0x00):
- return
-
- offset = 0
- items = []
- printed = False
- line = ""
-
- prefix = "*"
- if self.direction == defs.TO_MODEM:
- prefix = ">"
- elif self.direction == defs.TO_HOST:
- prefix = "<"
-
- if self.typecode:
- prefix = prefix + " " + self.typecode + " "
- else:
- prefix = prefix + " "
-
- prefix_printed = False
- for i in self.data:
- printed = False
- line += " %02x" % ord(i)
- items.append(ord(i))
- if len(items) % 16 == 0:
- output = "%04d: %s" % (offset, self.add_ascii(line, items))
- if offset == 0:
- print prefix + output
- else:
- print " " + output
- line = ""
- items = []
- printed = True
- offset += 16
- prefix_printed = True
-
- if not printed:
- output = "%04d: %s" % (offset, self.add_ascii(line, items))
- if prefix_printed:
- print " " + output
- else:
- print prefix + output
- print ""
-
- if self.fshow:
- self.fshow(self.data, " " * 8, self.direction)
-