MCPcopy Create free account
hub / github.com/secdev/scapy / IODWriteMultipleReq

Class IODWriteMultipleReq

scapy/contrib/pnio_rpc.py:611–670  ·  view source on GitHub ↗

IODWriteMultiple request

Source from the content-addressed store, hash-verified

609
610
611class IODWriteMultipleReq(Block):
612 """IODWriteMultiple request"""
613 fields_desc = [
614 BlockHeader,
615 ShortField("seqNum", 0),
616 UUIDField("ARUUID", None),
617 XIntField("API", 0xffffffff),
618 XShortField("slotNumber", 0xffff),
619 XShortField("subslotNumber", 0xffff),
620 StrFixedLenField("padding", "", length=2),
621 XShortEnumField("index", 0, IOD_WRITE_REQ_INDEX),
622 FieldLenField("recordDataLength", None, fmt="I", length_of="blocks"),
623 StrFixedLenField("RWPadding", "", length=24),
624 FieldListField("blocks", [],
625 PadFieldWithLen(PacketField("", None, IODWriteReq), 4),
626 length_from=lambda pkt: pkt.recordDataLength)
627 ]
628 # default values
629 block_type = 0x0008
630 index = 0xe040
631 API = 0xffffffff
632 slotNumber = 0xffff
633 subslotNumber = 0xffff
634
635 def post_build(self, p, pay):
636 # patch the update of block_length, as requests field must not be
637 # included. block_length is always 60
638 if self.block_length is None:
639 p = p[:2] + struct.pack("!H", 60) + p[4:]
640
641 # Remove the final padding added in requests
642 fld, val = self.getfield_and_val("blocks")
643 if fld.i2count(self, val) > 0:
644 length = len(val[-1])
645 pad = fld.field.padlen(length, self)
646 if pad > 0:
647 p = p[:-pad]
648 # also reduce the recordDataLength accordingly
649 if self.recordDataLength is None:
650 val = struct.unpack("!I", p[36:40])[0]
651 val -= pad
652 p = p[:36] + struct.pack("!I", val) + p[40:]
653
654 return Packet.post_build(self, p, pay)
655
656 def get_response(self):
657 """Generate the response block of this request.
658 Careful: it only sets the fields which can be set from the request
659 """
660 res = IODWriteMultipleRes()
661 for field in ["seqNum", "ARUUID", "API", "slotNumber",
662 "subslotNumber", "index"]:
663 res.setfieldval(field, self.getfieldval(field))
664
665 # append all block response
666 res_blocks = []
667 for block in self.getfieldval("blocks"):
668 res_blocks.append(block.get_response())

Callers

nothing calls this directly

Calls 10

ShortFieldClass · 0.90
UUIDFieldClass · 0.90
XIntFieldClass · 0.90
XShortFieldClass · 0.90
StrFixedLenFieldClass · 0.90
XShortEnumFieldClass · 0.90
FieldLenFieldClass · 0.90
FieldListFieldClass · 0.90
PacketFieldClass · 0.90
PadFieldWithLenClass · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…