RFC 2106

Data Link Switching Remote Access Protocol

πŸ“… published February 1997, from ietf

Okay bestie, here's the title block tea ✨

  • Series: Network Working Group
  • Number: RFC 2106
  • Category: Informational 🌸
  • Authors: S. Chiang and J. Lee (Cisco Systems, Inc.), and H. Yasuda (Mitsubishi Electric Corp.) πŸ‘‘
  • Date: February 1997
  • Obsoletes / Updates: the header doesn't list anything it obsoletes or updates, so this one stands on its own πŸ’…

Status of this Memo

This memo provides information for the Internet community. It does not specify an Internet standard of any kind. Distribution of this memo is unlimited. πŸ¦‹

Abstract

This memo describes the Data Link Switching Remote Access Protocol, which is used between workstations and routers to transport SNA/NetBIOS traffic over TCP sessions. Any questions or comments SHOULD be sent to drap@cisco.com. πŸ’Œ

1. Introduction

Ever since the Data Link Switching Protocol (RFC 1795) got published, some software vendors have started running DLSw on workstations πŸ’». Putting DLSw on a whole bunch of workstations brings up several important issues that MUST be addressed, and scalability is the biggest drama 😭. For example, the number of TCP sessions to the DLSw router goes up in direct proportion to how many workstations get added. Efficiency is the other concern: DLSw is a switch-to-switch protocol, so it isn't efficient when it runs on workstations.

DRAP handles those issues πŸ¦‹. It brings in a hierarchical structure to fix the scalability problems. All workstations become clients of the router (server) instead of peers to the router, which creates a client/server model. It also gives you a more efficient protocol between the workstation (client) and the router (server) ✨.

2. Overview

2.1. DRAP Client/Server Model

Here's the big picture of the setup πŸ‘€

          +-----------+              +-----------+       +---------+
          | Mainframe |              | IP Router +- ppp -+ DLSw    |
          +--+--------+              +-----+-----+       | Work    |
             |                             |             | Station |
             |                             |             +---------+
          +--+--+      +-------------+     |
          | FEP +- TR -+ DLSw Router +-- IP Backbone
          +-----+      +-------------+     |
                                           |
                                           |
                                     +-----------+       +---------+
                                     | IP Router +- ppp -+ DLSw    |
                                     +-----+-----+       | Work    |
                                                         | Station |
                                                         +---------+

                               |         DLSw Session          |
                               +-------------------------------+
      Figure 2-1. Running DLSw on a large number of workstations creates a
                             scalability problem.

Figure 2-1 shows a typical DLSw implementation on a workstation. The workstations connect to the central site DLSw router over the IP network. As the network grows, scalability becomes an issue, since the number of TCP sessions goes up with the number of workstations πŸ“ˆ.

                                      +-----------+       +-------+
           +-----------+              | DLSw/DRAP |       | DRAP  |
           | Mainframe |              |   Router  +- ppp -+ Client|
           +--+--------+              +-----+-----+       +-------+
              |                             |
              |                             |
           +--+--+      +-------------+     |
           | FEP +- TR -+ DLSw Router +-- IP Backbone
           +-----+      +-------------+     |
                                            |
                                            |
                                      +-----------+       +-------+
                                      | DLSw/DRAP |       | DRAP  |
                                      |   Router  +- ppp -+ Client|
                                      +-----+-----+       +-------+

                             | DLSw Session |  | DRAP Session |
                             +--------------+  +--------------+
    Figure 2-2. DLSw Remote Access Protocol solves the scalability problem.

In a large network, DRAP fixes the scalability problem by significantly cutting down the number of peers that connect to the central site router πŸ™Œ. The workstations (DRAP client) and the router (DRAP server) have a Client/Server relationship. Workstations are attached to a DRAP server, and each DRAP server has a single peer connection to the central site router.

2.2. Dynamic Address Resolution

