| module PCU_Tests_RAW_SNS { |
| |
| import from Osmocom_Types all; |
| import from PCU_Tests all; |
| import from PCU_Tests_RAW all; |
| import from Osmocom_Gb_Types all; |
| import from NS_CodecPort all; |
| import from NS_Types all; |
| |
| /********************************************************************************** |
| * Modern Gb/IP bring-up test cases using IP Sub-Network Service (SNS) |
| **********************************************************************************/ |
| |
| /* perform inbound SNS-SIZE procedure */ |
| function f_incoming_sns_size(template (omit) NsCause cause := omit) runs on RAW_NS_CT { |
| var PDU_NS rx; |
| /* expect one single SNS-SIZE with RESET flag; one remote v4 EP; no v6 EP */ |
| rx := f_ns_exp(tr_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := ?, |
| num_v4 := 1, num_v6 := omit)); |
| NSCP.send(t_NS_Send(g_ns_conn_id, ts_SNS_SIZE_ACK(mp_nsconfig.nsei, cause))); |
| } |
| |
| /* perform outbound SNS-SIZE procedure */ |
| function f_outgoing_sns_size(template (omit) NsCause cause := omit) runs on RAW_NS_CT { |
| var PDU_NS rx; |
| NSCP.send(t_NS_Send(g_ns_conn_id, ts_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := 1, |
| num_v4 := 1, num_v6 := omit) |
| )); |
| /* expect one single SNS-SIZE with RESET flag; one remote v4 EP; no v6 EP */ |
| rx := f_ns_exp(tr_SNS_SIZE_ACK(mp_nsconfig.nsei, cause)); |
| } |
| |
| /* perform inbound SNS-CONFIG procedure */ |
| function f_incoming_sns_config(template (omit) NsCause cause := omit) runs on RAW_NS_CT { |
| var PDU_NS rx; |
| rx := f_ns_exp(tr_SNS_CONFIG(mp_nsconfig.nsei, end_flag := true, v4 := ?)); |
| NSCP.send(t_NS_Send(g_ns_conn_id, ts_SNS_CONFIG_ACK(mp_nsconfig.nsei, cause))); |
| } |
| |
| /* perform outbound SNS-CONFIG procedure */ |
| function f_outgoing_sns_config(template (omit) NsCause cause := omit) runs on RAW_NS_CT { |
| var PDU_NS rx; |
| var template (omit) IP4_Elements v4 := { ts_SNS_IPv4(mp_nsconfig.local_ip, |
| mp_nsconfig.local_udp_port) } |
| NSCP.send(t_NS_Send(g_ns_conn_id, ts_SNS_CONFIG(mp_nsconfig.nsei, true, v4))); |
| rx := f_ns_exp(tr_SNS_CONFIG_ACK(mp_nsconfig.nsei, cause)); |
| } |
| |
| /* PCU-originated SNS-SIZE: successful case */ |
| testcase TC_sns_po_size_success() runs on RAW_NS_CT { |
| f_init_ns_codec(); |
| f_init_pcuif(); |
| f_incoming_sns_size(); |
| f_sleep(1.0); |
| setverdict(pass); |
| } |
| |
| /* PCU-originated SNS-SIZE: NACK from our side */ |
| testcase TC_sns_po_size_nack() runs on RAW_NS_CT { |
| f_init_ns_codec(); |
| f_init_pcuif(); |
| f_incoming_sns_size(NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED); |
| /* FIXME: ensure we don't get a SNS-CONFIG */ |
| /* FIXME: ensure we get re-transmitted SNS-SIZE attempts */ |
| f_sleep(10.0); |
| setverdict(pass); |
| } |
| |
| /* PCU-originated SNS-CONFIG: successful case */ |
| testcase TC_sns_po_config_success() runs on RAW_NS_CT { |
| f_init_ns_codec(); |
| f_init_pcuif(); |
| f_incoming_sns_size(); |
| f_incoming_sns_config(); |
| f_sleep(1.0); |
| setverdict(pass); |
| } |
| |
| /* PCU-originated SNS-CONFIG: successful case */ |
| testcase TC_sns_po_config_nack() runs on RAW_NS_CT { |
| f_init_ns_codec(); |
| f_init_pcuif(); |
| f_incoming_sns_size(); |
| f_incoming_sns_config(NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED); |
| /* FIXME: ensure we get re-transmitted SNS-CONFIG attempts */ |
| f_sleep(10.0); |
| setverdict(pass); |
| } |
| |
| |
| /* SGSN-originated SNS-SIZE: successful case */ |
| testcase TC_sns_so_config_success() runs on RAW_NS_CT { |
| f_init_ns_codec(); |
| f_init_pcuif(); |
| f_incoming_sns_size(); |
| f_incoming_sns_config(); |
| f_outgoing_sns_config(); |
| |
| /* wait for one ALIVE cycle, then ACK any further ALIVE in the background */ |
| as_rx_alive_tx_ack(oneshot := true); |
| activate(as_rx_alive_tx_ack()); |
| |
| f_outgoing_ns_alive(); |
| |
| /* Expect BVC-RESET for signaling (0) and ptp BVCI */ |
| as_rx_bvc_reset_tx_ack(0, oneshot := true); |
| as_rx_bvc_reset_tx_ack(mp_gb_cfg.bvci, oneshot := true); |
| as_rx_bvc_unblock_tx_ack(mp_gb_cfg.bvci, oneshot := true); |
| |
| /* wait for one FLOW-CONTROL BVC and then ACK any further in the future */ |
| as_rx_bvc_fc_tx_ack(mp_gb_cfg.bvci, oneshot := true); |
| activate(as_rx_bvc_fc_tx_ack(mp_gb_cfg.bvci)); |
| setverdict(pass); |
| } |
| |
| control { |
| execute( TC_sns_po_size_success() ); |
| execute( TC_sns_po_size_nack() ); |
| execute( TC_sns_po_config_success() ); |
| execute( TC_sns_po_config_nack() ); |
| execute( TC_sns_so_config_success() ); |
| } |
| |
| } |