mirror of https://gerrit.osmocom.org/libosmocore
gprs_ns2_sns: refactor local and remote entries into a struct
The IPv4/IPv6 elemens are the same for local and remote. Refactor the entries into a struct to use function to manipulate them with a single function. Related: OS#5036 Change-Id: I05e053a9eb3328655502dfe2981c8f402104e292
This commit is contained in:
parent
31d52e156f
commit
7112867151
|
@ -122,6 +122,13 @@ struct ns2_sns_bind {
|
||||||
struct gprs_ns2_vc_bind *bind;
|
struct gprs_ns2_vc_bind *bind;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ns2_sns_elems {
|
||||||
|
struct gprs_ns_ie_ip4_elem *ip4;
|
||||||
|
unsigned int num_ip4;
|
||||||
|
struct gprs_ns_ie_ip6_elem *ip6;
|
||||||
|
unsigned int num_ip6;
|
||||||
|
};
|
||||||
|
|
||||||
struct ns2_sns_state {
|
struct ns2_sns_state {
|
||||||
struct gprs_ns2_nse *nse;
|
struct gprs_ns2_nse *nse;
|
||||||
|
|
||||||
|
@ -150,26 +157,16 @@ struct ns2_sns_state {
|
||||||
bool alive;
|
bool alive;
|
||||||
|
|
||||||
/* local configuration to send to the remote end */
|
/* local configuration to send to the remote end */
|
||||||
struct gprs_ns_ie_ip4_elem *ip4_local;
|
struct ns2_sns_elems local;
|
||||||
size_t num_ip4_local;
|
|
||||||
|
|
||||||
/* local configuration to send to the remote end */
|
/* remote configuration as received */
|
||||||
struct gprs_ns_ie_ip6_elem *ip6_local;
|
struct ns2_sns_elems remote;
|
||||||
size_t num_ip6_local;
|
|
||||||
|
|
||||||
/* local configuration about our capabilities in terms of connections to
|
/* local configuration about our capabilities in terms of connections to
|
||||||
* remote (SGSN) side */
|
* remote (SGSN) side */
|
||||||
size_t num_max_nsvcs;
|
size_t num_max_nsvcs;
|
||||||
size_t num_max_ip4_remote;
|
size_t num_max_ip4_remote;
|
||||||
size_t num_max_ip6_remote;
|
size_t num_max_ip6_remote;
|
||||||
|
|
||||||
/* remote configuration as received */
|
|
||||||
struct gprs_ns_ie_ip4_elem *ip4_remote;
|
|
||||||
unsigned int num_ip4_remote;
|
|
||||||
|
|
||||||
/* remote configuration as received */
|
|
||||||
struct gprs_ns_ie_ip6_elem *ip6_remote;
|
|
||||||
unsigned int num_ip6_remote;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct gprs_ns2_nse *nse_inst_from_fi(struct osmo_fsm_inst *fi)
|
static inline struct gprs_ns2_nse *nse_inst_from_fi(struct osmo_fsm_inst *fi)
|
||||||
|
@ -216,8 +213,8 @@ static int ip6_weight_sum(const struct gprs_ns_ie_ip6_elem *ip6, unsigned int nu
|
||||||
|
|
||||||
static int nss_weight_sum(const struct ns2_sns_state *nss, bool data_weight)
|
static int nss_weight_sum(const struct ns2_sns_state *nss, bool data_weight)
|
||||||
{
|
{
|
||||||
return ip4_weight_sum(nss->ip4_remote, nss->num_ip4_remote, data_weight) +
|
return ip4_weight_sum(nss->remote.ip4, nss->remote.num_ip4, data_weight) +
|
||||||
ip6_weight_sum(nss->ip6_remote, nss->num_ip6_remote, data_weight);
|
ip6_weight_sum(nss->remote.ip6, nss->remote.num_ip6, data_weight);
|
||||||
}
|
}
|
||||||
#define nss_weight_sum_data(nss) nss_weight_sum(nss, true)
|
#define nss_weight_sum_data(nss) nss_weight_sum(nss, true)
|
||||||
#define nss_weight_sum_sig(nss) nss_weight_sum(nss, false)
|
#define nss_weight_sum_sig(nss) nss_weight_sum(nss, false)
|
||||||
|
@ -300,20 +297,20 @@ void ns2_sns_replace_nsvc(struct gprs_ns2_vc *nsvc)
|
||||||
|
|
||||||
static void ns2_clear_ipv46_entries_local(struct ns2_sns_state *gss)
|
static void ns2_clear_ipv46_entries_local(struct ns2_sns_state *gss)
|
||||||
{
|
{
|
||||||
TALLOC_FREE(gss->ip4_local);
|
TALLOC_FREE(gss->local.ip4);
|
||||||
TALLOC_FREE(gss->ip6_local);
|
TALLOC_FREE(gss->local.ip6);
|
||||||
|
|
||||||
gss->num_ip4_local = 0;
|
gss->local.num_ip4 = 0;
|
||||||
gss->num_ip6_local = 0;
|
gss->local.num_ip6 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ns2_clear_ipv46_entries_remote(struct ns2_sns_state *gss)
|
static void ns2_clear_ipv46_entries_remote(struct ns2_sns_state *gss)
|
||||||
{
|
{
|
||||||
TALLOC_FREE(gss->ip4_remote);
|
TALLOC_FREE(gss->remote.ip4);
|
||||||
TALLOC_FREE(gss->ip6_remote);
|
TALLOC_FREE(gss->remote.ip6);
|
||||||
|
|
||||||
gss->num_ip4_remote = 0;
|
gss->remote.num_ip4 = 0;
|
||||||
gss->num_ip6_remote = 0;
|
gss->remote.num_ip6 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ns2_vc_create_ip(struct osmo_fsm_inst *fi, struct gprs_ns2_nse *nse, const struct osmo_sockaddr *remote,
|
static void ns2_vc_create_ip(struct osmo_fsm_inst *fi, struct gprs_ns2_nse *nse, const struct osmo_sockaddr *remote,
|
||||||
|
@ -393,8 +390,8 @@ static int create_missing_nsvcs(struct osmo_fsm_inst *fi)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* iterate over all remote IPv4 endpoints */
|
/* iterate over all remote IPv4 endpoints */
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip4; i++) {
|
||||||
const struct gprs_ns_ie_ip4_elem *ip4 = &gss->ip4_remote[i];
|
const struct gprs_ns_ie_ip4_elem *ip4 = &gss->remote.ip4[i];
|
||||||
|
|
||||||
remote.u.sin.sin_family = AF_INET;
|
remote.u.sin.sin_family = AF_INET;
|
||||||
remote.u.sin.sin_addr.s_addr = ip4->ip_addr;
|
remote.u.sin.sin_addr.s_addr = ip4->ip_addr;
|
||||||
|
@ -425,8 +422,8 @@ static int create_missing_nsvcs(struct osmo_fsm_inst *fi)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* iterate over all remote IPv4 endpoints */
|
/* iterate over all remote IPv4 endpoints */
|
||||||
for (i = 0; i < gss->num_ip6_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip6; i++) {
|
||||||
const struct gprs_ns_ie_ip6_elem *ip6 = &gss->ip6_remote[i];
|
const struct gprs_ns_ie_ip6_elem *ip6 = &gss->remote.ip6[i];
|
||||||
|
|
||||||
remote.u.sin6.sin6_family = AF_INET6;
|
remote.u.sin6.sin6_family = AF_INET6;
|
||||||
remote.u.sin6.sin6_addr = ip6->ip_addr;
|
remote.u.sin6.sin6_addr = ip6->ip_addr;
|
||||||
|
@ -465,21 +462,21 @@ static int add_remote_ip4_elem(struct ns2_sns_state *gss, const struct gprs_ns_i
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (gss->num_ip4_remote >= gss->num_max_ip4_remote)
|
if (gss->remote.num_ip4 >= gss->num_max_ip4_remote)
|
||||||
return -NS_CAUSE_INVAL_NR_NS_VC;
|
return -NS_CAUSE_INVAL_NR_NS_VC;
|
||||||
|
|
||||||
/* check for duplicates */
|
/* check for duplicates */
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip4; i++) {
|
||||||
if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))
|
if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))
|
||||||
continue;
|
continue;
|
||||||
/* TODO: log message duplicate */
|
/* TODO: log message duplicate */
|
||||||
return -NS_CAUSE_PROTO_ERR_UNSPEC;
|
return -NS_CAUSE_PROTO_ERR_UNSPEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote, struct gprs_ns_ie_ip4_elem,
|
gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4, struct gprs_ns_ie_ip4_elem,
|
||||||
gss->num_ip4_remote+1);
|
gss->remote.num_ip4+1);
|
||||||
gss->ip4_remote[gss->num_ip4_remote] = *ip4;
|
gss->remote.ip4[gss->remote.num_ip4] = *ip4;
|
||||||
gss->num_ip4_remote += 1;
|
gss->remote.num_ip4 += 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,12 +485,12 @@ static int remove_remote_ip4_elem(struct ns2_sns_state *gss, const struct gprs_n
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip4; i++) {
|
||||||
if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))
|
if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))
|
||||||
continue;
|
continue;
|
||||||
/* all array elements < i remain as they are; all > i are shifted left by one */
|
/* all array elements < i remain as they are; all > i are shifted left by one */
|
||||||
memmove(&gss->ip4_remote[i], &gss->ip4_remote[i+1], gss->num_ip4_remote-i-1);
|
memmove(&gss->remote.ip4[i], &gss->remote.ip4[i+1], gss->remote.num_ip4-i-1);
|
||||||
gss->num_ip4_remote -= 1;
|
gss->remote.num_ip4 -= 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -504,13 +501,13 @@ static int update_remote_ip4_elem(struct ns2_sns_state *gss, const struct gprs_n
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip4; i++) {
|
||||||
if (gss->ip4_remote[i].ip_addr != ip4->ip_addr ||
|
if (gss->remote.ip4[i].ip_addr != ip4->ip_addr ||
|
||||||
gss->ip4_remote[i].udp_port != ip4->udp_port)
|
gss->remote.ip4[i].udp_port != ip4->udp_port)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
gss->ip4_remote[i].sig_weight = ip4->sig_weight;
|
gss->remote.ip4[i].sig_weight = ip4->sig_weight;
|
||||||
gss->ip4_remote[i].data_weight = ip4->data_weight;
|
gss->remote.ip4[i].data_weight = ip4->data_weight;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -519,13 +516,13 @@ static int update_remote_ip4_elem(struct ns2_sns_state *gss, const struct gprs_n
|
||||||
/* Add a given remote IPv6 element to gprs_sns_state */
|
/* Add a given remote IPv6 element to gprs_sns_state */
|
||||||
static int add_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_ns_ie_ip6_elem *ip6)
|
static int add_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_ns_ie_ip6_elem *ip6)
|
||||||
{
|
{
|
||||||
if (gss->num_ip6_remote >= gss->num_max_ip6_remote)
|
if (gss->remote.num_ip6 >= gss->num_max_ip6_remote)
|
||||||
return -NS_CAUSE_INVAL_NR_NS_VC;
|
return -NS_CAUSE_INVAL_NR_NS_VC;
|
||||||
|
|
||||||
gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote, struct gprs_ns_ie_ip6_elem,
|
gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6, struct gprs_ns_ie_ip6_elem,
|
||||||
gss->num_ip6_remote+1);
|
gss->remote.num_ip6+1);
|
||||||
gss->ip6_remote[gss->num_ip6_remote] = *ip6;
|
gss->remote.ip6[gss->remote.num_ip6] = *ip6;
|
||||||
gss->num_ip6_remote += 1;
|
gss->remote.num_ip6 += 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,12 +531,12 @@ static int remove_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_n
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < gss->num_ip6_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip6; i++) {
|
||||||
if (memcmp(&gss->ip6_remote[i], ip6, sizeof(*ip6)))
|
if (memcmp(&gss->remote.ip6[i], ip6, sizeof(*ip6)))
|
||||||
continue;
|
continue;
|
||||||
/* all array elements < i remain as they are; all > i are shifted left by one */
|
/* all array elements < i remain as they are; all > i are shifted left by one */
|
||||||
memmove(&gss->ip6_remote[i], &gss->ip6_remote[i+1], gss->num_ip6_remote-i-1);
|
memmove(&gss->remote.ip6[i], &gss->remote.ip6[i+1], gss->remote.num_ip6-i-1);
|
||||||
gss->num_ip6_remote -= 1;
|
gss->remote.num_ip6 -= 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -550,12 +547,12 @@ static int update_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_n
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < gss->num_ip6_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip6; i++) {
|
||||||
if (memcmp(&gss->ip6_remote[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||
|
if (memcmp(&gss->remote.ip6[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||
|
||||||
gss->ip6_remote[i].udp_port != ip6->udp_port)
|
gss->remote.ip6[i].udp_port != ip6->udp_port)
|
||||||
continue;
|
continue;
|
||||||
gss->ip6_remote[i].sig_weight = ip6->sig_weight;
|
gss->remote.ip6[i].sig_weight = ip6->sig_weight;
|
||||||
gss->ip6_remote[i].data_weight = ip6->data_weight;
|
gss->remote.ip6[i].data_weight = ip6->data_weight;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -811,11 +808,11 @@ static void ns2_sns_compute_local_ep_from_binds(struct osmo_fsm_inst *fi)
|
||||||
|
|
||||||
switch (gss->ip) {
|
switch (gss->ip) {
|
||||||
case IPv4:
|
case IPv4:
|
||||||
ip4_elems = talloc_realloc(fi, gss->ip4_local, struct gprs_ns_ie_ip4_elem, count);
|
ip4_elems = talloc_realloc(fi, gss->local.ip4, struct gprs_ns_ie_ip4_elem, count);
|
||||||
if (!ip4_elems)
|
if (!ip4_elems)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gss->ip4_local = ip4_elems;
|
gss->local.ip4 = ip4_elems;
|
||||||
llist_for_each_entry(sbind, &gss->binds, list) {
|
llist_for_each_entry(sbind, &gss->binds, list) {
|
||||||
bind = sbind->bind;
|
bind = sbind->bind;
|
||||||
sa = gprs_ns2_ip_bind_sockaddr(bind);
|
sa = gprs_ns2_ip_bind_sockaddr(bind);
|
||||||
|
@ -841,16 +838,16 @@ static void ns2_sns_compute_local_ep_from_binds(struct osmo_fsm_inst *fi)
|
||||||
ip4_elems++;
|
ip4_elems++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gss->num_ip4_local = count;
|
gss->local.num_ip4 = count;
|
||||||
gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->num_ip4_local, 8);
|
gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->local.num_ip4, 8);
|
||||||
break;
|
break;
|
||||||
case IPv6:
|
case IPv6:
|
||||||
/* IPv6 */
|
/* IPv6 */
|
||||||
ip6_elems = talloc_realloc(fi, gss->ip6_local, struct gprs_ns_ie_ip6_elem, count);
|
ip6_elems = talloc_realloc(fi, gss->local.ip6, struct gprs_ns_ie_ip6_elem, count);
|
||||||
if (!ip6_elems)
|
if (!ip6_elems)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gss->ip6_local = ip6_elems;
|
gss->local.ip6 = ip6_elems;
|
||||||
|
|
||||||
llist_for_each_entry(sbind, &gss->binds, list) {
|
llist_for_each_entry(sbind, &gss->binds, list) {
|
||||||
bind = sbind->bind;
|
bind = sbind->bind;
|
||||||
|
@ -877,8 +874,8 @@ static void ns2_sns_compute_local_ep_from_binds(struct osmo_fsm_inst *fi)
|
||||||
|
|
||||||
ip6_elems++;
|
ip6_elems++;
|
||||||
}
|
}
|
||||||
gss->num_ip6_local = count;
|
gss->local.num_ip6 = count;
|
||||||
gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->num_ip6_local, 8);
|
gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->local.num_ip6, 8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -924,9 +921,9 @@ static void ns2_sns_st_bss_size_onenter(struct osmo_fsm_inst *fi, uint32_t old_s
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gss->num_max_ip4_remote > 0)
|
if (gss->num_max_ip4_remote > 0)
|
||||||
ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->num_ip4_local, -1);
|
ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->local.num_ip4, -1);
|
||||||
else
|
else
|
||||||
ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->num_ip6_local);
|
ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->local.num_ip6);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ns2_sns_st_bss_config_bss(struct osmo_fsm_inst *fi, uint32_t event, void *data)
|
static void ns2_sns_st_bss_config_bss(struct osmo_fsm_inst *fi, uint32_t event, void *data)
|
||||||
|
@ -966,13 +963,13 @@ static void ns2_sns_st_bss_config_bss_onenter(struct osmo_fsm_inst *fi, uint32_t
|
||||||
switch (gss->ip) {
|
switch (gss->ip) {
|
||||||
case IPv4:
|
case IPv4:
|
||||||
ns2_tx_sns_config(gss->sns_nsvc, true,
|
ns2_tx_sns_config(gss->sns_nsvc, true,
|
||||||
gss->ip4_local, gss->num_ip4_local,
|
gss->local.ip4, gss->local.num_ip4,
|
||||||
NULL, 0);
|
NULL, 0);
|
||||||
break;
|
break;
|
||||||
case IPv6:
|
case IPv6:
|
||||||
ns2_tx_sns_config(gss->sns_nsvc, true,
|
ns2_tx_sns_config(gss->sns_nsvc, true,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
gss->ip6_local, gss->num_ip6_local);
|
gss->local.ip6, gss->local.num_ip6);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1001,19 +998,19 @@ static int ns_sns_append_remote_eps(struct osmo_fsm_inst *fi, const struct tlv_p
|
||||||
v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);
|
v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);
|
||||||
num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);
|
num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);
|
||||||
|
|
||||||
if (num_v4 && gss->ip6_remote)
|
if (num_v4 && gss->remote.ip6)
|
||||||
return -NS_CAUSE_INVAL_NR_IPv4_EP;
|
return -NS_CAUSE_INVAL_NR_IPv4_EP;
|
||||||
|
|
||||||
/* realloc to the new size */
|
/* realloc to the new size */
|
||||||
gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote,
|
gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4,
|
||||||
struct gprs_ns_ie_ip4_elem,
|
struct gprs_ns_ie_ip4_elem,
|
||||||
gss->num_ip4_remote + num_v4);
|
gss->remote.num_ip4 + num_v4);
|
||||||
/* append the new entries to the end of the list */
|
/* append the new entries to the end of the list */
|
||||||
memcpy(&gss->ip4_remote[gss->num_ip4_remote], v4_list, num_v4*sizeof(*v4_list));
|
memcpy(&gss->remote.ip4[gss->remote.num_ip4], v4_list, num_v4*sizeof(*v4_list));
|
||||||
gss->num_ip4_remote += num_v4;
|
gss->remote.num_ip4 += num_v4;
|
||||||
|
|
||||||
LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv4 list now %u entries\n",
|
LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv4 list now %u entries\n",
|
||||||
gss->num_ip4_remote);
|
gss->remote.num_ip4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {
|
if (TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {
|
||||||
|
@ -1022,19 +1019,19 @@ static int ns_sns_append_remote_eps(struct osmo_fsm_inst *fi, const struct tlv_p
|
||||||
v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);
|
v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);
|
||||||
num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);
|
num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);
|
||||||
|
|
||||||
if (num_v6 && gss->ip4_remote)
|
if (num_v6 && gss->remote.ip4)
|
||||||
return -NS_CAUSE_INVAL_NR_IPv6_EP;
|
return -NS_CAUSE_INVAL_NR_IPv6_EP;
|
||||||
|
|
||||||
/* realloc to the new size */
|
/* realloc to the new size */
|
||||||
gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote,
|
gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6,
|
||||||
struct gprs_ns_ie_ip6_elem,
|
struct gprs_ns_ie_ip6_elem,
|
||||||
gss->num_ip6_remote + num_v6);
|
gss->remote.num_ip6 + num_v6);
|
||||||
/* append the new entries to the end of the list */
|
/* append the new entries to the end of the list */
|
||||||
memcpy(&gss->ip6_remote[gss->num_ip6_remote], v6_list, num_v6*sizeof(*v6_list));
|
memcpy(&gss->remote.ip6[gss->remote.num_ip6], v6_list, num_v6*sizeof(*v6_list));
|
||||||
gss->num_ip6_remote += num_v6;
|
gss->remote.num_ip6 += num_v6;
|
||||||
|
|
||||||
LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %u entries\n",
|
LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %d entries\n",
|
||||||
gss->num_ip6_remote);
|
gss->remote.num_ip6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1204,9 +1201,9 @@ static void ns2_sns_st_configured_delete(struct osmo_fsm_inst *fi,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* make a copy as do_sns_delete() will change the array underneath us */
|
/* make a copy as do_sns_delete() will change the array underneath us */
|
||||||
ip4_remote = talloc_memdup(fi, gss->ip4_remote,
|
ip4_remote = talloc_memdup(fi, gss->remote.ip4,
|
||||||
gss->num_ip4_remote * sizeof(*v4_list));
|
gss->remote.num_ip4 * sizeof(*v4_list));
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip4; i++) {
|
||||||
if (ip4_remote[i].ip_addr == ip_addr) {
|
if (ip4_remote[i].ip_addr == ip_addr) {
|
||||||
rc = do_sns_delete(fi, &ip4_remote[i], NULL);
|
rc = do_sns_delete(fi, &ip4_remote[i], NULL);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
@ -1255,9 +1252,9 @@ static void ns2_sns_st_configured_delete(struct osmo_fsm_inst *fi,
|
||||||
}
|
}
|
||||||
memcpy(&ip6_addr, (ie+1), sizeof(struct in6_addr));
|
memcpy(&ip6_addr, (ie+1), sizeof(struct in6_addr));
|
||||||
/* make a copy as do_sns_delete() will change the array underneath us */
|
/* make a copy as do_sns_delete() will change the array underneath us */
|
||||||
ip6_remote = talloc_memdup(fi, gss->ip6_remote,
|
ip6_remote = talloc_memdup(fi, gss->remote.ip6,
|
||||||
gss->num_ip6_remote * sizeof(*v4_list));
|
gss->remote.num_ip6 * sizeof(*v4_list));
|
||||||
for (i = 0; i < gss->num_ip6_remote; i++) {
|
for (i = 0; i < gss->remote.num_ip6; i++) {
|
||||||
if (!memcmp(&ip6_remote[i].ip_addr, &ip6_addr, sizeof(struct in6_addr))) {
|
if (!memcmp(&ip6_remote[i].ip_addr, &ip6_addr, sizeof(struct in6_addr))) {
|
||||||
rc = do_sns_delete(fi, NULL, &ip6_remote[i]);
|
rc = do_sns_delete(fi, NULL, &ip6_remote[i]);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
@ -1774,24 +1771,24 @@ void ns2_sns_dump_vty(struct vty *vty, const char *prefix, const struct gprs_ns2
|
||||||
vty_out(vty, "%sMaximum number of remote NS-VCs: %zu, IPv4 Endpoints: %zu, IPv6 Endpoints: %zu%s",
|
vty_out(vty, "%sMaximum number of remote NS-VCs: %zu, IPv4 Endpoints: %zu, IPv6 Endpoints: %zu%s",
|
||||||
prefix, gss->num_max_nsvcs, gss->num_max_ip4_remote, gss->num_max_ip6_remote, VTY_NEWLINE);
|
prefix, gss->num_max_nsvcs, gss->num_max_ip4_remote, gss->num_max_ip6_remote, VTY_NEWLINE);
|
||||||
|
|
||||||
if (gss->num_ip4_local && gss->num_ip4_remote) {
|
if (gss->local.num_ip4 && gss->remote.num_ip4) {
|
||||||
vty_out(vty, "%sLocal IPv4 Endpoints:%s", prefix, VTY_NEWLINE);
|
vty_out(vty, "%sLocal IPv4 Endpoints:%s", prefix, VTY_NEWLINE);
|
||||||
for (i = 0; i < gss->num_ip4_local; i++)
|
for (i = 0; i < gss->local.num_ip4; i++)
|
||||||
vty_dump_sns_ip4(vty, prefix, &gss->ip4_local[i]);
|
vty_dump_sns_ip4(vty, prefix, &gss->local.ip4[i]);
|
||||||
|
|
||||||
vty_out(vty, "%sRemote IPv4 Endpoints:%s", prefix, VTY_NEWLINE);
|
vty_out(vty, "%sRemote IPv4 Endpoints:%s", prefix, VTY_NEWLINE);
|
||||||
for (i = 0; i < gss->num_ip4_remote; i++)
|
for (i = 0; i < gss->remote.num_ip4; i++)
|
||||||
vty_dump_sns_ip4(vty, prefix, &gss->ip4_remote[i]);
|
vty_dump_sns_ip4(vty, prefix, &gss->remote.ip4[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gss->num_ip6_local && gss->num_ip6_remote) {
|
if (gss->local.num_ip6 && gss->remote.num_ip6) {
|
||||||
vty_out(vty, "%sLocal IPv6 Endpoints:%s", prefix, VTY_NEWLINE);
|
vty_out(vty, "%sLocal IPv6 Endpoints:%s", prefix, VTY_NEWLINE);
|
||||||
for (i = 0; i < gss->num_ip6_local; i++)
|
for (i = 0; i < gss->local.num_ip6; i++)
|
||||||
vty_dump_sns_ip6(vty, prefix, &gss->ip6_local[i]);
|
vty_dump_sns_ip6(vty, prefix, &gss->local.ip6[i]);
|
||||||
|
|
||||||
vty_out(vty, "%sRemote IPv6 Endpoints:%s", prefix, VTY_NEWLINE);
|
vty_out(vty, "%sRemote IPv6 Endpoints:%s", prefix, VTY_NEWLINE);
|
||||||
for (i = 0; i < gss->num_ip6_remote; i++)
|
for (i = 0; i < gss->remote.num_ip6; i++)
|
||||||
vty_dump_sns_ip6(vty, prefix, &gss->ip6_remote[i]);
|
vty_dump_sns_ip6(vty, prefix, &gss->remote.ip6[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2052,8 +2049,8 @@ int gprs_ns2_sns_del_bind(struct gprs_ns2_nse *nse,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update SNS weights
|
/* Update SNS weights for a bind (local endpoint).
|
||||||
* \param[in] nsvc the NSVC which should be updated
|
* \param[in] bind the bind which has been updated
|
||||||
*/
|
*/
|
||||||
void ns2_sns_update_weights(struct gprs_ns2_vc_bind *bind)
|
void ns2_sns_update_weights(struct gprs_ns2_vc_bind *bind)
|
||||||
{
|
{
|
||||||
|
@ -2121,8 +2118,8 @@ static void ns2_sns_st_sgsn_wait_config_ack_onenter(struct osmo_fsm_inst *fi, ui
|
||||||
OSMO_ASSERT(gss->role == GPRS_SNS_ROLE_SGSN);
|
OSMO_ASSERT(gss->role == GPRS_SNS_ROLE_SGSN);
|
||||||
|
|
||||||
/* transmit SGSN-oriented SNS-CONFIG */
|
/* transmit SGSN-oriented SNS-CONFIG */
|
||||||
ns2_tx_sns_config(gss->sns_nsvc, true, gss->ip4_local, gss->num_ip4_local,
|
ns2_tx_sns_config(gss->sns_nsvc, true, gss->local.ip4, gss->local.num_ip4,
|
||||||
gss->ip6_local, gss->num_ip6_local);
|
gss->local.ip6, gss->local.num_ip6);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We're waiting for SNS-CONFIG-ACK from the BSS (in response to our outbound SNS-CONFIG) */
|
/* We're waiting for SNS-CONFIG-ACK from the BSS (in response to our outbound SNS-CONFIG) */
|
||||||
|
@ -2253,15 +2250,15 @@ static void ns2_sns_st_all_action_sgsn(struct osmo_fsm_inst *fi, uint32_t event,
|
||||||
if (gss->num_max_ip6_remote && ns2_sns_count_num_local_ep(fi, IPv6)) {
|
if (gss->num_max_ip6_remote && ns2_sns_count_num_local_ep(fi, IPv6)) {
|
||||||
gss->ip = IPv6;
|
gss->ip = IPv6;
|
||||||
ns2_sns_compute_local_ep_from_binds(fi);
|
ns2_sns_compute_local_ep_from_binds(fi);
|
||||||
num_local_eps = gss->num_ip6_local;
|
num_local_eps = gss->local.num_ip6;
|
||||||
num_remote_eps = gss->num_max_ip6_remote;
|
num_remote_eps = gss->num_max_ip6_remote;
|
||||||
} else if (gss->num_max_ip4_remote && ns2_sns_count_num_local_ep(fi, IPv4)) {
|
} else if (gss->num_max_ip4_remote && ns2_sns_count_num_local_ep(fi, IPv4)) {
|
||||||
gss->ip = IPv4;
|
gss->ip = IPv4;
|
||||||
ns2_sns_compute_local_ep_from_binds(fi);
|
ns2_sns_compute_local_ep_from_binds(fi);
|
||||||
num_local_eps = gss->num_ip4_local;
|
num_local_eps = gss->local.num_ip4;
|
||||||
num_remote_eps = gss->num_max_ip4_remote;
|
num_remote_eps = gss->num_max_ip4_remote;
|
||||||
} else {
|
} else {
|
||||||
if (gss->num_ip4_local && !gss->num_max_ip4_remote)
|
if (gss->local.num_ip4 && !gss->num_max_ip4_remote)
|
||||||
cause = NS_CAUSE_INVAL_NR_IPv4_EP;
|
cause = NS_CAUSE_INVAL_NR_IPv4_EP;
|
||||||
else
|
else
|
||||||
cause = NS_CAUSE_INVAL_NR_IPv6_EP;
|
cause = NS_CAUSE_INVAL_NR_IPv6_EP;
|
||||||
|
|
Loading…
Reference in New Issue