pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38452?usp=email )
Change subject: sgsn: Improve validation of TLA encoded in RAB Ass Req ......................................................................
sgsn: Improve validation of TLA encoded in RAB Ass Req
Validate received TLA in RAB Ass Req according to confguration and test expectancies.
Related: OS#6508 Related: SYS#7119 Change-Id: I725bf39c5564fb320954fc9e387ac569fc1a0136 --- M sgsn/BSSGP_ConnHdlr.ttcn M sgsn/SGSN_Tests_Iu.ttcn 2 files changed, 65 insertions(+), 13 deletions(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve pespin: Looks good to me, approved fixeria: Looks good to me, but someone else must approve
diff --git a/sgsn/BSSGP_ConnHdlr.ttcn b/sgsn/BSSGP_ConnHdlr.ttcn index e6503ac..a966a43 100644 --- a/sgsn/BSSGP_ConnHdlr.ttcn +++ b/sgsn/BSSGP_ConnHdlr.ttcn @@ -103,6 +103,8 @@ /* only in IuPS / RANAP case */ SCCP_PAR_Address sccp_addr_local optional, SCCP_PAR_Address sccp_addr_peer optional, + /* Whether to expect an specific addr format in RAB Ass Req: true = X.213, false = raw IPv4, omit = don't care */ + boolean ranap_exp_itu_x213_addr_format optional, /* Whether to encode HNBGW addr with ITU X.213 format when sending RAB Ass Resp: */ boolean ranap_use_itu_x213_addr_format, octetstring ranap_itu_x213_addr_format_padding @@ -129,6 +131,7 @@ t_guard := t_guard, sccp_addr_local := omit, sccp_addr_peer := omit, + ranap_exp_itu_x213_addr_format := omit, ranap_use_itu_x213_addr_format := false, ranap_itu_x213_addr_format_padding := ''O } @@ -698,22 +701,38 @@ } }
+/* Validate received IP address + TEID from SGSN is the one we + * did set up from the GGSN, since the SGSN is expected to do + * Direct Tunnel: */ +private function f_ranap_rab_ass_req_validate_tli(RANAP_PDU rab_ass_req, PdpActPars apars) +runs on BSSGP_ConnHdlr { + var TransportLayerInformation tli := f_ranap_rab_ass_req_extract_tli(rab_ass_req); + var template (present) TransportLayerAddress exp_tla_x213 := decmatch tr_NSAP_Address_IANA_BIN_IPv4(apars.ggsn_ip_u); + var template (present) TransportLayerAddress exp_tla_raw := oct2bit(apars.ggsn_ip_u); + var template (present) TransportLayerAddress exp_tla; + var template (present) TransportLayerInformation exp_tli; + if (ispresent(g_pars.ranap_exp_itu_x213_addr_format)) { + if (g_pars.ranap_exp_itu_x213_addr_format) { + exp_tla := exp_tla_x213; + } else { + exp_tla := exp_tla_raw; + } + } else { /* Accept any of the known formats: */ + exp_tla := (exp_tla_x213, exp_tla_raw); + } + exp_tli := tr_TLI_ps(exp_tla, apars.ggsn_tei_u); + if (not match(tli, exp_tli)) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Rx RAB Ass Req with TLI ", tli, " vs exp ", exp_tli)); + } +} + altstep as_ranap_rab_ass_req(inout PdpActPars apars) runs on BSSGP_ConnHdlr { var RANAP_PDU ranap; [] BSSAP.receive(tr_RANAP_RabAssReq(?)) -> value ranap { var RAB_ID rab_id := f_ranap_rab_ass_req_extract_rab_id(ranap); - var TransportLayerInformation tli := f_ranap_rab_ass_req_extract_tli(ranap);
- /* Validate received IP address + TEID from SGSN is the one we - * did set up from the GGSN, since the SGSN is expected to do - * Direct Tunnel: */ - var template (present) TransportLayerInformation exp_tli := - tr_TLI_ps(oct2bit(enc_NSAP_Address(valueof(ts_NSAP_Address_IANA_BIN_IPv4Len20(apars.ggsn_ip_u)))), - apars.ggsn_tei_u); - if (not match(tli, exp_tli)) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("Rx RAB Ass Req with TLI ", tli, " vs exp ", exp_tli)); - } + f_ranap_rab_ass_req_validate_tli(ranap, apars);
var template (value) RAB_SetupOrModifiedList l; var bitstring tla_bits; diff --git a/sgsn/SGSN_Tests_Iu.ttcn b/sgsn/SGSN_Tests_Iu.ttcn index 61bd8a9..7a7ee7c 100644 --- a/sgsn/SGSN_Tests_Iu.ttcn +++ b/sgsn/SGSN_Tests_Iu.ttcn @@ -19,6 +19,7 @@
import from BSSGP_ConnHdlr all;
+ private function f_init() runs on test_CT { g_iu_enable := true; SGSN_Tests.f_init(); @@ -27,6 +28,14 @@ f_vty_config(SGSNVTY, "sgsn", "encryption uea 0"); }
+private function f_vty_iu_rab_assign_addr_enc(boolean use_itu_x213 := true) runs on test_CT { + if (use_itu_x213) { + f_vty_config(SGSNVTY, "sgsn", "iu rab-assign-addr-enc x213"); + } else { + f_vty_config(SGSNVTY, "sgsn", "iu rab-assign-addr-enc v4raw"); + } +} + private function f_TC_iu_attach(charstring id) runs on BSSGP_ConnHdlr { var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip, mp_ranap_cfg[0].sctp_addr.local_ip_addr));
@@ -147,14 +156,37 @@ vc_conn.done; f_cleanup(); } -/* Same as TC_attach_pdp_act_user, but encoding HNBGW addr using ITU X.213 -format (IPv4, with padding to reach 20 bytes) in RAB Ass Resp. See OS#6508. */ + +/* Same as TC_attach_pdp_act_user, but: + * - Configure SGSN to send v4raw address in RAB Ass REQ + * - Transmit HNBGW addr using v4raw format in RAB Ass Resp. + */ +testcase TC_attach_pdp_act_user_addr_v4raw() runs on test_CT { + var BSSGP_ConnHdlr vc_conn; + var BSSGP_ConnHdlrPars pars; + f_init(); + f_sleep(1.0); + f_vty_iu_rab_assign_addr_enc(false); /* Force v4raw */ + pars := f_new_BSSGP_ConnHdlrPars(1058, f_cell_ids_from_gb(g_gb)); + pars.ranap_exp_itu_x213_addr_format := false; + pars.ranap_use_itu_x213_addr_format := false; + vc_conn := f_start_handler_pars(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, pars); + vc_conn.done; + f_cleanup(); +} +/* Same as TC_attach_pdp_act_user, but: + * - Configure SGSN to send ITU X.213 address in RAB Ass REQ + * - Transmit HNBGW addr using ITU X.213 format (IPv4, with different padding) + * in RAB Ass Resp. See OS#6508. + */ function f_TC_attach_pdp_act_user_addr_itu_x213_ipv4len(integer imsi_suffix, octetstring padding) runs on test_CT { var BSSGP_ConnHdlr vc_conn; var BSSGP_ConnHdlrPars pars; f_init(); f_sleep(1.0); + f_vty_iu_rab_assign_addr_enc(true); pars := f_new_BSSGP_ConnHdlrPars(imsi_suffix, f_cell_ids_from_gb(g_gb)); + pars.ranap_exp_itu_x213_addr_format := true; pars.ranap_use_itu_x213_addr_format := true; pars.ranap_itu_x213_addr_format_padding := padding; vc_conn := f_start_handler_pars(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, pars); @@ -390,6 +422,7 @@ execute( TC_iu_attach_geran_rau() ); execute( TC_geran_attach_iu_rau() ); execute( TC_attach_pdp_act_user() ); + execute( TC_attach_pdp_act_user_addr_v4raw() ); execute( TC_attach_pdp_act_user_addr_itu_x213_ipv4len7() ); execute( TC_attach_pdp_act_user_addr_itu_x213_ipv4len20() ); execute( TC_attach_pdp_act_user_addr_itu_x213_ipv4lentoolarge() );