| 118 | |
| 119 | |
| 120 | class _CoAPOpt(Packet): |
| 121 | fields_desc = [BitField("delta", 0, 4), |
| 122 | BitField("len", 0, 4), |
| 123 | StrLenField("delta_ext", "", length_from=_get_delta_ext_size), # noqa: E501 |
| 124 | StrLenField("len_ext", "", length_from=_get_len_ext_size), |
| 125 | StrLenField("opt_val", "", length_from=_get_opt_val_size)] |
| 126 | |
| 127 | @staticmethod |
| 128 | def _populate_extended(val): |
| 129 | if val >= 269: |
| 130 | return struct.pack('!H', val - 269), 14 |
| 131 | if val >= 13: |
| 132 | return struct.pack('B', val - 13), 13 |
| 133 | return None, val |
| 134 | |
| 135 | def do_build(self): |
| 136 | self.delta_ext, self.delta = self._populate_extended(self.delta) |
| 137 | self.len_ext, self.len = self._populate_extended(len(self.opt_val)) |
| 138 | |
| 139 | return Packet.do_build(self) |
| 140 | |
| 141 | def guess_payload_class(self, payload): |
| 142 | if payload[:1] != b"\xff": |
| 143 | return _CoAPOpt |
| 144 | else: |
| 145 | return Packet.guess_payload_class(self, payload) |
| 146 | |
| 147 | |
| 148 | class _CoAPOptsField(StrField): |
no test coverage detected