Commit Graph

4226 Commits

Author SHA1 Message Date
Neels Hofmeyr e90c7176be refactor stat_item: get rid of FIFO and "skipped" error
Intead of attempting to store all distinct values of a reporting period,
just store min, max, last as well as a sum and N of each reporting
period.

This gets rid of error messages like

  DLSTATS ERROR stat_item.c:285 num_bts:oml_connected: 44 stats values skipped

while at the same time more accurately reporting the max value for each
reporting period. (So far stats_item only reports the max value; keep
that part unchanged, as shown in stats_test.c.)

With the other so far unused values (min, sum), we are ready to also
report the minimum value as well as an average value per reporting
period in the future, if/when our stats reporter allows for it.

Store the complete record of the previous reporting period. So far we
only compare the 'max' value, but like this we are ready to also see
changes in min, last and average value between reporting periods.

This patch breaks API by removing:
- struct members osmo_stats_item.stats_next_id, .last_offs and .values[]
- struct osmo_stats_item_value
- osmo_stat_item_get_next()
- osmo_stat_item_discard()
- osmo_stat_item_discard_all()
and by making struct osmo_stats_item opaque.
In libosmocore, we do have a policy of never breaking API. But since the
above should never be accessed by users of the osmo_stats_item API -- or
if they are, would no longer yield useful results, we decided to make an
exception in this case. The alternative would be to introduce a new
osmo_stats_item2 API and maintaining an unused legacy osmo_stats_item
forever, but we decided that the effort is not worth it. There are no
known users of the removed items.

Related: SYS#5542
Change-Id: I137992a5479fc39bbceb6c6c2af9c227bd33b39b
2021-09-30 18:33:43 +00:00
Keith Whyte 3f43134b6b GPRS: Add PDP_TYPE_N_IETF_IPv4v6
Change-Id: I1f82f9d8fc13dcc4474760329bd74ae9685b9031
2021-09-29 21:05:20 +02:00
Pau Espin 4e3b594e93 cosmetic: gsm: meas_rep.h: Fix typo in comment
Change-Id: I35c47a69ad1e9a75de6cc82c44a87828ebbb7189
2021-09-28 11:32:44 +02:00
Pau Espin 50e6f06658 gsm: Mark gsm0858_rsl_ul_meas_enc() pointer param const
Change-Id: I9b2704250d8a3f6c6fc6cd2a5136b1408c8ed965
2021-09-28 11:32:00 +02:00
Alexander Couzens ca5ce0d849 ns2: nsvc: add a uptime/downtime to track the last state change
To show adminstrator the last state change of a nsvc add a timestamp and
show it on the vty

> show ns nsei 1234
NSEI 01234: UDP, DEAD since 0d 0h 1m 42s
[...]
  4 NS-VC:
   UNBLOCKED DYNAMIC sig_weight=1 data_weight=1 udp)[127.0.0.1]:22000<>[127.0.0.1]:23001 ALIVE since 0d 0h 0m 1s
   UNBLOCKED DYNAMIC sig_weight=2 data_weight=2 udp)[127.0.0.1]:22000<>[127.0.0.1]:23000 ALIVE since 0d 0h 0m 1s
   UNBLOCKED DYNAMIC sig_weight=2 data_weight=2 udp)[127.0.0.1]:22001<>[127.0.0.1]:23000 ALIVE since 0d 0h 0m 1s
   UNBLOCKED DYNAMIC sig_weight=1 data_weight=1 udp)[127.0.0.1]:22001<>[127.0.0.1]:23001 ALIVE since 0d 0h 0m 1s

Related: OS#5028
Change-Id: Ie3a039a209869295afa5feda39297cee81fedf22
2021-09-23 13:12:34 +02:00
Alexander Couzens 2c64c257c8 ns2: nse: add a uptime/downtime to track the last state change
To show adminstrator the last state change of a nse add a timestamp and
show it on the vty

> show ns nse 1234

