msc { hscale="3"; ue [label="Customer"], trx [label="Lower Layer TRX"], hnodeb [label="osmo-hnodeb"], hnbgw [label="HNBGW"], ggsn [label="GGSN"], mgw [label="MGW"]; |||; --- [ label = "hNodeB starts up" ]; hnodeb => hnbgw [label="HNBAP HnbRegisterRequest"]; hnodeb <= hnbgw [label="HNBAP HnbRegisterResponse"]; |||; ...; |||; |||; --- [ label = "TRX starts up & connects to hNodeB" ]; trx => hnodeb [label="CTL-HELLO.req(SAPI=CTL, VERSION)"]; trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=CTL, VERSION)"]; trx => hnodeb [label="CTL-HELLO.req(SAPI=IUH, VERSION)"]; trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=IUH, VERSION)"]; trx => hnodeb [label="CTL-HELLO.req(SAPI=GTP, VERSION)"]; trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=GTP, VERSION)"]; trx => hnodeb [label="CTL-HELLO.req(SAPI=AUDIO, VERSION)"]; trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=AUDIO, VERSION)"]; trx <= hnodeb [label="IUH-CONFIGURE.ind(PLMN,LAC,SAC,RAC,CI,RNC_ID from HnbRegisterResponse)"]; |||; ...; |||; |||; --- [ label = "Subscriber Paging" ]; hnodeb <= hnbgw [label="RUA-InitiatingMessage(RANAP Paging)"]; trx <= hnodeb [label="IUH-UNITDATA.ind[RANAP Paging]"]; |||; ...; |||; |||; --- [ label = "Subscriber Sign Up" ]; ue => trx [label="CM Service Req"]; trx => hnodeb [label="IUH-CONN_ESTABLISH.req[RANAP CM ServiceReq]"]; hnodeb => hnbgw [label="HNBAP UE Register Req(IMSI?)"]; hnodeb <= hnbgw [label="HNBAP UE Register Acc(context_id)"]; hnodeb => hnbgw [label="RUA-Connect(RANAP-GMM ServiceRequest)"]; hnodeb <= hnbgw [label="RUA-DirectTransfer(RANAP GMM ServiceAccept)"]; trx <= hnodeb [label="IUH-CONN_ESTABLISH.cnf(context_id])"]; trx <= hnodeb [label="IUH-CONN_DATA.ind[context_id, RANAP GMM ServiceAccept]"]; --- [ label = "Subscriber set up PS data:" ]; hnodeb <= hnbgw [label="RANAP RAB-Assignment Request(TEI, ADDR)"]; trx <= hnodeb [label="IUH-CONN_DATA.ind[RANAP RAB-Assignment Request(remote_ip, remote_port, remote_tei)]"]; trx => hnodeb [label="GTP-CONN_ESTABLISH.req(context_id,remote_ip,remote_port,remote_tei)"]; ... [ label = "HnodeB sets up GTP-U connection" ]; trx <= hnodeb [label="GTP-CONN_ESTABLISH.cnf(context_id,gtp_conn_id,local_ip,local_port,local_tei)"]; |||; ...; |||; |||; --- [ label = "PS data transmission over GTP-U:" ]; ue => trx [label="..."]; trx => hnodeb [label="GTP-CONN_DATA.req[gtp_conn_id,payload]"]; hnodeb => ggsn [label="GTP-U(remote_tei, local_addr, remote_addr, payload)"]; hnodeb <= ggsn [label="GTP-U(local_tei, remote_addr, local_addr, payload)"]; trx <= hnodeb [label="GTP-CONN_DATA.ind[gtp_conn_id,payload]"]; ue <= trx [label="..."]; |||; ...; |||; --- [ label = "MO/MT PS data Release:" ]; ue => trx [label="..."]; trx => hnodeb [label="IUH-CONN_DATA.req[RANAP IU Release Request]"]; hnodeb => hnbgw [label="RANAP IU Release Request"]; hnodeb <= hnbgw [label="RANAP IU Release Command"]; trx <= hnodeb [label="IUH-CONN_DATA.ind[RANAP IU Release Command]"]; ...; trx => hnodeb [label="GTP-CONN_RELEASE.req(gtp_conn_id)"]; trx => hnodeb [label="IUH-CONN_RELEASE.req[RANAP IU Release Complete]"]; hnodeb => hnbgw [label="RUA-Disconnect(RANAP IU Release Complete)"]; |||; ...; |||; --- [ label = "For voice call (CS): Similar to SAPI_GTP, but using SAPI_AUDIO and osmo-hnodeb sets up RTP stream" ]; |||; ...; |||; --- [ label = "Iuh SCTP link goes down" ]; trx <= hnodeb [label="UD socket is closed, osmo-hnodeb cleans up state and attempts reconnect. lowerlayer can re-connect and wait for next CONFIGURE.req"]; }