Drop fabricated SET UP IDLE MODE TEXT qualifier decode; bump to 1.15.1
Spec verification against UICC_SPECS.md / TS 102 223 V18.3.0 §8.6
showed the Command Qualifier for SET UP IDLE MODE TEXT is RFU
("this byte is RFU") — no icon self-explanatory bit exists in any
generation (GSM 11.14 predates the command; TS 31.111 does not
override it). The v1.11.0 _idle_text_qualifier decoded bit 1 as
"icon self-explanatory" from an unverified source.
Remove the decoder; the command now uses generic RFU handling
(hidden at '00', raw hex otherwise). Tests updated accordingly.
Version 1.15.1, SW cache v21.
This commit is contained in:
1 parent
f61ca9685c
commit
bf83074de8
7 files changed
+12
-21
No files matched your search
+1
-1
@@ -1881,7 +1881,7 @@ function onFilterChange() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ──────────────────── Versioning ────────────────────
|
// ──────────────────── Versioning ────────────────────
|
||||||
const PWA_VERSION = '1.15.0';
|
const PWA_VERSION = '1.15.1';
|
||||||
const MIN_SERVER_VERSION = '1.0.0';
|
const MIN_SERVER_VERSION = '1.0.0';
|
||||||
|
|
||||||
function parseVersion(v) {
|
function parseVersion(v) {
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
const CACHE = 'simtrace-analyser-v20';
|
const CACHE = 'simtrace-analyser-v21';
|
||||||
|
|
||||||
const PRECACHE = [
|
const PRECACHE = [
|
||||||
'index.html',
|
'index.html',
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.backends._legacy:_Backend"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "simtrace2-pysniff"
|
name = "simtrace2-pysniff"
|
||||||
version = "1.15.0"
|
version = "1.15.1"
|
||||||
description = "Python-based sniffing tool for SIMtrace2 hardware (SIM card communication sniffer)"
|
description = "Python-based sniffing tool for SIMtrace2 hardware (SIM card communication sniffer)"
|
||||||
readme = {file = "README.md", content-type = "text/markdown"}
|
readme = {file = "README.md", content-type = "text/markdown"}
|
||||||
license = {text = "GPL-2.0-or-later"}
|
license = {text = "GPL-2.0-or-later"}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from .gsmtap import GsmtapSender, GsmtapReceiver
|
|||||||
from .pcap import PcapWriter
|
from .pcap import PcapWriter
|
||||||
from .dump import FileDumper, format_message
|
from .dump import FileDumper, format_message
|
||||||
|
|
||||||
__version__ = '1.15.0'
|
__version__ = '1.15.1'
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'SniffSession',
|
'SniffSession',
|
||||||
'DeviceDisconnected',
|
'DeviceDisconnected',
|
||||||
|
|||||||
@@ -1069,20 +1069,9 @@ COMMAND_QUALIFIERS = {
|
|||||||
0x01: REFRESH_MODES, # REFRESH
|
0x01: REFRESH_MODES, # REFRESH
|
||||||
0x26: PLI_QUALIFIERS, # PROVIDE LOCAL INFORMATION
|
0x26: PLI_QUALIFIERS, # PROVIDE LOCAL INFORMATION
|
||||||
}
|
}
|
||||||
|
# NOTE: SET UP IDLE MODE TEXT ('28') has no entry — its Command Qualifier
|
||||||
|
# is RFU per TS 102 223 V18.3.0 §8.6 ("this byte is RFU"); the generic
|
||||||
def _idle_text_qualifier(qualifier):
|
# fallback (hidden at '00', raw hex otherwise) applies.
|
||||||
"""SET UP IDLE MODE TEXT (TS 102 223 §6.6.13): bit 1 = icon
|
|
||||||
self-explanatory flag, all other bits RFU."""
|
|
||||||
if qualifier & ~0x01:
|
|
||||||
return f'0x{qualifier:02X}'
|
|
||||||
if qualifier & 0x01:
|
|
||||||
return 'icon self-explanatory'
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
# TS 102 223 §6.6.13 — SET UP IDLE MODE TEXT
|
|
||||||
COMMAND_QUALIFIERS[0x28] = _idle_text_qualifier
|
|
||||||
|
|
||||||
|
|
||||||
# ──────────────────── §8.6 bitmask qualifier decoders ────────────────────
|
# ──────────────────── §8.6 bitmask qualifier decoders ────────────────────
|
||||||
|
|||||||
@@ -1556,14 +1556,16 @@ class TestIdleModeText(unittest.TestCase):
|
|||||||
bytes.fromhex('80120000%02x' % len(body)) + body + b'\x90\x00')
|
bytes.fromhex('80120000%02x' % len(body)) + body + b'\x90\x00')
|
||||||
|
|
||||||
def test_8bit_text_icon_qualifier(self):
|
def test_8bit_text_icon_qualifier(self):
|
||||||
# "Hello" 8-bit + icon record 5 + qualifier bit 1 (self-explanatory)
|
# "Hello" 8-bit + icon record 5 + qualifier 0x01 (RFU byte — no
|
||||||
|
# icon bit exists per TS 102 223 V18.3.0 §8.6)
|
||||||
r = self._fetch(
|
r = self._fetch(
|
||||||
'810301280182028182' # cmd details (qual 0x01) + device ids
|
'810301280182028182' # cmd details (qual 0x01) + device ids
|
||||||
'8d060448656c6c6f' # Text String: DCS 0x04 (8-bit), "Hello"
|
'8d060448656c6c6f' # Text String: DCS 0x04 (8-bit), "Hello"
|
||||||
'1e0105') # Icon Identifier: record 5
|
'1e0105') # Icon Identifier: record 5
|
||||||
self.assertEqual(r['cat_command'], 'SET UP IDLE MODE TEXT')
|
self.assertEqual(r['cat_command'], 'SET UP IDLE MODE TEXT')
|
||||||
self.assertEqual(r['cmd']['text'], 'Hello')
|
self.assertEqual(r['cmd']['text'], 'Hello')
|
||||||
self.assertEqual(r['cmd']['qualifier'], 'icon self-explanatory')
|
# Qualifier byte is RFU per V18.3.0 §8.6 — non-zero shows raw
|
||||||
|
self.assertEqual(r['cmd']['qualifier'], '0x01')
|
||||||
self.assertEqual(r['cmd']['icon_id'], 5)
|
self.assertEqual(r['cmd']['icon_id'], 5)
|
||||||
|
|
||||||
def test_ucs2_text(self):
|
def test_ucs2_text(self):
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ class TestImportEndpoint(unittest.TestCase):
|
|||||||
class TestVersion(unittest.TestCase):
|
class TestVersion(unittest.TestCase):
|
||||||
def test_package_version(self):
|
def test_package_version(self):
|
||||||
from simtrace2_pysniff import __version__
|
from simtrace2_pysniff import __version__
|
||||||
self.assertEqual(__version__, '1.15.0')
|
self.assertEqual(__version__, '1.15.1')
|
||||||
|
|
||||||
def test_status_includes_version(self):
|
def test_status_includes_version(self):
|
||||||
import os
|
import os
|
||||||
|
|||||||
Reference in new issue
Block a user