NSEI 01234: UDP, ALIVE since 0d 0h 0m 16s
 FSM Instance Name: 'GPRS-NS2-SNS-SGSN(NSE01234-SNS)[0x6120000012a0]', ID: 'NSE01234-SNS'
  Log-Level: 'DEBUG', State: 'CONFIGURED'
  Timer: 4
 Maximum number of remote  NS-VCs: 8, IPv4 Endpoints: 2, IPv6 Endpoints: 0
 [...]

Related: OS#5028
Change-Id: I8143080a3c5c9a55d37dfad44ba2ac6561daa216
2021-09-23 13:12:34 +02:00
Alexander Couzens 06929166de vty: add vty_out_uptime() print the uptime to the vty
vty_out_uptime() calculates the time difference to a given timespec
and print it in a human readable format (days, hours,
minutes, seconds) to the vty.

Related: OS#5028
Change-Id: I264a3f49096b96646e0a1f5366623ac20d860793
2021-09-23 13:12:34 +02:00
Harald Welte 53b4bbb955 osmo-auc-gen: Print RFC3310 IMS HTTP-AKA style base64 nonce/res
This is useful when debugging IMS Authentication which uses
RFC3310 representation of the nonce and expected result.

Change-Id: Ibfa72410d8ff8e5b42063f1a12bff69ad2bebbb8
2021-09-21 19:57:56 +00:00
Harald Welte d075e3ae23 base64: reformat using Lindent to conform to our coding style
Change-Id: I2286fa0d2cba7c11359bb48329135dfcd0d8a948
2021-09-21 19:57:56 +00:00
Harald Welte 292f9e7014 base64: Migrate over to osmocom
This containts the osmocom changes to the mbedtls base64 code
merged in the previous commit.

Change-Id: I82c1bf5f827c8def370dbcb80b146e9e4184c4a3
2021-09-21 19:57:56 +00:00
Harald Welte c757239fd3 copy base64 implementation from mbedtls
Using mbedtls commit f9c599cd8ac9d00c484d4f5b027e18c6af4f9fdf before
they re-licensed to Apache 2.0, so we have a GPL-v2-or-later bsae64
implementation and avoid having code under a different license in the
tree.

This code is the unmodified import, so we can record any local changes
compared to the original version.

Change-Id: I39a9d3ab98257d21b9439b00528c744efa372c14
2021-09-21 19:57:56 +00:00
Neels Hofmeyr 599601e12c stats_test: assert counter and stat item val counts separately
Instead of just a send_count, keep one such count for the counter
updates, and a separate one for the stat item updates.
Print those numbers in the test output.

An upcoming patch will tweak stat_item reporting so that only an
actually changed value results in sending a new stat value. This patch
allows illustrating that change clearly.

Related: SYS#5542
Change-Id: I2da003ee6ec15f1c3959efe69e01b4ee24af82bb
2021-09-20 13:05:32 +00:00
Neels Hofmeyr 049fd5ccc0 stat_item: cosmetic: s/desc/group_desc in osmo_stat_item_group_alloc()
There also is an osmo_stat_item_desc, so the name 'desc' makes it hard
to read the code / the upcoming refactoring patches. It is an
osmo_stat_item_group_desc, so call it group_desc.

Related: SYS#5542
Change-Id: I07bc011450549a44ebf043e7d8a70718ddfd900e
2021-09-20 13:04:54 +00:00
Harald Welte b48f438ae9 osmo-auc-gen: Permit specifying the SQN in hex (0x12345) format
Use base '0' of strtoul to permit both decimal and hexadecimal input
to the SQN parameter.  Some other tools represent the SQN as hex,
so this avoids having to use some external tool to convert and allows
you to copy+paste it to the osmo-auc-gen command line.

Change-Id: I67c6341a989de433451994b824e12afd0c26cb8a
2021-09-17 07:57:23 +02:00
Neels Hofmeyr a16b50c5e8 CTRL: expose stat_item groups on CTRL
Expose all stat items as RO variables of the form

  stat_item.last.group_name.N.item_name
  stat_item.last.group_name.by_name.idx_name.item_name

