() (****************************************************************) () (Copyright (c) 1992, Carnegie Mellon University) () (All Rights Reserved) () (Permission is hereby granted to use, copy, modify, and) (distribute this software provided that the above copyright) (notice appears in all copies and that any distribution be for) (noncommercial purposes.) () (Carnegie Mellon University disclaims all warranties with regard) (to this software. In no event shall Carnegie Mellon University) (be liable for any special, indirect, or consequential damages) (or any damages whatsoever resulting from loss of use, data, or) (profits arising out of or in connection with the use or) (performance of this software.) () (****************************************************************) () (This file processed with symbol generator: 27-MAY-1991 17:12:26.67.) (Data Structures\Data_Struct_Appendix)

These are the data structures used by the various components of CMU-OpenVMS/IP. Numbers are represented in decimal unless otherwise noted. Field sizes are given as the number of bits in the field, and the offsets are given as the number off bytes from the begining of the structure.

A word of warning. These structures are the ones used in CMU-OpenVMS/IP version 6.6. They may be different from the ones being used in your personal copy of CMU-OpenVMS/IP for any of the following reasons: (UNNUMBERED) You are not using CMU-OpenVMS/IP 6.6 You have an enhanced version of 6.6 Your local network hacker changed the source Your humble narrator typed them in wrong (oops!)

In any case, the definitive definitions [sic] for these structures can be found in the source code in the .REQ and .MAR files. It is very important, when changing these structures, to recompile ALL of the source modules that use them. Furthermore, keep it in mind that there are some structures that are defined twice, once in BLISS and once in MACRO. If one of these structures changes, so must the other.

There are no implementation-indepentant data structures (e.g. a TCP segment) listed here. These may be found in the apropriate RFCs as well as Douglas Comer's book, (Internetworking with TCP/IP\ITALIC). (Structures returned by QIO calls\CMUIP_STR_1) (NET$STATUS\CMUIP_STR_2)

(STRUCTS_CSRB) shows the structure of the data returned in the NET$STATUS QIO call. (Connection_Status_Return_Block\STRUCTS_CSRB) (KEEP) (4\20\5\6) (Field\Len\Off\Use) (CS$Bytes_Avail\16\0\) (CS$State\8\2\) (CS$Last_State\8\3\) (CS$Send_Window\32\4\) (CS$Recv_Window\32\8\) (CS$User_ID\32\12\Owning PID) (NET$DUMP\CMUIP_STR_4)

These are the structures returned in the NET$DUMP QIO call. (D$Mem_Alloc_Return_blk\CMUIP_STR_5)

Dynamic Memory allocation stats.

