| 355 | |
| 356 | |
| 357 | class ZigbeeNWKCommandPayload(Packet): |
| 358 | name = "Zigbee Network Layer Command Payload" |
| 359 | fields_desc = [ |
| 360 | ByteEnumField("cmd_identifier", 1, { |
| 361 | 1: "route request", |
| 362 | 2: "route reply", |
| 363 | 3: "network status", |
| 364 | 4: "leave", |
| 365 | 5: "route record", |
| 366 | 6: "rejoin request", |
| 367 | 7: "rejoin response", |
| 368 | 8: "link status", |
| 369 | 9: "network report", |
| 370 | 10: "network update", |
| 371 | 11: "end device timeout request", |
| 372 | 12: "end device timeout response" |
| 373 | # 0x0d - 0xff reserved |
| 374 | }), |
| 375 | |
| 376 | # - Route Request Command - # |
| 377 | # Command options (1 octet) |
| 378 | ConditionalField(BitField("res1", 0, 1), |
| 379 | lambda pkt: pkt.cmd_identifier in [1, 2]), |
| 380 | ConditionalField(BitField("multicast", 0, 1), |
| 381 | lambda pkt: pkt.cmd_identifier in [1, 2]), |
| 382 | ConditionalField(BitField("dest_addr_bit", 0, 1), lambda pkt: pkt.cmd_identifier == 1), # noqa: E501 |
| 383 | ConditionalField( |
| 384 | BitEnumField("many_to_one", 0, 2, { |
| 385 | 0: "not_m2one", 1: "m2one_support_rrt", 2: "m2one_no_support_rrt", 3: "reserved"} # noqa: E501 |
| 386 | ), lambda pkt: pkt.cmd_identifier == 1), |
| 387 | ConditionalField(BitField("res2", 0, 3), lambda pkt: pkt.cmd_identifier == 1), # noqa: E501 |
| 388 | |
| 389 | # - Route Reply Command - # |
| 390 | # Command options (1 octet) |
| 391 | ConditionalField(BitField("responder_addr_bit", 0, 1), lambda pkt: pkt.cmd_identifier == 2), # noqa: E501 |
| 392 | ConditionalField(BitField("originator_addr_bit", 0, 1), lambda pkt: pkt.cmd_identifier == 2), # noqa: E501 |
| 393 | ConditionalField(BitField("res3", 0, 4), lambda pkt: pkt.cmd_identifier == 2), # noqa: E501 |
| 394 | # Route request identifier (1 octet) |
| 395 | ConditionalField(ByteField("route_request_identifier", 0), |
| 396 | lambda pkt: pkt.cmd_identifier in [1, 2]), # noqa: E501 |
| 397 | # Originator address (2 octets) |
| 398 | ConditionalField(XLEShortField("originator_address", 0x0000), lambda pkt: pkt.cmd_identifier == 2), # noqa: E501 |
| 399 | # Responder address (2 octets) |
| 400 | ConditionalField(XLEShortField("responder_address", 0x0000), lambda pkt: pkt.cmd_identifier == 2), # noqa: E501 |
| 401 | |
| 402 | # - Network Status Command - # |
| 403 | # Status code (1 octet) |
| 404 | ConditionalField(ByteEnumField("status_code", 0, { |
| 405 | 0x00: "No route available", |
| 406 | 0x01: "Tree link failure", |
| 407 | 0x02: "Non-tree link failure", |
| 408 | 0x03: "Low battery level", |
| 409 | 0x04: "No routing capacity", |
| 410 | 0x05: "No indirect capacity", |
| 411 | 0x06: "Indirect transaction expiry", |
| 412 | 0x07: "Target device unavailable", |
| 413 | 0x08: "Target address unallocated", |
| 414 | 0x09: "Parent link failure", |
nothing calls this directly
no test coverage detected
searching dependent graphs…