Commit Graph

576 Commits

Author SHA1 Message Date
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
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
Alexander Couzens 1c40525f44 gprs_ns2_sns: free the NSE if the SIZE PDU is not valid
The SGSN fsm should be freed when becoming invalid instead of going
into the unconfigured state. The unconfigured states should be only used
when creating the NSE (on the SGSN side).

Change-Id: Ife889091ecba4180a90743deb786767008fe863d
2021-08-13 09:55:51 +00:00
Alexander Couzens 652ab4da5f gprs_ns2_sns: refactor SNS failures into a function
The SNS fsm is similar for BSS and SGSN.
Terminate the SGSN failures by freeing the NSE.

Change-Id: I1896f6c3ddb4f98ca261139c1cc77aa8f1558c6f
2021-08-13 09:55:51 +00:00
Alexander Couzens 20ed591036 gprs_ns2_udp: don't start the NSVC fsm for SNS
The SNS code will always create NSVC on it's own. The only case
when the SNS dialect allows dynamic NSE/NSVC is on the SGSN side when accepting
dynamic NSE and receiving the first SNS SIZE. In this case the NSVC FSM must not be started yet.
Prevents sending NS_ALIVE before the SNS configuration has been
finished.

Change-Id: I86275c99432262b3c19c1ded9a77090b74303bc8
2021-08-13 09:55:51 +00:00
Pau Espin 26a42c0783 gb/bssgp: Abort clearly if backward-compat API is used in wrong way
Some tests under osmo-pcu (TbfTest) were caught accessning NULL pointer
bssgp_nsi in bssgp_tx_llc_discarded triggered by timeout while stepping
slowly with the debugger.

It seems that test is not properly using neither the old nor the new
API. Let's catch such cases easily.

Change-Id: I3ea42755c4bfd29e4a01ad57f186f28d58ab466a
2021-07-26 14:39:46 +02:00
Pau Espin f26490b07b cosmetic: gb/gprs_ns.c: fix trailing whitespace
Change-Id: I842efdb93c9b480d5ab35c78b0bc60697262874a
2021-07-26 14:35:23 +02:00
Alexander Couzens a140d44a4f gprs_ns2: ensure the NSE becomes dead when FR link went down
The FR code is using force unconfigured to change the state of the NSVC
when the FR link goes down. The force unconfigured state didn't
notified the NSE when changing into this state.

Related: SYS#5533
Change-Id: I4d7bbbbce26f7cde99eebe96995c50b1e812e5bd
2021-07-13 07:43:06 +00:00
Daniel Willmann efa64f9429 Aggregate NSVC stats inside the NSE
Change-Id: Ifa3c85ec52bda14596e9d7a8705baa1fd4ee2010
Related: OS#4998
2021-07-09 20:35:00 +02:00
Alexander Couzens 5e040bf1f1 gprs_ns2_vty: dump_nsvc: change output depending on NSVCI
If the NSVCI is valid, there is no signalling or data weight defined (internally this is 1).
For NSVC with NSVCI don't print the signalling or data weight.
For NSVC without NSVCI, don't print NSVCI at all.

Related: OS#5180
Change-Id: Iaadc806a9136436468e2b02eb0bc1f4570a10ecc
2021-07-06 09:50:23 +00:00
Alexander Couzens 6ba77a3770 gprs_ns2: fix wrong format string in Tx Size logline
Don't use %u for integer.

Change-Id: I324836ec4943c97f0dbc16ade697c468eba02b35
2021-07-06 09:50:00 +00:00
Alexander Couzens 56287d26fe gprs_ns2: use gprs_ns2_free_bind() to clean up a bind
gprs_ns2_free_bind() takes care of all required steps to clean up a bind.
The driver->free_bind() operation only cleans up the driver internal state
but not NSVCs and other generic things.
Fixes a crash when free'ing a bind from the vty which has active NSVCs.

Related: OS#5195
Change-Id: I0a2ad22905bcacb929b9b5f5b034af0da3081826
2021-07-06 11:21:30 +02:00
Alexander Couzens 31cf166511 gprs_ns2: correct mtu value in the log line
The log line should describe what's reported towards the NS user
and not the NSE MTU itself

Related: OS#5192
Change-Id: I3f5445a1ba8c89c4023ff48be15a80569a128528
2021-07-02 17:38:12 +02:00
Alexander Couzens a6096ad367 gprs_ns2: fix check of MTU changes for frame relay
The frame relay needs 2 byte for data packets.

Related: OS#5192
Change-Id: I02d4e81896a473aeb79ea2f2983e12324244048f
2021-07-02 17:38:02 +02:00
Alexander Couzens db7b2ab36b gprs_ns2: fix crash when changing the MTU
When the MTU changes for any fr device, all
NSE will recalculate their MTU. If any NSE is alive,
libosmocore will crash.