In a DLSw network, each workstation needs a MAC address to talk to a FEP attached to a LAN. When DLSw runs on a workstation, that workstation doesn't always have a MAC address defined. For example, when a workstation connects to a router through a modem via PPP, it only has an IP address. In that case, the user MUST define a virtual MAC address. This is super admin-heavy, because each workstation MUST have a unique MAC address 😩.

DRAP uses the Dynamic Address Resolution protocol to solve this problem πŸͺ„. It lets the server dynamically assign a MAC address to a client without complex configuration.

For a client to start a session with a server, the workstation sends a direct request to the server. The request contains the destination MAC address and the destination SAP. The workstation can either specify its own MAC address or request that the server assign one to it. The server's IP address MUST be pre-configured on the workstation. If IP addresses are configured for multiple servers at a workstation, the request can be sent to those servers, and the first one to respond will be used ⚑.

For a server to start a session with a client, the server sends a directed request to the workstation. The workstation MUST pre-register its MAC address at the server. This can be done either by configuration on the server or by registration at the server (both MAC addresses and IP addresses will be registered) πŸ—‚οΈ.

2.3. TCP Connection

The transport used between the client and the server is TCP. Before a TCP session is established between the client and the server, no message can be sent 🚫. The default parameters associated with the TCP connections between the client and the server are as follows:

   Socket Family     AF_INET        (Internet protocols)
   Socket Type       SOCK_STREAM    (stream socket)
   Port Number       1973

There is only one TCP connection between the client and the server, and it's used for both read and write operations πŸ”.

3. DRAP Format

3.1. General Frame Format

The General format of the DRAP frame looks like this 🧩:

             +-------------+-----------+-----------+
             | DRAP Header | DRAP Data | User Data |
             +-------------+-----------+-----------+
                     Figure 3-1. DRAP Frame Format

The DRAP protocol lives in the DRAP header, which is common to all frames passed between the DRAP client and the server. This header is 4 bytes long, and the next section explains the details πŸ“¦.

The next part is the DRAP Data. Its structure and size depend on the type of messages carried in the DRAP frame. The DRAP data is used to process the frame, but it is OPTIONAL πŸ€·β€β™€οΈ.

The third part of the frame is the user data, which is sent by the local system to the remote system. Its size is variable, and it's only included in the frame when there's data to be sent to the remote system 🎁.

3.2. Header Format

The DRAP header is used to identify the message type and the length of the frame. It's a general-purpose header used for each frame passed between the DRAP server and the client. More information is needed for frames like CAN_U_REACH and I_CAN_REACH, so that info gets passed to the peer as DRAP data. The structure of the DRAP data depends on the type of frame, and it'll be discussed in detail in later sections 🫢.

The DRAP Header is given below:

             +-------------------------------------------+
             | DRAP Packet Header (Each row is one byte) |
             +===========================================+
           0 | Protocol ID / Version Number              |
             +-------------------------------------------+
           1 | Message Type                              |
             +-------------------------------------------+
           2 | Packet Length                             |
             + - - - - - - - - - - - - - - - - - - - - - +
           3 |                                           |
             +-------------------------------------------+
                     Figure 3-2. DRAP Header Format
  • The Protocol ID uses the first 4 bits of this field and is set to "1000" πŸ”’.
  • The Version Number uses the next 4 bits in this field and is set to "0001" πŸ”’.
  • The message type is the DRAP message type πŸ’¬.
  • The Total Packet length is the length of the packet, including the DRAP header, DRAP data and User Data. The minimum size of the packet is 4, which is the length of the header πŸ“.

3.3. DRAP Messages

Most of the Drap frames are based on the existing DLSw frames and have the same names πŸ‘―. The information in the corresponding DRAP and DLSw frames MAY differ, but the functionalities are the same, so the DLSw State Machine handles these DRAP frames. Some new DRAP frames were created to handle special DRAP functions. For example, the new DRAP frames I_CANNOT_REACH and START_DL_FAILED provide negative acknowledgment πŸ™…β€β™€οΈ. The DLSw frames that aren't needed for DRAP get dropped πŸ—‘οΈ.