For (possibly contrived) example:

  stat_item.last.trunk.0.endpoints:used
  stat_item.last.trunk.by_name.virtual-0.endpoints:used

Include the 'last' token to ease future extension, like 'max'.
Put this token in the beginning, similarly to rate_ctr variables, which
begin with 'per_sec', 'per_hour', ...

Related: SYS#5542
Related: I178dcf4516606aa561d47b06061b8a416d3c40cf (osmo-ttcn3-hacks)
Related: Ic1b35b7406547f92818afe399a2383d154576409 (osmo-ttcn3-hacks)
Change-Id: Idace66b37492fe96b2f2e133a69cac7960ca279c
2021-09-14 10:28:05 +02:00
Neels Hofmeyr 7fcfefbcf7 add osmo_stat_item_get_group_by_name_idxname()
Add "missing" API for looking up a stat_item_group by its index-name.
A subsequent patch, which adds stat_items to the CTRL interface, will
use this to look up stat item groups by object name.

In stat item groups, there are group names, having a number of indexes
denoting different objects. An object can have, besides the index, also
a name that is equivalent to the index.

Apologies for the weird function name, it's still the best one I
could come up with: "group_by_name" refers to the group name, and
"idxname" refers to the name that the object index is associated with.

We already have osmo_stat_item_get_group_by_name_idx().
Other contestants for name of this new function were:

- osmo_stat_item_get_group_by_name_name()
  because there is a "name" instead of "idx", but I find it confusing.

- osmo_stat_item_get_group_by_name_idx_name()
  but I find that the last "name" should be closer to the "idx".

Related: SYS#5542
Change-Id: Ia1a77a1e4657ba624dd4f4bf7ad274e7751d0141
2021-09-14 10:28:02 +02:00
Neels Hofmeyr 47773344fb utils: add osmo_str_to_int() and osmo_str_to_int64()
Properly converting a string to an integer while validating against all
possible errors is not trivial. It is a recurring theme in code review,
and there are places in osmo code that do it wrong.
End this by providing a simple API, if for nothing else then as an
example of how to use strol() / strtoul() / strtoll() / strtoull()
in an airtight way.

A subsequent patch, adding stat items to the CTRL interface, uses this
to properly validate indexes in CTRL variables and convert them to int.

Related: SYS#5542
Change-Id: I4dac826aab00bc1780a5258b6b55d34ce7d50c60
2021-09-12 21:24:50 +02:00
Eric Wild 11a58a1b34 vty: allow flushing
It was so far sufficient to wait for the buffers to drain at some
random point in time, but this is not always the case, sometimes it is
important that the output is flushed immediately.

Change-Id: If984b9ad2eba9f400bc29a7aa8825e241fd1d2a9
2021-09-10 14:50:26 +02:00
Alexander Couzens a7a757f2ee gprs_ns2: nsvc: react on STATUS PDUs with cause code NSVC UNKNOWN/NSVC BLOCKED
A STATUS PDU with cause code NSVC UNKNOWN/NSVC BLOCKED informs the other
side about a state mismatch between the side.

Change-Id: Ib6a2424f3027a30f14ef0a9fc2230e6aae9a2a04
2021-09-07 20:46:04 +02:00
Alexander Couzens e7873336a2 gprs_ns2: fix a white space
Change-Id: I2207d13ae451ce49482625fac43b6ab1c0f215e8
2021-09-07 20:46:04 +02:00
Alexander Couzens eec4f608b5 gprs_ns2: fix NS STATUS validation
The wrong TLVs were used.

Change-Id: I01339d93469285cc5340500717ab2b696284e12a
2021-09-07 20:46:04 +02:00
Alexander Couzens 9cd9f6d53f ns2: fix a crash when receiving a SIZE while configured
The ns2_vc_force_unconfigured() needs to be protected otherwise it would free
gss->nsvc which will be used later. It further would run into another
SNS failure which is wrong too.

