This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
lynxis lazus gerrit-no-reply at lists.osmocom.orglynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/23130 ) Change subject: one step ...................................................................... one step Change-Id: I1e264633105c71ad8202c38bb05c6afd4f70e202 --- M src/gb/gprs_ns2_sns.c 1 file changed, 123 insertions(+), 3 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/30/23130/1 diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c index a82da95..5852e4e 100644 --- a/src/gb/gprs_ns2_sns.c +++ b/src/gb/gprs_ns2_sns.c @@ -102,6 +102,12 @@ { 0, NULL } }; +enum sns_procedure { + SNS_ADD, + SNS_DEL, + SNS_UPDATE_WEIGHT, +}; + struct sns_endpoint { struct llist_head list; struct osmo_sockaddr saddr; @@ -112,6 +118,12 @@ struct gprs_ns2_vc_bind *bind; }; +struct ns2_sns_procedure { + struct llist_head list; + struct gprs_ns2_vc_bind *bind; + enum sns_procedure procedure; +}; + struct ns2_sns_state { struct gprs_ns2_nse *nse; @@ -133,6 +145,12 @@ struct sns_endpoint *initial; /* all SNS PDU will be sent over this nsvc */ struct gprs_ns2_vc *sns_nsvc; + + /* all pending local procedures*/ + struct llist_head *procedures; + /* all current procedure */ + struct ns2_sns_procedure *current; + /* timer N */ int N; /* true if at least one nsvc is alive */ @@ -167,6 +185,34 @@ return gss->nse; } +static struct gprs_ns_ie_ip4_elem *ip4_elem_by_saddr(struct gprs_ns_ie_ip4_elem *ip4, size_t num, const struct osmo_sockaddr *saddr) +{ + if (saddr->u.sa.sa_family != AF_INET) + return NULL; + + for (size_t i = 0; i < num; i++) { + if (ip4[i].ip_addr == saddr->u.sin.sin_addr.s_addr && + ip4->udp_port == saddr->u.sin.sin_port) + return &ip4[i]; + } + + return NULL; +} + +static struct gprs_ns_ie_ip6_elem *ip6_elem_by_saddr(struct gprs_ns_ie_ip6_elem *ip6, size_t num, const struct osmo_sockaddr *saddr) +{ + if (saddr->u.sa.sa_family != AF_INET6) + return NULL; + + for (size_t i = 0; i < num; i++) { + if (memcmp(&ip6[i].ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr)) == 0 && + ip6->udp_port == saddr->u.sin6.sin6_port) + return &ip6[i]; + } + + return NULL; +} + /* helper function to compute the sum of all (data or signaling) weights */ static int ip4_weight_sum(const struct gprs_ns_ie_ip4_elem *ip4, unsigned int num, bool data_weight) @@ -1927,12 +1973,86 @@ return 0; } -/* Update SNS weights - * \param[in] nsvc the NSVC which should be updated +/* Update SNS weights for a bind (local endpoint). */ +static void _ns2_sns_update_weights(struct ns2_sns_state *gss, struct ns2_sns_bind *sns_bind) { + // find the ip_local entry by using the initial connection for 0.0.0.0 + struct osmo_sockaddr *local, *remote; + const struct osmo_sockaddr *sa; + struct gprs_ns_ie_ip4_elem *ip4; + struct gprs_ns_ie_ip6_elem *ip6; + + sa = gprs_ns2_ip_bind_sockaddr(sns_bind->bind); + if (!sa) + return; + + switch (sa->u.sa.sa_family) { + case AF_INET: + if (sa->u.sin.sin_addr.s_addr == 0) { + if (osmo_sockaddr_local_ip(local, &gss->initial->saddr)) + return; + ip4 = ip4_elem_by_saddr(gss->ip4_local, gss->num_ip4_local, local); + } else { + ip4 = ip4_elem_by_saddr(gss->ip4_local, gss->num_ip4_local, sa); + } + + /* TODO: check if this bind is about to be added */ + if (!ip4) + return; + + /* did something change? */ + if (ip4->sig_weight == sns_bind->bind->sns_sig_weight && + ip4->data_weight == sns_bind->bind->sns_data_weight) + return; + + // TODO: create procedure + break; + case AF_INET6: + // in6addr_any + if (memcmp(&sa->u.sin6.sin6_addr, &in6addr_any, sizeof(struct in6_addr))) { + if (osmo_sockaddr_local_ip(local, remote)) + return; + ip6 = ip6_elem_by_saddr(gss->ip6_local, gss->num_ip6_local, local); + } else { + ip6 = ip6_elem_by_saddr(gss->ip6_local, gss->num_ip6_local, sa); + } + + /* TODO: check if this bind is about to be added */ + if (!ip6) + return; + + /* did something change? */ + if (ip6->sig_weight == sns_bind->bind->sns_sig_weight && + ip6->data_weight == sns_bind->bind->sns_data_weight) + return; + + // TODO: create procedure + break; + default: + OSMO_ASSERT(false); + break; + } +} + +/* Update SNS weights for a bind (local endpoint). + * \param[in] bind the bind which has been updated */ void ns2_sns_update_weights(struct gprs_ns2_vc_bind *bind) { - /* TODO: implement weights after binds per sns implemented */ + struct ns2_sns_bind *sns_bind; + struct gprs_ns2_nse *nse; + struct ns2_sns_state *gss; + llist_for_each_entry(nse, &bind->nsi->nse, list) { + if (!nse->bss_sns_fi) + continue; + + gss = nse->bss_sns_fi->priv; + llist_for_each_entry(sns_bind, &gss->binds, list) { + if (sns_bind->bind == bind) { + _ns2_sns_update_weights(gss, sns_bind); + break; + } + } + } } /* initialize osmo_ctx on main tread */ -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/23130 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I1e264633105c71ad8202c38bb05c6afd4f70e202 Gerrit-Change-Number: 23130 Gerrit-PatchSet: 1 Gerrit-Owner: lynxis lazus <lynxis at fe80.eu> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210226/75e070b7/attachment.htm>