LSL Protocol/Restrained Love Open Relay Group/ORG Requirements/0004 draft

STATUS: draft

VERSION: 0004

Summary

This page lists requirements that make a RLV relay or a RLVR controller "ORG compliant". Main advantages of an ORG compliant device over a classic RLVR devices are the following:

For a quick overview of the motivations and general working of the RLVR protocol and a few examples, we refer the reader to the original RLVR specification.

If you are making furniture, traps, or other RLVR controllers and you are not interested in what optional ORG x-tensions can offer, then you can stick with the original RLVR specification and still be compatible with ORG relays. However, to have the right to call your controller "ORG compatible", there are still a few light additional requirements such as:

If you are interested in ORG x-tensions, then you should also read the part about !x-orgversions.

If you are making a relay, sorry we are afraid you will have to read all this page.

Definition of an ORG device

A RLVR device is compliant with ORG specifications if it implements the consolidated RLVR protocol and meta-commands described in sections below, along with the optional ORG x-tensions it announces supporting.

Remarks:

If a device is ORG compliant, it may be advertised by the use of the ORG logo. ORG device makers are encouraged to do so.

Consolidated RLVR protocol

This consolidated RLVR protocol is roughly the same as Marine Kelley's RLVR protocol version 1.100, minus a few embarrassing loose ends.

Main differences are highlighted at the beginning of each subsection.

Protocol Syntax

Summary of differences with original RLVR:

Definitions

Requirements

RLVR protocol consists of messages exchanged between relay and controller

<c_msg> ::= IDENT "," KEY "," <commands>
<r_msg> ::= IDENT "," KEY "," <command> "," ACK
<commands> ::= <command> | <command> "|" <commands>
<command> ::= <rlv-command> | <meta-command>
<rlv-command> ::= "@" RLV-COMMAND
<meta-command> ::= "!" META-COMMAND_NAME <meta-command arguments>
<meta-command arguments> ::= "" | "/" ARG <meta-command arguments>

where we explicit the different terminal tokens:

IDENT: any string without ","
KEY: any UUID
ACK: any string without ","
RLV-COMMAND: any string without ","
META-COMMAND_NAME: any string without "/" and ","
ARG: any string without "/" and ","

Remark

IDENT and ARG can be empty, relay makers must take care of properly handling messages with empty IDENT or ARG (use llParseStringKeepNulls instead of llParseString2List). However, due to the fact many existing relays do not properly handle them, controllers should avoid using empty IDENTS.

On the relay side only

Further requirements:

Then, for every <command>:

  • IDENT is the same as IDENT in the <c_msg> being processed,
  • <command> is the subcommand being processed
  • and ACK is a string called acknowledgement value. By default the acknowledgement value is "ok" if the relay will execute the <command >, "ko" otherwise.

Remarks:

On executing commands

Summary of differences with original RLVR:

Relay side

Requirements:

Remarks:

Controller side

Protocol session

Summary of differences with original RLVR:

Definitions

Relay side requirements

On closing sessions:

  • on executing !release (received from the controller, or relay-triggered as in a safe-word, see #!release)
  • on noticing the controller is not reachable
  • on timeout, if the session is not Locked

On interactive Authentication:

On removing and adding restrictions:

Reachability:

Controller side requirements

In particular, non-portable controllers should not let a Locked relay wearer run free out of reach. Moreover, any controller should either react to some kind of event that is bound to happen (timer expiration being the most common) or provide a user interface for closing the session. It should be clear at least to the person who set the trap how the victim will be released.

Core meta-commands and associated mechanisms

An ORG device MUST at least support the meta-commands !release, !pong, !version, !implversion and !x-orgversions described below and implement their associated mechanisms.

Particular meta-commands definitions and mechanisms may override general requirements above.

New in ORG compared to RLVR: !x-orgversions

!release

Sent by a controller, this command closes the session.

      release,<controller_key>,!release,ok

When receiving the latter message, the controller should act accordingly, for instance by resetting itself and making itself ready for the next session.

Note that !release is not the same as @clear. @clear is interpreted by the relay as a RLV command and, as such, can only clear RLV restrictions. If RLV restrictions were the only restrictions of the session, then the session will be closed, but some x-tensions also define pure LSL based restrictions.

ping/!pong

The ping/!pong mechanism exists so that relays can check presence and responsiveness of a controller. This was primarily meant to be used on relay wearer relog, in order to reactivate all restrictions so that sessions persist on relog if the controller still exists and is ready to continue the session.

!pong cannot require authentication and does not lock a session

We call ping message a message from the relay, having the following syntax:

ping,<controller_key>,ping,ping

We call !pong message a message from the controller, having the following syntax:

ping,<relay_key>,!pong

Relay side

  1. if the session RLV restrictions contain unsit and the avatar was sitting on some object when the restriction was applied, then the relay MUST force the avatar to sit back on the same object (if still existing);
  2. the relay MUST make sure all restrictions belonging to the session are made active again.

Note that the relay is responsible for storing restrictions and the key of the sit target across sessions, not the controller.

Controller side

Note controller don't have to poll for relay presence to resume a session but should just listen for ping messages instead. The relay should have stored all restrictions and handle sitting back to whatever furniture the relay wearer was tied up to.

Concerning the second bullet: for instance, if the controller is a furniture which is already in use by another relay wearer, it would be cause dysfunctions to let the pinging relay restore the restrictions without letting its wearer sit on the furniture. Or if the controller is not stateless and the state for the pinging relay has not been saved before, resuming the session from the initial state might be inconsistent.

!version

The purpose of this meta-command is to query the version of the RLVR protocol supported by a relay.

Note this is the most common command for a controller to scan for nearby relays, as non-ORG relays also accept this command and answer it the way described above.

!implversion

The purpose of this meta-command is to query the name and version of the relay implementation.

It is recommended this string includes the following elements:

The latter is convenient for checking for ORG compatibility using a command even non-ORG relay should understand.

!x-orgversions

This meta-command's purpose is to make it possible for the controller to have detailed information on the protocol the relay supports. First the version of the ORG consolidated protocol, second the list of supported optional x-tensions, also with their version numbers.

Example:

C<->R
  ->   query,rUUID,!x-orgversions
 <-    query,cUUID,!x-orgversions,ORG=0004/who=002/email=006

Requirements:

Remarks:

Other meta-commands

Commands not listed here can belong to one of the following categories:

  1. (unlikely) commands from a future revision of Marine Kelley's original RLVR protocol.
  2. (more likely but not that much!) core commands from a future revision of ORG
  3. (very likely) commands from optional x-tensions
  4. proprietary commands

ORG intends for its successive versions to be backward compatible. Therefore ORG relays handle all unknown meta-commands.

We also intend for future versions of ORG consolidated protocol to include last version of original RLVR protocol, hence the prefix "!x-" for all meta-commands coming from ORG, which ensures there will be reasonably no collision.

For the same reason, we require that proprietary commands use an obvious prefix such as "!a-" or "!b-", and so on. Not doing so would prevent ensuring backward compatibility, hence a relay or controller who would use proprietary commands with wrong prefixes are not ORG compliant.