laforge has submitted this change. (
https://gerrit.osmocom.org/c/pysim/+/38472?usp=email
)
Change subject: pySim.ts_31_102: Add support for EF.EARFCNList
......................................................................
pySim.ts_31_102: Add support for EF.EARFCNList
This adds a construct + pyosmocore.tlv based declarative encoder/decoder
for the EF.EARFCNList file used in the context of NB-IoT in later
release USIMs.
Change-Id: I16797ca58c3ad6ebaf588d04fec011a0cbcfcef3
---
M pySim/ts_31_102.py
M tests/pySim-shell_test/export/export.script.ok
M tests/pySim-shell_test/file_specific/test_ef_ust.ok
M tests/pySim-shell_test/fsdump/fsdump.json.ok
4 files changed, 103 insertions(+), 4 deletions(-)
Approvals:
dexter: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py
index b82c411..636cf37 100644
--- a/pySim/ts_31_102.py
+++ b/pySim/ts_31_102.py
@@ -30,7 +30,7 @@
from construct import Optional as COptional
from construct import Int32ub, Nibble, GreedyRange, Struct, FlagsEnum, Switch, this,
Int16ub, Padding
-from construct import Bytewise, Int24ub, PaddedString, PrefixedArray, If
+from construct import Bytewise, Int24ub, Int24sb, PaddedString, PrefixedArray, If
from osmocom.utils import is_hexstr
from osmocom.tlv import *
@@ -893,6 +893,54 @@
super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
self._construct = BitStruct('rfu'/BitsRFU(7),
'from_preferred'/Flag)
+# TS 31.102 Section 4.2.112 + TS 23.032 Section 6.1
+GadPoint = Struct('latitude'/Int24sb, 'longitude'/Int24sb)
+
+# TS 31.102 Section 4.2.112 (Rel ??)
+class EF_EARFCNList(TransparentEF):
+ _test_de_encode = [
+ # single data object with one EARFCN + one area of 3 points
+ ('a01a8004000100008112000001100001000002100002000003100003',
+ [{'earfcn_list_tlv': [{'earfcn': 65536},
+ {'geographical_area': [{'latitude': 1,
'longitude': 1048577},
+ {'latitude': 2,
'longitude': 1048578},
+ {'latitude': 3,
'longitude': 1048579}] }]}] ),
+ # single data object with one EARFCN + two areas of 3 + 4 points
+
('a03480040001000081120000011000010000021000020000031000038118000001100001000002100002000003100003000004100004',
+ [{'earfcn_list_tlv': [{'earfcn': 65536},
+ {'geographical_area': [{'latitude': 1,
'longitude': 1048577},
+ {'latitude': 2,
'longitude': 1048578},
+ {'latitude': 3,
'longitude': 1048579}] },
+ {'geographical_area': [{'latitude': 1,
'longitude': 1048577},
+ {'latitude': 2,
'longitude': 1048578},
+ {'latitude': 3,
'longitude': 1048579},
+ {'latitude': 4,
'longitude': 1048580}] }
+ ] }] ),
+ # two concatenated data objects with 3 points each
+
('a01a8004000100008112000001100001000002100002000003100003a01a8004000200008112000011100011000012100012000013100013',
+ [{'earfcn_list_tlv': [{'earfcn': 65536},
+ {'geographical_area': [{'latitude': 1,
'longitude': 1048577},
+ {'latitude': 2,
'longitude': 1048578},
+ {'latitude': 3,
'longitude': 1048579}] }]},
+ {'earfcn_list_tlv': [{'earfcn': 131072},
+ {'geographical_area': [{'latitude': 17,
'longitude': 1048593},
+ {'latitude': 18,
'longitude': 1048594},
+ {'latitude': 19,
'longitude': 1048595}] }]} ]),
+ ]
+ class Earfcn(BER_TLV_IE, tag=0x80):
+ _construct = Int32ub
+ class GeographicalArea(BER_TLV_IE, tag=0x81):
+ _construct = GreedyRange(GadPoint)
+ class EarfcnListTlv(BER_TLV_IE, tag=0xa0, nested=[Earfcn,GeographicalArea]):
+ pass
+ # we need a collection as there might be multiple concatenated instances
+ class EarfcnListTlvCollection(TLV_IE_Collection, nested=[EarfcnListTlv]):
+ pass
+ def __init__(self, fid='6ffd', sfid=None, name='EF.EARFCNList',
size=(30, 100),
+ desc='EARFCN list for MTC/NB-IOT UEs', **kwargs):
+ super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
+ self._tlv = self.EarfcnListTlvCollection
+
# TS 31.102 Section 4.2.114 (Rel 18)
class EF_eAKA(TransparentEF):
def __init__(self, fid='6f01', sfid=None, name='EF.eAKA', size=(1,
1),
@@ -1675,7 +1723,7 @@
# TODO: EF.3GPPPSDATAOFF
# TODO: EF.3GPPPSDATAOFFservicelist
EF_XCAPConfigData(service=120),
- # TODO: EF.EARFCNList
+ EF_EARFCNList(service=121),
EF_MuDMiDConfigData(service=134),
EF_eAKA(),
EF_OCST(service=148),
diff --git a/tests/pySim-shell_test/export/export.script.ok
b/tests/pySim-shell_test/export/export.script.ok
index 1c3f052..2b8e6b0 100644
--- a/tests/pySim-shell_test/export/export.script.ok
+++ b/tests/pySim-shell_test/export/export.script.ok
@@ -3604,6 +3604,17 @@
# bad file: MF/ADF.USIM/EF.XCAPConfigData/EF.XCAPConfigData, SW match failed! Expected
9000 and got 6a82: Wrong parameters - File not found
#
################################################################################
+# MF/ADF.USIM/EF.EARFCNList #
+################################################################################
+# directory: MF/ADF.USIM/EF.EARFCNList (3f00/a0000000871002/6ffd)
+# file: EF.EARFCNList (6ffd)
+# structure: transparent
+# RAW FCP Template: 621e8202412183026ffda506d00120d2010f8a01058b036f0606800200808800
+# Decoded FCP Template: {'file_descriptor': {'file_descriptor_byte':
{'shareable': True, 'file_type': 'working_ef',
'structure': 'transparent'}, 'record_len': None,
'num_of_rec': None}, 'file_identifier': '6ffd',
'proprietary_information': {'unknown_ber_tlv_ie_d0': {'raw':
'20'}, 'toolkit_access_conditions': {'rfm_create': True,
'rfm_delete_terminate': True, 'other_applet_create': True,
'other_applet_delete_terminate': True}}, 'life_cycle_status_integer':
'operational_activated', 'security_attrib_referenced':
{'ef_arr_file_id': '6f06', 'ef_arr_record_nr': 6},
'file_size': 128, 'short_file_identifier': None}
+select MF/ADF.USIM/EF.EARFCNList
+update_binary
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+#
+################################################################################
# MF/ADF.USIM/EF.MuDMiDConfigData #
################################################################################
# directory: MF/ADF.USIM/EF.MuDMiDConfigData (3f00/a0000000871002/6ffe)
@@ -4873,7 +4884,7 @@
################################################################################
# Export summary #
################################################################################
-# total files visited: 345
+# total files visited: 346
# bad files: 63
# MF/DF.GSM/EF.SUME/EF.SUME, SW match failed! Expected 9000 and got 6982: Command not
allowed - Security status not satisfied
# MF/DF.GSM/EF.CPBCCH/EF.CPBCCH, SW match failed! Expected 9000 and got 6a82: Wrong
parameters - File not found
diff --git a/tests/pySim-shell_test/file_specific/test_ef_ust.ok
b/tests/pySim-shell_test/file_specific/test_ef_ust.ok
index 8d5596a..332fdc8 100644
--- a/tests/pySim-shell_test/file_specific/test_ef_ust.ok
+++ b/tests/pySim-shell_test/file_specific/test_ef_ust.ok
@@ -80,6 +80,7 @@
Checking service No 114 (inactive)
Checking service No 115 (inactive)
Checking service No 120 (inactive)
+Checking service No 121 (inactive)
Checking service No 122 (active)
Checking service No 123 (active)
Checking service No 124 (inactive)
@@ -104,7 +105,7 @@
Checking service No 147 (inactive)
Checking service No 148 (inactive)
Checking service No 150 (inactive)
-===> 75 service / file inconsistencies detected
+===> 76 service / file inconsistencies detected
beff9f9de73e04080000ff730000000600000000
beff9f9de73e04080000ff730000000600002000
beff9f9de73e04080000ff730000000600000000
diff --git a/tests/pySim-shell_test/fsdump/fsdump.json.ok
b/tests/pySim-shell_test/fsdump/fsdump.json.ok
index 9943982..6b82ef4 100644
--- a/tests/pySim-shell_test/fsdump/fsdump.json.ok
+++ b/tests/pySim-shell_test/fsdump/fsdump.json.ok
@@ -10105,6 +10105,45 @@
"message": "Wrong parameters - File not found"
}
},
+ "MF/ADF.USIM/EF.EARFCNList": {
+ "path": [
+ "MF",
+ "ADF.USIM",
+ "EF.EARFCNList"
+ ],
+ "fcp_raw":
"621e8202412183026ffda506d00120d2010f8a01058b036f0606800200808800",
+ "fcp": {
+ "file_descriptor": {
+ "file_descriptor_byte": {
+ "shareable": true,
+ "file_type": "working_ef",
+ "structure": "transparent"
+ },
+ "record_len": null,
+ "num_of_rec": null
+ },
+ "file_identifier": "6ffd",
+ "proprietary_information": {
+ "unknown_ber_tlv_ie_d0": {
+ "raw": "20"
+ },
+ "toolkit_access_conditions": {
+ "rfm_create": true,
+ "rfm_delete_terminate": true,
+ "other_applet_create": true,
+ "other_applet_delete_terminate": true
+ }
+ },
+ "life_cycle_status_integer":
"operational_activated",
+ "security_attrib_referenced": {
+ "ef_arr_file_id": "6f06",
+ "ef_arr_record_nr": 6
+ },
+ "file_size": 128,
+ "short_file_identifier": null
+ },
+ "body":
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ },
"MF/ADF.USIM/EF.MuDMiDConfigData": {
"path": [
"MF",
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/38472?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I16797ca58c3ad6ebaf588d04fec011a0cbcfcef3
Gerrit-Change-Number: 38472
Gerrit-PatchSet: 4
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>