BSSGP_Emulation: Allow a "CreateCb" to handle unknown inbound TLLI

The existing BSSGP Code assumed that the TLLIs were always known "a
priori" by the test case.  With the newly-introduced create_cb,
the user can provide a function to handle any incoming messages for an
unknown TLLL.  The default handler behaves like before: fail +
terminate.

Change-Id: Ice0e145f5a6518ff79547dd851042b7965f38e00
This commit is contained in:
Harald Welte 2020-11-12 19:48:31 +01:00 committed by daniel
parent e582f20aa3
commit 4d112c926c
6 changed files with 45 additions and 17 deletions

View File

@ -65,7 +65,8 @@ function f_gen_bvc(integer base, integer idx) return BssgpBvcConfig {
},
cell_id := base + 600 + idx
},
depth := BSSGP_DECODE_DEPTH_LLC
depth := BSSGP_DECODE_DEPTH_LLC,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
};
return bvc;
}

View File

@ -66,7 +66,8 @@ function f_gen_bvc(integer base, integer idx) return BssgpBvcConfig {
},
cell_id := base + 600 + idx
},
depth := BSSGP_DECODE_DEPTH_LLC
depth := BSSGP_DECODE_DEPTH_LLC,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
};
return bvc;
}

View File

@ -264,7 +264,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20960
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
} }
};
g_pcu[1].cfg := {
@ -280,7 +281,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20961
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
} }
};
g_pcu[2].cfg := {
@ -296,7 +298,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20962
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
} }
};
@ -314,7 +317,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20960
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
},
{
bvci := 210,
@ -326,7 +330,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20961
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
},
{
bvci := 220,
@ -338,7 +343,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20962
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
}
}
};

View File

@ -681,7 +681,8 @@ type record BssgpConfig {
type record BssgpBvcConfig {
BssgpBvci bvci,
BssgpCellId cell_id,
BssgpDecodeDepth depth
BssgpDecodeDepth depth,
BssgpCreateCallback create_cb
};
type record of BssgpBvcConfig BssgpBvcConfigs;
type enumerated BssgpDecodeDepth {
@ -693,6 +694,14 @@ type enumerated BssgpDecodeDepth {
BSSGP_DECODE_DEPTH_L3
#endif
};
/* call-back function type: Called for inbound BSSGP for unknown TLLIs; could create BSSGP_ClienT_CT */
type function BssgpCreateCallback(BssgpBvci bvci, BssgpCellId cell_id, OCT4 tlli, BssgpDecoded dec) runs on BSSGP_BVC_CT;
/* Default Create Callback function: Fail and terminate */
function DefaultCreateCallback(BssgpBvci bvci, BssgpCellId cell_id, OCT4 tlli, BssgpDecoded dec) runs on BSSGP_BVC_CT {
setverdict(fail, "Couldn't find Component for TLLI ", tlli);
mtc.stop;
}
/*
private function f_tbl_init() runs on BSSGP_BVC_CT {
@ -792,8 +801,7 @@ private function f_tbl_comp_by_tlli(OCT4 tlli) runs on BSSGP_BVC_CT return BSSGP
return ClientTable[i].comp_ref;
}
}
setverdict(fail, "Couldn't find Component for TLLI ", tlli);
mtc.stop;
return null;
}
private function f_tbl_idx_by_comp(BSSGP_Client_CT comp_ref) runs on BSSGP_BVC_CT return integer {
@ -987,7 +995,11 @@ private altstep as_ptp_unblocked() runs on BSSGP_BVC_CT {
var template OCT4 tlli := f_bssgp_get_tlli(udi.bssgp);
if (isvalue(tlli)) {
vc_conn := f_tbl_comp_by_tlli(valueof(tlli));
f_send_bssgp_dec(dec, vc_conn, BSSGP_SP);
if (vc_conn == null) {
g_cfg.create_cb.apply(g_cfg.bvci, g_cfg.cell_id, valueof(tlli), dec);
} else {
f_send_bssgp_dec(dec, vc_conn, BSSGP_SP);
}
} else {
log("No TLLI: Broadcasting ", dec);
/* broadcast this message to all components */
@ -1006,7 +1018,11 @@ private altstep as_ptp_unblocked() runs on BSSGP_BVC_CT {
var template OCT4 tlli := f_bssgp_get_tlli(udi.bssgp);
if (isvalue(tlli)) {
vc_conn := f_tbl_comp_by_tlli(valueof(tlli));
f_send_bssgp_dec(dec, vc_conn, BSSGP_SP_SIG);
if (vc_conn == null) {
g_cfg.create_cb.apply(g_cfg.bvci, g_cfg.cell_id, valueof(tlli), dec);
} else {
f_send_bssgp_dec(dec, vc_conn, BSSGP_SP_SIG);
}
} else {
log("No TLLI: Broadcasting ", dec);
/* broadcast this message to all components */

View File

@ -33,7 +33,8 @@ modulepar {
},
cell_id := 20960
},
depth := BSSGP_DECODE_DEPTH_BSSGP
depth := BSSGP_DECODE_DEPTH_BSSGP,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
}
}
};

View File

@ -334,7 +334,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20960
},
depth := BSSGP_DECODE_DEPTH_L3
depth := BSSGP_DECODE_DEPTH_L3,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
}
}
};
@ -354,7 +355,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20961
},
depth := BSSGP_DECODE_DEPTH_L3
depth := BSSGP_DECODE_DEPTH_L3,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
}
}
};
@ -374,7 +376,8 @@ function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
},
cell_id := 20962
},
depth := BSSGP_DECODE_DEPTH_L3
depth := BSSGP_DECODE_DEPTH_L3,
create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
}
}
};