The following table lists and describes all available DRAP messages πŸ“‹:

   DRAP Frame Name     Code  Function
   ---------------     ----  --------
   CAN_U_REACH         0x01  Find if the station given is reachable
   I_CAN_REACH         0x02  Positive response to CAN_U_REACH
   I_CANNOT_REACH      0x03  Negative response to CAN_U_REACH
   START_DL            0x04  Setup session for given addresses
   DL_STARTED          0x05  Session Started
   START_DL_FAILED     0x06  Session Start failed
   XID_FRAME           0x07  XID Frame
   CONTACT_STN         0x08  Contact destination to establish SABME
   STN_CONTACTED       0x09  Station contacted - SABME mode set
   DATA_FRAME          0x0A  Connectionless Data Frame for a link
   INFO_FRAME          0x0B  Connection oriented I-Frame
   HALT_DL             0x0C  Halt Data Link session
   HALT_DL_NOACK       0x0D  Halt Data Link session without ack
   DL_HALTED           0x0E  Session Halted
   FCM_FRAME           0x0F  Data Link Session Flow Control Message
   DGRM_FRAME          0x11  Connectionless Datagram Frame for a circuit
   CAP_XCHANGE         0x12  Capabilities Exchange Message
   CLOSE_PEER_REQUEST  0x13  Disconnect Peer Connection Request
   CLOSE_PEER_RESPONSE 0x14  Disconnect Peer Connection Response
   PEER_TEST_REQ       0x1D  Peer keepalive test request
   PEER_TEST_RSP       0x1E  Peer keepalive response

                         Table 3-1. DRAP Frames

3.4. DRAP Data formats

The DRAP data carries the information needed for each DRAP frame πŸŽ€. This information is used by the Server or the Client, and it does not contain any user data. The DRAP data frame types are listed in the following sections. Please note that the sender SHOULD set the reserved fields to zero, and the receiver SHOULD ignore these fields πŸ™.


to be continued in part 2 πŸ¦‹

3.4.1. CAN_U_REACH, I_CAN_REACH, and I_CANNOT_REACH Frames ✨

Okay so these frame types are how we find resources on the network πŸ” A CAN_U_REACH frame gets sent to the server to check if a resource is reachable 🫢 The server answers with an I_CAN_REACH frame if it can reach the workstation named in the CAN_U_REACH frame, or with an I_CANNOT_REACH frame if that station is not reachable. The server should not send the CAN_U_REACH frame to the clients πŸ™… And when a server gets an explorer whose destination is a known client, it should respond to it directly πŸ’

        +---------------+-----------------------+
        | Field Name    | Information           |
        +---------------+-----------------------+
        | Message Type  | 0x01, 0x02, or 0x03   |
        +---------------+-----------------------+
        | Packet Length | 0x0C                  |
        +---------------+-----------------------+

Figure 3-3. CAN_U_REACH, I_CAN_REACH, and I_CANNOT_REACH Header

          +-----------------------------------+
          | Field Name (Each row is one byte) |
          +===================================+
        0 | Target MAC Address                |
          + - - - - - - - - - - - - - - - - - +
        1 |                                   |
          + - - - - - - - - - - - - - - - - - +
        2 |                                   |
          + - - - - - - - - - - - - - - - - - +
        3 |                                   |
          + - - - - - - - - - - - - - - - - - +
        4 |                                   |
          + - - - - - - - - - - - - - - - - - +
        5 |                                   |
          +-----------------------------------+
        6 | Source SAP                        |
          +-----------------------------------+
        7 | Reserved                          |
          +-----------------------------------+

Figure 3-4. CAN_U_REACH, I_CAN_REACH, and I_CANNOT_REACH Data

