diff options
author | Harald Welte <laforge@osmocom.org> | 2021-04-29 19:44:54 +0200 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2021-04-29 21:10:30 +0200 |
commit | d9098703fadd46150139c717505f9032f5621b9d (patch) | |
tree | 27901e3054f1ae7d3c14e6a91969afbb61c075d8 /src/xua_as_fsm.c | |
parent | 40c4461c3af8c76de14dfb5d2e4ef7668a8f91b9 (diff) |
xua_as_fsm: Only delete a route for an IPA AS if we created one earlier
The current code would potentially delete a route that was statically present in the
configuration in the following situation:
* route exists in config
* identical route is attempted to be added at AS-ACTIVE time, but fails
* route is unconditionally deleted at AS-DOWN time
* user now does 'write file' and has lost a route
Let's make sure we only delete the route if we added it previously.
Change-Id: I9ad5f7ebe0790e6c186b8ea1b12f204860a00cd2
Related: SYS#5422
Diffstat (limited to 'src/xua_as_fsm.c')
-rw-r--r-- | src/xua_as_fsm.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/xua_as_fsm.c b/src/xua_as_fsm.c index f66ba88..2f52762 100644 --- a/src/xua_as_fsm.c +++ b/src/xua_as_fsm.c @@ -200,6 +200,7 @@ struct xua_as_fsm_priv { struct osmo_timer_list t_r; struct llist_head queued_msgs; } recovery; + bool ipa_route_created; }; /* is the given AS one with a single ASP of IPA type? */ @@ -227,9 +228,13 @@ static void ipa_add_route(struct osmo_fsm_inst *fi) struct osmo_ss7_as *as = xafp->as; struct osmo_ss7_instance *inst = as->inst; + if (osmo_ss7_route_find_dpc_mask(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff)) + return; + /* As opposed to M3UA, there is no RKM and we have to implicitly * automatically add a route once an IPA connection has come up */ - osmo_ss7_route_create(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff, as->cfg.name); + if (osmo_ss7_route_create(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff, as->cfg.name)) + xafp->ipa_route_created = true; } static void ipa_del_route(struct osmo_fsm_inst *fi) @@ -239,6 +244,10 @@ static void ipa_del_route(struct osmo_fsm_inst *fi) struct osmo_ss7_instance *inst = as->inst; struct osmo_ss7_route *rt; + /* don't delete a route if we added none */ + if (!xafp->ipa_route_created) + return; + /* find the route which we have created if we ever reached ipa_asp_fsm_wait_id_ack2 */ rt = osmo_ss7_route_find_dpc_mask(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff); /* no route found, bail out */ @@ -258,6 +267,7 @@ static void ipa_del_route(struct osmo_fsm_inst *fi) } osmo_ss7_route_destroy(rt); + xafp->ipa_route_created = false; } |