laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-pcu/+/22913 )

Change subject: gprs_bssgp: rework and rename ns_create_nsvc -> ns_configure_nse
......................................................................

gprs_bssgp: rework and rename ns_create_nsvc -> ns_configure_nse

Add support for multiple SNS endpoints.
Move the NSE allocation to the top in preparation of IP-SNS binds.
The future gprs_ns2 library will require to manual add every bind to the NSE 
for IP-SNS.
Rename the function to match more it's purpose.

Related: SYS#5354
Change-Id: I69cf48ab168a6dca4f649157bf6556d7cd27d4fb
---
M src/gprs_bssgp_pcu.c
1 file changed, 40 insertions(+), 26 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  daniel: Looks good to me, but someone else must approve
  Jenkins Builder: Verified



diff --git a/src/gprs_bssgp_pcu.c b/src/gprs_bssgp_pcu.c
index a6b6f7e..7d793be 100644
--- a/src/gprs_bssgp_pcu.c
+++ b/src/gprs_bssgp_pcu.c
@@ -975,12 +975,22 @@
        osmo_timer_schedule(&the_pcu->bssgp.bvc_timer, 
the_pcu->vty.fc_interval, 0);
 }

-static int ns_create_nsvc(struct gprs_rlcmac_bts *bts,
-                         uint16_t nsei,
-                         const struct osmo_sockaddr *local,
-                         const struct osmo_sockaddr *remote,
-                         const uint16_t *nsvci,
-                         uint16_t valid)
+/*! configure NS layer
+ *
+ * \param bts pointer to the bts object
+ * \param nsei the NSEI of the BSS
+ * \param local pointer to an array of local address to bind on.
+ * \param remote pointer to an array of remote address SGSNs. If dynamic 
IP-SNS is used remote is used as initial SGSN endpoints.
+ * \param nsvci pointer to an array of nsvcis
+ * \param valid bitmask. a 1 means the position in the array contains a valid 
entry for local, remote, nsvci
+ * \returns 0 if the configuration has succeeded. on error != 0
+ */
+static int ns_configure_nse(struct gprs_rlcmac_bts *bts,
+                           uint16_t nsei,
+                           const struct osmo_sockaddr *local,
+                           const struct osmo_sockaddr *remote,
+                           const uint16_t *nsvci,
+                           uint16_t valid)
 {
        int i, rc;
        uint16_t binds = 0;
@@ -988,10 +998,20 @@
        struct gprs_ns2_vc *nsvc;
        struct gprs_ns2_vc_bind *bind[PCU_IF_NUM_NSVC] = { };
        char name[5];
+       bool sns_configured = false;

        if (!valid)
                return -1;

+       bts->nse = gprs_ns2_nse_by_nsei(the_pcu->nsi, nsei);
+       if (!bts->nse)
+               bts->nse = gprs_ns2_create_nse(the_pcu->nsi, nsei,
+                                              GPRS_NS2_LL_UDP, 
the_pcu->vty.ns_dialect);
+       if (!bts->nse) {
+               LOGP(DBSSGP, LOGL_ERROR, "Failed to create NSE\n");
+               return -1;
+       }
+
        for (i = 0; i < PCU_IF_NUM_NSVC; i++) {
                if (!(valid & (1 << i)))
                        continue;
@@ -1010,31 +1030,22 @@

        if (!binds) {
                LOGP(DBSSGP, LOGL_ERROR, "Failed to bind to any NS-VC\n");
+               gprs_ns2_free_nses(the_pcu->nsi);
                return -1;
        }

-       bts->nse = gprs_ns2_nse_by_nsei(the_pcu->nsi, nsei);
-       if (!bts->nse)
-               bts->nse = gprs_ns2_create_nse(the_pcu->nsi, nsei,
-                                              GPRS_NS2_LL_UDP, 
the_pcu->vty.ns_dialect);
-
-       if (!bts->nse) {
-               LOGP(DBSSGP, LOGL_ERROR, "Failed to create NSE\n");
-               gprs_ns2_free_binds(the_pcu->nsi);
-               return 1;
-       }
-
        for (i = 0; i < PCU_IF_NUM_NSVC; i++) {
                if (!(binds & (1 << i)))
                        continue;

-               /* FIXME: for SNS we just use the first successful NS-VC 
instead of all for the initial connect */
                if (the_pcu->vty.ns_dialect == GPRS_NS2_DIALECT_SNS) {
                        rc = gprs_ns2_sns_add_endpoint(bts->nse, &remote[i]);
-                       if (!rc)
+                       if (rc && rc != -EALREADY) {
+                               LOGP(DBSSGP, LOGL_ERROR, "Failed to add SNS 
endpoint %s!\n", osmo_sockaddr_to_str(&remote[i]));
                                return rc;
-                       else
-                               LOGP(DBSSGP, LOGL_ERROR, "Failed to connect to 
(SNS) towards SGSN %s!\n", osmo_sockaddr_to_str(&remote[i]));
+                       } else {
+                               sns_configured = true;
+                       }
                } else {
                        nsvc = gprs_ns2_ip_connect(bind[i], &remote[i], 
bts->nse, nsvci[i]);
                        if (nsvc)
@@ -1044,7 +1055,10 @@
                }
        }

-       return nsvcs ? 0 : -1;
+       if (the_pcu->vty.ns_dialect == GPRS_NS2_DIALECT_SNS)
+               return sns_configured ? 0 : -1;
+       else
+               return nsvcs ? 0 : -1;
 }

 struct nsvc_cb {
@@ -1093,12 +1107,12 @@
                /* there shouldn't any previous state. */
                gprs_ns2_free_nses(the_pcu->nsi);
                gprs_ns2_free_binds(the_pcu->nsi);
-               rc = ns_create_nsvc(bts, nsei, local, remote, nsvci, valid);
+               rc = ns_configure_nse(bts, nsei, local, remote, nsvci, valid);
        } else if (nsei != gprs_ns2_nse_nsei(bts->nse)) {
                /* the NSEI has changed */
                gprs_ns2_free_nses(the_pcu->nsi);
                gprs_ns2_free_binds(the_pcu->nsi);
-               rc = ns_create_nsvc(bts, nsei, local, remote, nsvci, valid);
+               rc = ns_configure_nse(bts, nsei, local, remote, nsvci, valid);
        } else if (the_pcu->vty.ns_dialect == GPRS_NS2_DIALECT_SNS) {
                /* SNS: check if the initial nsvc is the same, if not recreate 
it */
                const struct osmo_sockaddr *initial = 
gprs_ns2_nse_sns_remote(bts->nse);
@@ -1114,7 +1128,7 @@

                gprs_ns2_free_nses(the_pcu->nsi);
                gprs_ns2_free_binds(the_pcu->nsi);
-               rc = ns_create_nsvc(bts, nsei, local, remote, nsvci, valid);
+               rc = ns_configure_nse(bts, nsei, local, remote, nsvci, valid);
        } else {
                /* check if all NSVC are still the same. */
                struct nsvc_cb data = {
@@ -1134,7 +1148,7 @@

                /* remove all found nsvcs from the valid field */
                valid &= ~data.found;
-               rc = ns_create_nsvc(bts, nsei, local, remote, nsvci, valid);
+               rc = ns_configure_nse(bts, nsei, local, remote, nsvci, valid);
        }

        if (rc)

--
To view, visit https://gerrit.osmocom.org/c/osmo-pcu/+/22913
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Change-Id: I69cf48ab168a6dca4f649157bf6556d7cd27d4fb
Gerrit-Change-Number: 22913
Gerrit-PatchSet: 3
Gerrit-Owner: lynxis lazus <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to