From aac9016570f9c2727598ab3f68efb148ba259877 Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Thu, 19 Nov 2020 02:44:04 +0100 Subject: ns2: move link layer type into NSE Even it was in theory possible to mix NS-VC ll types within a NSE. This is an unrealistic configuration. Further more to select the correct load sharing mechanism the NSE must know the correct link layer. Change-Id: I18dfd40a2429cd61b7c4a3dad5f226c64296f7d8 --- include/osmocom/gprs/gprs_ns2.h | 3 ++- src/gb/gprs_ns2.c | 19 +++++++------------ src/gb/gprs_ns2_fr.c | 4 ++-- src/gb/gprs_ns2_frgre.c | 1 + src/gb/gprs_ns2_internal.h | 8 ++++++-- src/gb/gprs_ns2_udp.c | 10 +++------- src/gb/gprs_ns2_vty.c | 7 +------ 7 files changed, 22 insertions(+), 30 deletions(-) diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h index da37e013..9dce3230 100644 --- a/include/osmocom/gprs/gprs_ns2.h +++ b/include/osmocom/gprs/gprs_ns2.h @@ -139,7 +139,8 @@ typedef int (*gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx); int gprs_ns2_nse_foreach_nsvc(struct gprs_ns2_nse *nse, gprs_ns2_foreach_nsvc_cb cb, void *cb_data); struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei); -struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei); +struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei, + enum gprs_ns2_ll linklayer); uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse); void gprs_ns2_free_nse(struct gprs_ns2_nse *nse); void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi); diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c index 96ad7676..5e43364c 100644 --- a/src/gb/gprs_ns2.c +++ b/src/gb/gprs_ns2.c @@ -226,7 +226,7 @@ char *gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc) if (!buf_len) return NULL; - switch (nsvc->ll) { + switch (nsvc->nse->ll) { case GPRS_NS2_LL_UDP: if (!gprs_ns2_is_ip_bind(nsvc->bind)) { buf[0] = '\0'; @@ -397,15 +397,11 @@ static struct gprs_ns2_vc *ns2_load_sharing( /* signalling */ nsvc = ns2_load_sharing_signal(nse); } else { - enum gprs_ns2_ll ll; - /* data with load sharing parameter */ if (llist_empty(&nse->nsvc)) return NULL; - nsvc = llist_first_entry(&nse->nsvc, struct gprs_ns2_vc, list); - ll = nsvc->ll; - switch (ll) { + switch (nse->ll) { case GPRS_NS2_LL_FR: nsvc = ns2_load_sharing_modulor(nse, bvci, link_selector); break; @@ -676,7 +672,7 @@ struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t n * \param[in] nsi NS instance in which to create NS Entity * \param[in] nsei NS Entity Identifier of to-be-created NSE * \returns newly-allocated NS-E in successful case; NULL on error */ -struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei) +struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei, enum gprs_ns2_ll linklayer) { struct gprs_ns2_nse *nse; @@ -690,6 +686,7 @@ struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nse if (!nse) return NULL; + nse->ll = linklayer; nse->nsei = nsei; nse->nsi = nsi; nse->first = true; @@ -845,7 +842,7 @@ enum gprs_ns2_cs ns2_create_vc(struct gprs_ns2_vc_bind *bind, return GPRS_NS2_CS_SKIPPED; } - nse = gprs_ns2_create_nse(bind->nsi, nsei); + nse = gprs_ns2_create_nse(bind->nsi, nsei, bind->ll); if (!nse) { return GPRS_NS2_CS_ERROR; } @@ -855,8 +852,6 @@ enum gprs_ns2_cs ns2_create_vc(struct gprs_ns2_vc_bind *bind, if (!nsvc) return GPRS_NS2_CS_SKIPPED; - nsvc->ll = GPRS_NS2_LL_UDP; - nsvci = tlvp_val16be(&tp, NS_IE_VCI); nsvc->nsvci = nsvci; nsvc->nsvci_is_valid = true; @@ -926,7 +921,7 @@ struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind, struct gprs_ns2_nse *nse = gprs_ns2_nse_by_nsei(bind->nsi, nsei); if (!nse) { - nse = gprs_ns2_create_nse(bind->nsi, nsei); + nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP); if (!nse) return NULL; } @@ -947,7 +942,7 @@ int gprs_ns2_ip_connect_sns(struct gprs_ns2_vc_bind *bind, struct gprs_ns2_vc *nsvc; if (!nse) { - nse = gprs_ns2_create_nse(bind->nsi, nsei); + nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP); if (!nse) return -1; } diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c index 75c70d7c..80e3366d 100644 --- a/src/gb/gprs_ns2_fr.c +++ b/src/gb/gprs_ns2_fr.c @@ -354,6 +354,7 @@ int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi, return -ENOSPC; bind->driver = &vc_driver_fr; + bind->ll = GPRS_NS2_LL_FR; bind->send_vc = fr_vc_sendmsg; bind->free_vc = free_vc; bind->dump_vty = dump_vty; @@ -469,7 +470,7 @@ struct gprs_ns2_vc *gprs_ns2_fr_connect(struct gprs_ns2_vc_bind *bind, struct priv_vc *priv = NULL; struct gprs_ns2_nse *nse = gprs_ns2_nse_by_nsei(bind->nsi, nsei); if (!nse) { - nse = gprs_ns2_create_nse(bind->nsi, nsei); + nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_FR); if (!nse) return NULL; created_nse = true; @@ -490,7 +491,6 @@ struct gprs_ns2_vc *gprs_ns2_fr_connect(struct gprs_ns2_vc_bind *bind, nsvc->nsvci = nsvci; nsvc->nsvci_is_valid = true; - nsvc->ll = GPRS_NS2_LL_FR; gprs_ns2_vc_fsm_start(nsvc); diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c index cd478d6e..3c276bc5 100644 --- a/src/gb/gprs_ns2_frgre.c +++ b/src/gb/gprs_ns2_frgre.c @@ -555,6 +555,7 @@ int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi, } bind->driver = &vc_driver_frgre; + bind->ll = GPRS_NS2_LL_FR_GRE; bind->send_vc = frgre_vc_sendmsg; bind->free_vc = free_vc; bind->nsi = nsi; diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h index d7211e53..08ffac2e 100644 --- a/src/gb/gprs_ns2_internal.h +++ b/src/gb/gprs_ns2_internal.h @@ -123,6 +123,9 @@ struct gprs_ns2_nse { /*! true if this NSE has at least one alive VC */ bool alive; + /*! which link-layer are we based on? */ + enum gprs_ns2_ll ll; + struct osmo_fsm_inst *bss_sns_fi; }; @@ -164,8 +167,6 @@ struct gprs_ns2_vc { struct rate_ctr_group *ctrg; struct osmo_stat_item_group *statg; - /*! which link-layer are we based on? */ - enum gprs_ns2_ll ll; enum gprs_ns2_vc_mode mode; struct osmo_fsm_inst *fi; @@ -186,6 +187,9 @@ struct gprs_ns2_vc_bind { /*! if VCs use reset/block/unblock method. IP shall not use this */ enum gprs_ns2_vc_mode vc_mode; + /*! which link-layer are we based on? */ + enum gprs_ns2_ll ll; + /*! send a msg over a VC */ int (*send_vc)(struct gprs_ns2_vc *nsvc, struct msgb *msg); diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c index 38c1a161..7f826677 100644 --- a/src/gb/gprs_ns2_udp.c +++ b/src/gb/gprs_ns2_udp.c @@ -322,6 +322,7 @@ int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi, } bind->driver = &vc_driver_ip; + bind->ll = GPRS_NS2_LL_UDP; bind->send_vc = nsip_vc_sendmsg; bind->free_vc = free_vc; bind->dump_vty = dump_vty; @@ -391,8 +392,6 @@ struct gprs_ns2_vc *gprs_ns2_ip_bind_connect(struct gprs_ns2_vc_bind *bind, priv = nsvc->priv; priv->remote = *remote; - nsvc->ll = GPRS_NS2_LL_UDP; - return nsvc; } @@ -403,9 +402,6 @@ const struct osmo_sockaddr *gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc) { struct priv_bind *priv; - if (nsvc->ll != GPRS_NS2_LL_UDP) - return NULL; - if (nsvc->bind->driver != &vc_driver_ip) return NULL; @@ -420,7 +416,7 @@ const struct osmo_sockaddr *gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc { struct priv_vc *priv; - if (nsvc->ll != GPRS_NS2_LL_UDP) + if (nsvc->bind->driver != &vc_driver_ip) return NULL; priv = nsvc->priv; @@ -442,7 +438,7 @@ bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc, struct priv_vc *vpriv; struct priv_bind *bpriv; - if (nsvc->ll != GPRS_NS2_LL_UDP) + if (nsvc->bind->driver != &vc_driver_ip) return false; vpriv = nsvc->priv; diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c index fa9b97b8..4c00ae32 100644 --- a/src/gb/gprs_ns2_vty.c +++ b/src/gb/gprs_ns2_vty.c @@ -525,11 +525,6 @@ DEFUN(cfg_nse_fr_dlci, cfg_nse_fr_dlci_cmd, return CMD_WARNING; } - if (vtyvc->ll != GPRS_NS2_LL_FR_GRE) { - vty_out(vty, "Warning: seting FR DLCI on non-FR NSE%s", - VTY_NEWLINE); - } - vtyvc->frdlci = dlci; return CMD_SUCCESS; @@ -880,7 +875,7 @@ int gprs_ns2_vty_create() { nse = gprs_ns2_nse_by_nsei(vty_nsi, vtyvc->nsei); if (!nse) { - nse = gprs_ns2_create_nse(vty_nsi, vtyvc->nsei); + nse = gprs_ns2_create_nse(vty_nsi, vtyvc->nsei, vtyvc->ll); if (!nse) { /* Could not create NSE for VTY */ continue; -- cgit v1.2.3