Change-Id: If14b9e3fcd5d139457b10d06517302168091d8d8
2021-09-07 20:46:04 +02:00
Alexander Couzens f27fbf65b7 ns2: nsvc: reject UNITDATA when the remote BLOCK'ed
When the remote initiated the BLOCK the nsvc would still accept UNITDATA
over this nsvc.

Change-Id: I3ed4aa105a84e448082d3028fe844aae7720426b
2021-09-07 20:46:04 +02:00
Alexander Couzens 3178e30206 gprs_ns2: ensure the incoming NSVC is also the outgoing NSVC
Previous the SNS NSVC (the NSVC used for all SNS traffic) was never changed except
when the choosen NSVC went dead or got freed.
When receiving a SNS SIZE PDU over a different NSVC than the current SNS
NSVC the answer would be transmitted to a different port.

Change-Id: I36cd9488b8bca5cb99dae5cf50a55ee282e0557b
2021-09-04 01:31:18 +02:00
Alexander Couzens 1adfd23290 gprs_ns2_sns: ensure the SNS fsm behave correct when no signalling NSVCs are present
When no remaining signalling NSVCs are available the SNS must be
restarted (BSS) or go into unconfigured state (SGSN).

Change-Id: I95e6bbb7a418d647a8426804879571597ae06ff8
2021-09-04 01:26:28 +02:00
Alexander Couzens 8a612de92b gprs_ns2: improve reselection protection
Change-Id: I375a7639fb8e0f92fd67bb4176bd6219978aa428
2021-09-04 01:26:28 +02:00
Alexander Couzens b0874cdf97 gprs_ns2: add correct filename/linenr to sns failed log message
Change-Id: I117eaf8340fca50cb14392a3f05ea8feac1af3ed
2021-09-04 01:26:28 +02:00
Alexander Couzens 616a949456 gprs_ns2: calculate the nse->*_sums before notifing the sns fsm
The sns fsm needs these information to determine if there is a signalling nsvc left

Change-Id: I7b115921780bd1ae895d8b9d0d4aec3e1cbaaf58
2021-09-04 01:26:28 +02:00
Alexander Couzens c2fec69baa gprs_ns2: also prevent recursive events when SGSN side cleans up
When cleaning up the SGSN side (e.g. receiving a SNS SIZE PDU) the
clean up will result in a use-after-free bug when the SGSN side is still
alive.

Change-Id: I0f57dd0577d1fc7bd270f58e15f6f22eb130ef59
2021-09-04 01:25:32 +02:00
Alexander Couzens db07a44988 gprs_ns2_sns: implement outbound SNS DEL procedures
When removing a bind the remote side needs to be
informed via the SNS DELETE procedure.

Related: OS#5036
Change-Id: I53cd54dfd262c70c425c3f13dad3b29526daa523
2021-09-04 01:10:16 +02:00
Alexander Couzens 9cd39ac6ac gprs_ns2_sns: implement outbound SNS ADD procedures
When adding a bind, the remote side needs to be
informed via the SNS ADD procedure.

Related: OS#5036
Change-Id: I71c33200bd1f0307ceb943ee958db5ebe3623d36
2021-09-04 00:00:48 +02:00
Alexander Couzens 1f3193d344 gprs_ns2_sns: implement local change weight procedure
When changing the bind ip-sns weight, initiate a
SNS CHANGE WEIGHT procedure to inform the other side.

Related: OS#5036
Change-Id: Icec4dabb46bc198f68f91bfe09ba279fbe68d454
2021-09-04 00:00:48 +02:00
Alexander Couzens f074659520 gprs_ns2: don't use llist_for_each when freeing an element
The problem are recursive execution because a free generates an event which could
allow the use to free a nsvcs while the llist_for_each() is still running.

Change-Id: I902557fb6e56e6588728a46e43a9cbe3215d5c68
2021-09-04 00:00:48 +02:00
Alexander Couzens 4bfcce6c54 gprs_ns2: gprs_ns2_free_bind() should remove itself before removing nsvcs
When removing NSVCs before removing the bind from the SNS list, the removing NSVCs could
trigger a creation of a new NSVC on the same bind ending in a
while(true) loop.

