| 296 | # ZigBee # |
| 297 | |
| 298 | class ZigbeeNWK(Packet): |
| 299 | name = "Zigbee Network Layer" |
| 300 | fields_desc = [ |
| 301 | BitField("discover_route", 0, 2), |
| 302 | BitField("proto_version", 2, 4), |
| 303 | BitEnumField("frametype", 0, 2, |
| 304 | {0: 'data', 1: 'command', 3: 'Inter-PAN'}), |
| 305 | FlagsField("flags", 0, 8, ['multicast', 'security', 'source_route', 'extended_dst', 'extended_src', 'reserved1', 'reserved2', 'reserved3']), # noqa: E501 |
| 306 | XLEShortField("destination", 0), |
| 307 | XLEShortField("source", 0), |
| 308 | ByteField("radius", 0), |
| 309 | ByteField("seqnum", 1), |
| 310 | |
| 311 | # ConditionalField(XLongField("ext_dst", 0), lambda pkt:pkt.flags & 8), |
| 312 | |
| 313 | ConditionalField(dot15d4AddressField("ext_dst", 0, adjust=lambda pkt, x: 8), lambda pkt:pkt.flags & 8), # noqa: E501 |
| 314 | ConditionalField(dot15d4AddressField("ext_src", 0, adjust=lambda pkt, x: 8), lambda pkt:pkt.flags & 16), # noqa: E501 |
| 315 | |
| 316 | ConditionalField(ByteField("relay_count", 1), lambda pkt:pkt.flags & 0x04), # noqa: E501 |
| 317 | ConditionalField(ByteField("relay_index", 0), lambda pkt:pkt.flags & 0x04), # noqa: E501 |
| 318 | ConditionalField(FieldListField("relays", [], XLEShortField("", 0x0000), count_from=lambda pkt:pkt.relay_count), lambda pkt:pkt.flags & 0x04), # noqa: E501 |
| 319 | ] |
| 320 | |
| 321 | @classmethod |
| 322 | def dispatch_hook(cls, _pkt=None, *args, **kargs): |
| 323 | if _pkt and len(_pkt) >= 2: |
| 324 | frametype = ord(_pkt[:1]) & 3 |
| 325 | if frametype == 3: |
| 326 | return ZigbeeNWKStub |
| 327 | return cls |
| 328 | |
| 329 | def guess_payload_class(self, payload): |
| 330 | if self.flags.security: |
| 331 | return ZigbeeSecurityHeader |
| 332 | elif self.frametype == 0: |
| 333 | return ZigbeeAppDataPayload |
| 334 | elif self.frametype == 1: |
| 335 | return ZigbeeNWKCommandPayload |
| 336 | else: |
| 337 | return Packet.guess_payload_class(self, payload) |
| 338 | |
| 339 | |
| 340 | class LinkStatusEntry(Packet): |
nothing calls this directly
no test coverage detected
searching dependent graphs…