Related: OS#5192
Change-Id: I31ba5cefea7bbb0b74060d6664b42c58815ee2a1
2021-07-02 17:38:02 +02:00
Daniel Willmann c7f547f897 ns2: Ignore NSVC with data_weight 0 for data
Change-Id: If0c2bee285f85110771326e07b513fc3e3f9d3f0
Fixes: OS#5189
2021-06-29 13:18:42 +02:00
Alexander Couzens 8138c53a32 gprs_ns2_vc_fsm: reset the ALIVE response time when stopping test
Prevent showing a response time when the NSVC has failed.

Related: OS#5089
Change-Id: I5435077d35ff1ae3d743ea1b1b8ace7f0fb913cf
2021-06-25 08:12:39 +00:00
Alexander Couzens e09deb6355 gprs_ns2: fix missing notify towards the NSE when NSVC become blocked
The NSE wasn't notified when a NSVC went into the BLOCKED state from
an UNBLOCKED state.

Related: OS#5182
Change-Id: I09634e414e9bb966e6b5809b7de1b59fbabd413d
2021-06-25 08:12:39 +00:00
Alexander Couzens d5cd8c61cb gprs_ns2: use llist_add_tail to keep order
When configuring multiple NSE/BINDs the order of the configuration
should be keeped.

Related: OS#5181
Change-Id: Ibbc03f0780b49543b5bd97ee059f11cfd6c2a126
2021-06-25 08:12:39 +00:00
Alexander Couzens 68ab9c4193 gprs_ns2_sns: bss: set gss->family
gss->family (and gss->ip) was never set.
So IPv6 should have never worked.

Fixes: e769f5226b ("gprs_ns2_sns: rework IP-SNS initial remote")
Related: OS#5036
Change-Id: I4e39dc5c7f766a7040645ceb62afdf6a9cfad00f
2021-06-13 18:31:51 +00:00
Alexander Couzens 077ce5ac94 gprs_ns2_sns: replace ns2_sns_type with address family
Reduces the code as the conversion between address family (bind)
and ns2_sns_type is not needed anymore.

Related: OS#5036
Change-Id: I1bcdd43af34c926d4b88491d00669422c299bef7
2021-06-13 18:31:51 +00:00
Alexander Couzens 019da4b082 gprs_ns2_sns: refactor nss_weight_sum_data -> ip46_weight_sum_data
Allow to use ip46_weight_sum_data for local endpoints as well.

Related: OS#5036
Change-Id: I75d88f3da89ad13e34a3fd5ae72bd967d81f4abc
2021-06-13 18:31:25 +00:00
Alexander Couzens 6231055645 gprs_ns2_sns: refactor ip4_weight_sum/ip6_weight_sum
Use the new introduced struct ns2_sns_elems instead of
the elems seperate.

Related: OS#5036
Change-Id: I0956ab6085554210569188f52cae121e32fca19b
2021-06-13 18:31:25 +00:00
Alexander Couzens cc56ddcdd0 gprs_ns2_sns: add check for duplicates to add_ip6_elem()
The ip4 version already checks for duplicates.

Related: OS#5036
Change-Id: I4a1528ea3427946ce465085919b2b522d3cedd07
2021-06-13 18:31:25 +00:00
Michael Iedema a667d85a92 ns2: use same name in ctr_group as stat_item_group
Change-Id: I7d2dcb6c7ddf72a0d06ff19f5d0e3dc740bd19ff
2021-06-10 12:57:04 +00:00
Alexander Couzens d3507e851e gprs_ns2_sns: move gss->remote specific check out of add_ip4_elem/add_ip6_elem
Allow to use the add_ip4_elem also with local elemens.

Related: OS#5036
Change-Id: Ib48dfd7567467e60c5af2348924ece5cc6124206
2021-06-07 12:39:47 +00:00
Alexander Couzens c2ba25e436 gprs_ns2_sns: use struct ns2_sns_elems in add/update/remove remote_elems
Prepare to use the function also with local elems.

Related: OS#5036
Change-Id: I7db43c8dbd5bd7e7b07a7d629d2615bfa18623db
2021-06-07 12:39:47 +00:00
Alexander Couzens d2c6c49724 gprs_ns2_sns: refactor ns2_clear_ipv46_entries_local to use new elems functions
Related: OS#5036
Change-Id: I7225f7a4215842f0ea601ce6d9d38220f98f808d
2021-06-07 12:39:47 +00:00
Alexander Couzens 7112867151 gprs_ns2_sns: refactor local and remote entries into a struct
The IPv4/IPv6 elemens are the same for local and remote.
Refactor the entries into a struct to use function to manipulate
them with a single function.

Related: OS#5036
Change-Id: I05e053a9eb3328655502dfe2981c8f402104e292
2021-06-07 12:39:47 +00:00
Alexander Couzens 31d52e156f gprs_ns2_sns: bss: improve validation of configuration
Some combination of IPv4 and IPv6 result in incomplete
combination.
E.g. IPv6 binds, but only IPv4 endpoints and vice versa.

