pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/35515?usp=email )
(
1 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: GTPv2_Emulation: routing improvements: Prioritize response, fallback to TEID ......................................................................
GTPv2_Emulation: routing improvements: Prioritize response, fallback to TEID
First try forwarding to component transmitting the originating request, since this is the most fine-grained match. Finally, if no specific match was found and if messages belongs to TEID0, send it over that port as a fallback.
Fixes: 1d2cc67036e95a0c3ee3ac7738d7e15d5f76b8a2 Change-Id: Ie96d65085fb352489150183415dbd6cc8237a47c --- M library/GTPv2_Emulation.ttcn 1 file changed, 24 insertions(+), 6 deletions(-)
Approvals: laforge: Looks good to me, approved daniel: Looks good to me, but someone else must approve Jenkins Builder: Verified
diff --git a/library/GTPv2_Emulation.ttcn b/library/GTPv2_Emulation.ttcn index eb2b977..240cce4 100644 --- a/library/GTPv2_Emulation.ttcn +++ b/library/GTPv2_Emulation.ttcn @@ -560,7 +560,12 @@ /* route inbound GTP2-C based on TEID, SEQ or IMSI */ [] GTP2C.receive(Gtp2cUnitdata:?) -> value g2c_ud { var template hexstring imsi_t := f_gtp2c_extract_imsi(g2c_ud.gtpc); - if (isvalue(imsi_t) and f_imsi_known(valueof(imsi_t))) { + /* if this is a response, route by SEQ: */ + if (match(g2c_ud.gtpc, tr_PDU_GTP2C_msgtypes(gtp2_responses)) + and f_seq_known(g2c_ud.gtpc.sequenceNumber)) { + vc_conn := f_comp_by_seq(g2c_ud.gtpc.sequenceNumber); + CLIENT.send(g2c_ud.gtpc) to vc_conn; + }else if (isvalue(imsi_t) and f_imsi_known(valueof(imsi_t))) { vc_conn := f_comp_by_imsi(valueof(imsi_t)); CLIENT.send(g2c_ud.gtpc) to vc_conn; } else if ((ispresent(g2c_ud.gtpc.tEID) and g2c_ud.gtpc.tEID != '00000000'O) @@ -571,13 +576,11 @@ and f_teid_known('00000000'O)) { vc_conn := f_comp_by_teid(g2c_ud.gtpc.tEID); CLIENT.send(g2c_ud.gtpc) to vc_conn; - /* if this is a response, route by SEQ: */ - } else if (match(g2c_ud.gtpc, tr_PDU_GTP2C_msgtypes(gtp2_responses)) - and f_seq_known(g2c_ud.gtpc.sequenceNumber)) { - vc_conn := f_comp_by_seq(g2c_ud.gtpc.sequenceNumber); - CLIENT.send(g2c_ud.gtpc) to vc_conn; } else { SendToUdMsgTable(g2c_ud); + if (not ispresent(g2c_ud.gtpc.tEID) or g2c_ud.gtpc.tEID == '00000000'O) { + TEID0.send(g2c_ud.gtpc); + } }
/* remove sequence number if response was received */