The MAC Address field carries the MAC address of the target workstation that's being searched for πŸ‘€ It's a six-byte MAC Address field, and the same MAC Address comes back in both the I_CAN_REACH and the I_CANNOT_REACH frames πŸ¦‹

Byte 6 is the source SAP 🌸 The destination SAP is set to zero when an explorer frame is sent to the network.

If the sender didn't receive a positive acknowledgment within a recommended threshold value of 60 seconds, the destination is considered not reachable πŸ’€


3.4.2. START_DL, DL_STARTED, and START_DL_FAILED Frames

These frame types are how DRAP sets up a link station (circuit) πŸ”— The START_DL frame gets sent directly to the server that responded to the CAN_U_REACH frame. When the server gets this frame, it establishes a link station using the source and destination addresses and saps provided in the START_DL frame. If the circuit is set up successfully, a DL_STARTED frame gets sent back as the response πŸŽ€ If it fails, you get a START_DL_FAILED response instead. The server can also send START_DL frames to clients to set up circuits πŸ‘‘

        +---------------+-----------------------+
        | Field Name    | Information           |
        +---------------+-----------------------+
        | Message Type  | 0x04, 0x05, or 0x06   |
        +---------------+-----------------------+
        | Packet Length | 0x18                  |
        +---------------+-----------------------+

Figure 3-5. START_DL, DL_STARTED, and START_DL_FAILED Header

          +-----------------------------------+
          | Field Name (Each row is one byte) |
          +===================================+
        0 | Host MAC Address                  |
          + - - - - - - - - - - - - - - - - - +
        1 |                                   |
          + - - - - - - - - - - - - - - - - - +
        2 |                                   |
          + - - - - - - - - - - - - - - - - - +
        3 |                                   |
          + - - - - - - - - - - - - - - - - - +
        4 |                                   |
          + - - - - - - - - - - - - - - - - - +
        5 |                                   |
          +-----------------------------------+
        6 | Host SAP                          |
          +-----------------------------------+
        7 | Client SAP                        |
          +-----------------------------------+
        8 | Origin Session ID                 |
          +-----------------------------------+
        9 |                                   |
          + - - - - - - - - - - - - - - - - - +
        10|                                   |
          + - - - - - - - - - - - - - - - - - +
        11|                                   |
          +-----------------------------------+
        12| Target Session ID                 |
          + - - - - - - - - - - - - - - - - - +
        13|                                   |
          + - - - - - - - - - - - - - - - - - +
        14|                                   |
          + - - - - - - - - - - - - - - - - - +
        15|                                   |
          +-----------------------------------+
        16| Largest Frame Size                |
          +-----------------------------------+
        17| Initial Window size               |
          +-----------------------------------+
        18| Reserved                          |
          + - - - - - - - - - - - - - - - - - +
        19|                                   |
          +-----------------------------------+

Figure 3-6. START_DL, DL_STARTED, and START_DL_FAILED Data

The Host MAC address is the address of the target station if the session is started from the client 🧚 Or it's the address of the originating station if the session is started from the server.

The next two fields are the Host and Client SAPs πŸ’œ Each one is one byte long. The Host SAP is the SAP used by the station with the Host MAC address, and the Client SAP is the SAP used by the client.

The Origin Session ID is the ID of the originating station that starts the circuit ✨ The originating station uses this ID to identify the newly created circuit. Before the START_DL frame is sent to the target station, the originating station sets up a control block for the circuit. This link station information gets set up because DRAP does not use a three-way handshake for link station establishment πŸ™ˆ In the DL_STARTED and the START_DL_FAILED messages, the Origin Session ID is returned exactly as it was received in the START_DL frame. The Target Session ID is set by the target station and returned in the DL_STARTED message.

The Target Session ID is not valid for the START_DL and the START_DL_FAILED frame, so treat it as a Reserved field 🫠 In the DL_STARTED frame, it's the session ID that the target station uses to set up this circuit.

