
{
{  The request block is the CPU representation of the CPU / IOU processor
{  interface for network output.
{
{  NOTES:
{    1. The field 'io request' must be the first field the record.
{    2. The field (record) 'network request' is defined as such to permit
{       job / monitor communication of completed requests and to position
{       the field 'peripheral request' on a word boundary.
{    3. The field 'network_request' MUST be the last field in nat$request_block
{       and the field 'peripheral_request' MUST be the last field in nat$network_request.
{       This is because the RMA list MUST be contiguous to the peripheral request.
{

  TYPE
    nat$request_block = record
      io_request: ALIGNED [0 MOD 512] iot$io_request,
      allocation_description: nat$request_block_allocation,
      complete_request_block: ^nat$complete_request_block,
      peripheral_request_rma: ost$real_memory_address,
      network_request: nat$network_request,
    recend,

    nat$network_request = record
      request_block_link: ^nat$request_block, {links completed requests}
      message_id: nlt$bm_message_id,
      rma_list: ^nat$rma_list,
      ethernet_address: ALIGNED [0 MOD 8] nlt$ethernet_addr_and_checksum,
      peripheral_request: nat$peripheral_request,
    recend,

    nat$fixed_rma_list = 1 .. 5,
    nat$rma_list = array [1 .. * ] of nat$rma_list_entry,

    nat$rma_list_entry = record
      length: ALIGNED [0 MOD 8] 0 .. 0ffff(16),
      rma: ALIGNED [4 MOD 8] ost$real_memory_address,
    recend;

?? PUSH (LISTEXT := ON) ??
{
{  The 'complete request block' is used to allocate a 'request block' and
{  its associated 'real memory address list' with a single allocate request.
{
?? POP ??

  TYPE
    nat$complete_request_block = record
      complete_sequence: ALIGNED [0 MOD 1024] SEQ ( * ),
    recend;

*copyc iot$io_request
*copyc nat$peripheral_request
*copyc nat$request_block_allocation
*copyc nlt$bm_message_id
*copyc nlt$ethernet_addr_and_checksum
*copyc ost$hardware_subranges