Related: OS#5036
Change-Id: I2fcf67bc2431ddac23c4ae23cebbb29771e573f1
2021-06-07 12:39:47 +00:00
Alexander Couzens 6608ce9525 gprs_ns2_sns: move selection of the next bind into own function
It will be also used by del_bind() when removing an active bind

Related: OS#5036
Change-Id: Ic39f0e5474ecc055d9a1b6a7b30777574d8b741d
2021-06-07 12:39:47 +00:00
Pau Espin 05047b7f27 ns2: Use NSVC bufid in stats report
Use the new stats API to set a meaningful name for its stats group too,
so that they are easily to identify when reported.

Example on VTY "show stats":
"""
NSVC Peer Statistics (0)('UDP-NSE01800-NSVC01800'):
 ALIVE response time        :        0 ms
NS Bind Statistics:
 Transmit backlog length:        0 packets
"""

Example reporting to statsd:
"""
my-stats-reporter-prefix.ns.nsvc.UDP-NSE01800-NSVC01800.alive.delay:0|g
"""

Related: SYS#5456
Change-Id: I4c696c615ba3416f8524d0797ce06c0ecd3a18f2
2021-06-05 15:46:27 +00:00
Alexander Couzens d794806719 gprs_ns2: rework id strings of nsvcs
Ensure all nsvcs ids are unique as UDP ids might not be unique when
multiple NSVCs connect to the same remote endpoint (multiple binds).
Change the format of all ids to look similiar.
FR: NSE11-NSVC23-FR-fr0-DLCI13.
UDP: NSE11-NSVC-UDP-10.0.0.1:23000-192.168.1.1:24000
UDP: NSE11-NSVC23-UDP-10.0.0.1:23000-192.168.1.1:24000
UDP: NSE11-NSVC66-UDP-[fd01::1]:23000-[fd03::2]:24000

Change-Id: I618e263e73fcc64d4e46b57aa3a2cb2783837907
2021-06-05 15:46:13 +00:00
Pau Espin 7b894a7de0 Use new stat item/ctr getter APIs
Generated with spatch:
"""
@@
expression E1, E2;
@@
- &E2->ctr[E1]
+ rate_ctr_group_get_ctr(E2, E1)
"""

"""
@@
expression E1, E2, E3;
@@
- E2->items[E1]
+ osmo_stat_item_group_get_item(E2, E1)
"""

Change-Id: I41297a8df68e28dfc6016330ac82b0ed5dd0ebc1
2021-06-04 18:19:37 +02:00
Alexander Couzens 15596899a3 gprs_ns2: vty: fix removing a bind from a SNS
Return 0 after removing a bind. Otherwise the vty would return a
wrong error to the user.

Change-Id: I088c18abafc82ae7bd7b8c487ad9e9b448c42ba9
2021-05-23 10:32:40 +00:00
Alexander Couzens a35c296b6b gprs_ns2: sns: fix del bind()
When the bind to be removed is not the last entry, it would
remove the wrong SNS bind resulting in use-after-free memory.

Change-Id: I79062d404ebba9d5c8f7f209bebde146fa08c71f
2021-05-23 10:32:40 +00:00
Pau Espin a5af04477e gb: Fix missing exporting symbol bssgp_encode_rim_pdu
The symbol was not in the list of exported symbols.

Change-Id: I4c3792c3b22989571548e40aa4fbf26912e699df
2021-05-06 20:28:27 +02:00
Pau Espin adef546ff9 Revert "gb: Fix naming and export symbol bssgp_enc_rim_pdu"
This reverts commit 43ad616e4b.

 _enc_ functions are for some ies while the _encode_ and _decode_ are
for the full pdu.  so the old name is correct.

Change-Id: Ib0b4a6fd7f8c96e4647a373541e3cccb324c6a11
2021-05-06 18:28:12 +00:00
Pau Espin 43ad616e4b gb: Fix naming and export symbol bssgp_enc_rim_pdu
The symbol was not in the list of exported symbols.
Take the chance that it was not used anywhere outside libosmocore to
rename it in order to follow similar naming as other existing APIs.

Change-Id: I534db7d8bc5ceb19a2a6866f07d5f5c70e456c5c
2021-05-06 17:56:47 +02:00
Harald Welte 5782fec9ff ns2: change the 'priority' setting name to 'socket-priority'
This has been changed based on feedback from Pau Espin in osmo-mgw,
and for consistency we also adjust it here.  No backwards compat
needed as it was just introduced yesterday.

Change-Id: I88989dc17c8996609b895c43012f8cca98aa81dc
2021-04-29 21:29:48 +02:00
Harald Welte d99e4eee2b ns2: Allow setting the socket priority for a UDP bind
Change-Id: Ifdfa086ce1c8d62b256abb3454b70cf53da9dcdb
2021-04-29 19:55:34 +02:00