The Largest Frame Size field shows the maximum frame size the client can use πŸ“ It's only valid when the server sets it. The Largest Frame Size field must be set to zero when a frame is sent by the client. Both START_DL and DL_STARTED use the Largest Frame Size field, and only its rightmost 6 bits are used. The format is defined in the IEEE 802.1D Standard, Annex C, Largest Frame Bits (LF). Bit 3 to bit 5 are base bits, and bit 0 to bit 2 are extended bits. The Largest Frame Size field isn't used in the START_DL_FAILED frame, and it must be set to zero there.

        bit   7    6    5    4    3    2    1    0
              r    r    b    b    b    e    e    e

Figure 3-7. Largest Frame Size

Please note that if the client is a PU 2.1 node, the client should use the maximum I-frame size negotiated in the XID3 exchange πŸ“£

The Initial window size in the START_DL frame gives the receive window size on the originating side πŸͺŸ The target DRAP station returns its receive window size in the DL_STARTED frame. The field is reserved in the START_DL_FAILED frame. The window size works the same way it does in DLSw. Please refer to RFC 1795 for details πŸ“š

The last two bits are reserved for future use πŸ”’ They must be set to zero by the sender and ignored by the receiver.

If the sender of the START_DL frame didn't receive a START_DL_FAILED frame within a recommended threshold value of 60 seconds, the connection is considered unsuccessful ⏰


3.4.3. HALT_DL, HALT_DL_NOACK, and DL_HALTED Frames

These frame types are how DRAP disconnects a link station πŸ‘‹ A HALT_DL frame gets sent directly to the remote workstation to say the sender wants to disconnect. When the receiver gets this frame, it tears down the session associated with the Original Session ID and the Target Session ID provided in the HALT_DL frame. The receiver should respond with the DL_HALTED frame. The DL_HALTED frame should use the same Session ID values as the received HALT_DL message, without swapping them πŸ” The HALT_DL_NOACK frame is used when a response isn't required.

        +---------------+-----------------------+
        | Field Name    | Information           |
        +---------------+-----------------------+
        | Message Type  | 0x0C, 0x0D, or 0x0E   |
        +---------------+-----------------------+
        | Packet Length | 0x10                  |
        +---------------+-----------------------+

Figure 3-8. HALT_DL, HALT_DL_NOACK, and DL_HALTED Header

          +-----------------------------------+
          | Field Name (Each row is one byte) |
          +===================================+
        0 | Sender Session ID                 |
          + - - - - - - - - - - - - - - - - - +
        1 |                                   |
          + - - - - - - - - - - - - - - - - - +
        2 |                                   |
          + - - - - - - - - - - - - - - - - - +
        3 |                                   |
          +-----------------------------------+
        4 | Receiver Session ID               |
          + - - - - - - - - - - - - - - - - - +
        5 |                                   |
          + - - - - - - - - - - - - - - - - - +
        6 |                                   |
          + - - - - - - - - - - - - - - - - - +
        7 |                                   |
          +-----------------------------------+
        8 | Reserved                          |
          + - - - - - - - - - - - - - - - - - +
        9 |                                   |
          + - - - - - - - - - - - - - - - - - +
        10|                                   |
          + - - - - - - - - - - - - - - - - - +
        11|                                   |
          +-----------------------------------+

Figure 3-9. START_DL, DL_STARTED, and START_DL_FAILED Data

3.4.4. XID_FRAME, CONTACT_STN, STN_CONTACTED, INFO_FRAME, FCM_FRAME, and DGRM_FRAME ✨

