<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/25839">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pySim-shell: Add support for GSM-R SIM Cards with DF.EIRENE<br><br>GSM-R SIM cards have an additional directory (DF.EIRENE) with a number<br>of files.  This is all specified in the following document:<br><br>        UIC Reference P38 T 9001 5.0 "FFFIS for GSM-R SIM Cards"<br><br>Change-Id: I4034d09292a08d277d4abcbed9a0ec2808daaacb<br>---<br>M pySim-shell.py<br>A pySim/gsm_r.py<br>2 files changed, 260 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-shell.py b/pySim-shell.py</span><br><span>index ca47fb3..4cf32a4 100755</span><br><span>--- a/pySim-shell.py</span><br><span>+++ b/pySim-shell.py</span><br><span>@@ -49,6 +49,7 @@</span><br><span> from pySim.ts_102_221 import CardProfileUICC</span><br><span> from pySim.ts_31_102 import CardApplicationUSIM</span><br><span> from pySim.ts_31_103 import CardApplicationISIM</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.gsm_r import DF_EIRENE</span><br><span> </span><br><span> # we need to import this module so that the SysmocomSJA2 sub-class of</span><br><span> # CardModel is created, which will add the ATR-based matching and</span><br><span>@@ -90,6 +91,7 @@</span><br><span>       # FIXME: do this dynamically</span><br><span>         rs.mf.add_file(DF_TELECOM())</span><br><span>         rs.mf.add_file(DF_GSM())</span><br><span style="color: hsl(120, 100%, 40%);">+      rs.mf.add_file(DF_EIRENE())</span><br><span> </span><br><span>      CardModel.apply_matching_models(scc, rs)</span><br><span> </span><br><span>diff --git a/pySim/gsm_r.py b/pySim/gsm_r.py</span><br><span>new file mode 100644</span><br><span>index 0000000..7cd7529</span><br><span>--- /dev/null</span><br><span>+++ b/pySim/gsm_r.py</span><br><span>@@ -0,0 +1,258 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# -*- coding: utf-8 -*-</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# without this, pylint will fail when inner classes are used</span><br><span style="color: hsl(120, 100%, 40%);">+# within the 'nested' kwarg of our TlvMeta metaclass on python 3.7 :(</span><br><span style="color: hsl(120, 100%, 40%);">+# pylint: disable=undefined-variable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"""</span><br><span style="color: hsl(120, 100%, 40%);">+The File (and its derived classes) uses the classes of pySim.filesystem in</span><br><span style="color: hsl(120, 100%, 40%);">+order to describe the files specified in UIC Reference P38 T 9001 5.0 "FFFIS for GSM-R SIM Cards"</span><br><span style="color: hsl(120, 100%, 40%);">+"""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation, either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.utils import *</span><br><span style="color: hsl(120, 100%, 40%);">+#from pySim.tlv import *</span><br><span style="color: hsl(120, 100%, 40%);">+from struct import pack, unpack</span><br><span style="color: hsl(120, 100%, 40%);">+from construct import *</span><br><span style="color: hsl(120, 100%, 40%);">+from construct import Optional as COptional</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.construct import *</span><br><span style="color: hsl(120, 100%, 40%);">+import enum</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.filesystem import *</span><br><span style="color: hsl(120, 100%, 40%);">+import pySim.ts_102_221</span><br><span style="color: hsl(120, 100%, 40%);">+import pySim.ts_51_011</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+######################################################################</span><br><span style="color: hsl(120, 100%, 40%);">+# DF.EIRENE (FFFIS for GSM-R SIM Cards)</span><br><span style="color: hsl(120, 100%, 40%);">+######################################################################</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class FuncNTypeAdapter(Adapter):</span><br><span style="color: hsl(120, 100%, 40%);">+    def _decode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        bcd = swap_nibbles(b2h(obj))</span><br><span style="color: hsl(120, 100%, 40%);">+        last_digit = bcd[-1]</span><br><span style="color: hsl(120, 100%, 40%);">+        return {'functional_number': bcd[:-1],</span><br><span style="color: hsl(120, 100%, 40%);">+                'presentation_of_only_this_fn': last_digit & 4,</span><br><span style="color: hsl(120, 100%, 40%);">+                'permanent_fn': last_digit & 8 }</span><br><span style="color: hsl(120, 100%, 40%);">+    def _encode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 'FIXME'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_FN(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.2"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6ff1', sfid=None, name='EF.EN', desc='Functional numbers', rec_len={9,9})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('functional_number_and_type'/FuncNTypeAdapter(Bytes(8)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'list_number'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class PlConfAdapter(Adapter):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.4.3"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def _decode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        num = int(obj) & 0x7</span><br><span style="color: hsl(120, 100%, 40%);">+        if num == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 'None'</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 4</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 2:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 3</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 3:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 2</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 4:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 5:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0</span><br><span style="color: hsl(120, 100%, 40%);">+    def _encode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        if obj == 'None':</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0</span><br><span style="color: hsl(120, 100%, 40%);">+        obj = int(obj)</span><br><span style="color: hsl(120, 100%, 40%);">+        if obj == 4:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 3:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 2</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 2:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 3</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 4</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 5</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class PlCallAdapter(Adapter):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.4.12"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def _decode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        num = int(obj) & 0x7</span><br><span style="color: hsl(120, 100%, 40%);">+        if num == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 'None'</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 4</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 2:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 3</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 3:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 2</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 4:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 5:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 6:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 'B'</span><br><span style="color: hsl(120, 100%, 40%);">+        elif num == 7:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 'A'</span><br><span style="color: hsl(120, 100%, 40%);">+    def _encode(self, obj, context, path):</span><br><span style="color: hsl(120, 100%, 40%);">+        if obj == 'None':</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0</span><br><span style="color: hsl(120, 100%, 40%);">+        if obj == 4:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 3:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 2</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 2:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 3</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 4</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 5</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 'B':</span><br><span style="color: hsl(120, 100%, 40%);">+            return 6</span><br><span style="color: hsl(120, 100%, 40%);">+        elif obj == 'A':</span><br><span style="color: hsl(120, 100%, 40%);">+            return 7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+NextTableType = Enum(Byte, decision=0xf0, predefined=0xf1, num_dial_digits=0xf2, ic=0xf3, empty=0xff)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CallconfC(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.3"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6ff2', sfid=None, name='EF.CallconfC', size={24,24},</span><br><span style="color: hsl(120, 100%, 40%);">+                         desc='Call Configuration of emergency calls Configuration')</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('pl_conf'/PlConfAdapter(Int8ub),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'conf_nr'/BcdAdapter(Bytes(8)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'max_rand'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'n_ack_max'/Int16ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'pl_ack'/PlCallAdapter(Int8ub),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'n_nested_max'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'train_emergency_gid'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'shunting_emergency_gid'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'imei'/BcdAdapter(Bytes(8)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_CallconfI(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.5"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6ff3', sfid=None, name='EF.CallconfI', rec_len={21,21},</span><br><span style="color: hsl(120, 100%, 40%);">+                         desc='Call Configuration of emergency calls Information')</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('t_dur'/Int24ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 't_relcalc'/Int32ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'pl_call'/PlCallAdapter(Int8ub),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'cause'/FlagsEnum(Int8ub, powered_off=1, radio_link_error=2, user_command=5),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'gcr'/BcdAdapter(Bytes(4)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'fnr'/BcdAdapter(Bytes(8)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_Shunting(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.6"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6ff4', sfid=None, name='EF.Shunting', desc='Shunting', size={8,8})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('common_gid'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'shunting_gid'/Bytes(7))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_GsmrPLMN(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.7"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6ff5', sfid=None, name='EF.GsmrPLMN', desc='GSM-R network selection', rec_len={9,9})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('plmn'/BcdAdapter(Bytes(3)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'class_of_network'/BitStruct('supported'/FlagsEnum(BitsInteger(5), vbs=1, vgcs=2, emlpp=4, fn=8, eirene=16),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              'preference'/BitsInteger(3)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ic_incoming_ref_tbl'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'outgoing_ref_tbl'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ic_table_ref'/HexAdapter(Bytes(1)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_IC(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.8"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6f8d', sfid=None, name='EF.IC', desc='International Code', rec_len={7,7})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('next_table_type'/NextTableType,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'id_of_next_table'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'ic_decision_value'/BcdAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'network_string_table_index'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_NW(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 7.9"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid='6f80', sfid=None, name='EF.NW', desc='Network Name', rec_len={8,8})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = GsmString(8)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_Switching(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 8.4"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid, name, desc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=None, name=name, desc=desc, rec_len={6,6})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('next_table_type'/NextTableType,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'id_of_next_table'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'decision_value'/BcdAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'string_table_index'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_Predefined(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 8.5"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid, name, desc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=None, name=name, desc=desc, rec_len={3,3})</span><br><span style="color: hsl(120, 100%, 40%);">+        # header and other records have different structure. WTF !?!</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('next_table_type'/NextTableType,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'id_of_next_table'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'predefined_value1'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'string_table_index1'/Int8ub)</span><br><span style="color: hsl(120, 100%, 40%);">+        # TODO: predefined value n, ...</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_DialledVals(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    """Section 8.6"""</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid, name, desc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=None, name=name, desc=desc, size={4,4})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Struct('next_table_type'/NextTableType,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'id_of_next_table'/HexAdapter(Bytes(2)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 'dialed_digits'/BcdAdapter(Bytes(1)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class DF_EIRENE(CardDF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='7fe0', name='DF.EIRENE', desc='GSM-R EIRENE'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        files = [</span><br><span style="color: hsl(120, 100%, 40%);">+            # Section 7.1.6 / Table 10 EIRENE GSM EFs</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_FN(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_CallconfC(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_CallconfI(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Shunting(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_GsmrPLMN(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_IC(),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_NW(),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            # support of the numbering plan</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Switching(fid='6f8e', name='EF.CT', desc='Call Type'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Switching(fid='6f8f', name='EF.SC', desc='Short Code'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f88', name='EF.FC', desc='Function Code'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f89', name='EF.Service', desc='VGCS/VBS Service Code'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f8a', name='EF.Call', desc='First digit of the group ID'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f8b', name='EF.FctTeam', desc='Call Type 6 Team Type + Team member function'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f92', name='EF.Controller', desc='Call Type 7 Controller function code'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_Predefined(fid='6f8c', name='EF.Gateway', desc='Access to external networks'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f81', name='EF.5to8digits', desc='Call Type 2 User Identity Number length'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f82', name='EF.2digits', desc='2 digits input'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f83', name='EF.8digits', desc='8 digits input'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f84', name='EF.9digits', desc='9 digits input'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f85', name='EF.SSSSS', desc='Group call area input'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f86', name='EF.LLLLL', desc='Location number Call Type 6'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f91', name='EF.Location', desc='Location number Call Type 7'),</span><br><span style="color: hsl(120, 100%, 40%);">+            EF_DialledVals(fid='6f87', name='EF.FreeNumber', desc='Free Number Call Type 0 and 8'),</span><br><span style="color: hsl(120, 100%, 40%);">+          ]</span><br><span style="color: hsl(120, 100%, 40%);">+        self.add_files(files)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def decode_select_response(self, data_hex):</span><br><span style="color: hsl(120, 100%, 40%);">+        return pySim.ts_51_011.decode_select_response(data_hex)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/25839">change 25839</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/25839"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4034d09292a08d277d4abcbed9a0ec2808daaacb </div>
<div style="display:none"> Gerrit-Change-Number: 25839 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>