lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
gerrit-log@lists.osmocom.org

June 2023

  • 1 participants
  • 2480 discussions
[L] Change in osmo-hnbgw[master]: cnpool: extract Mobile Identity from RANAP payload
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33133 ) ( 5 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: cnpool: extract Mobile Identity from RANAP payload ...................................................................... cnpool: extract Mobile Identity from RANAP payload For InitialUE messages, decode the RANAP and NAS PDU to obtain the Mobile Identity. Store it in map->l3. A following patch will use this mobile identity to decide on which CN links to pick from the CN pools for this subscriber. Add the new information to LOG_MAP() as ubiquitous logging context. Depends: libosmocore Ic5e0406d9e20b0d4e1372fa30ba11a1e69f5cc94 Related: SYS#6412 Change-Id: I373d665c9684b607207f68094188eab63209db51 --- M include/osmocom/hnbgw/context_map.h M include/osmocom/hnbgw/hnbgw.h M src/osmo-hnbgw/Makefile.am A src/osmo-hnbgw/hnbgw_l3.c M src/osmo-hnbgw/hnbgw_rua.c 5 files changed, 364 insertions(+), 3 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/include/osmocom/hnbgw/context_map.h b/include/osmocom/hnbgw/context_map.h index bcc3238..7017491 100644 --- a/include/osmocom/hnbgw/context_map.h +++ b/include/osmocom/hnbgw/context_map.h @@ -3,12 +3,19 @@ #include <stdint.h> #include <osmocom/core/linuxlist.h> #include <osmocom/hnbgw/hnbgw.h> +#include <osmocom/gsm/gsm48.h> #define LOG_MAP(HNB_CTX_MAP, SUBSYS, LEVEL, FMT, ARGS...) \ LOGHNB((HNB_CTX_MAP) ? (HNB_CTX_MAP)->hnb_ctx : NULL, \ - SUBSYS, LEVEL, "RUA-%u %s: " FMT, \ + SUBSYS, LEVEL, "RUA-%u %s MI=%s%s%s: " FMT, \ (HNB_CTX_MAP) ? (HNB_CTX_MAP)->rua_ctx_id : 0, \ - (HNB_CTX_MAP) ? ((HNB_CTX_MAP)->is_ps ? "PS" : "CS") : "NULL", \ + (HNB_CTX_MAP) ? \ + ((HNB_CTX_MAP)->cnlink ? (HNB_CTX_MAP)->cnlink->name \ + : ((HNB_CTX_MAP)->is_ps ? "PS" : "CS")) \ + : "NULL", \ + (HNB_CTX_MAP) ? osmo_mobile_identity_to_str_c(OTC_SELECT, &(HNB_CTX_MAP)->l3.mi) : "null", \ + (HNB_CTX_MAP) && (HNB_CTX_MAP)->l3.from_other_plmn ? " (from other PLMN)" : "", \ + (HNB_CTX_MAP) && (HNB_CTX_MAP)->l3.is_emerg ? " EMERGENCY" : "", \ ##ARGS) /* All these events' data argument may either be NULL, or point to a RANAP msgb. @@ -75,6 +82,21 @@ struct hnb_context; struct hnbgw_cnlink; +struct hnbgw_l3_peek { + /* L3 message type, like GSM48_PDISC_MM+GSM48_MT_MM_LOC_UPD_REQUEST... / GSM48_PDISC_MM_GPRS+GSM48_MT_GMM_ATTACH_REQ... */ + uint8_t gsm48_pdisc; + uint8_t gsm48_msg_type; + /* The Mobile Identity from MM and GMM messages */ + struct osmo_mobile_identity mi; + /* On PS, the "TMSI Based NRI Container", 10 bit integer, or -1 if not present. + * This is only for PS -- for CS, the NRI is in the TMSI obtained from 'mi' above. */ + int gmm_nri_container; + /* For a CM Service Request for voice call, true if this is for an Emergency Call, false otherwise. */ + bool is_emerg; + /* True if the NAS PDU indicates that the UE was previously attached to a different PLMN than the local PLMN. */ + bool from_other_plmn; +}; + struct hnbgw_context_map { /* entry in the per-CN list of mappings */ struct llist_head hnbgw_cnlink_entry; @@ -103,6 +125,9 @@ /* False for CS, true for PS */ bool is_ps; + /* Information extracted from RUA Connect's RANAP InitialUE message */ + struct hnbgw_l3_peek l3; + /* When an FSM is asked to disconnect but must still wait for a response, it may set this flag, to continue to * disconnect once the response is in. In particular, when SCCP is asked to disconnect after an SCCP Connection * Request was already sent and while waiting for a Connection Confirmed, we should still wait for the SCCP CC diff --git a/include/osmocom/hnbgw/hnbgw.h b/include/osmocom/hnbgw/hnbgw.h index cc32f93..8183cbc 100644 --- a/include/osmocom/hnbgw/hnbgw.h +++ b/include/osmocom/hnbgw/hnbgw.h @@ -312,3 +312,5 @@ } struct msgb *hnbgw_ranap_msg_alloc(const char *name); + +int hnbgw_peek_l3(struct hnbgw_context_map *map, struct msgb *ranap_msg); diff --git a/src/osmo-hnbgw/Makefile.am b/src/osmo-hnbgw/Makefile.am index e8b4966..5fbdf74 100644 --- a/src/osmo-hnbgw/Makefile.am +++ b/src/osmo-hnbgw/Makefile.am @@ -33,6 +33,7 @@ libhnbgw_la_SOURCES = \ hnbgw.c \ hnbgw_hnbap.c \ + hnbgw_l3.c \ hnbgw_rua.c \ hnbgw_ranap.c \ hnbgw_vty.c \ diff --git a/src/osmo-hnbgw/hnbgw_l3.c b/src/osmo-hnbgw/hnbgw_l3.c new file mode 100644 index 0000000..60498ea --- /dev/null +++ b/src/osmo-hnbgw/hnbgw_l3.c @@ -0,0 +1,308 @@ +/* OsmoHNBGW implementation of CS and PS Level3 message decoding (NAS PDU) */ + +/* Copyright 2023 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de> + * All Rights Reserved + * + * Author: Neels Janosch Hofmeyr <nhofmeyr(a)sysmocom.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include "config.h" + +#include "asn1helpers.h" + +#include <osmocom/gsm/gsm48.h> +#include <osmocom/gsm/protocol/gsm_04_08_gprs.h> + +#include <osmocom/hnbgw/hnbgw.h> +#include <osmocom/hnbgw/hnbgw_rua.h> +#include <osmocom/hnbgw/context_map.h> +#include <osmocom/ranap/ranap_ies_defs.h> + +static const struct tlv_definition gsm48_gmm_att_tlvdef = { + .def = { + [GSM48_IE_GMM_CIPH_CKSN] = { TLV_TYPE_FIXED, 1 }, + [GSM48_IE_GMM_TIMER_READY] = { TLV_TYPE_TV, 1 }, + [GSM48_IE_GMM_TMSI_BASED_NRI_C] = { TLV_TYPE_TLV }, + [GSM48_IE_GMM_ALLOC_PTMSI] = { TLV_TYPE_TLV, 0 }, + [GSM48_IE_GMM_PTMSI_SIG] = { TLV_TYPE_FIXED, 3 }, + [GSM48_IE_GMM_AUTH_RAND] = { TLV_TYPE_FIXED, 16 }, + [GSM48_IE_GMM_AUTH_SRES] = { TLV_TYPE_FIXED, 4 }, + [GSM48_IE_GMM_IMEISV] = { TLV_TYPE_TLV, 0 }, + [GSM48_IE_GMM_DRX_PARAM] = { TLV_TYPE_FIXED, 2 }, + [GSM48_IE_GMM_MS_NET_CAPA] = { TLV_TYPE_TLV, 0 }, + [GSM48_IE_GMM_PDP_CTX_STATUS] = { TLV_TYPE_TLV, 0 }, + [GSM48_IE_GMM_PS_LCS_CAPA] = { TLV_TYPE_TLV, 0 }, + [GSM48_IE_GMM_GMM_MBMS_CTX_ST] = { TLV_TYPE_TLV, 0 }, + }, +}; + +static void decode_gmm_tlv(struct osmo_mobile_identity *mi, + struct osmo_routing_area_id *old_ra, + int *nri, + const uint8_t *tlv_data, size_t tlv_len, bool allow_hex) +{ + struct tlv_parsed tp; + struct tlv_p_entry *e; + + tlv_parse(&tp, &gsm48_gmm_att_tlvdef, tlv_data, tlv_len, 0, 0); + + e = TLVP_GET(&tp, GSM48_IE_GMM_TMSI_BASED_NRI_C); + if (e) { + *nri = e->val[0]; + *nri <<= 2; + *nri |= e->val[1] >> 6; + } +} + +static int mobile_identity_decode_from_gmm_att_req(struct osmo_mobile_identity *mi, + struct osmo_routing_area_id *old_ra, + int *nri, + const uint8_t *l3_data, size_t l3_len, bool allow_hex) +{ + const struct gsm48_hdr *gh = (void *)l3_data; + const uint8_t *cur = gh->data; + const uint8_t *end = l3_data + l3_len; + const uint8_t *mi_data; + uint8_t mi_len; + uint8_t msnc_len; + uint8_t ms_ra_acc_cap_len; + int rc; + + /* MS network capability 10.5.5.12 */ + msnc_len = *cur++; + cur += msnc_len; + + /* aTTACH Type 10.5.5.2 */ + cur++; + + /* DRX parameter 10.5.5.6 */ + cur += 2; + + /* Mobile Identity (P-TMSI or IMSI) 10.5.1.4 */ + mi_len = *cur++; + mi_data = cur; + cur += mi_len; + + if (cur >= end) + return -ENOSPC; + + rc = osmo_mobile_identity_decode(mi, mi_data, mi_len, allow_hex); + if (rc) + return rc; + + /* Old routing area identification 10.5.5.15. */ + rc = osmo_routing_area_id_decode(old_ra, cur, end - cur); + if (rc < 0) + return rc; + cur += rc; + + /* MS Radio Access Capability 10.5.5.12a */ + ms_ra_acc_cap_len = *cur++; + cur += ms_ra_acc_cap_len; + + if (cur > end) + return -ENOSPC; + + decode_gmm_tlv(mi, old_ra, nri, cur, end - cur, allow_hex); + return 0; +} + +static int mobile_identity_decode_from_gmm_rau_req(struct osmo_mobile_identity *mi, + struct osmo_routing_area_id *old_ra, + int *nri, + const uint8_t *l3_data, size_t l3_len, bool allow_hex) +{ + const struct gsm48_hdr *gh = (void *)l3_data; + const uint8_t *cur = gh->data; + const uint8_t *end = l3_data + l3_len; + uint8_t ms_ra_acc_cap_len; + int rc; + + /* Update Type 10.5.5.18 */ + cur++; + if (cur >= end) + return -ENOSPC; + + /* Old routing area identification 10.5.5.15 */ + rc = osmo_routing_area_id_decode(old_ra, cur, end - cur); + if (rc < 0) + return rc; + cur += rc; + if (cur >= end) + return -ENOSPC; + + /* MS Radio Access Capability 10.5.5.12a */ + ms_ra_acc_cap_len = *cur++; + cur += ms_ra_acc_cap_len; + + if (cur > end) + return -ENOSPC; + + decode_gmm_tlv(mi, old_ra, nri, cur, end - cur, allow_hex); + return 0; +} + +static int peek_l3_nas(struct hnbgw_context_map *map, const uint8_t *nas_pdu, size_t len, + const struct osmo_plmn_id *local_plmn) +{ + const struct gsm48_hdr *gh; + int8_t pdisc; + uint8_t mtype; + const struct gsm48_loc_upd_req *lu; + struct gsm48_service_request *cm; + struct osmo_location_area_id old_lai; + struct osmo_routing_area_id old_ra = {}; + int nri = -1; + + map->l3 = (struct hnbgw_l3_peek){ + .gmm_nri_container = -1, + }; + + /* Get the mobile identity from CS MM -- the PS GMM happens further down. + * This will return an error for GMM messages, ignore that. */ + if (!map->is_ps) + osmo_mobile_identity_decode_from_l3_buf(&map->l3.mi, nas_pdu, len, false); + + /* Get is_emerg and from_other_plmn */ + if (len < sizeof(*gh)) { + LOGP(DCN, LOGL_ERROR, "Layer 3 message too short for header\n"); + return -EINVAL; + } + + gh = (void *)nas_pdu; + pdisc = gsm48_hdr_pdisc(gh); + mtype = gsm48_hdr_msg_type(gh); + + map->l3.gsm48_pdisc = pdisc; + map->l3.gsm48_msg_type = mtype; + + /* Determine from_other_plmn and is_emerg */ + switch (pdisc) { + case GSM48_PDISC_MM: + + switch (mtype) { + case GSM48_MT_MM_LOC_UPD_REQUEST: + if (len < sizeof(*gh) + sizeof(*lu)) { + LOGP(DCN, LOGL_ERROR, "LU Req message too short\n"); + break; + } + + lu = (struct gsm48_loc_upd_req *)gh->data; + gsm48_decode_lai2(&lu->lai, &old_lai); + + map->l3.from_other_plmn = (osmo_plmn_cmp(&old_lai.plmn, local_plmn) != 0); + LOGP(DCN, LOGL_DEBUG, "LU from_other_plmn=%d\n", map->l3.from_other_plmn); + break; + + case GSM48_MT_MM_CM_SERV_REQ: + if (len < sizeof(*gh) + sizeof(*cm)) { + LOGP(DCN, LOGL_ERROR, "CM Service Req message too short\n"); + break; + } + cm = (struct gsm48_service_request *)&gh->data[0]; + map->l3.is_emerg = (cm->cm_service_type == GSM48_CMSERV_EMERGENCY); + LOGP(DCN, LOGL_DEBUG, "CM Service is_emerg=%d\n", map->l3.is_emerg); + break; + + default: + break; + } + break; + + case GSM48_PDISC_MM_GPRS: + switch (mtype) { + case GSM48_MT_GMM_ATTACH_REQ: + mobile_identity_decode_from_gmm_att_req(&map->l3.mi, &old_ra, &nri, nas_pdu, len, false); + + LOGP(DRUA, LOGL_DEBUG, "GMM Attach Req mi=%s old_ra=%s nri:%d=0x%x\n", + osmo_mobile_identity_to_str_c(OTC_SELECT, &map->l3.mi), + osmo_rai_name2_c(OTC_SELECT, &old_ra), + nri, nri); + + if (old_ra.lac.plmn.mcc && osmo_plmn_cmp(&old_ra.lac.plmn, local_plmn)) { + map->l3.from_other_plmn = true; + LOGP(DRUA, LOGL_INFO, "GMM Attach Req from other PLMN: old RAI=%s my PLMN=%s\n", + osmo_rai_name2_c(OTC_SELECT, &old_ra), + osmo_plmn_name_c(OTC_SELECT, local_plmn)); + } + + if (nri >= 0) + map->l3.gmm_nri_container = nri; + + break; + + case GSM48_MT_GMM_RA_UPD_REQ: + mobile_identity_decode_from_gmm_rau_req(&map->l3.mi, &old_ra, &nri, nas_pdu, len, false); + + LOGP(DRUA, LOGL_DEBUG, "GMM Routing Area Upd Req mi=%s old_ra=%s nri:%d=0x%x\n", + osmo_mobile_identity_to_str_c(OTC_SELECT, &map->l3.mi), + osmo_rai_name2_c(OTC_SELECT, &old_ra), + nri, nri); + + if (old_ra.lac.plmn.mcc && osmo_plmn_cmp(&old_ra.lac.plmn, local_plmn)) { + map->l3.from_other_plmn = true; + LOGP(DRUA, LOGL_INFO, "GMM Routing Area Upd Req from other PLMN: old RAI=%s my PLMN=%s\n", + osmo_rai_name2_c(OTC_SELECT, &old_ra), + osmo_plmn_name_c(OTC_SELECT, local_plmn)); + } + + if (nri >= 0) + map->l3.gmm_nri_container = nri; + + break; + } + break; + + default: + break; + } + + return 0; +} + +static int peek_l3_initial_ue(struct hnbgw_context_map *map, const RANAP_InitialUE_MessageIEs_t *ies) +{ + struct osmo_plmn_id plmn; + + if (ies->lai.pLMNidentity.size < 3) { + LOGP(DCN, LOGL_ERROR, "Missing PLMN in RANAP InitialUE message\n"); + return -EINVAL; + } + osmo_plmn_from_bcd(ies->lai.pLMNidentity.buf, &plmn); + + return peek_l3_nas(map, ies->nas_pdu.buf, ies->nas_pdu.size, &plmn); +} + +/* Extract a Layer 3 message (NAS PDU) from the RANAP message, and put the info obtained in map->l3. This is relevant + * for CN pooling, to decide which CN link to map the RUA context to. */ +int hnbgw_peek_l3(struct hnbgw_context_map *map, struct msgb *ranap_msg) +{ + ranap_message *message = hnbgw_decode_ranap_co(ranap_msg); + if (!message) { + LOGP(DCN, LOGL_ERROR, "Failed to decode RANAP PDU\n"); + return -EINVAL; + } + + switch (message->procedureCode) { + case RANAP_ProcedureCode_id_InitialUE_Message: + return peek_l3_initial_ue(map, &message->msg.initialUE_MessageIEs); + default: + LOGP(DCN, LOGL_ERROR, "unexpected RANAP PDU in RUA Connect message: %s\n", + get_value_string(ranap_procedure_code_vals, message->procedureCode)); + return -ENOTSUP; + } +} diff --git a/src/osmo-hnbgw/hnbgw_rua.c b/src/osmo-hnbgw/hnbgw_rua.c index abda5ea..3dad8a7 100644 --- a/src/osmo-hnbgw/hnbgw_rua.c +++ b/src/osmo-hnbgw/hnbgw_rua.c @@ -38,7 +38,9 @@ #include <osmocom/rua/rua_common.h> #include <osmocom/rua/rua_ies_defs.h> #include <osmocom/hnbgw/context_map.h> +#include <osmocom/hnbgw/hnbgw_rua.h> #include <osmocom/hnbap/HNBAP_CN-DomainIndicator.h> +#include <osmocom/ranap/ranap_ies_defs.h> static const char *cn_domain_indicator_to_str(RUA_CN_DomainIndicator_t cN_DomainIndicator) { @@ -208,7 +210,11 @@ map = context_map_alloc(hnb, rua_ctx_id, is_ps); OSMO_ASSERT(map); - /* FUTURE: extract mobile identity and store in map-> */ + if (hnbgw_peek_l3(map, ranap_msg)) + LOGP(DCN, LOGL_NOTICE, "Failed to extract Mobile Identity from RUA Connect message's RANAP payload\n"); + /* map->l3 now contains all the interesting information from the NAS PDU, if any. + * If no useful information could be decoded, still continue to select a hopefully adequate link by round robin. + */ cnlink = hnbgw_cnlink_select(map); if (!cnlink) { -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33133 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I373d665c9684b607207f68094188eab63209db51 Gerrit-Change-Number: 33133 Gerrit-PatchSet: 6 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[M] Change in osmo-hnbgw[master]: doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33168 ) ( 3 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg ...................................................................... doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg Change-Id: I932eca7489f29eab23d180cd6d1216d26c62dd30 --- M contrib/osmo-hnbgw.spec.in M debian/osmo-hnbgw.install A doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg 3 files changed, 50 insertions(+), 0 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/contrib/osmo-hnbgw.spec.in b/contrib/osmo-hnbgw.spec.in index 8428ce8..65e3d04 100644 --- a/contrib/osmo-hnbgw.spec.in +++ b/contrib/osmo-hnbgw.spec.in @@ -94,6 +94,7 @@ %{_docdir}/%{name}/examples/osmo-hnbgw/osmo-hnbgw.cfg %{_docdir}/%{name}/examples/osmo-hnbgw/osmo-hnbgw-cs7.cfg %{_docdir}/%{name}/examples/osmo-hnbgw/osmo-hnbgw-pfcp.cfg +%{_docdir}/%{name}/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg %dir %{_sysconfdir}/osmocom %config(noreplace) %{_sysconfdir}/osmocom/osmo-hnbgw.cfg %{_unitdir}/%{name}.service diff --git a/debian/osmo-hnbgw.install b/debian/osmo-hnbgw.install index c2449b6..1757667 100644 --- a/debian/osmo-hnbgw.install +++ b/debian/osmo-hnbgw.install @@ -4,3 +4,4 @@ usr/share/doc/osmo-hnbgw/examples/osmo-hnbgw/osmo-hnbgw.cfg usr/share/doc/osmo-hnbgw/examples usr/share/doc/osmo-hnbgw/examples/osmo-hnbgw/osmo-hnbgw-pfcp.cfg usr/share/doc/osmo-hnbgw/examples usr/share/doc/osmo-hnbgw/examples/osmo-hnbgw/osmo-hnbgw-cs7.cfg usr/share/doc/osmo-hnbgw/examples +usr/share/doc/osmo-hnbgw/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg usr/share/doc/osmo-hnbgw/examples diff --git a/doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg b/doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg new file mode 100644 index 0000000..2d0348d --- /dev/null +++ b/doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg @@ -0,0 +1,39 @@ +log stderr + logging filter all 1 + logging color 1 + logging print level 1 + logging print category 1 + logging print category-hex 0 + logging print file basename last + logging print extended-timestamp 1 + logging level set-all notice + +cs7 instance 0 + point-code 0.42.0 + + sccp-address my-msc-0 + point-code 0.1.0 + sccp-address my-msc-1 + point-code 0.1.1 + sccp-address my-sgsn-0 + point-code 0.2.0 + +hnbgw + iucs + nri bitlen 10 + nri null add 0 7 + iups + nri bitlen 8 + nri null add 0 5 + +msc 0 + remote-addr my-msc-0 + nri add 128 255 + +msc 1 + remote-addr my-msc-1 + nri add 256 511 + +sgsn 0 + remote-addr my-sgsn-0 + nri add 128 255 -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33168 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I932eca7489f29eab23d180cd6d1216d26c62dd30 Gerrit-Change-Number: 33168 Gerrit-PatchSet: 5 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-hnbgw[master]: add CTRL transcript tests for cnpool rate ctrs
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33135 ) ( 2 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: add CTRL transcript tests for cnpool rate ctrs ...................................................................... add CTRL transcript tests for cnpool rate ctrs Related: SYS#6412 Change-Id: I5a9a23c10e3ac85dabbb1d367351bb7c5dfe2526 --- M tests/Makefile.am A tests/test_nodes.ctrl 2 files changed, 34 insertions(+), 0 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/tests/Makefile.am b/tests/Makefile.am index f34d9a0..63ce3fe 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -26,6 +26,7 @@ $(TESTSUITE) \ osmo-hnbgw-vty-test.cfg \ $(srcdir)/*.vty \ + $(srcdir)/*.ctrl \ $(srcdir)/config/*.cfg \ $(srcdir)/config/*.vty \ $(srcdir)/config/run_tests.sh \ @@ -68,6 +69,18 @@ config-tests: $(srcdir)/config/run_tests.sh "$(top_builddir)/src/osmo-hnbgw/osmo-hnbgw" "$(srcdir)/config/" $U +# Run a specific test with: 'make ctrl-test CTRL_TEST=osmo-hnbgw.ctrl' +CTRL_TEST ?= *.ctrl + +# To update the CTRL script from current application behavior, +# pass -u to ctrl_script_runner.py by doing: +# make ctrl-test U=-u +ctrl-test: $(top_builddir)/src/osmo-hnbgw/osmo-hnbgw + osmo_verify_transcript_ctrl.py -v \ + -p 4262 \ + -r "$(top_builddir)/src/osmo-hnbgw/osmo-hnbgw -c $(top_srcdir)/doc/examples/osmo-hnbgw/osmo-hnbgw.cfg" \ + $(U) $(srcdir)/$(CTRL_TEST) + check-local: atconfig $(TESTSUITE) $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS) $(MAKE) $(AM_MAKEFLAGS) python-tests diff --git a/tests/test_nodes.ctrl b/tests/test_nodes.ctrl new file mode 100644 index 0000000..2ce5428 --- /dev/null +++ b/tests/test_nodes.ctrl @@ -0,0 +1,11 @@ +GET 1 rate_ctr.abs.iucs.0.cnpool:subscr:no_cnlink +GET_REPLY 1 rate_ctr.abs.iucs.0.cnpool:subscr:no_cnlink 0 + +GET 2 rate_ctr.abs.iups.0.cnpool:emerg:lost +GET_REPLY 2 rate_ctr.abs.iups.0.cnpool:emerg:lost 0 + +GET 3 rate_ctr.abs.msc.0.cnpool:subscr:new +GET_REPLY 3 rate_ctr.abs.msc.0.cnpool:subscr:new 0 + +GET 4 rate_ctr.abs.sgsn.0.cnpool:emerg:forwarded +GET_REPLY 4 rate_ctr.abs.sgsn.0.cnpool:emerg:forwarded 0 -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33135 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I5a9a23c10e3ac85dabbb1d367351bb7c5dfe2526 Gerrit-Change-Number: 33135 Gerrit-PatchSet: 7 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[M] Change in osmo-hnbgw[master]: cnpool: select CN link from pool by NRI or round robin
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33136 ) ( 2 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: cnpool: select CN link from pool by NRI or round robin ...................................................................... cnpool: select CN link from pool by NRI or round robin This is the bulk of the CN pooling logic but is not working properly without these future patches: - detect in/active CN links by RANAP RESET Id3eefdea889a736fd5957b80280fa45b9547b792 - return Paging Resp to the exact CN link that Paged I907dbcaeb442ca5630146f8cad40601c448fc40e Change-Id: I66fba27cfbe6e2b27ee3443718846ecfbbd8a974 --- M src/osmo-hnbgw/hnbgw_cn.c 1 file changed, 162 insertions(+), 10 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/osmo-hnbgw/hnbgw_cn.c b/src/osmo-hnbgw/hnbgw_cn.c index 486d30a..f33023e 100644 --- a/src/osmo-hnbgw/hnbgw_cn.c +++ b/src/osmo-hnbgw/hnbgw_cn.c @@ -702,21 +702,155 @@ return NULL; } +static bool is_cnlink_usable(struct hnbgw_cnlink *cnlink, bool is_emerg) +{ + if (is_emerg && !cnlink->allow_emerg) + return false; + if (!cnlink->hnbgw_sccp_user || !cnlink->hnbgw_sccp_user->sccp_user) + return false; + // TODO indicator whether the CN link is actually active, akin to bssmap_reset_is_conn_ready() + return true; +} + +/* Decide which MSC/SGSN to forward this Complete Layer 3 request to. The current Layer 3 Info is passed in map->l3. + * a) If the subscriber was previously paged from a particular CN link, that CN link shall receive the Paging Response. + * b) If the message contains an NRI indicating a particular CN link that is currently connected, that CN link shall + * handle this conn. + * c) All other cases distribute the messages across connected CN links in a round-robin fashion. + */ struct hnbgw_cnlink *hnbgw_cnlink_select(struct hnbgw_context_map *map) { struct hnbgw_cnpool *cnpool = map->is_ps ? &g_hnbgw->sccp.cnpool_iups : &g_hnbgw->sccp.cnpool_iucs; struct hnbgw_cnlink *cnlink; - /* FUTURE: soon we will pick one of many configurable CN peers from a pool. There will be more input arguments - * (MI, or TMSI, or NRI decoded from RANAP) and this function will do round robin for new subscribers. */ - llist_for_each_entry(cnlink, &cnpool->cnlinks, entry) { - if (!cnlink->hnbgw_sccp_user || !cnlink->hnbgw_sccp_user->sccp_user) - continue; - LOG_MAP(map, DCN, LOGL_INFO, "Selected %s / %s\n", - cnlink->name, - cnlink->hnbgw_sccp_user->name); - return cnlink; + struct hnbgw_cnlink *round_robin_next = NULL; + struct hnbgw_cnlink *round_robin_first = NULL; + unsigned int round_robin_next_nr; + int16_t nri_v = -1; + bool is_null_nri = false; + uint8_t nri_bitlen = cnpool->use.nri_bitlen; + +#define LOG_NRI(LOGLEVEL, FORMAT, ARGS...) \ + LOG_MAP(map, DCN, LOGLEVEL, "%s NRI(%dbit)=0x%x=%d: " FORMAT, osmo_mobile_identity_to_str_c(OTC_SELECT, &map->l3.mi), \ + nri_bitlen, nri_v, nri_v, ##ARGS) + + /* Get the NRI bits either from map->l3.nri, or extract NRI bits from TMSI. + * The NRI possibly indicates which MSC is responsible. */ + if (map->l3.gmm_nri_container >= 0) { + nri_v = map->l3.gmm_nri_container; + /* The 'TMSI based NRI container' is always 10 bits long. If the relevant NRI length is configured to be + * less than that, ignore the lower bits. */ + if (nri_bitlen < 10) + nri_v >>= 10 - nri_bitlen; + } else if (map->l3.mi.type == GSM_MI_TYPE_TMSI) { + if (osmo_tmsi_nri_v_get(&nri_v, map->l3.mi.tmsi, nri_bitlen)) { + LOG_NRI(LOGL_ERROR, "Unable to retrieve NRI from TMSI 0x%x, nri_bitlen == %u\n", map->l3.mi.tmsi, + nri_bitlen); + nri_v = -1; + } } - return NULL; + + if (map->l3.from_other_plmn && nri_v >= 0) { + /* If a subscriber was previously attached to a different PLMN, it might still send the other + * PLMN's TMSI identity in an IMSI Attach. The LU sends a LAI indicating the previous PLMN. If + * it mismatches our PLMN, ignore the NRI. */ + LOG_NRI(LOGL_DEBUG, + "This Complete Layer 3 message indicates a switch from another PLMN. Ignoring the NRI.\n"); + nri_v = -1; + } + + if (nri_v >= 0) + is_null_nri = osmo_nri_v_matches_ranges(nri_v, cnpool->use.null_nri_ranges); + if (is_null_nri) + LOG_NRI(LOGL_DEBUG, "this is a NULL-NRI\n"); + + /* Iterate CN links to find one that matches the extracted NRI, and the next round-robin target for the case no + * NRI match is found. */ + round_robin_next_nr = (map->l3.is_emerg ? cnpool->round_robin_next_emerg_nr : cnpool->round_robin_next_nr); + llist_for_each_entry(cnlink, &cnpool->cnlinks, entry) { + bool nri_matches_cnlink = (nri_v >= 0 && osmo_nri_v_matches_ranges(nri_v, cnlink->use.nri_ranges)); + + if (!is_cnlink_usable(cnlink, map->l3.is_emerg)) { + if (nri_matches_cnlink) { + LOG_NRI(LOGL_DEBUG, "NRI matches %s %d, but this %s is currently not connected\n", + cnpool->peer_name, cnlink->nr, cnpool->peer_name); + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_SUBSCR_ATTACH_LOST)); + } + continue; + } + + /* Return CN link if it matches this NRI, with some debug logging. */ + if (nri_matches_cnlink) { + if (is_null_nri) { + LOG_NRI(LOGL_DEBUG, "NRI matches %s %d, but this NRI is also configured as NULL-NRI\n", + cnpool->peer_name, cnlink->nr); + } else { + LOG_NRI(LOGL_INFO, "NRI match selects %s %d\n", cnpool->peer_name, cnlink->nr); + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_SUBSCR_KNOWN)); + if (map->l3.is_emerg) { + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_EMERG_FORWARDED)); + rate_ctr_inc(rate_ctr_group_get_ctr(cnpool->ctrs, CNPOOL_CTR_EMERG_FORWARDED)); + } + return cnlink; + } + } + + /* Figure out the next round-robin MSC. The MSCs may appear unsorted in net->mscs. Make sure to linearly + * round robin the MSCs by number: pick the lowest msc->nr >= round_robin_next_nr, and also remember the + * lowest available msc->nr to wrap back to that in case no next MSC is left. + * + * MSCs configured with `no allow-attach` do not accept new subscribers and hence must not be picked by + * round-robin. Such an MSC still provides service for already attached subscribers: those that + * successfully performed IMSI-Attach and have a TMSI with an NRI pointing at that MSC. We only avoid + * adding IMSI-Attach of new subscribers. The idea is that the MSC is in a mode of off-loading + * subscribers, and the MSC decides when each subscriber is off-loaded, by assigning the NULL-NRI in a + * new TMSI (at the next periodical LU). So until the MSC decides to offload, an attached subscriber + * remains attached to that MSC and is free to use its services. + */ + if (!cnlink->allow_attach) + continue; + /* Find the allowed cnlink with the lowest nr */ + if (!round_robin_first || cnlink->nr < round_robin_first->nr) + round_robin_first = cnlink; + /* Find the allowed cnlink with the lowest nr >= round_robin_next_nr */ + if (cnlink->nr >= round_robin_next_nr + && (!round_robin_next || cnlink->nr < round_robin_next->nr)) + round_robin_next = cnlink; + } + + if (nri_v >= 0 && !is_null_nri) + LOG_NRI(LOGL_DEBUG, "No %s found for this NRI, doing round-robin\n", cnpool->peer_name); + + /* No dedicated CN link found. Choose by round-robin. + * If round_robin_next is NULL, there are either no more CN links at/after round_robin_next_nr, or none of + * them are usable -- wrap to the start. */ + cnlink = round_robin_next ? : round_robin_first; + if (!cnlink) { + rate_ctr_inc(rate_ctr_group_get_ctr(cnpool->ctrs, CNPOOL_CTR_SUBSCR_NO_CNLINK)); + if (map->l3.is_emerg) + rate_ctr_inc(rate_ctr_group_get_ctr(cnpool->ctrs, CNPOOL_CTR_EMERG_LOST)); + return NULL; + } + + LOGP(DCN, LOGL_DEBUG, "New subscriber MI=%s: CN link round-robin selects %s %d\n", + osmo_mobile_identity_to_str_c(OTC_SELECT, &map->l3.mi), cnpool->peer_name, cnlink->nr); + + if (is_null_nri) + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_SUBSCR_REATTACH)); + else + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_SUBSCR_NEW)); + + if (map->l3.is_emerg) { + rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_EMERG_FORWARDED)); + rate_ctr_inc(rate_ctr_group_get_ctr(cnpool->ctrs, CNPOOL_CTR_EMERG_FORWARDED)); + } + + /* A CN link was picked by round-robin, so update the next round-robin nr to pick */ + if (map->l3.is_emerg) + cnpool->round_robin_next_emerg_nr = cnlink->nr + 1; + else + cnpool->round_robin_next_nr = cnlink->nr + 1; + return cnlink; +#undef LOG_NRI } char *cnlink_sccp_addr_to_str(struct hnbgw_cnlink *cnlink, const struct osmo_sccp_addr *addr) -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33136 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I66fba27cfbe6e2b27ee3443718846ecfbbd8a974 Gerrit-Change-Number: 33136 Gerrit-PatchSet: 7 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[M] Change in osmo-hnbgw[master]: tweak lots of logging
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33171 ) Change subject: tweak lots of logging ...................................................................... tweak lots of logging Make lots of small tweaks in logging around RUA to SCCP context maps, CN link selection and HNBAP: - remove duplicate log context (e.g. LOGHNB() already shows the HNB Id) - bring more sense into logging categories and levels / reduce noise - add and clarify the details being logged at what points in time Related: SYS#6412 Change-Id: I41275d8c3e272177976a9302795884666c35cd06 --- M include/osmocom/hnbgw/context_map.h M src/osmo-hnbgw/context_map.c M src/osmo-hnbgw/context_map_sccp.c M src/osmo-hnbgw/hnbgw.c M src/osmo-hnbgw/hnbgw_cn.c M src/osmo-hnbgw/hnbgw_hnbap.c M src/osmo-hnbgw/hnbgw_l3.c M src/osmo-hnbgw/hnbgw_rua.c 8 files changed, 94 insertions(+), 41 deletions(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve neels: Looks good to me, approved diff --git a/include/osmocom/hnbgw/context_map.h b/include/osmocom/hnbgw/context_map.h index 7017491..f7335a7 100644 --- a/include/osmocom/hnbgw/context_map.h +++ b/include/osmocom/hnbgw/context_map.h @@ -7,8 +7,9 @@ #define LOG_MAP(HNB_CTX_MAP, SUBSYS, LEVEL, FMT, ARGS...) \ LOGHNB((HNB_CTX_MAP) ? (HNB_CTX_MAP)->hnb_ctx : NULL, \ - SUBSYS, LEVEL, "RUA-%u %s MI=%s%s%s: " FMT, \ + SUBSYS, LEVEL, "RUA-%u SCCP-%u %s MI=%s%s%s: " FMT, \ (HNB_CTX_MAP) ? (HNB_CTX_MAP)->rua_ctx_id : 0, \ + (HNB_CTX_MAP) ? (HNB_CTX_MAP)->scu_conn_id : 0, \ (HNB_CTX_MAP) ? \ ((HNB_CTX_MAP)->cnlink ? (HNB_CTX_MAP)->cnlink->name \ : ((HNB_CTX_MAP)->is_ps ? "PS" : "CS")) \ diff --git a/src/osmo-hnbgw/context_map.c b/src/osmo-hnbgw/context_map.c index 4d46b11..d0e0d80 100644 --- a/src/osmo-hnbgw/context_map.c +++ b/src/osmo-hnbgw/context_map.c @@ -26,6 +26,8 @@ #include <osmocom/core/timer.h> +#include <osmocom/netif/stream.h> + #include <osmocom/sigtran/sccp_helpers.h> #include <osmocom/hnbgw/hnbgw_cn.h> @@ -92,7 +94,7 @@ llist_add_tail(&map->hnb_list, &hnb->map_list); - LOG_MAP(map, DRUA, LOGL_INFO, "New RUA CTX\n"); + LOG_MAP(map, DRUA, LOGL_DEBUG, "New RUA CTX\n"); return map; } @@ -123,8 +125,17 @@ hash_add(hsu->hnbgw_context_map_by_conn_id, &map->hnbgw_sccp_user_entry, new_scu_conn_id); - LOG_MAP(map, DMAIN, LOGL_INFO, "Creating new Mapping RUA CTX %u <-> SCU Conn ID %u to %s on %s\n", - map->rua_ctx_id, new_scu_conn_id, cnlink_selected->name, hsu->name); + LOGP(DRUA, LOGL_NOTICE, "New conn: %s '%s' RUA-%u <-> SCCP-%u %s%s%s %s l=%s<->r=%s\n", + osmo_sock_get_name2_c(OTC_SELECT, osmo_stream_srv_get_ofd(map->hnb_ctx->conn)->fd), + hnb_context_name(map->hnb_ctx), map->rua_ctx_id, + new_scu_conn_id, + cnlink_selected->name, + cnlink_selected->use.remote_addr_name ? " " : "", + cnlink_selected->use.remote_addr_name ? : "", + hsu->name, + osmo_ss7_pointcode_print(hsu->ss7, hsu->local_addr.pc), + osmo_ss7_pointcode_print2(hsu->ss7, cnlink_selected->remote_addr.pc) + ); return 0; } diff --git a/src/osmo-hnbgw/context_map_sccp.c b/src/osmo-hnbgw/context_map_sccp.c index 3bdec8c..1f2cd09 100644 --- a/src/osmo-hnbgw/context_map_sccp.c +++ b/src/osmo-hnbgw/context_map_sccp.c @@ -81,7 +81,8 @@ struct osmo_fsm_inst *fi = osmo_fsm_inst_alloc(&map_sccp_fsm, map, map, LOGL_DEBUG, NULL); OSMO_ASSERT(fi); osmo_fsm_inst_update_id_f_sanitize(fi, '-', "%s-%s-SCCP-%u", hnb_context_name(map->hnb_ctx), - map->is_ps ? "PS" : "CS", map->scu_conn_id); + map->cnlink ? map->cnlink->name : (map->is_ps ? "PS" : "CS"), + map->scu_conn_id); OSMO_ASSERT(map->sccp_fi == NULL); map->sccp_fi = fi; diff --git a/src/osmo-hnbgw/hnbgw.c b/src/osmo-hnbgw/hnbgw.c index 571ff16..fc9e698 100644 --- a/src/osmo-hnbgw/hnbgw.c +++ b/src/osmo-hnbgw/hnbgw.c @@ -350,13 +350,29 @@ const char *hnb_context_name(struct hnb_context *ctx) { + char *result; if (!ctx) return "NULL"; + if (ctx->conn) { + char hostbuf_r[INET6_ADDRSTRLEN]; + char portbuf_r[6]; + int fd = osmo_stream_srv_get_ofd(ctx->conn)->fd; + + /* get remote addr */ + if (osmo_sock_get_ip_and_port(fd, hostbuf_r, sizeof(hostbuf_r), portbuf_r, sizeof(portbuf_r), false) == 0) + result = talloc_asprintf(OTC_SELECT, "%s:%s", hostbuf_r, portbuf_r); + else + result = "?"; + } else { + result = "disconnected"; + } + if (g_hnbgw->config.log_prefix_hnb_id) - return ctx->identity_info; + result = talloc_asprintf(OTC_SELECT, "%s %s", result, ctx->identity_info); else - return umts_cell_id_name(&ctx->id); + result = talloc_asprintf(OTC_SELECT, "%s %s", result, umts_cell_id_name(&ctx->id)); + return result; } void hnb_context_release_ue_state(struct hnb_context *ctx) diff --git a/src/osmo-hnbgw/hnbgw_cn.c b/src/osmo-hnbgw/hnbgw_cn.c index f33023e..537544f 100644 --- a/src/osmo-hnbgw/hnbgw_cn.c +++ b/src/osmo-hnbgw/hnbgw_cn.c @@ -298,7 +298,7 @@ return -ENOENT; if (param->called_addr.ssn != OSMO_SCCP_SSN_RANAP) { - LOGP(DMAIN, LOGL_NOTICE, "N-UNITDATA.ind for unknown SSN %u\n", + LOGP(DCN, LOGL_NOTICE, "N-UNITDATA.ind for unknown SSN %u\n", param->called_addr.ssn); return -1; } @@ -316,7 +316,7 @@ if (!map || !map->cnlink) return -ENOENT; - LOGP(DMAIN, LOGL_DEBUG, "handle_cn_conn_conf() conn_id=%d, addrs: called=%s calling=%s responding=%s\n", + LOGP(DCN, LOGL_DEBUG, "handle_cn_conn_conf() conn_id=%d, addrs: called=%s calling=%s responding=%s\n", param->conn_id, cnlink_sccp_addr_to_str(map->cnlink, &param->called_addr), cnlink_sccp_addr_to_str(map->cnlink, &param->calling_addr), @@ -349,7 +349,7 @@ if (!map || !map->cnlink) return -ENOENT; - LOGP(DMAIN, LOGL_DEBUG, "handle_cn_disc_ind() conn_id=%u responding_addr=%s\n", + LOGP(DCN, LOGL_DEBUG, "handle_cn_disc_ind() conn_id=%u responding_addr=%s\n", param->conn_id, cnlink_sccp_addr_to_str(map->cnlink, &param->responding_addr)); @@ -364,10 +364,10 @@ struct osmo_scu_prim *prim = (struct osmo_scu_prim *) oph; int rc = 0; - LOGP(DMAIN, LOGL_DEBUG, "sccp_sap_up(%s)\n", osmo_scu_prim_name(oph)); + LOGP(DCN, LOGL_DEBUG, "sccp_sap_up(%s)\n", osmo_scu_prim_name(oph)); if (!scu) { - LOGP(DMAIN, LOGL_ERROR, + LOGP(DCN, LOGL_ERROR, "sccp_sap_up(): NULL osmo_sccp_user, cannot send prim (sap %u prim %u op %d)\n", oph->sap, oph->primitive, oph->operation); return -1; @@ -375,7 +375,7 @@ hsu = osmo_sccp_user_get_priv(scu); if (!hsu) { - LOGP(DMAIN, LOGL_ERROR, + LOGP(DCN, LOGL_ERROR, "sccp_sap_up(): NULL hnbgw_sccp_user, cannot send prim (sap %u prim %u op %d)\n", oph->sap, oph->primitive, oph->operation); return -1; @@ -397,11 +397,11 @@ rc = handle_cn_disc_ind(hsu, &prim->u.disconnect, oph); break; case OSMO_PRIM(OSMO_SCU_PRIM_N_PCSTATE, PRIM_OP_INDICATION): - LOGP(DMAIN, LOGL_DEBUG, "Ignoring prim %s from SCCP USER SAP\n", + LOGP(DCN, LOGL_DEBUG, "Ignoring prim %s from SCCP USER SAP\n", osmo_scu_prim_hdr_name_c(OTC_SELECT, oph)); break; default: - LOGP(DMAIN, LOGL_ERROR, + LOGP(DCN, LOGL_ERROR, "Received unknown prim %u from SCCP USER SAP\n", OSMO_PRIM_HDR(oph)); break; @@ -426,7 +426,7 @@ if (!addr_name) { osmo_sccp_make_addr_pc_ssn(dest, default_pc, OSMO_SCCP_SSN_RANAP); if (label) - LOGP(DMAIN, LOGL_INFO, "%s remote addr not configured, using default: %s\n", label, + LOGP(DCN, LOGL_INFO, "%s remote addr not configured, using default: %s\n", label, osmo_sccp_addr_name(*ss7, dest)); return 0; } @@ -434,7 +434,7 @@ *ss7 = osmo_sccp_addr_by_name(dest, addr_name); if (!*ss7) { if (label) - LOGP(DMAIN, LOGL_ERROR, "%s remote addr: no such SCCP address book entry: '%s'\n", + LOGP(DCN, LOGL_ERROR, "%s remote addr: no such SCCP address book entry: '%s'\n", label, addr_name); return -1; } @@ -443,14 +443,11 @@ if (!addr_has_pc_and_ssn(dest)) { if (label) - LOGP(DMAIN, LOGL_ERROR, "Invalid/incomplete %s remote-addr: %s\n", + LOGP(DCN, LOGL_ERROR, "Invalid/incomplete %s remote-addr: %s\n", label, osmo_sccp_addr_name(*ss7, dest)); return -1; } - if (label) - LOGP(DRANAP, LOGL_NOTICE, "Remote %s SCCP addr: %s\n", - label, osmo_sccp_addr_name(*ss7, dest)); return 0; } @@ -512,6 +509,17 @@ cnlink->hnbgw_sccp_user = NULL; } +static void hnbgw_cnlink_log_self(struct hnbgw_cnlink *cnlink) +{ + struct osmo_ss7_instance *ss7 = cnlink->hnbgw_sccp_user->ss7; + LOG_CNLINK(cnlink, DCN, LOGL_NOTICE, "using: cs7-%u %s <-> %s %s %s\n", + ss7->cfg.id, + /* printing the entire SCCP address is quite long, rather just print the point-code */ + osmo_ss7_pointcode_print(ss7, cnlink->hnbgw_sccp_user->local_addr.pc), + osmo_ss7_pointcode_print2(ss7, cnlink->remote_addr.pc), + cnlink->name, cnlink->use.remote_addr_name ? : "(default remote point-code)"); +} + /* If not present yet, set up all of osmo_ss7_instance, osmo_sccp_instance and hnbgw_sccp_user for the given cnlink. * The cs7 instance nr to use is determined by cnlink->remote_addr_name, or cs7 instance 0 if that is not present. * Set cnlink->hnbgw_sccp_user to the new SCCP instance. Return 0 on success, negative on error. */ @@ -570,8 +578,9 @@ if (hsu->ss7 != ss7) continue; cnlink->hnbgw_sccp_user = hsu; - LOG_CNLINK(cnlink, DCN, LOGL_NOTICE, "using existing SCCP instance %s on cs7 instance %u\n", + LOG_CNLINK(cnlink, DCN, LOGL_DEBUG, "using existing SCCP instance %s on cs7 instance %u\n", hsu->name, ss7->cfg.id); + hnbgw_cnlink_log_self(cnlink); return 0; } /* else cnlink->hnbgw_sccp_user stays NULL and is set up below. */ @@ -605,7 +614,7 @@ sccp_user = osmo_sccp_user_bind_pc(sccp, "OsmoHNBGW", sccp_sap_up, OSMO_SCCP_SSN_RANAP, local_pc); if (!sccp_user) { - LOGP(DMAIN, LOGL_ERROR, "Failed to init SCCP User\n"); + LOGP(DCN, LOGL_ERROR, "Failed to init SCCP User\n"); return -1; } @@ -622,6 +631,8 @@ llist_add_tail(&hsu->entry, &g_hnbgw->sccp.users); cnlink->hnbgw_sccp_user = hsu; + + hnbgw_cnlink_log_self(cnlink); return 0; } @@ -661,6 +672,7 @@ INIT_LLIST_HEAD(&cnlink->map_list); llist_add_tail(&cnlink->entry, &cnpool->cnlinks); + LOG_CNLINK(cnlink, DCN, LOGL_DEBUG, "allocated\n"); return cnlink; } @@ -831,8 +843,7 @@ return NULL; } - LOGP(DCN, LOGL_DEBUG, "New subscriber MI=%s: CN link round-robin selects %s %d\n", - osmo_mobile_identity_to_str_c(OTC_SELECT, &map->l3.mi), cnpool->peer_name, cnlink->nr); + LOG_MAP(map, DCN, LOGL_INFO, "CN link round-robin selects %s %d\n", cnpool->peer_name, cnlink->nr); if (is_null_nri) rate_ctr_inc(rate_ctr_group_get_ctr(cnlink->ctrs, CNLINK_CTR_CNPOOL_SUBSCR_REATTACH)); diff --git a/src/osmo-hnbgw/hnbgw_hnbap.c b/src/osmo-hnbgw/hnbgw_hnbap.c index 85adccd..06d1a9d 100644 --- a/src/osmo-hnbgw/hnbgw_hnbap.c +++ b/src/osmo-hnbgw/hnbgw_hnbap.c @@ -119,7 +119,7 @@ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_HNBAP_HNBRegisterAccept, &accept_out); - LOGHNB(ctx, DHNBAP, LOGL_NOTICE, "Accepting HNB-REGISTER-REQ from %s\n", ctx->identity_info); + LOGHNB(ctx, DHNBAP, LOGL_NOTICE, "Accepting HNB-REGISTER-REQ\n"); return hnbgw_hnbap_tx(ctx, msg); } @@ -409,14 +409,10 @@ int rc; struct osmo_plmn_id plmn; struct osmo_fd *ofd = osmo_stream_srv_get_ofd(ctx->conn); - char name[OSMO_SOCK_NAME_MAXLEN]; - - osmo_sock_get_name_buf(name, sizeof(name), ofd->fd); rc = hnbap_decode_hnbregisterrequesties(&ies, in); if (rc < 0) { - LOGHNB(ctx, DHNBAP, LOGL_ERROR, "Failure to decode HNB-REGISTER-REQ %s from %s: rc=%d\n", - ctx->identity_info, name, rc); + LOGHNB(ctx, DHNBAP, LOGL_ERROR, "Failure to decode HNB-REGISTER-REQ: rc=%d\n", rc); return rc; } @@ -460,17 +456,15 @@ /* If new conn registering same HNB is from anoter remote addr+port, let's reject it to avoid * misconfigurations or someone trying to impersonate an already working HNB: */ - LOGHNB(ctx, DHNBAP, LOGL_ERROR, "rejecting HNB-REGISTER-REQ with duplicate cell identity " - "MCC=%u,MNC=%u,LAC=%u,RAC=%u,SAC=%u,CID=%u from %s\n", - ctx->id.mcc, ctx->id.mnc, ctx->id.lac, ctx->id.rac, ctx->id.sac, ctx->id.cid, name); + LOGHNB(ctx, DHNBAP, LOGL_ERROR, "rejecting HNB-REGISTER-REQ with duplicate cell identity %s\n", + umts_cell_id_name(&ctx->id)); hnbap_free_hnbregisterrequesties(&ies); return hnbgw_tx_hnb_register_rej(ctx); } } - LOGHNB(ctx, DHNBAP, LOGL_DEBUG, "HNB-REGISTER-REQ %s MCC=%u,MNC=%u,LAC=%u,RAC=%u,SAC=%u,CID=%u from %s%s\n", - ctx->identity_info, ctx->id.mcc, ctx->id.mnc, ctx->id.lac, ctx->id.rac, ctx->id.sac, ctx->id.cid, - name, ctx->hnb_registered ? " (re-connecting)" : ""); + LOGHNB(ctx, DHNBAP, LOGL_DEBUG, "HNB-REGISTER-REQ %s %s%s\n", + ctx->identity_info, umts_cell_id_name(&ctx->id), ctx->hnb_registered ? " (re-connecting)" : ""); /* The HNB is already registered, and we are seeing a new HNB Register Request. The HNB has restarted * without us noticing. Clearly, the HNB does not expect any UE state to be active here, so discard any diff --git a/src/osmo-hnbgw/hnbgw_l3.c b/src/osmo-hnbgw/hnbgw_l3.c index 60498ea..6a9c62f 100644 --- a/src/osmo-hnbgw/hnbgw_l3.c +++ b/src/osmo-hnbgw/hnbgw_l3.c @@ -205,17 +205,20 @@ gsm48_decode_lai2(&lu->lai, &old_lai); map->l3.from_other_plmn = (osmo_plmn_cmp(&old_lai.plmn, local_plmn) != 0); - LOGP(DCN, LOGL_DEBUG, "LU from_other_plmn=%d\n", map->l3.from_other_plmn); + if (map->l3.from_other_plmn) + LOGP(DRUA, LOGL_INFO, "LU from other PLMN: old LAI=%s my PLMN=%s\n", + osmo_plmn_name_c(OTC_SELECT, &old_lai.plmn), + osmo_plmn_name_c(OTC_SELECT, local_plmn)); break; case GSM48_MT_MM_CM_SERV_REQ: if (len < sizeof(*gh) + sizeof(*cm)) { - LOGP(DCN, LOGL_ERROR, "CM Service Req message too short\n"); + LOGP(DRUA, LOGL_ERROR, "CM Service Req message too short\n"); break; } cm = (struct gsm48_service_request *)&gh->data[0]; map->l3.is_emerg = (cm->cm_service_type == GSM48_CMSERV_EMERGENCY); - LOGP(DCN, LOGL_DEBUG, "CM Service is_emerg=%d\n", map->l3.is_emerg); + LOGP(DRUA, LOGL_DEBUG, "CM Service is_emerg=%d\n", map->l3.is_emerg); break; default: diff --git a/src/osmo-hnbgw/hnbgw_rua.c b/src/osmo-hnbgw/hnbgw_rua.c index 3dad8a7..a354e4d 100644 --- a/src/osmo-hnbgw/hnbgw_rua.c +++ b/src/osmo-hnbgw/hnbgw_rua.c @@ -229,7 +229,6 @@ return NULL; } - LOG_MAP(map, DCN, LOGL_INFO, "establishing SCCP link: selected %s\n", cnlink->name); return map; } -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33171 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I41275d8c3e272177976a9302795884666c35cd06 Gerrit-Change-Number: 33171 Gerrit-PatchSet: 7 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-hnbgw[master]: fix umts_cell_id_name(): show CID
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33169 ) ( 4 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: fix umts_cell_id_name(): show CID ...................................................................... fix umts_cell_id_name(): show CID The Cell ID is an important part to distinguish HNB in logging, add it to the output string. Use OTC_SELECT buffer instead of static buffer. Related: SYS#6412 Change-Id: Id903b8579ded8b908e644808e440d373bcca8da4 --- M src/osmo-hnbgw/hnbgw.c 1 file changed, 17 insertions(+), 4 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve neels: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/osmo-hnbgw/hnbgw.c b/src/osmo-hnbgw/hnbgw.c index 4166ab3..5fae3b4 100644 --- a/src/osmo-hnbgw/hnbgw.c +++ b/src/osmo-hnbgw/hnbgw.c @@ -344,10 +344,8 @@ static const char *umts_cell_id_name(const struct umts_cell_id *ucid) { - static __thread char buf[40]; - - snprintf(buf, sizeof(buf), "%u-%u-L%u-R%u-S%u", ucid->mcc, ucid->mnc, ucid->lac, ucid->rac, ucid->sac); - return buf; + return talloc_asprintf(OTC_SELECT, "%u-%u-L%u-R%u-S%u-C%u", ucid->mcc, ucid->mnc, ucid->lac, ucid->rac, + ucid->sac, ucid->cid); } const char *hnb_context_name(struct hnb_context *ctx) -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33169 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: Id903b8579ded8b908e644808e440d373bcca8da4 Gerrit-Change-Number: 33169 Gerrit-PatchSet: 5 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-hnbgw[master]: make public: umts_cell_id_name()
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33170 ) ( 3 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: make public: umts_cell_id_name() ...................................................................... make public: umts_cell_id_name() Upcoming logging tweaks will call this from hnbgw_hnbap.c as well. See I41275d8c3e272177976a9302795884666c35cd06 Related: SYS#6412 Change-Id: I499d18876685062d066a9a66d2def827efb77640 --- M include/osmocom/hnbgw/hnbgw.h M src/osmo-hnbgw/hnbgw.c 2 files changed, 15 insertions(+), 1 deletion(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/include/osmocom/hnbgw/hnbgw.h b/include/osmocom/hnbgw/hnbgw.h index 62e5392..90aee5b 100644 --- a/include/osmocom/hnbgw/hnbgw.h +++ b/include/osmocom/hnbgw/hnbgw.h @@ -71,6 +71,7 @@ uint16_t sac; /*!< Service Area Code */ uint32_t cid; /*!< Cell ID */ }; +const char *umts_cell_id_name(const struct umts_cell_id *ucid); struct hnbgw_context_map; diff --git a/src/osmo-hnbgw/hnbgw.c b/src/osmo-hnbgw/hnbgw.c index 5fae3b4..571ff16 100644 --- a/src/osmo-hnbgw/hnbgw.c +++ b/src/osmo-hnbgw/hnbgw.c @@ -342,7 +342,7 @@ return ctx; } -static const char *umts_cell_id_name(const struct umts_cell_id *ucid) +const char *umts_cell_id_name(const struct umts_cell_id *ucid) { return talloc_asprintf(OTC_SELECT, "%u-%u-L%u-R%u-S%u-C%u", ucid->mcc, ucid->mnc, ucid->lac, ucid->rac, ucid->sac, ucid->cid); -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33170 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I499d18876685062d066a9a66d2def827efb77640 Gerrit-Change-Number: 33170 Gerrit-PatchSet: 5 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-hnbgw[master]: ctrl test: also test msc 1
by neels 22 Jun '23

22 Jun '23
neels has submitted this change. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/33172 ) ( 4 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: ctrl test: also test msc 1 ...................................................................... ctrl test: also test msc 1 Change-Id: I957dca863b6cdc8b077f2ec2b2894cebe7613736 --- M tests/Makefile.am M tests/test_nodes.ctrl 2 files changed, 13 insertions(+), 1 deletion(-) Approvals: pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/tests/Makefile.am b/tests/Makefile.am index 63ce3fe..d499c33 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -78,7 +78,7 @@ ctrl-test: $(top_builddir)/src/osmo-hnbgw/osmo-hnbgw osmo_verify_transcript_ctrl.py -v \ -p 4262 \ - -r "$(top_builddir)/src/osmo-hnbgw/osmo-hnbgw -c $(top_srcdir)/doc/examples/osmo-hnbgw/osmo-hnbgw.cfg" \ + -r "$(top_builddir)/src/osmo-hnbgw/osmo-hnbgw -c $(top_srcdir)/doc/examples/osmo-hnbgw/osmo-hnbgw-cnpool.cfg" \ $(U) $(srcdir)/$(CTRL_TEST) check-local: atconfig $(TESTSUITE) diff --git a/tests/test_nodes.ctrl b/tests/test_nodes.ctrl index 2ce5428..4223187 100644 --- a/tests/test_nodes.ctrl +++ b/tests/test_nodes.ctrl @@ -9,3 +9,6 @@ GET 4 rate_ctr.abs.sgsn.0.cnpool:emerg:forwarded GET_REPLY 4 rate_ctr.abs.sgsn.0.cnpool:emerg:forwarded 0 + +GET 5 rate_ctr.abs.msc.1.cnpool:subscr:new +GET_REPLY 5 rate_ctr.abs.msc.1.cnpool:subscr:new 0 -- To view, visit https://gerrit.osmocom.org/c/osmo-hnbgw/+/33172 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-hnbgw Gerrit-Branch: master Gerrit-Change-Id: I957dca863b6cdc8b077f2ec2b2894cebe7613736 Gerrit-Change-Number: 33172 Gerrit-PatchSet: 7 Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-msc[master]: msc_ho_send_handover_request: fix check_after_deref
by pespin 22 Jun '23

22 Jun '23
Attention is currently required from: osmith. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-msc/+/33398 ) Change subject: msc_ho_send_handover_request: fix check_after_deref ...................................................................... Patch Set 2: Code-Review+1 -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/33398 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: I9389cc9c4af987c11652c6fe9a0ff4289a7781c9 Gerrit-Change-Number: 33398 Gerrit-PatchSet: 2 Gerrit-Owner: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Comment-Date: Thu, 22 Jun 2023 13:32:16 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-msc[master]: msc_ho_send_handover_request: fix check_after_deref
by osmith 22 Jun '23

22 Jun '23
Attention is currently required from: pespin. osmith has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-msc/+/33398 ) Change subject: msc_ho_send_handover_request: fix check_after_deref ...................................................................... Patch Set 1: (1 comment) File src/libmsc/msc_ho.c: https://gerrit.osmocom.org/c/osmo-msc/+/33398/comment/caa823f9_450504fe PS1, Line 424: ran_enc_msg.handover_request.geran.channel_type = &channel_type; > imho you should move setting those 2 fields to here (or in line 418). Done -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/33398 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: I9389cc9c4af987c11652c6fe9a0ff4289a7781c9 Gerrit-Change-Number: 33398 Gerrit-PatchSet: 1 Gerrit-Owner: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Thu, 22 Jun 2023 12:53:46 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: comment
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • ...
  • 248
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.