1.     Requirements

1.1      Summary

Many messages are sent and received from external x-apps to E2 Terminator (not through E2 Manager) or are sent from RAN to xApps through E2 terminator

Until such xApps will be developed, a simple lightweight x-app mock will be developed to test these flows.

Request from x-app

  1. Enable user to trigger sending messages.
  2. Send ASN1 encoded messages (from configuration) via RMR to E2 Terminator,
  3. Receive responses from E2 Terminator if any
  4. Write to stdout (don’t decode them)
  5. Receive RAN requests from E2 Terminator and send configured encoded responses, if required.
  6. The flows:
    1. Send RIC SUBSCRIPTION REQUEST and receive RIC SUBSCRIPTION RESPONSE
    2. Send RIC SUBSCRIPTION DELETE REQUEST and receive RIC SUBSCRIPTION DELETE RESPONSE

Request from RAN

  1. RIC CONTROL ACKNOWLEDGE
  2. RIC CONTROL FAILURE
  3. ERROR INDICATION


2.      Solution

2.1      Proposed Solution


2.2      Phases

2.2.1   Phase one

2.3      Fail/Recovery (Error Handling)

2.4      Security

2.5      Logging



2.6      High Level Flow




 

 

 

 

 

3.     File formats

3.1      Configuration file

The format of the configuration file is an array of Json objects, each object has the following format

{ “id”: “<id>” ,  “rmrMessageType”: <integer|reserved name>, “transactionId”: “<tid>”,   “ranName”: “<name>”, “ranIp”: “<ip>”,  “ranPort”: <integer>,

“payloadHeader”: “<string>”, “packedPayload”: “<sequence as produced by %x>”, “payload”: “text”}


The Mock shall load the configuration file, on startup, and use the id to associate them to rmr message types or to the id specified in the user request to the Mock.

Failure to process the configuration file or no configuration file will trigger a panic (the process will fail to start).

3.2      Output file

N/A (see 3.5 Logging).

3.3      Configration (Docker level)

The following environment variables are required:

LD_LIBRARY_PATH=/usr/local/lib  - location of the rmr shared libraries

RMR_SEED_RT=router.txt  - routing data for the rmr infrastructure.

RMR_PORT = The port of the Mock’s RMR endpoint.




4.     Application sub-systems

4.1      Rmr-Sender

The *rmr-Sender* accepts a json object from the dispatcher and converts it to an RMR message and passes it to the remote. The sub-system supports the plain RMR message and the E2Term RMR message.

4.2      Rmr-Receiver

The *rmr-receiver* receives a message from the remote and passes a representation of it to the log and to the dispatcher (which may trigger the sending of a new RMR message).

Failure to establish the receiver will trigger a panic (the process will fail to start).

4.3      Dispatcher

The *dispatcher* executes the business logic of the Mock. On the one end it accepts the user request and consults the configuration file to decide which RMR message to send. It combines the parameters passed in the user request and relevant configuration data and construct the object that will be passed to the rmr-Sender.

On the other end, it accepts a message received by the RMR endpoint, consults the configuration file to decide which RMR message to send by searching for a match between the rmr message type and the id in the configuration, if any, and construct the object that will be passed to the rmr-Sender or returned to the user.

Example #1:


{“action”: “send”, “id”: “RIC_X2_SETUP_REQ”, “ranName”: “ran”, “ranIp”: “ip”, “ranPort”: port, “waitForRmrMessageType”: “RIC_X2_SETUP_RESP”},



Example #2:


{“action”: “receive”, rmrMessageType: “RIC_ENB_CONF_UPDATE”, “id”: “RIC_ENB_CONF_UPDATE_ACK_positive”, “ranName”: “ran”, <additional parameter>},


Configuration:

{“id”: “RIC_X2_SETUP_REQ” , “type”: “rmrMessage”,  “rmrMessageType”: 10060, “transactionId”: “e2e$”, “payloadHeader”: “$ranIp|$ranPort|$ranName|#packedPayload|”,  “packedPayload”: …., }

{“id”: “RIC_ENB_CONF_UPDATE_ACK_positive” , “type”: “rmrMessage”,  “rmrMessageType”: “RIC_ENB_CONF_UPDATE_ACK”, “transactionId”: “e2e$”, “payloadHeader”: “$ranIp|$ranPort|$ranName|#packedPayload|”,  “packedPayload”: …., }


4.4      Command line interface

The Mock shall expect a single json object, an array of json objects will be rejected, on the command line that it will process as a single flow.