optional steps in ttcn3 interleave

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Harald Welte laforge at osmocom.org
Fri Oct 18 09:06:30 UTC 2019


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 at osmocom.org>            http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
                                                  (ETSI EN 300 175-7 Ch. A6)



More information about the OpenBSC mailing list