@startuml

title Sending data from Node A to Node C through Node B

-> "Node A": Route to B: "RAB"\nRoute to C: "RAC"

== Create Control Channels ==

"Node A" -> "Node B": Send "CreateControlChannel" message\n- over route "RAB"
"Node B" --> "Node A": Reply with new Control Channel ID: "CCB"
|||
"Node A" -> "Node C": Send "CreateControlChannel" message\n- over route "RAC"
"Node C" --> "Node A": Reply with new Control Channel ID: "CCC"

== Setup routes using Control Messages ==

"Node A" -> "Node A": Create new Route ID: "RUD"
|||
"Node A" -> "Node B": Send control message "SetRoute"\n- over route: RAB\n- control channel: CCB\n- route: RUD\n- forward: Node C\n- reply: Node A
"Node B" -> "Node B": Route table update
"Node B" --> "Node A": Reply OK
|||
"Node A" -> "Node C": Send control message "SetRoute" \n- over route: RAC\n- control channel: CCC\n- route: RUD\n- forward: none\n- reply: Node B
"Node C" -> "Node C": Route table update
"Node C" --> "Node A": Reply OK

== Send user data through route ==

"Node A" -> "Node B": Send user message\n- over route "RUD"
"Node B" --> "Node A": Reply ACK
"Node B" -> "Node B": Route table lookup:\nforwarding rule found
"Node B" -> "Node C": Forward user message\n- over route "RUD"
"Node C" --> "Node B": Reply ACK
"Node C" -> "Node C": Route table lookup:\nnowhere to forward!
"Node C" ->: Receive user message

== Remove routes using Control Messages ==

"Node A" -> "Node B": Send control message "RemoveRoute" \n- control channel: CCB\n- route: RUD
"Node B" -> "Node B": Route table update
"Node B" --> "Node A": Reply OK
|||
"Node A" -> "Node C": Send control message "RemoveRoute" \n- control channel: CCC\n- route: RUD
"Node C" -> "Node C": Route table update
"Node C" --> "Node A": Reply OK

== Close Control Channels ==

"Node A" -> "Node B": Send "CloseControlChannel" message
"Node B" --> "Node A": Reply OK
|||
"Node A" -> "Node C": Send "CloseControlChannel" message
"Node C" --> "Node A": Reply OK


@enduml