okay so these frames are the ones doing the real work πŸ’… They carry the end-to-end data or set up a circuit. The Destination Session ID is the Session ID that the receiver made in the START_DL frame or the DL_STARTED frame, so it's giving continuity 🧚 The flow control flag works exactly the way it does in DLSw. For the full tea, check out RFC 1795 🫢

           +---------------+----------------------------+
           | Field Name    | Information                |
           +---------------+----------------------------+
           | Message Type  | Based on Message type      |
           +---------------+----------------------------+
           | Packet Length | 0x0C + length of user data |
           +---------------+----------------------------+
                    Figure 3-10. Generic DRAP Header

             +-----------------------------------+
             | Field Name (Each row is one byte) |
             +===================================+
           0 | Destination Session ID            |
             + - - - - - - - - - - - - - - - - - +
           1 |                                   |
             + - - - - - - - - - - - - - - - - - +
           2 |                                   |
             + - - - - - - - - - - - - - - - - - +
           3 |                                   |
             +-----------------------------------+
           4 | Flow Control Flags                |
             +-----------------------------------+
           5 | Reserved                          |
             + - - - - - - - - - - - - - - - - - +
           6 |                                   |
             + - - - - - - - - - - - - - - - - - +
           7 |                                   |
             +-----------------------------------+
                 Figure 3-11. Generic DRAP Data Format

3.4.5. DATA_FRAME πŸŽ€

this frame type is for sending connectionless SNA and NetBIOS Datagram (UI) frames πŸ¦‹ The key difference is with the DGRM_FRAME. DGRM_FRAME sends UI frames for stations that already have a link station open. DATA_FRAME is for frames where no link station has been set up between that source and destination MAC/SAP pair. Same vibe, different situation πŸ™ˆ

           +---------------+-----------------------------+
           | Field Name    | Information                 |
           +---------------+-----------------------------+
           | Message Type  | 0x0A                        |
           +---------------+-----------------------------+
           | Packet Length | 0x10 + Length of user data  |
           +---------------+-----------------------------+
                     Figure 3-12. DATA_FRAME Header

             +-----------------------------------+
             | Field Name (Each row is one byte) |
             +===================================+
           0 | Host MAC Address                  |
             + - - - - - - - - - - - - - - - - - +
           1 |                                   |
             + - - - - - - - - - - - - - - - - - +
           2 |                                   |
             + - - - - - - - - - - - - - - - - - +
           3 |                                   |
             + - - - - - - - - - - - - - - - - - +
           4 |                                   |
             + - - - - - - - - - - - - - - - - - +
           5 |                                   |
             +-----------------------------------+
           6 | Host SAP                          |
             +-----------------------------------+
           7 | Client SAP                        |
             +-----------------------------------+
           8 | Broadcast Type                    |
             +-----------------------------------+
           9 | Reserved                          |
             + - - - - - - - - - - - - - - - - - +
           10|                                   |
             + - - - - - - - - - - - - - - - - - +
           11|                                   |
             +-----------------------------------+
                  Figure 3-13. DATA_FRAME Data Format

the first 8 bytes are defined the same way as in the START_DL frame ✨ The Broadcast Type field says what kind of broadcast frames are in use: Single Route Broadcast, All Route Broadcast, or Directed. The target side uses the same broadcast type too, so everyone's on the same page πŸ‘‘ If it's a Directed frame and the RIF information is known, the target peer can send a directed frame. If the RIF isn't known, a Single Route Broadcast frame gets sent instead 🌸

3.4.6. CAP_XCHANGE Frame πŸ’œ

in DRAP, the capability exchange frame is how the client and server swap info like its MAC address 🧚 If a DRAP client has its own MAC address defined, it SHOULD put that in the MAC address field. If it doesn't, that field MUST be set to zero 🫢

when the DRAP server gets a CAP_XCHANGE frame, it SHOULD cache the MAC address as long as it's non zero πŸ’… The server also checks that the MAC address is unique, which is so important 😭 The server SHOULD send back a CAP_XCHANGE response frame with the MAC address the client gave it, if that address is accepted. If the client doesn't have its own MAC address, the server SHOULD assign one and put it in the CAP_XCHANGE command frame πŸ¦‹

