pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/libosmo-pfcp/+/42131?usp=email )
Change subject: pfcp: Trigger assoc_cb(false) upon Recovery Timestamp change
......................................................................
pfcp: Trigger assoc_cb(false) upon Recovery Timestamp change
Signal cp_peer becomes disassociated to the user when the recovery
timestamp value changes.
The library will automatically try to re-associate after signalling the
association change.
Related: SYS#7294
Change-Id: I5400ae9c2f00b3c87a73aef5cebba67cf9434477
---
M include/osmocom/pfcp/pfcp_cp_peer_private.h
M src/libosmo-pfcp/pfcp_cp_peer.c
2 files changed, 28 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-pfcp refs/changes/31/42131/1
diff --git a/include/osmocom/pfcp/pfcp_cp_peer_private.h
b/include/osmocom/pfcp/pfcp_cp_peer_private.h
index 503912d..3cc8e27 100644
--- a/include/osmocom/pfcp/pfcp_cp_peer_private.h
+++ b/include/osmocom/pfcp/pfcp_cp_peer_private.h
@@ -39,6 +39,10 @@
struct osmo_sockaddr remote_addr;
uint64_t next_seid_state;
+ /* Recovery Timestamp received from peer, if
recovery_timestamp_known=true */
+ bool recovery_timestamp_known;
+ uint32_t recovery_timestamp;
+
/* If non-NULL, called whenever the peer completes a PFCP Association,
and when it loses association.
* Argument associated == true means the peer has just associated;
* associated == false means the association has been lost. */
diff --git a/src/libosmo-pfcp/pfcp_cp_peer.c b/src/libosmo-pfcp/pfcp_cp_peer.c
index 2e4fd1b..85af616 100644
--- a/src/libosmo-pfcp/pfcp_cp_peer.c
+++ b/src/libosmo-pfcp/pfcp_cp_peer.c
@@ -46,6 +46,7 @@
PFCP_CP_PEER_EV_RX_ASSOC_SETUP_RESP,
PFCP_CP_PEER_EV_RX_ASSOC_UPDATE_REQ,
PFCP_CP_PEER_EV_HEARTBEAT_TIMEOUT,
+ PFCP_CP_PEER_EV_RECOVERY_CHANGED,
PFCP_CP_PEER_EV_USE_COUNT_ZERO,
};
@@ -53,6 +54,7 @@
OSMO_VALUE_STRING(PFCP_CP_PEER_EV_RX_ASSOC_SETUP_RESP),
OSMO_VALUE_STRING(PFCP_CP_PEER_EV_RX_ASSOC_UPDATE_REQ),
OSMO_VALUE_STRING(PFCP_CP_PEER_EV_HEARTBEAT_TIMEOUT),
+ OSMO_VALUE_STRING(PFCP_CP_PEER_EV_RECOVERY_CHANGED),
OSMO_VALUE_STRING(PFCP_CP_PEER_EV_USE_COUNT_ZERO),
{}
};
@@ -97,6 +99,7 @@
{
struct osmo_fsm_inst *fi = req->ctx.peer_fi;
struct osmo_pfcp_cp_peer *cp_peer = fi->priv;
+ uint32_t rx_recovery_ts;
if (!rx_resp) {
OSMO_LOG_PFCP_MSG(req, LOGL_NOTICE, "Error: PFCP Heartbeat
Response: %s\n",
@@ -104,7 +107,21 @@
return 0;
}
- OSMO_LOG_PFCP_MSG(rx_resp, LOGL_INFO, "Rx PFCP Heartbeat Response\n");
+ rx_recovery_ts = rx_resp->ies.heartbeat_resp.recovery_time_stamp;
+ OSMO_LOG_PFCP_MSG(rx_resp, LOGL_INFO, "Rx PFCP Heartbeat Response
(recovery=%" PRIu32 ")\n",
+ rx_recovery_ts);
+
+ if (cp_peer->recovery_timestamp_known && cp_peer->recovery_timestamp !=
rx_recovery_ts) {
+ OSMO_LOG_PFCP_MSG(rx_resp, LOGL_NOTICE,
+ "Rx PFCP Heartbeat Request: Recovery
Timestamp change %"PRIu32 " -> %" PRIu32 "\n",
+ cp_peer->recovery_timestamp,
rx_recovery_ts);
+ cp_peer->recovery_timestamp = rx_recovery_ts;
+ osmo_fsm_inst_dispatch(fi, PFCP_CP_PEER_EV_RECOVERY_CHANGED,
NULL);
+ return 0;
+ }
+
+ cp_peer->recovery_timestamp = rx_recovery_ts;
+ cp_peer->recovery_timestamp_known = true;
if (fi->state != PFCP_CP_PEER_ST_ASSOCIATED)
return 0;
@@ -357,6 +374,11 @@
osmo_pfcp_cp_peer_fsm_state_chg(PFCP_CP_PEER_ST_WAIT_ASSOC_SETUP_RESP);
break;
+ case PFCP_CP_PEER_EV_RECOVERY_CHANGED:
+ LOG_CP_PEER(cp_peer, LOGL_NOTICE, "Recovery Timestamp
Changed!\n");
+
osmo_pfcp_cp_peer_fsm_state_chg(PFCP_CP_PEER_ST_WAIT_ASSOC_SETUP_RESP);
+ break;
+
default:
OSMO_ASSERT(false);
}
@@ -445,6 +467,7 @@
.in_event_mask = 0
| S(PFCP_CP_PEER_EV_RX_ASSOC_UPDATE_REQ)
| S(PFCP_CP_PEER_EV_HEARTBEAT_TIMEOUT)
+ | S(PFCP_CP_PEER_EV_RECOVERY_CHANGED)
,
.out_state_mask = 0
| S(PFCP_CP_PEER_ST_WAIT_ASSOC_SETUP_RESP)
--
To view, visit https://gerrit.osmocom.org/c/libosmo-pfcp/+/42131?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: libosmo-pfcp
Gerrit-Branch: master
Gerrit-Change-Id: I5400ae9c2f00b3c87a73aef5cebba67cf9434477
Gerrit-Change-Number: 42131
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>