(KEEP) (4\10\4\4)(Field\Off\Len\Description) (DM$QB\0\32\Queue Blocks) (DM$UA\4\32\UARG Blocks) (DM$CS\8\32\TCP Control segments) (DM$DMS\12\32\default size max segs) (DM$NM\16\32\net mesg receive buffer) (DM$QBMX\20\32\Queue blocks max) (DM$UAMX\24\32\UARG Blocks max) (DM$CSMX\28\32\TCP Control segments max) (DM$DMSMX\32\32\default size max segs max) (DM$NMMX\36\32\net mesg receive buffer max) (DM$QBAL\40\32\qblks allocated) (DM$UAAL\44\32\Uarg blks allocated) (DM$CSAL\48\32\Control segs allocated) (DM$DMSAL\52\32\Default segs allocated) (DM$NMAL\56\32\net recv bufs allocated) (DM$QBFR\60\32\QBlks free) (DM$UAFR\64\32\Uarg blks free) (DM$CSFR\68\32\Control segs free) (DM$DMSFR\72\32\Default segs free) (DM$NMFR\76\32\net recv bufs free) (DU$TCP_Stats\CMUIP_STR_6)
(KEEP) (4\27\4\4)(Field\Off\Len\Description) (DM$TCPACP_PID\0\32\Process ID of the IPACP) (DM$User_IO_Requests\4\32\Number of IRP's processed) (DM$StoreForward\8\32\) (DM$Active_Conects_Opened\12\32\Active open requests) (DM$Passive_Conects_Opened\16\32\Passive open requests) (DM$Data_Bytes_Xmitted\20\32\) (DM$Data_Bytes_Recved\24\32\) (DM$Segs_Xmitted\28\32\) (DM$Segs_Recved\32\32\) (DM$Seg_Bad_Chksum\36\32\) (DM$BadSeq\40\32\Obsolete) (DM$Duplicate\44\32\Duplicates received) (DM$Retrans\48\32\Retransmissions sent) (DM$RPZ_RXQ\52\32\Repacketizer (obsolete)) (DM$OORW_Segs\56\32\out of recv window) (DM$Future_Rcvd\60\32\In, but not at RCV.NXT) (DM$Future_Used\64\32\Future segs later used) (DM$Future_Dropped\68\32\) (DM$Future_Dups\72\32\) (DM$Servers_Forked\76\32\Well-known-socket servers run) (DM$Uptime\80\16\) (DM$Arps_Received\82\32\) (Local_Connection_ID\CMUIP_STR_7)

This function returns a vector of longwords containing the indices of valid TCP connection blocks within the IPACP. The first longword contains a count of the remaining longwords. (TCB_Dump\CMUIP_STR_8)

Describes an individual TCP connection.

(KEEP) (4\25\4\4)(Field\Off\Len\Description) (DM$TCB_Addr\0\32\Address of TCB (internal)) (DM$User_ID\4\32\Owning process ID) (DM$State\8\16\Current TCB state) (DM$Last_State\10\16\) (DM$Foreign_Host\12\32\Foreign host #) (DM$Foreign_Port\16\32\Foreign port #) (DM$Local_Host\20\32\Local host #) (DM$Local_Port\24\32\Local port #) (DM$User_Recv_QE\28\32\# of pending user receives) (DM$User_Send_QE\32\32\# of pending user sends) (DM$Net_Recv_QE\36\32\# of pending receive buffers) (DM$Future_QE\40\32\# of buffers on future queue) (DM$Rexmit_QE\44\32\# of bytes on RX queue) (DM$Dasm_ptr\48\32\Disassembly pointer) (DM$Dasm_bc\52\32\Dissasembly byte count) (DM$Asm_ptr\56\32\Assembly pointer) (DM$Asm_bc\60\32\Assembly byte count) (DM$ISS\64\32\Initial Send Sequence #) (DM$SND_UNA\68\32\# of bytes send but not ACK'ed) (DM$SND_NXT\72\32\Next Send Sequence #) (DM$SND_WND\76\32\Send window count) (DM$SND_WL\80\32\) (DM$SND_BS\84\32\) (DM$IRS\88\32\Initial Receive Sequence #) (DM$RCV_NXT\92\32\Next Receive Sequence #) (DM$RCV_WND\96\32\Receive window count) (DM$RCV_BS\100\32\) (DM$Conn_TimeOut\104\32\Connection dead timeout) (DM$RT_TimeOut\108\32\Retransmission timer) (DM$Round_Trip_Time\112\32\Measured round-trip-time) (DU$Host_stats\CMUIP_STR_9)

Undocumented. (DU$Known_Host_Index\CMUIP_STR_10)

Undocumented. (DU$device_dump\CMUIP_STR_11)

Undocumented (DU$UDP_Connections\CMUIP_STR_12)

This function returns a vector of longwords containing the indices of valid UCP connection blocks within the IPACP. The first longword contains a count of the remaining longwords. (DU$UDPCB_Dump\CMUIP_STR_13)

(KEEP) (4\25\4\4)(Field\Off\Len\Description) (DU$UDPCB_Address\0\32\Internal UDPCB address) (DU$UDPCB_Foreign_Host\4\32\Foreign host number) (DU$UDPCB_Foreign_Port\8\16\Foreign port number) (DU$UDPCB_Local_Host\10\32\Local host number) (DU$UDPCB_Local_Port\14\16\Local port number) (DU$UDPCB_NR_Qcount\16\32\Count of items on receive queue) (DU$UDPCB_UR_Qcount\20\32\Count of items on user queue) (DU$UDPCB_Flags\24\16\UDPCB flags (See next table.)) (DU$UDPCB_User_ID\26\32\Owning process)
(KEEP) (3\25\4)(Field\Bit #\Function) (DU$UDPCB_Wildcard\0\Wildcard foreign host/port) (DU$UDPCB_Raw_Mode\1\User wants IP headers (not impl)) (DU$UDPCB_Aborting\2\Connection is closing) (DU$UDPCB_NMlook\3\Name lookup in progress) (DU$UDPCB_Internal\4\Connection is internal) (DU$ARP_Cache\CMUIP_STR_14)

Obselete (DU$ICMP_Connections\CMUIP_STR_15)

This function returns a vector of longwords containing the indices of valid ICMP connection blocks within the IPACP. The first longword contains a count of the remaining longwords. (DU$ICMPCB_Dump\CMUIP_STR_16)

(KEEP) (4\25\4\4)(Field\Off\Len\Description) (DU$ICMPCB_Address\0\32\Internal ICMPCB address) (DU$ICMPCB_Foreign_Host\4\32\Foreign host number) (DU$ICMPCB_Local_Host\8\32\Local host number) (DU$ICMPCB_NR_Qcount\12\32\Count of items on receive queue) (DU$ICMPCB_UR_Qcount\16\32\Count of items on user queue) (DU$ICMPCB_Flags\20\16\UDPCB flags (See next table)) (DU$ICMPCB_User_ID\22\32\Owning process)
(KEEP) (3\25\4)(Field\Bit\Description) (DU$ICMPCB_Wildcard\0\Wildcard foreign host/port) (DU$ICMPCB_Raw_Mode\1\User wants IP headers (not impl)) (DU$ICMPCB_Aborting\2\Connection is closing) (DU$ICMPCB_NMlook\3\Name lookup in progress) (DU$ICMPCB_Internal\4\Connection is internal) (DU$IP_Connections\CMUIP_STR_17)

This function returns a vector of longwords containing the indices of valid UCP connection blocks within the IPACP. The first longword contains a count of the remaining longwords. (DU$IPCB_Dump\CMUIP_STR_18)

(KEEP) (4\25\4\4)(Field\Off\Len\Description) (DU$IPCB_Address\0\32\Internal IPCB address) (DU$IPCB_Foreign_Host\4\32\Foreign host number) (DU$IPCB_Local_Host\8\32\Local host number) (DU$IPCB_NR_Qcount\12\32\Count of items on receive queue) (DU$IPCB_UR_Qcount\16\32\Count of items on user queue) (DU$IPCB_Flags\20\16\UDPCB flags (See next table)) (DU$IPCB_User_ID\22\32\Owning process)
(KEEP) (3\25\4)(Field\Bit\Description) (DU$IPCB_Wildcard\0\Wildcard foreign host/port) (DU$IPCB_Raw_Mode\1\User wants IP headers (not impl)) (DU$IPCB_Aborting\2\Connection is closing) (DU$IPCB_NMlook\3\Name lookup in progress) (DU$IPCB_Internal\4\Connection is internal) (IPACP\CMUIP_STR_19) (IPACP Information block\CMUIP_STR_20)

The structure shown in (STRUCTS_IPACPINFO) is assembled by the IPACP to describe itself to other modules who wish to interact with it. It consists of entry points, literals, and pointers to global parameters.

Defined in NETCONFIG.REQ

(IPACP Information block\STRUCTS_IPACPINFO) (4\20\4\4) (Field\Len\Off\Use) ((4\LEFT)IAPCP receive callback) (ACPI$IP_Receive\32\0\Function called when external data arrives) ((4\LEFT)IPACP AST flag) (ACPI$AST_in_progress\32\4\Points to IPACP's IPL-raised flag) ((4\LEFT)IPACP nap control flag) (ACPI$Sleeping\32\8\Points to IPACP's hibernation flag) ((4\LEFT)Interrupt blocking routines) (ACPI$NOINT\32\12\Function called to disable interrupts) (ACPI$OKINT\32\16\Function called to reenable interrupts) ((4\LEFT)Error reporting routines) (ACPI$Device_Error\32\20\Function pointer) ((4\LEFT)IPACP self-address recognition) (ACPI$IP_ISME\32\24\Function. IPACP recog. addr. as self?) ((4\LEFT)Memory allocation routines) (ACPI$Seg_Get\32\28\Function, Ask IPACP for a Segment) (ACPI$Seg_Free\32\32\Function, return a Segment to IPACP) (ACPI$QBlk_Free\32\36\Function, return a QBlk to IPACP) ((4\LEFT)Formatted event logging routines) (ACPI$LOG_STATE\32\40\Pntr to current IPACP logging mask) (ACPI$QL_FAO\32\44\Function: Queue a message to log) (ACPI$LOG_FAO\32\48\Function: Log a message) (ACPI$OPR_FAO\32\52\Function: Message to console) (ACPI$ERROR_FAO\32\56\Function: Log an error) (ACPI$FATAL_FAO\32\60\Function: Log an error and die) ((4\LEFT)IPACP buffer sizes) (ACPI$MPBS\32\64\Maximum Physical Buffer Size) (Circular Queue\CMUIP_STR_22)

Circular byte queues are used to keep track of data as it flows between the user and the network. This structure is shown in (STRUCTS_CIRCQUE).

Defined in STRUCTURE.REQ

(Circular Queue\STRUCTS_CIRCQUE) (KEEP) (4\20\5\6) (Field\Len\Off\Use) (CQ$QUEUE\0\0\First address of structure) (CQ$BASE\32\0\Base address of queue) (CQ$END\32\4\Address of end of queue) (CQ$SIZE\16\8\Size of queue) (CQ$COUNT\16\10\Count of items on queue) (CQ$ENQP\32\12\Pointer to last byte on queue) (CQ$DEQP\32\16\Pointer to first byte on queue) (Queue Element Block Definitions\CMUIP_STR_24)

Queue blocks are used as queue elements which in turn contain bliss fullwords used for other purposes. Since they are used so frequently, they are not allocated from the system as they are needed but are instead maintained in a free-list while not in use. The basic queue block has only two fields, the forward and backword pointers.

Defined in STRUCTURE.REQ (Network Send Queue\CMUIP_STR_25)

The Network Send Queue Element is shown in (STRUCTS_NSQE).

Defined in STRUCTURE.REQ

(Network Send Queue Element\STRUCTS_NSQE) (KEEP) (4\20\5\6) (Field\Len\Off\Use) (SN$Next\32\0\Forward Queue Link (Flink)) (SN$Last\32\4\Backwards queue link (Blink)) (SN$Size\32\8\# of bytes to send) (SN$Data\32\12\Start of data buffer) (SN$Uargs\32\16\Address of user arg blk) (SN$TimeOut\16\20\connection timeout (time)) (SN$Flags\8\22\See (STRUCTS_NSQE_FLAGS))
(Flags subfields\STRUCTS_NSQE_FLAGS) (KEEP) (3\20\6) (field\bits\purpose) (SN$EOL\0\End Of Line Boolean) (SN$URG\1\Urgent data boolean) (SN$USER\2\On if seg is in user space) (ReTransmission Queue\CMUIP_STR_28)

The ReTransmission Queue Element is shown in (STRUCTS_RTQE).

Defined in STRUCTURE.REQ.

(ReTransmission Queue Element\STRUCTS_RTQE) (KEEP) (4\18\5\6) (Field\Len\Off\Use) (RT$Next\32\0\FLink.) (RT$Last\32\4\Blink.) (RT$Buf\32\8\segment buffer start adrs) (RT$BufSize\16\12\byte size of buffer.) (RT$SegSize\16\14\Byte size of segment.) (RT$Seg\32\16\Start address of segment.) (RT$Dest\32\20\Destination network adrs.) (RT$TimeOut\32\24\Retransmission timeout) (RT$Maxtimeout\32\28\expiration time on RX queue) (RT$Start_Xmit_Time\32\32\base for round trip calc.) (RT$Xmit_Count\32\36\# of transmissions.) (RT$Seq_End\32\40\Last sequence # in segment) (Network Receive segment Queue\CMUIP_STR_30)

The structure for the Network Receive Segment Queue Element is shown in (STRUCTS_NRSQE).

Defined in STRUCTURE.REQ

(Network Receive segment QueueElement\STRUCTS_NRSQE) (KEEP) (4\20\5\6) (Field\Len\Off\Use) ((4\LEFT)Normal field definitions for TCP segment) (NR$NEXT\32\0\FLINK.) (NR$LAST\32\4\BLink.) (NR$Buf_Size\32\8\byte size of read buffer.) (NR$Buf\32\12\Read buffer start.) (NR$Size\32\16\Byte size of TCP segment.) (NR$Seg\32\20\start of TCP segment.) (NR$Data_Size\32\24\# of data bytes available.) (NR$Uptr\32\28\pointer to new data) (NR$Ucount\32\32\count of new data) (NR$TimeOut\32\36\Internet address.) (NR$Dest_Adrs\32\40\Internet address.) (NR$Src_Port\16\44\SYN wait list: Source Port) (NR$Dest_Port\16\46\SYN wait list: Dest port.) (NR$SEQ_Start\32\48\First usable seqence #) (NR$SEQ_End\32\52\Segment's last sequence #.) (NR$SEQ_Count\32\56\Count of usable sequence #s) (NR$Flags\32\60\See (STRUCTS_NRSQE_FLAGS)) ((4\LEFT)Alternate fields for ICMP segments) (NR$ICM_TYPE\8\48\ICMP msg type) (NR$ICM_CODE\8\49\ICMP code field) (NR$ICM_EX\16\50\ICMP extra data) ((4\LEFT)Alternate fields for fragments) (NR$FragPtr\32\48\IP fragment flag/pointer)
(Flags subfields\STRUCTS_NRSQE_FLAGS) (KEEP) (3\20\6) (field\bits\purpose) (NR$EOL\0\End Of Line boolean) (NR$URG\1\Urgent data boolean) (NR$ICMP\2\Really an ICMP message) (User Receive Data Request Queue\CMUIP_STR_33)

The User Receive Data Request Queue Element is described in (STRUCTS_URDRQE).

Defined in STRUCTURE.REQ

(User Receive Data Request Queue Element\STRUCTS_URDRQE) (KEEP) (4\20\5\6) (Field\Len\Off\Use) (UR$NEXT\32\0\FLINK.) (UR$LAST\32\4\Blink) (UR$Size\32\8\# of bytes requested by user.) (UR$Data\32\12\Start of data buffer.) (UR$IRP_Adrs\32\16\IO request adrs.) (UR$UCB_Adrs\32\20\Unit Control Blk adrs.) (UR$Uargs\32\24\Address of user arg blk.) (Argument Blocks\CMUIP_STR_35)

User Network I/O requests are fed to TCP via an ACP queue. The queue elements are VMS I/O request packets (IRP's) which point to a TCP argument blocks. These argument block are formatted according to the field definitions shown in (STRUCTS_UARG).

(Basic Uarg definition\STRUCTS_UARG) (KEEP) (4\20\5\6) (Field\Len\Off\Use) (UD$Data_Start\32\0\Start of data within this block.) (UD$UBuf_Adrs\32\4\User buffer address.) (UD$VMS_BLK_ID\32\8\VMS system dynamic block ID.) (UD$IRP_Adrs\32\12\I/O Request Packet Address.) (UD$UCB_Adrs\32\16\Unit Control Block Address.) (UD$PID\32\20\Owning process ID.) (UD$UARGSIZE\16\24\Size of this UARG block) (UD$Funct\8\26\ACP Function code.) (UD$Protocol\8\27\ACP Protocol code.) (IP transport\CMUIP_STR_37) (Network Device Configuration blockvector Entry Fields.\CMUIP_STR_38)

The structure shown in (STRUCTS_NDCE) represents the IPACP's link with an IP transport.

Defined in NETCONFIG.REQ

(Network Device Configuration Entry\STRUCTS_NDCE) (4\16\5\6) (Field\Len\Off\Use) ((4\LEFT)Standard Device Configuration entries.) (dc_begin\0\0\Begining of structure) (dc_devname\64\0\String descriptor for the device name) (dc_devspec\64\8\Device-specific string descriptor) (dc_dev_interface\32\16\address of the transport-specific info block) (dc_ip_address\32\20\IP address for this interface) (dc_ip_netmask\32\24\IP network mask for this interface) (dc_ip_network\32\28\) (dc_rtn_Init\32\32\routine to initialize the device) (dc_rtn_Xmit\32\36\routine to transmit packets) (dc_rtn_Dump\32\40\routine to do dump specific functions) (dc_rtn_check\32\44\) (dc_Send_Qhead\32\48\Transmit queue head) (dc_send_Qtail\32\52\Transmit queue tail) (dc_flags\8\56\See (STRUCTS_NDCE_FLAGS)) ((4\LEFT)SNMP MIB-related entries.) (dcmib_begin\0\57\start of MIB) (dcmib_ifIndex\32\57\Interface index number) (dcmib_ifDescr\64\61\Interface description string) (dcmib_ifType\32\69\device type) (dcmib_ifMTU\32\73\Max Transfer Unit) (dcmib_ifSpeed\32\77\Bandwidth (bits/second)) (dcmib_ifPAsize\32\81\size of Physical Addr) (dcmib_ifPhysAddress\32\85\pntr to Physical Addr) (dcmib_ifAdminStatus\32\89\Desired status of interface) (dcmib_ifOperStatus\32\93\Current status of interface) (dcmib_ifLastState\32\97\time of last state change) (dcmib_ifInOctets\32\101\Octets received) (dcmib_ifInUcastPkts\32\105\Unicasts delivered) (dcmib_ifInNUcastPkts\32\109\non-Unicasts delivered) (dcmib_ifInDiscards\32\113\good but discarded pckts) (dcmib_ifInErrors\32\117\bad and discarded) (dcmib_ifInUnknownProtos\32\121\Unknown protocol fields) (dcmib_ifOutOctets\32\125\) (dcmib_ifOutUcastPkts\32\129\) (dcmib_ifOutNUcastPkts\32\133\) (dcmib_ifOutDiscards\32\137\) (dcmib_ifOutErrors\32\141\) (dcmib_ifOutQLen\32\145\)
(dc_flags subfields\STRUCTS_NDCE_FLAGS) (KEEP) (3\20\6) (field\bits\purpose) (dc_valid_device\0\Transport is for real) (dc_Online\1\Transport is online) (Ethernet transport control block\CMUIP_STR_41)

This structure represents the EtherNet transport's side of the Ethernet interface. It is provided as an example of a device-specific transport control block. The structure is shown in (STRUCTS_XEIS).

(XE Interface Structure\STRUCTS_XEIS) (KEEP) (4\16\5\6) (Field\Len\Off\Use) (XEI$dev_config\32\0\Pntr to dev_config entry) (XEI$IO_Chan\32\4\IP Channel to controller) (XEI$ARP_IO_Chan\32\8\ARP channel to controller) (XEI$rcvhdrs\32\12\Pre-allocated addr-recv headers) (XEI$recv_Qhead\32\16\List of outstanding reads, head) (XEI$recv_Qtail\32\20\List of outstanding reads, tail) (XEI$ARP_Buffer\32\24\Pntr to ARP-recv buffer) (XEI$ARP_Block\32\28\Pntr to ARP-recv structure) (XEI$Phy_Size\16\32\Size (in bytes) of physical address) (XEI$Phy_Addr\48\36\Physical address) (XEI$restart_time\32\40\Last time restarted?) (XEI$restart_count\16\44\Number of times restarted) (XEI$retry_count\16\48\Current number of read-retries) (XEI$max_retry\16\52\Restart after this many retries) (XEI$MPBS\16\56\Maximum Physical Buffer Size) (XEI$curhdr\16\60\Current addr-recv buffer in use) (XEI$Flags\16\64\See (STRUCTS_XEIS_FLAGS))
(XEI$Flags subfields\STRUCTS_XEIS_FLAGS) (KEEP) (3\20\6) (field\bits\purpose) (XEI$need_2_free\0\XEshutdown buf free pending) (XEI$IO_queued\1\XE I/O has been started) (XEI$XE_decnet\2\XE DECNET address seen) (XEI$XE_started\3\XE started at least once)