the client SHOULD record the new MAC address the server assigned and send back a response with that assigned address. If the client can't accept the assigned MAC address, another CAP_XCHANGE command with the MAC address field set to zero SHOULD be sent to the server. Then the server SHOULD allocate a new MAC address for this client πŸ”₯

during the capability exchange, both the client and the server can send command frames. It stops once either side sends a CAP_XCHANGE response frame. When that response goes out, the MAC address in the CAP_XCHANGE frame SHOULD match the one from the previous command it received. By sending that response, the sender agrees to use the MAC address from the previous command, which is a whole commitment πŸ’

the client and server each figure out independently how many CAP_XCHANGE frames need to be exchanged. If the count goes over the pre-defined number set by either the server or the client, the session SHOULD be brought down πŸ’€

the flag shows what the sender is capable of. These are the valid flags:

  • 0x01 NetBIOS support. If a client sets this bit on, the server passes all NetBIOS explorers to that client. If the bit isn't set, only SNA traffic gets sent to that client 🌈
  • 0x02 TCP Listen Mode support. If a client supports TCP listen mode, the server keeps the client's MAC and IP addresses even after the TCP session goes down. The server uses that cached info to connect out. If a client doesn't support TCP listen mode, the cache gets deleted as soon as the TCP session is down πŸ™ˆ
  • 0x04 Command/Response. If this bit is set, it's a command. Otherwise, it's a response ✨

the values 0x01 and 0x02 are only used by the client. When a server sends a command or response to a client, it doesn't return these values πŸŽ€

starting with the Reserved field, implementors can optionally implement the Capability Exchange Control Vector 🧚 Each one has three fields: Length (1 byte), Type (1 byte), and Data (Length - 2 bytes). There are two types defined: SAP_LIST and VENDOR_CODE. For compatibility, implementors SHOULD ignore unknown Control Vectors instead of treating them as errors πŸ’–

  • 0x01 SAP_LIST. Length: 2+n bytes, where n ranges from 1 to 16. This control vector lists the SAPs the client can support. A client can define up to 16 SAPs, so this control vector's length ranges from 3 to 18. If SAP_LIST isn't specified in the capability exchange, the server assumes the client can support all SAP values. For example, if a client can only support SAP 4 and 8, the following Control Vectors SHOULD be sent: "0x04, 0x01, 0x04, 0x08". The first byte is the length of 4. The second byte is the control vector type, SAP_LIST. The last two bytes are the supported SAP values, 0x04 and 0x08 πŸ“ Only the client uses this control vector. If the server accepts it, the server MUST return the same Control Vector to the client πŸ’…
  • 0x02 VENDOR_CODE. Length: 6 bytes. Each vendor gets a vendor code that identifies it. This control vector doesn't need a response 🌸

once the receiver responds to a Control Vector and the capability exchange isn't finished yet, the sender doesn't have to send that same Control Vector again 🫢

           +---------------+-----------------------+
           | Field Name    | Information           |
           +---------------+-----------------------+
           | Message Type  | 0x12                  |
           +---------------+-----------------------+
           | Packet Length | 0x1C                  |
           +---------------+-----------------------+
                    Figure 3-14. CAP_XCHANGE Header

             +-----------------------------------+
             | Field Name (Each row is one byte) |
             +===================================+
           0 | MAC Address                       |
             + - - - - - - - - - - - - - - - - - +
           1 |                                   |
             + - - - - - - - - - - - - - - - - - +
           2 |                                   |
             + - - - - - - - - - - - - - - - - - +
           3 |                                   |
             + - - - - - - - - - - - - - - - - - +
           4 |                                   |
             + - - - - - - - - - - - - - - - - - +
           5 |                                   |
             +-----------------------------------+
           6 | Flag                              |
             +-----------------------------------+
           7 | Reserved                          |
             +-----------------------------------+
                  Figure 3-15. CAP_XCHANGE Data Format

3.4.7. CLOSE_PEER_REQ Frames ✨

