aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2020-11-19 02:44:04 +0100
committerAlexander Couzens <lynxis@fe80.eu>2020-11-24 03:53:22 +0100
commitaac9016570f9c2727598ab3f68efb148ba259877 (patch)
tree1c92013f80dc794accf906d340ae7e84ae780cf3
parent24a14ac80c46b7ac82dcddecb7068a484cd9e93c (diff)
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
-rw-r--r--include/osmocom/gprs/gprs_ns2.h3
-rw-r--r--src/gb/gprs_ns2.c19
-rw-r--r--src/gb/gprs_ns2_fr.c4
-rw-r--r--src/gb/gprs_ns2_frgre.c1
-rw-r--r--src/gb/gprs_ns2_internal.h8
-rw-r--r--src/gb/gprs_ns2_udp.c10
-rw-r--r--src/gb/gprs_ns2_vty.c7
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;