def _read_opt_smf_dpd(self, code, *, desc):
_type = self._read_opt_type(code)<EOL>_size = self._read_unpack(<NUM_LIT:1>)<EOL>_tidd = self._read_binary(<NUM_LIT:1>)<EOL>if _tidd[<NUM_LIT:0>] == '<STR_LIT:0>':<EOL><INDENT>_mode = '<STR_LIT>'<EOL>_tidt = _TID_TYPE.get(_tidd[<NUM_LIT:1>:<NUM_LIT:4>], '<STR_LIT>')<EOL>_tidl = int(_tidd[<NUM_LIT:4>:], base=<NUM_LIT:2>)<EOL>if _tidt == '<STR_LIT>':<EOL><INDENT>if _tidl != <NUM_LIT:0>:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>')<EOL><DEDENT>_iden = self._read_fileng(_size-<NUM_LIT:1>)<EOL>opt = dict(<EOL>desc=desc,<EOL>type=_type,<EOL>length=_size + <NUM_LIT:2>,<EOL>dpd_type=_mode,<EOL>tid_type=_tidt,<EOL>tid_len=_tidl,<EOL>id=_iden,<EOL>)<EOL><DEDENT>elif _tidt == '<STR_LIT>':<EOL><INDENT>if _tidl != <NUM_LIT:3>:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>')<EOL><DEDENT>_tidf = self._read_fileng(<NUM_LIT:4>)<EOL>_iden = self._read_fileng(_size-<NUM_LIT:4>)<EOL>opt = dict(<EOL>desc=desc,<EOL>type=_type,<EOL>length=_size + <NUM_LIT:2>,<EOL>dpd_type=_mode,<EOL>tid_type=_tidt,<EOL>tid_len=_tidl,<EOL>tid=ipaddress.ip_address(_tidf),<EOL>id=_iden,<EOL>)<EOL><DEDENT>elif _tidt == '<STR_LIT>':<EOL><INDENT>if _tidl != <NUM_LIT:15>:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>')<EOL><DEDENT>_tidf = self._read_fileng(<NUM_LIT:15>)<EOL>_iden = self._read_fileng(_size-<NUM_LIT:15>)<EOL>opt = dict(<EOL>desc=desc,<EOL>type=_type,<EOL>length=_size + <NUM_LIT:2>,<EOL>dpd_type=_mode,<EOL>tid_type=_tidt,<EOL>tid_len=_tidl,<EOL>tid=ipaddress.ip_address(_tidf),<EOL>id=_iden,<EOL>)<EOL><DEDENT>else:<EOL><INDENT>_tidf = self._read_unpack(_tidl+<NUM_LIT:1>)<EOL>_iden = self._read_fileng(_size-_tidl-<NUM_LIT:2>)<EOL>opt = dict(<EOL>desc=desc,<EOL>type=_type,<EOL>length=_size + <NUM_LIT:2>,<EOL>dpd_type=_mode,<EOL>tid_type=_tidt,<EOL>tid_len=_tidl,<EOL>tid=_tidf,<EOL>id=_iden,<EOL>)<EOL><DEDENT><DEDENT>elif _tidd[<NUM_LIT:0>] == '<STR_LIT:1>':<EOL><INDENT>_data = self._read_binary(_size-<NUM_LIT:1>)<EOL>opt = dict(<EOL>desc=desc,<EOL>type=_type,<EOL>length=_size + <NUM_LIT:2>,<EOL>dpd_type=_mode,<EOL>tid_type=_tidt,<EOL>hav=_tidd[<NUM_LIT:1>:] + _data,<EOL>)<EOL><DEDENT>else:<EOL><INDENT>raise ProtocolError(f'<STR_LIT>')<EOL><DEDENT>return opt<EOL>
Read HOPOPT SMF_DPD option.

        Structure of HOPOPT SMF_DPD option [RFC 5570]:
            * IPv6 SMF_DPD Option Header in I-DPD mode
                 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
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                               ...              |0|0|0|  01000  | Opt. Data Len |
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                |0|TidTy| TidLen|             TaggerId (optional) ...           |
                +-+-+-+-+-+-+-+-+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                |                               |            Identifier  ...
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Octets      Bits        Name                        Description
                  0           0     hopopt.smf_dpd.type         Option Type
                  0           0     hopopt.smf_dpd.type.value   Option Number
                  0           0     hopopt.smf_dpd.type.action  Action (00)
                  0           2     hopopt.smf_dpd.type.change  Change Flag (0)
                  1           8     hopopt.smf_dpd.length       Length of Option Data
                  2          16     hopopt.smf_dpd.dpd_type     DPD Type (0)
                  2          17     hopopt.smf_dpd.tid_type     TaggerID Type
                  2          20     hopopt.smf_dpd.tid_len      TaggerID Length
                  3          24     hopopt.smf_dpd.tid          TaggerID
                  ?           ?     hopopt.smf_dpd.id           Identifier

            * IPv6 SMF_DPD Option Header in H-DPD Mode
                 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
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                               ...              |0|0|0| OptType | Opt. Data Len |
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                |1|    Hash Assist Value (HAV) ...
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Octets      Bits        Name                        Description
                  0           0     hopopt.smf_dpd.type         Option Type
                  0           0     hopopt.smf_dpd.type.value   Option Number
                  0           0     hopopt.smf_dpd.type.action  Action (00)
                  0           2     hopopt.smf_dpd.type.change  Change Flag (0)
                  1           8     hopopt.smf_dpd.length       Length of Option Data
                  2          16     hopopt.smf_dpd.dpd_type     DPD Type (1)
                  2          17     hopopt.smf_dpd.hav          Hash Assist Value