<p>herlesupreeth has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/20816">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils.py: Add helper method to parse ePDG Selection info TLV<br><br>ePDG selection information TLV data object is made of following elements:<br><br>ePDG Selection Information Tag '80' (1 Byte)<br>Length 5n Note<br>PLMN 1 (3 Bytes)<br>ePDG Priority (2 Bytes)<br>ePDG FQDN format '00' or '01' (1 Byte)<br>...<br><br>PLMN n<br>...<br><br>Note: The length is coded according to ISO/IEC 8825-1 [35]<br><br>Note 2: Inconsistency in spec: 3GPP TS 31.102 version 15.2.0 Release 15, 4.2.104<br><br>As per spec, Length field value is 5n, where n is number of PLMNs<br>But, each PLMN entry is made of PLMN (3 Bytes) + ePDG Priority (2 Bytes) + ePDG FQDN format (1 Byte)<br>Totalling to 6 Bytes, maybe Length should be 6n and not 5n<br><br>Change-Id: I0f9f38961a589e3f9a53d2288a3dc6fa71a4b1b0<br>---<br>M pySim/utils.py<br>1 file changed, 57 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/16/20816/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/utils.py b/pySim/utils.py</span><br><span>index f7d099b..88a42e1 100644</span><br><span>--- a/pySim/utils.py</span><br><span>+++ b/pySim/utils.py</span><br><span>@@ -609,3 +609,60 @@</span><br><span>            sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)</span><br><span> </span><br><span>   return sl</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def dec_ePDGSelection(sixhexbytes):</span><br><span style="color: hsl(120, 100%, 40%);">+      """</span><br><span style="color: hsl(120, 100%, 40%);">+    Decode ePDGSelection to get EF.ePDGSelection or EF.ePDGSelectionEm.</span><br><span style="color: hsl(120, 100%, 40%);">+   See 3GPP TS 31.102 version 15.2.0 Release 15, section 4.2.104 and 4.2.106.</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%);">+  res = {'mcc': 0, 'mnc': 0, 'epdg_priority': 0, 'epdg_fqdn_format': ''}</span><br><span style="color: hsl(120, 100%, 40%);">+        plmn_chars = 6</span><br><span style="color: hsl(120, 100%, 40%);">+        epdg_priority_chars = 4</span><br><span style="color: hsl(120, 100%, 40%);">+       epdg_fqdn_format_chars = 2</span><br><span style="color: hsl(120, 100%, 40%);">+    # first three bytes (six ascii hex chars)</span><br><span style="color: hsl(120, 100%, 40%);">+     plmn_str = sixhexbytes[:plmn_chars]</span><br><span style="color: hsl(120, 100%, 40%);">+   # two bytes after first three bytes</span><br><span style="color: hsl(120, 100%, 40%);">+   epdg_priority_str = sixhexbytes[plmn_chars:plmn_chars + epdg_priority_chars]</span><br><span style="color: hsl(120, 100%, 40%);">+  # one byte after first five bytes</span><br><span style="color: hsl(120, 100%, 40%);">+     epdg_fqdn_format_str = sixhexbytes[plmn_chars + epdg_priority_chars:plmn_chars + epdg_priority_chars + epdg_fqdn_format_chars]</span><br><span style="color: hsl(120, 100%, 40%);">+        res['mcc'] = dec_mcc_from_plmn(plmn_str)</span><br><span style="color: hsl(120, 100%, 40%);">+      res['mnc'] = dec_mnc_from_plmn(plmn_str)</span><br><span style="color: hsl(120, 100%, 40%);">+      res['epdg_priority'] = epdg_priority_str</span><br><span style="color: hsl(120, 100%, 40%);">+      res['epdg_fqdn_format'] = epdg_fqdn_format_str == '00' and 'Operator Identifier FQDN' or 'Location based FQDN'</span><br><span style="color: hsl(120, 100%, 40%);">+        return res</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def format_ePDGSelection(hexstr):</span><br><span style="color: hsl(120, 100%, 40%);">+       ePDGSelection_info_tag_chars = 2</span><br><span style="color: hsl(120, 100%, 40%);">+      ePDGSelection_info_tag_str = hexstr[:2]</span><br><span style="color: hsl(120, 100%, 40%);">+       # Minimum length</span><br><span style="color: hsl(120, 100%, 40%);">+      len_chars = 2</span><br><span style="color: hsl(120, 100%, 40%);">+ # TODO: Need to determine length properly - definite length support only</span><br><span style="color: hsl(120, 100%, 40%);">+      # Inconsistency in spec: 3GPP TS 31.102 version 15.2.0 Release 15, 4.2.104</span><br><span style="color: hsl(120, 100%, 40%);">+    # As per spec, length is 5n, n - number of PLMNs</span><br><span style="color: hsl(120, 100%, 40%);">+      # But, each PLMN entry is made of PLMN (3 Bytes) + ePDG Priority (2 Bytes) + ePDG FQDN format (1 Byte)</span><br><span style="color: hsl(120, 100%, 40%);">+        # Totalling to 6 Bytes, maybe length should be 6n</span><br><span style="color: hsl(120, 100%, 40%);">+     len_str = hexstr[ePDGSelection_info_tag_chars:ePDGSelection_info_tag_chars+len_chars]</span><br><span style="color: hsl(120, 100%, 40%);">+ if len_str[0] == '8':</span><br><span style="color: hsl(120, 100%, 40%);">+         # The bits 7 to 1 denotes the number of length octets if length > 127</span><br><span style="color: hsl(120, 100%, 40%);">+              if int(len_str[1]) > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                    # Update number of length octets</span><br><span style="color: hsl(120, 100%, 40%);">+                      len_chars = len_chars * int(len_str[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                       len_str = hexstr[ePDGSelection_info_tag_chars:len_chars]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    content_str = hexstr[ePDGSelection_info_tag_chars+len_chars:]</span><br><span style="color: hsl(120, 100%, 40%);">+ # Right pad to prevent index out of range - multiple of 6 bytes</span><br><span style="color: hsl(120, 100%, 40%);">+       content_str = rpad(content_str, len(content_str) + (12 - (len(content_str) % 12)))</span><br><span style="color: hsl(120, 100%, 40%);">+    s = ""</span><br><span style="color: hsl(120, 100%, 40%);">+      for rec_data in hexstr_to_Nbytearr(content_str, 6):</span><br><span style="color: hsl(120, 100%, 40%);">+           rec_info = dec_ePDGSelection(rec_data)</span><br><span style="color: hsl(120, 100%, 40%);">+                if rec_info['mcc'] == 0xFFF and rec_info['mnc'] == 0xFFF:</span><br><span style="color: hsl(120, 100%, 40%);">+                     rec_str = "unused"</span><br><span style="color: hsl(120, 100%, 40%);">+          else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 # A BCD value of 'D' in any of the MCC and/or MNC digits shall be used to indicate a "wild" value for that corresponding MCC/MNC digit</span><br><span style="color: hsl(120, 100%, 40%);">+                      mcc = rec_info['mcc'].replace("D", "*")</span><br><span style="color: hsl(120, 100%, 40%);">+                   mnc = rec_info['mnc'].replace("D", "*")</span><br><span style="color: hsl(120, 100%, 40%);">+                   rec_str = "MCC: %03d MNC: %03d ePDG Priority: %s ePDG FQDN format: %s" % \</span><br><span style="color: hsl(120, 100%, 40%);">+                                  (mcc, mnc, rec_info['epdg_priority'], rec_info['epdg_fqdn_format'])</span><br><span style="color: hsl(120, 100%, 40%);">+           s += "\t%s # %s\n" % (rec_data, rec_str)</span><br><span style="color: hsl(120, 100%, 40%);">+    return s</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/20816">change 20816</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/+/20816"/><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: I0f9f38961a589e3f9a53d2288a3dc6fa71a4b1b0 </div>
<div style="display:none"> Gerrit-Change-Number: 20816 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: herlesupreeth <herlesupreeth@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>