Hi Neels,
On Thu, Oct 17, 2019 at 11:51:20PM +0200, Neels Hofmeyr wrote:
I've got the problem that optional steps seem to
not be possible in
'interleave' statements.
yes, they are not. The TTCN-3 core language specification explicitly mandates
that the guard expression in 'interleave' must be empty. I guess it was done
to simplify the transformation from interleave to nested alt (that's what supposedly
happens internally) is simpler - or maybe to guarantee it is possible to solve
the resulting logic based on nested alt statements at all?
Another sad thing about interleave is that there's no equivalend to altsteps.
What I want: accept either BSSMAP Assignment Request
or Iu Rab Assignment:
interleave {
[g_pars.ran_is_geran] BSSAP.receive(tr_BSSMAP_AssignmentReq) { ... };
[not g_pars.ran_is_geran] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) { ... };
[] other {...};
[] complex {...};
[] steps {...};
}
why not simply have a "var template ..." that is assigned before and then use
that
variable instead of the template in the receive statement? Probably because it's
separate TTCN-3 types (BSSAP vs. RANAP)? I think I read that there's some kind of
"ANY" type (called anytype). but have never used it, and I don't know if you
can have a
"var template anytype". Maybe worth a try?
TTCN3_P.pdf contains a slide about it, important part seems to use the 'with extension
anytype' part at the end of the module, listing the types.
Or you could "cheat" and do something like
[] BSSAP.receive((tr_BSSMAP_AssignmentReq, tr_RANAP_RabAssReq(rab_sml)))
which would accept either of the two in both cases. Not exactly great as the condition
would be fulfilled even if you receive BSSAP but are in a 3G scenario (or vice versa).
1) moving the optionals into a separate altstep
var default assignment;
if (g_pars.ran_is_geran) {
assignment := activate(as_BSSMAP_assignment());
} else {
assignment := activate(as_RANAP_assignment());
}
interleave {
[] other {...};
[] complex {...};
[] steps {...};
}
deactivate(assignment);
possible, and I would say very ttcn3-like
2) blatant code dup
if (g_pars.ran_is_geran) {
interleave {
[] BSSAP.receive(tr_BSSMAP_AssignmentReq) { ... };
[] other {...};
[] complex {...};
[] steps {...};
}
} else {
interleave {
[] BSSAP.receive(tr_RANAP_RabAssReq) { ... };
[] other {...};
[] complex {...};
[] steps {...};
}
}
easy to read but probably less easy to maintain.
3) boolean dance and break
var boolean done1 := false;
var boolean done2 := false;
var boolean done3 := false;
var boolean done4 := false;
god forbid.
Are there other options??
you could try to perform the manual conversion of interleave to nested ALT statements?
Not sure if that's nicer than any of the other options.
--
- Harald Welte <laforge(a)osmocom.org>
http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
(ETSI EN 300 175-7 Ch. A6)