laforge has uploaded this change for review. (
https://gerrit.osmocom.org/c/pysim/+/35277?usp=email )
Change subject: usim: Properly decode/encode IPv4 + IPv6 addresses
......................................................................
usim: Properly decode/encode IPv4 + IPv6 addresses
use normal textual representation for IPv4 and IPv6 addresses
Change-Id: I2c6c377f4502af37639e555826c85d5dcf602f9b
---
M pySim/construct.py
M pySim/ts_31_102.py
2 files changed, 42 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/77/35277/1
diff --git a/pySim/construct.py b/pySim/construct.py
index af96b49..31caf0e 100644
--- a/pySim/construct.py
+++ b/pySim/construct.py
@@ -7,6 +7,7 @@
from pySim.utils import b2h, h2b, swap_nibbles
import gsm0338
import codecs
+import ipaddress
"""Utility code related to the integration of the 'construct'
declarative parser."""
@@ -138,6 +139,32 @@
def _encode(self, obj, context, path):
return obj.encode(self.codec, self.err)
+class Ipv4Adapter(Adapter):
+ """
+ Encoder converts from 4 bytes to string representation (A.B.C.D).
+ Decoder converts from string representation (A.B.C.D) to four bytes.
+ """
+ def _decode(self, obj, context, path):
+ ia = ipaddress.IPv4Address(obj)
+ return ia.compressed
+
+ def _encode(self, obj, context, path):
+ ia = ipaddress.IPv4Address(obj)
+ return ia.packed
+
+class Ipv6Adapter(Adapter):
+ """
+ Encoder converts from 16 bytes to string representation.
+ Decoder converts from string representation to 16 bytes.
+ """
+ def _decode(self, obj, context, path):
+ ia = ipaddress.IPv6Address(obj)
+ return ia.compressed
+
+ def _encode(self, obj, context, path):
+ ia = ipaddress.IPv6Address(obj)
+ return ia.packed
+
def filter_dict(d, exclude_prefix='_'):
"""filter the input dict to ensure no keys starting with
'exclude_prefix' remain."""
diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py
index 74a2c4c..87bd8c7 100644
--- a/pySim/ts_31_102.py
+++ b/pySim/ts_31_102.py
@@ -875,14 +875,15 @@
class EF_ePDGId(TransparentEF):
_test_de_encode = [
( '801100657064672e6f736d6f636f6d2e6f7267', {'e_pdg_id':
{"type_of_ePDG_address": "FQDN", "ePDG_address" :
"epdg.osmocom.org" } } ),
- ( '800501c0a8a001', {'e_pdg_id':
{"type_of_ePDG_address": "IPv4", "ePDG_address" :
"c0a8a001" } } ),
+ ( '800501c0a8a001', {'e_pdg_id':
{"type_of_ePDG_address": "IPv4", "ePDG_address" :
"192.168.160.1" } } ),
+ ( '80110220010db8000000000000000000000023', {'e_pdg_id':
{"type_of_ePDG_address": "IPv6", "ePDG_address" :
"2001:db8::23" } } ),
]
class ePDGId(BER_TLV_IE, tag=0x80):
_construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1,
IPv6=2),
'ePDG_address'/Switch(this.type_of_ePDG_address,
{'FQDN':
Utf8Adapter(GreedyBytes),
- 'IPv4':
HexAdapter(GreedyBytes),
- 'IPv6':
HexAdapter(GreedyBytes)}))
+ 'IPv4':
Ipv4Adapter(GreedyBytes),
+ 'IPv6':
Ipv6Adapter(GreedyBytes)}))
def __init__(self, fid='6ff3', sfid=None, name='EF.ePDGId',
desc='Home ePDG Identifier', **kwargs):
super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/35277?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I2c6c377f4502af37639e555826c85d5dcf602f9b
Gerrit-Change-Number: 35277
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: newchange