aboutsummaryrefslogtreecommitdiff
path: root/decode/wmc.py
diff options
context:
space:
mode:
Diffstat (limited to 'decode/wmc.py')
-rw-r--r--decode/wmc.py410
1 files changed, 0 insertions, 410 deletions
diff --git a/decode/wmc.py b/decode/wmc.py
deleted file mode 100644
index f710407f..00000000
--- a/decode/wmc.py
+++ /dev/null
@@ -1,410 +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 struct
-import defs
-
-def complete(data, direction):
- if direction == defs.TO_MODEM:
- if data[len(data) - 2:] == "0d" or data[len(data) - 2:] == "7e":
- return True
- elif direction == defs.TO_HOST:
- if data[len(data) - 6:] == "30307e":
- # UML190 and UML290 fake CRC + term
- return True
- elif data[len(data) - 2:] == "7e":
- # PC5740 uses a real CRC
- return True
- else:
- raise ValueError("No data direction")
- return False
-
-
-def unpack(data, direction):
- # unpack the data
- if direction == defs.TO_MODEM:
- if data[:14] == "41542a574d433d":
- # remove the AT*WMC= bits, and the newline and CRC at the end
- data = data[14:]
- if data[len(data) - 2:] == "0d":
- data = data[:len(data) - 6]
- elif data[:2] == "c8" and data[len(data) - 2:] == "7e":
- # PC5740 doesn't use AT*WMC= framing
- data = data[:len(data) - 6]
- else:
- print "asdfasdfasfaf"
- elif direction == defs.TO_HOST:
- if data[len(data) - 2:] == "7e":
- # remove HDLC terminator and CRC
- data = data[:len(data) - 6]
- else:
- raise ValueError("No data direction")
-
- data = binascii.unhexlify(data)
-
- # PPP-unescape it
- escape = False
- new_data = ""
- for i in data:
- if ord(i) == 0x7D:
- escape = True
- elif escape == True:
- new_data += chr(ord(i) ^ 0x20)
- escape = False
- else:
- new_data += i
-
- return new_data
-
-def show_data(data, prefix):
- line = ""
- for i in data:
- line += " %02x" % ord(i)
- print prefix + " Data: %s" % line
-
-def show_device_info(data, prefix, direction):
- if direction != defs.TO_HOST:
- return
-
- fmt = "<"
- fmt += "27s" # unknown1
- fmt += "64s" # manf
- fmt += "64s" # model
- fmt += "64s" # fwrev
- fmt += "64s" # hwrev
- fmt += "64s" # unknown2
- fmt += "64s" # unknown3
- fmt += "10s" # min
- fmt += "12s" # unknown4
- fmt += "H" # home_sid
- fmt += "2s" # unknown5
- fmt += "H" # prlver
- fmt += "2s" # unknown6
- fmt += "H" # eriver
- fmt += "4s" # unknown7
-
- expected = struct.calcsize(fmt)
- if len(data) >= expected:
- (u1, manf, model, fwrev, hwrev, u2, u3, cdmamin, u4, homesid, u5, prlver, \
- u6, eriver, u7) = struct.unpack(fmt, data[:expected])
- print prefix + " Manf: %s" % manf
- print prefix + " Model: %s" % model
- print prefix + " FW Rev: %s" % fwrev
- print prefix + " HW Rev: %s" % hwrev
- print prefix + " MIN: %s" % cdmamin
- print prefix + " Home SID: %d" % homesid
- print prefix + " PRL Ver: %d" % prlver
- print prefix + " ERI Ver: %d" % eriver
- else:
- raise ValueError("Unexpected Info command response len (got %d expected %d)" % (len(data), expected))
-
- fmt2 = "<"
- fmt2 += "64s" # unknown8
- fmt2 += "14s" # meid
- fmt2 += "6s" # unknown10
- fmt2 += "16s" # imei
- fmt2 += "6s" # unknown11
- fmt2 += "16s" # unknown12
- fmt2 += "20s" # iccid
- fmt2 += "6s" # unknown13
-
- expected2 = struct.calcsize(fmt2)
- if len(data) >= expected + expected2:
- (u8, meid, u10, imei, u11, something, iccid, u13) = struct.unpack(fmt2, data[expected:expected + expected2])
- print prefix + " MEID: %s" % meid
- print prefix + " IMEI: %s" % imei
- print prefix + " ??? : %s" % something
- print prefix + " ICCID: %s" % iccid
-
- fmt3 = "<"
- fmt3 += "16s" # MCC
- fmt3 += "16s" # MNC
- fmt3 += "4s" # unknown11
- fmt3 += "4s" # unknown12
- fmt3 += "4s" # unknown13
- expected3 = struct.calcsize(fmt3)
- if len(data) >= expected + expected2 + expected3:
- (mcc, mnc, u11, u12, u13) = struct.unpack(fmt3, data[expected + expected2:])
- print prefix + " MCC: %s" % mcc
- print prefix + " MNC: %s" % mnc
-
-
-def state_to_string(state):
- states = { 0: "unknown",
- 1: "idle",
- 2: "connecting",
- 3: "authenticating",
- 4: "connected",
- 5: "dormant",
- 6: "updating NAM",
- 7: "updating PRL",
- 8: "disconnecting",
- 9: "error",
- 10: "updating UICC",
- 11: "updating PLMN" }
- try:
- return states[state]
- except KeyError:
- return "unknown"
-
-def show_connection_info(data, prefix, direction):
- if direction != defs.TO_HOST:
- return
-
- fmt = "<"
- fmt += "I" # rx_bytes
- fmt += "I" # tx_bytes
- fmt += "8s" # unknown1
- fmt += "B" # state
- fmt += "3s" # unknown2
-
- expected = struct.calcsize(fmt)
- if len(data) >= expected:
- (rxb, txb, u1, state, u2) = struct.unpack(fmt, data[:expected])
- print prefix + " RX Bytes: %d" % rxb
- print prefix + " TX Bytes: %d" % txb
- print prefix + " State: %d (%s)" % (state, state_to_string (state))
- else:
- raise ValueError("Unexpected Connection Info command response len (got %d expected %d)" % (len(data), expected))
-
- fmt3 = "<"
- fmt3 += "4s" # unknown3
- fmt3 += "16s" # ip4_address
- fmt3 += "8s" # netmask?
- fmt3 += "40s" # ip6_address
- expected3 = struct.calcsize(fmt3)
- if len(data) >= expected + expected3:
- (u3, ip4addr, netmask, ip6addr) = struct.unpack(fmt3, data[expected:])
- print prefix + " IP4 Addr: %s" % ip4addr
- print prefix + " IP6 Addr: %s" % ip6addr
-
-def get_signal(item):
- if item == 0x7D:
- return (item * -1, "(NO SIGNAL)")
- else:
- return (item * -1, "")
-
-def service_to_string(service):
- services = { 0: "none",
- 1: "AMPS",
- 2: "IS95-A",
- 3: "IS95-B",
- 4: "GSM",
- 5: "GPRS",
- 6: "1xRTT",
- 7: "EVDO r0",
- 8: "UMTS",
- 9: "EVDO rA",
- 10: "EDGE",
- 11: "HSDPA",
- 12: "HSUPA",
- 13: "HSPA",
- 14: "LTE",
- 15: "EVDO rA eHRPD" }
- try:
- return services[service]
- except KeyError:
- return "unknown"
-
-def show_network_info(data, prefix, direction):
- if direction != defs.TO_HOST:
- return
-
- fmt = "<"
- fmt += "B" # unknown1
- fmt += "3s" # unknown2
- fmt += "B" # service
- fmt += "B" # unknown3
- fmt += "H" # year
- fmt += "B" # month
- fmt += "B" # zero
- fmt += "B" # day
- fmt += "B" # zero
- fmt += "B" # hours
- fmt += "B" # zero
- fmt += "B" # minutes
- fmt += "B" # zero
- fmt += "B" # seconds
- fmt += "H" # counter1
- fmt += "H" # unknown4
- fmt += "3s" # unknown5
- fmt += "B" # 2g_dbm
-
- expected = struct.calcsize(fmt)
- if len(data) >= expected:
- (u1, u2, service, u3, year, month, z1, day, z2, hours, z3, minutes, z4, \
- seconds, counter1, u4, u5, two_g_dbm) = struct.unpack(fmt, data[:expected])
- print prefix + " Time: %04d/%02d/%02d %02d:%02d:%02d" % (year, month, day, hours, minutes, seconds)
- print prefix + " Service: %d (%s)" % (service, service_to_string (service))
- print prefix + " 2G dBm: %d dBm %s" % get_signal(two_g_dbm)
- else:
- raise ValueError("Unexpected Network Info command response len (got %d expected %d)" % (len(data), expected))
-
- fmt2 = "<"
- fmt2 += "3s" # unknown7
- fmt2 += "16s" # cdma_opname
- fmt2 += "18s" # unknown8
- fmt2 += "B" # 3g_dbm
- fmt2 += "3s" # unknown9
- fmt2 += "B" # unknown10
- fmt2 += "3s" # unknown11
- fmt2 += "B" # unknown12
- fmt2 += "8s" # 3gpp_opname
- fmt2 += "4s" # unknown13
- fmt2 += "I" # unknown14
- fmt2 += "I" # unknown15
- fmt2 += "44s" # unknown16
- fmt2 += "I" # mcc/mnc
-
- expected2 = struct.calcsize(fmt2)
- if len(data) >= expected + expected2:
- (u7, cdma_opname, u8, three_g_dbm, u9, u10, u11, u12, tgpp_opname, u13, \
- u14, u15, u16, mccmnc) = struct.unpack(fmt2, data[expected:expected + expected2])
- print prefix + " 3G dBm: %d dBm %s" % get_signal(three_g_dbm)
- print prefix + " CDMA Op: %s" % cdma_opname
- print prefix + " 3GPP Op: %s" % tgpp_opname
-
- # handle 2-digit MNC
- if mccmnc < 100000:
- mccmnc *= 10;
-
- mcc = mccmnc / 1000
- mnc = mccmnc - (mcc * 1000)
- if mcc > 100:
- print prefix + " MCC/MNC: %u-%u" % (mcc, mnc)
-
- fmt3 = "<"
- fmt3 += "B" # lte_dbm
- fmt3 += "3s" # unknown15
- fmt3 += "4s" # unknown16
- expected3 = struct.calcsize(fmt3)
- if len(data) >= expected + expected2 + expected3:
- (lte_dbm, u17, u18) = struct.unpack(fmt3, data[expected + expected2:])
- print prefix + " LTE dBm: %d dBm %s" % get_signal(lte_dbm)
-
-
-def show_init(data, prefix, direction):
- if len(data) == 0:
- # PC5740/old format
- return
-
- if direction == defs.TO_HOST:
- show_data(data, prefix)
- return
-
- fmt = "<"
- fmt += "H" # year
- fmt += "B" # month
- fmt += "B" # zero
- fmt += "B" # day
- fmt += "B" # zero
- fmt += "B" # hours
- fmt += "B" # zero
- fmt += "B" # minutes
- fmt += "B" # zero
- fmt += "B" # seconds
- expected = struct.calcsize(fmt)
- if len(data) >= expected:
- (year, month, z1, day, z2, hours, z3, minutes, z4, seconds) = struct.unpack(fmt, data[:expected])
- print prefix + " Time: %04d/%02d/%02d %02d:%02d:%02d" % (year, month, day, hours, minutes, seconds)
- else:
- raise ValueError ("Unexpected Init command length (got %d expected %d)" % (len(data), expected))
-
-def show_bearer_info(data, prefix, direction):
- pass
-
-def mode_to_string(mode):
- if mode == 0x00:
- return "CDMA/EVDO"
- elif mode == 0x01:
- return "CDMA only"
- elif mode == 0x02:
- return "EVDO only"
- elif mode == 0x0A:
- return "GSM/UMTS"
- elif mode == 0x0B:
- return "GSM/GPRS/EDGE only"
- elif mode == 0x0C:
- return "UMTS/HSPA only"
- elif mode == 0x14:
- return "Auto"
- return "unknown"
-
-def show_get_global_mode(data, prefix, direction):
- if direction != defs.TO_HOST:
- return
-
- fmt = "<"
- fmt += "B" # unknown1
- fmt += "B" # mode
- fmt += "B" # unknown2
- fmt += "B" # unknown3
-
- expected = struct.calcsize(fmt)
- if len(data) != expected:
- raise ValueError("Unexpected GET_GLOBAL_MODE command response len (got %d expected %d)" % (len(data), expected))
- (u1, mode, u2, u3) = struct.unpack(fmt, data)
-
- print prefix + " Mode: 0x%X (%s)" % (mode, mode_to_string(mode))
-
-def show_set_global_mode(data, prefix, direction):
- if direction != defs.TO_MODEM:
- return;
-
- fmt = "<"
- fmt += "B" # unknown1
- fmt += "B" # mode
- fmt += "B" # unknown2
- fmt += "B" # unknown3
-
- expected = struct.calcsize(fmt)
- if len(data) != expected:
- raise ValueError("Unexpected SET_GLOBAL_MODE command response len (got %d expected %d)" % (len(data), expected))
- (u1, mode, u2, u3) = struct.unpack(fmt, data)
-
- print prefix + " Mode: 0x%X (%s)" % (mode, mode_to_string(mode))
-
-
-cmds = { 0x03: ("GET_GLOBAL_MODE", show_get_global_mode),
- 0x04: ("SET_GLOBAL_MODE", show_set_global_mode),
- 0x06: ("DEVICE_INFO", show_device_info),
- 0x0A: ("CONNECTION_INFO", show_connection_info),
- 0x0B: ("NETWORK_INFO", show_network_info),
- 0x0D: ("INIT", show_init),
- 0x4D: ("EPS_BEARER_INFO", show_bearer_info)
- }
-
-def show(data, prefix, direction):
- if ord(data[:1]) != 0xC8:
- return
-
- data = data[1:] # skip 0xC8 header
- cmdno = ord(data[:1])
- try:
- cmdinfo = cmds[cmdno]
- except KeyError:
- return
- data = data[1:] # skip cmdno
-
- print prefix + "WMC Packet:"
- print prefix + " Cmd: 0x%02x (%s)" % (cmdno, cmdinfo[0])
- cmdinfo[1](data, prefix, direction)
- print ""
-
-def get_funcs():
- return (complete, unpack, show)
-