<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _read_para_reg_from(self, code, cbit, clen, *, desc, length, version):
 """Read HIP REG_FROM parameter. Structure of HIP REG_FROM parameter [RFC 5770]: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Port | Protocol | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Address | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Octets Bits Name Description 0 0 reg_from.type Parameter Type 1 15 reg_from.critical Critical Bit 2 16 reg_from.length Length of Contents 4 32 reg_from.port Port 6 48 reg_from.protocol Protocol 7 56 - Reserved 8 64 reg_from.ip Address (IPv6) """

        if clen != 20:
            raise ProtocolError(f'HIPv{version}: [Parano {code}] invalid format')

        _port = self._read_unpack(2)
        _ptcl = self._read_unpack(1)
        _resv = self._read_fileng(1)
        _addr = self._read_fileng(16)

        reg_from = dict(
            type=desc,
            critical=cbit,
            length=clen,
            port=_port,
            protocol=TP_PROTO.get(_ptcl),
            ip=ipaddress.ip_address(_addr),
        )

        return reg_from