Change-Id: I6f497348f75fb479427d8a4c23313e33fbc62036
2021-09-04 00:00:48 +02:00
Alexander Couzens 83f06cea0a gprs_ns2: use an event to free the nsvscs when using SNS
Otherwise there could be recursive loop when free'ing NSVCs which
in the end create an event which the SNS want to free the NSVCs a
second time

Change-Id: Ie99ba5fe8a84519fe8a8c0abdf875606715ab7f6
2021-09-04 00:00:48 +02:00
Alexander Couzens a27078266a gprs_ns2_sns: rework sns clean up
Move the cleanup into it's own state. Also changing the
SGSN unconfigured state which won't be triggered when a
SIZE is received.

Change-Id: I2639345fdf3cd300a934238d676c543065ceaa8b
2021-09-04 00:00:48 +02:00
Alexander Couzens 175eb7be1b gprs_ns2: move sns_event into internal.h to direct emit events
When other parts of ns2 requires to emit an event to the SNS fsm it would
need a proxy function because the events are private to the
SNS file. To circumvent creating multiple proxy function make the events
available via a header file.

Change-Id: I8e3fae4367c112b5a71bffb33c302d903855cddc
2021-09-04 00:00:48 +02:00
Pau Espin 51933840ff gsm_08_58.h: Extend IPA Power Control Params IEs to pass C/I params
This commit adds new Osmocom specific IEs required to pass C/I related
Power Control Parameters osmo-bsc => osmo-bts to be used by the MS Power
Control Loop being implemented.

Related: SYS#4917
Change-Id: Iffef0611430ad6c90606149c398d80158633bbca
2021-09-03 15:32:50 +00:00
Philipp Maier e67edfdec2 gsm_08_58: fix sourcecode formatting
Change-Id: Ia58c25441911d6f872a8ec5664c71e56ad895f97
2021-08-31 19:54:28 +00:00
Philipp Maier 55ce87da69 gsm_08_58: fix sourcecode formatting
struct abis_rsl_osmo_rep_acch_cap has an indentation level that is too
deep.

Change-Id: Ie15feac75d1aa4fe5e5e237b14119addf09e5d77
2021-08-31 19:54:28 +00:00
Philipp Maier 58f76d8b90 bts_features: Add new feature to indicate support for temporary overpower
To indicate to the BSC that a BTS supports temporary overpower of
SACCH/FACCH channels a new feature BTS_FEAT_ACCH_TOP is added.

Change-Id: I62fbfc30acd5d67b20727b75a8f256e6b5d31e06
Related: SYS#5319
2021-08-31 19:54:28 +00:00
Philipp Maier 0e44a7203c rsl: add new RSL IE to signal temporary overpower
To transfer the temporary overpower value from the BSC to the BTS, a new
RSL IE (RSL_IE_OSMO_TOP_ACCH_CAP) is added.

Change-Id: I31c5be4bceb9140d63ab8e2f197f0acc68699426
Related: SYS#5319
2021-08-31 19:54:28 +00:00
Philipp Maier cfea39ba13 gsm0503_coding: use ahs tables when encoding ahs codec id
The encoder function gsm0503_tch_ahs_encode uses gsm0503_afs_ic_ubit
when encoding the CMR or FT (depends on the frame number). This is not
correct. It should use gsm0503_ahs_ic_ubit instead.

Change-Id: Id250b2102ac79ff222bd3ad9d1abc4b60abdd12b
Related: SYS#5549
2021-08-31 16:05:20 +02:00
Pau Espin 9da16b5bbc cosmetic: Fix missing space in comment
Change-Id: If0940a2e1c66c3498f5e3d6ac641029290955175
2021-08-26 15:25:16 +02:00
Neels Hofmeyr 923cb84270 vty 'stats reset': do not reset stat_items
Exempt all stat_item statistics from 'stats reset'. Only reset rate_ctr
statistics to zero.

