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]>

Reply via email to