IPA_Emulation: Allow client/server to specify CCM parameters

This commit is contained in:
Harald Welte 2017-12-04 20:45:12 +01:00
parent e7096c1571
commit e21096dbaf
1 changed files with 62 additions and 7 deletions

View File

@ -57,14 +57,43 @@ type component IPA_Emulation_CT {
var boolean g_is_bsc_mgw;
var IpaMode g_mode;
var IPA_CCM_Parameters g_ccm_pars := c_default_ccm_pars;
}
type record IPA_CCM_Parameters {
charstring ser_nr optional,
charstring name optional,
charstring location1 optional,
charstring location2 optional,
charstring equip_version optional,
charstring sw_version optional,
charstring ip_addr optional,
charstring mac_addr optional,
charstring unit_id optional,
charstring osmo_rand optional
}
private const IPA_CCM_Parameters c_default_ccm_pars := {
ser_nr := omit,
name := "mahlzeit",
location1 := omit,
location2 := omit,
equip_version := omit,
sw_version := omit,
ip_addr := omit,
mac_addr := omit,
unit_id := "0/1/2",
osmo_rand := omit
};
function f_connect(charstring remote_host, PortNumber remote_port,
charstring local_host, PortNumber local_port) runs on IPA_Emulation_CT {
charstring local_host, PortNumber local_port,
IPA_CCM_Parameters ccm_pars := c_default_ccm_pars) runs on IPA_Emulation_CT {
var Result res;
res := IPA_CodecPort_CtrlFunct.f_IPL4_connect(IPA_PORT, remote_host, remote_port,
local_host, local_port, 0, { tcp:={} });
g_ipa_conn_id := res.connId;
g_ccm_pars := ccm_pars;
/* Set function for dissecting the binary */
var f_IPL4_getMsgLen vl_f := refers(f_IPL4_fixedMsgLen);
IPA_CodecPort_CtrlFunct.f_IPL4_setGetMsgLen(IPA_PORT, g_ipa_conn_id, vl_f, {0, 2, 3, 1, 0});
@ -72,11 +101,13 @@ function f_connect(charstring remote_host, PortNumber remote_port,
g_is_bsc_mgw := true;
}
function f_bind(charstring local_host, PortNumber local_port) runs on IPA_Emulation_CT {
function f_bind(charstring local_host, PortNumber local_port,
IPA_CCM_Parameters ccm_pars := c_default_ccm_pars) runs on IPA_Emulation_CT {
var Result res;
res := IPA_CodecPort_CtrlFunct.f_IPL4_listen(IPA_PORT,
local_host, local_port, { tcp:={} });
g_ipa_conn_id := res.connId;
g_ccm_pars := ccm_pars;
g_is_bsc_mgw := false;
}
@ -96,7 +127,7 @@ private template IpaCcmRespPart t_IdRespPart(IpaCcmIdTag tag, charstring payload
}
/* build IPA CCM ID RESP response from IPA CCM GET */
private function f_ccm_make_id_resp(PDU_IPA_CCM get) return PDU_IPA_CCM {
private function f_ccm_make_id_resp(PDU_IPA_CCM get) runs on IPA_Emulation_CT return PDU_IPA_CCM {
var integer i;
var PDU_IPA_CCM resp := {
msg_type := IPAC_MSGT_ID_RESP,
@ -109,14 +140,38 @@ private function f_ccm_make_id_resp(PDU_IPA_CCM get) return PDU_IPA_CCM {
var IpaCcmIdTag tag := get.u.get[i].tag;
var charstring foo;
select (tag) {
case (IPAC_IDTAG_UNIT) {
foo := "0/1/2";
case (IPAC_IDTAG_SERNR) {
foo := g_ccm_pars.ser_nr;
}
case (IPAC_IDTAG_UNITNAME) {
foo := "mahlzeit";
foo := g_ccm_pars.name;
}
case (IPAC_IDTAG_LOCATION1) {
foo := g_ccm_pars.location1;
}
case (IPAC_IDTAG_LOCATION2) {
foo := g_ccm_pars.location2;
}
case (IPAC_IDTAG_EQUIPVERS) {
foo := g_ccm_pars.equip_version;
}
case (IPAC_IDTAG_SWVERSION) {
foo := g_ccm_pars.sw_version;
}
case (IPAC_IDTAG_IPADDR) {
foo := g_ccm_pars.ip_addr;
}
case (IPAC_IDTAG_MACADDR) {
foo := g_ccm_pars.mac_addr;
}
case (IPAC_IDTAG_UNIT) {
foo := g_ccm_pars.unit_id;
}
case (IPAC_IDTAG_OSMO_RAND) {
foo := g_ccm_pars.osmo_rand;
}
case else {
foo := "foo";
foo := "unknown";
}
}
resp.u.resp[sizeof(resp.u.resp)] := valueof(t_IdRespPart(tag, foo));