pespin has submitted this change. ( 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(-)
Approvals: laforge: Looks good to me, but someone else must approve osmith: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified
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)