Okay bestie, this frame is the "bye, I'm out" message for peer connection management πŸ’… It carries a reason code field, and these are the valid reason codes:

  • 0x01 System shutdown πŸ”Œ: this means a shutdown is in progress.
  • 0x02 Suspend 😴: this one is for when there's no traffic between the server and the client and one of them wants to pause the TCP session. While it's suspended, all circuits should remain intact. The TCP session should be re-established when new user data needs to be sent, and once it's back there's no need to send the CAP_XCHANGE frame again. so chill 🫢
  • 0x03 No MAC address available πŸ™…: the server sends this when there is no MAC address available from the MAC address pool.
           +---------------+-----------------------+
           | Field Name    | Information           |
           +---------------+-----------------------+
           | Message Type  | 0x13                  |
           +---------------+-----------------------+
           | Packet Length | 0x08                  |
           +---------------+-----------------------+

Figure 3-16. CLOSE_PEER_REQ Header

             +-----------------------------------+
             | Field Name (Each row is one byte) |
             +===================================+
           0 | Reason Code                       |
             +-----------------------------------+
           1 | Reserved                          |
             + - - - - - - - - - - - - - - - - - +
           2 |                                   |
             + - - - - - - - - - - - - - - - - - +
           3 |                                   |
             +-----------------------------------+

Figure 3-17. CLOSE_PEER_REQ Data Format


3.4.8. CLOSE_PEER_RSP, PEER_TEST_REQ, and PEER_TEST_RSP Frames πŸ’Œ

Three frames, one job: keeping peer connections healthy 🩷 None of them carry any data.

  • CLOSE_PEER_RSP: this is the response to CLOSE_PEER_REQ.
  • PEER_TEST_REQ and PEER_TEST_RSP: these are for peer-level keepalive. Implementing PEER_TEST_REQ is optional, but PEER_TEST_RSP must be implemented so it can answer PEER_TEST_REQ. When a PEER_TEST_REQ frame goes out to the remote station, the sender expects a PEER_TEST_RSP back within a predefined time interval (the recommended value is 60 seconds). If that PEER_TEST_RSP doesn't show up in time, the sender can send PEER_TEST_REQ again. If a predefined number of PEER_TEST_REQ frames has been sent with no PEER_TEST_RSP received (the recommended number is 3), the sender should close the TCP session with that remote station and terminate all associated circuits. 🚨
           +---------------+-----------------------+
           | Field Name    | Information           |
           +---------------+-----------------------+
           | Message Type  | 0x14, 0x1D, or 0x1E   |
           +---------------+-----------------------+
           | Packet Length | 0x04                  |
           +---------------+-----------------------+

Figure 3-18. CLOSE_PEER_RSP, PEER_TEST_REQ, and PEER_TEST_RSP DRAP


4. References πŸ“š

[1] Wells, L., Chair, and A. Bartky, Editor, "DLSw: Switch-to-Switch Protocol", RFC 1795, October 1993.

[2] IEEE 802.1D Standard.

Authors' Addresses πŸŽ€

Steve T. Chiang 🌸

InterWorks Business Unit
Cisco Systems, Inc.
170 Tasman Drive
San Jose, CA 95134

Phone: (408) 526-5189
EMail: schiang@cisco.com

Joseph S. Lee 🌸

InterWorks Business Unit
Cisco Systems, Inc.
170 Tasman Drive
San Jose, CA 95134

Phone: (408) 526-5232
EMail: jolee@cisco.com

Hideaki Yasuda 🌸

System Product Center
Network Products Department
Network Software Products Section B
Mitsubishi Electric Corp.
Information Systems Engineering Center
325, Kamimachiya Kamakura Kanagawa 247, Japan

Phone: +81-467-47-2120
EMail: yasuda@eme068.cow.melco.co.jp

And that's the whole DRAP spec, bestie πŸŒˆπŸ‘‘

πŸ“¦ where this page comes from