The rate_ctr statistics have an implicit time scale, counting occurences
per time unit. For them it makes sense to reset all ratings and start
from zero, for example in a test suite (e.g. our TTCN3 BSC_Tests).

In contrast, stat_item statistics count number of objects or nr of
specific object stati at any given time, and they do not deteriorate
over time. Many stat items depend on increment/decrement to be sane.

For example, in osmo-bsc, if the nr of connected BTS is 3, that does not
make sense to be reset to zero. There are still 3 BTS connected, only
the stat_item would suddenly reflect zero. From then on, it'd be wrong.

All stat_items are by definition wrong after a 'stats reset'.
- Those that depend on increment/decrement will be wrong until the
  program exits, and
- those that are set to absolute values will be wrong up until the next
  value is set. That could be seconds or hours later, depending.

Related: SYS#5542
Change-Id: If2134768b1076e7af189276c45f2a09a4944303e
2021-08-23 21:22:16 +02:00
Philipp Maier 2bd4bc94f6 codec: add missing osmo_amr_type_name function.
We have value strings for osmo_amr_type, but we do not have a function
that returns us the strings.

Change-Id: I694f56b032537440db6264df5e6a6aa3a2992175
2021-08-23 15:44:00 +02:00
Oliver Smith 11da4a4abd stats: send real last value if no new values come
Background:
* Individual values can be added to osmo_stat_item.values at any time.
* Stats are reported at a fixed interval (see vty 'stats interval'),
  e.g. every 10 seconds.
* In order to report a new stat value, we use the maximum of all
  osmo_stat_item.values added since the last report.
* By default, we do not send new stat values if they did not change
  (see vty 'config-stats' -> 'flush-period' default of 0).

Fix the following bug:
* If 'flush-period' is 0, and no new osmo_stat_item.values are coming
  in, the last value that gets reported is not necessarily the last
  entry in osmo_stat_item.values.
* For attached reporters (statsd), it could then be that the given stat
  stays at the wrong value for a long stretch of time (think of several
  hours/days/forever).

Explanation of how the test shows that it is fixed:
* stats get reported (value is irrelevant)
* osmo_stat_item gets a new value: 20
* osmo_stat_item gets a new value: 10
* stats get reported (value: 20, the maximum of both new values)
* osmo_stat_item gets no new values
* stats get reported (value: 10, this is new because of the bug fix,
  the real last value in osmo_stat_item, different from the 20 sent
  earlier, without the fix it would not send anything here and the last
  sent value would be 20)
* osmo_stat_item gets no new values
* stats get reported (nothing gets sent, since the real last value was
  already sent and 'flush-period' is 0)

Fixes: OS#5215
Change-Id: Ibeefd0e3d1dbe4be454ff05a21df4848b2abfabe
2021-08-20 14:04:54 +00:00
Oliver Smith a79a549273 tests/stats: show how last item sent may be wrong
Extend the test to illustrate the bug described in the related issue,
which will be fixed with the next patch.

Related: OS#5215
Change-Id: I1d26867ac1b837bea6a9754a3203e53c147e7a5f
2021-08-20 14:04:54 +00:00
Oliver Smith 22db07d7ed tests: add 'make update_exp' target
Add convenience target to update the test output.

Change-Id: I7247fffde82ab9195ae03b2ccb30d7aa47543113
2021-08-19 10:04:26 +02:00
Alexander Couzens 41589a3e7a gprs_ns2: add recursive anchor to protect against double free
When free'ing a NSE/NSVC/BIND ensure there can't be a double
free by using a free anchor in the struct.

Recursive free's can happen when the NS user reacts on an event
(e.g. GPRS_NS2_AFF_CAUSE_VC_FAILURE) and calls the free().
Or when the user free's a NSVC when the NSE uses SNS as configuration,
the fsm tries to free it again.

Change-Id: If9823aadaa936e136aa43e88cee925ddd5974841
2021-08-13 09:55:51 +00:00