@startuml

participant BDM_control
participant BDM_dispatch
participant uD3TN
participant Storage

BDM_control -> uD3TN: connect
uD3TN -> BDM_control: Welcome(node_id = 'ipn:1.0')
BDM_control -> uD3TN: Configure(is_subscriber = false, auth_type = FIB_CONTROL, secret = ...)
uD3TN -> uD3TN: check secret
uD3TN -> BDM_control: ACK
BDM_control -> uD3TN: Link(peer_node_id = 'ipn:42.0', peer_cla_addr = ...)
uD3TN -> uD3TN: invoke CLA connection
uD3TN -> BDM_control: ACK

BDM_dispatch -> uD3TN: connect
uD3TN -> BDM_dispatch: Welcome(node_id = 'ipn:1.0')
BDM_dispatch -> uD3TN: Configure(is_subscriber = true, auth_type = BUNDLE_DISPATCH, secret = ...)
uD3TN -> uD3TN: check secret
uD3TN -> BDM_dispatch: ACK

uD3TN -> BDM_dispatch: Link(peer_node_id = 'ipn:42.0', status = ACTIVE, ...)
BDM_dispatch -> uD3TN: ACK
BDM_control -> uD3TN: BundleADU(peer_eid = 'ud3tn:storage', payload = StorageCall(PUSH_BUNDLES, filter = 'ipn:4*'))
uD3TN -> uD3TN: create bundle to storage CLA
uD3TN -> BDM_control: ACK
uD3TN -> Storage: Bundle(StorageCall(...))
Storage -> Storage: load bundles matching filter
Storage -> uD3TN: Bundle(to = 'ipn:42.0', ...)
Storage -> uD3TN: Bundle(to = 'ipn:44.7', ...)
uD3TN -> uD3TN: process incoming bundles
uD3TN -> uD3TN: forward Bundle(to = 'ipn:42.0', ...) to 'ipn:42.0'
uD3TN -> BDM_dispatch: Bundle(dst_eid = 'ipn:44.7', ...)
BDM_dispatch -> uD3TN: Dispatch(next_hop_node_id = ['ipn:42.0'])
uD3TN -> uD3TN: forward Bundle(to = 'ipn:44.7', ...) to 'ipn:42.0'

@enduml
