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 -----
  • 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

July 2025

  • 1 participants
  • 1492 discussions
[XS] Change in osmo-sgsn[master]: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS
by lynxis lazus 14 Jul '25

14 Jul '25
Attention is currently required from: fixeria. lynxis lazus has posted comments on this change by lynxis lazus. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email ) Change subject: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS ...................................................................... Patch Set 1: (2 comments) File src/sgsn/gprs_gmm.c: https://gerrit.osmocom.org/c/osmo-sgsn/+/40653/comment/083edfc6_8024d6a7?us… : PS1, Line 1978: Create tlvp_val16be > `tlvp_val16be` is already there, did you mean `tlvp_val16le`? Done https://gerrit.osmocom.org/c/osmo-sgsn/+/40653/comment/735879ca_90660d5f?us… : PS1, Line 1979: osmo_swab16(tlvp_val16be(&tp, GSM48_IE_GMM_PDP_CTX_STATUS)); > I would avoid calling `tlvp_val16be()` and then swapping bytes. […] Done -- To view, visit https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: Ib9bee2f8d0b1f89986d15cf3ce6404ad76378c8c Gerrit-Change-Number: 40653 Gerrit-PatchSet: 1 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 14 Jul 2025 15:40:28 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[XS] Change in osmo-sgsn[master]: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS
by lynxis lazus 14 Jul '25

14 Jul '25
Attention is currently required from: lynxis lazus. Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email to look at the new patch set (#3). Change subject: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS ...................................................................... gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS The pdp_status is actually encoded as little endian, but there is no tlvp_val16le yet. Change-Id: Ib9bee2f8d0b1f89986d15cf3ce6404ad76378c8c --- M src/sgsn/gprs_gmm.c 1 file changed, 2 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/53/40653/3 -- To view, visit https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: Ib9bee2f8d0b1f89986d15cf3ce6404ad76378c8c Gerrit-Change-Number: 40653 Gerrit-PatchSet: 3 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu>
1 0
0 0
[XS] Change in osmo-sgsn[master]: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS
by lynxis lazus 14 Jul '25

14 Jul '25
Attention is currently required from: lynxis lazus. Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email to look at the new patch set (#2). The following approvals got outdated and were removed: Verified-1 by Jenkins Builder Change subject: gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS ...................................................................... gprs_gmm: fix endianess of GSM48_IE_GMM_PDP_CTX_STATUS The pdp_status is actually encoded as little endian, but there is no tlvp_val16le. Use osmo_swab16() instead. Change-Id: Ib9bee2f8d0b1f89986d15cf3ce6404ad76378c8c --- M src/sgsn/gprs_gmm.c 1 file changed, 2 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/53/40653/2 -- To view, visit https://gerrit.osmocom.org/c/osmo-sgsn/+/40653?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: Ib9bee2f8d0b1f89986d15cf3ce6404ad76378c8c Gerrit-Change-Number: 40653 Gerrit-PatchSet: 2 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu>
1 0
0 0
[XS] Change in osmo-msc[master]: ran_peer: Avoid paging attempt if not ready
by pespin 14 Jul '25

14 Jul '25
Attention is currently required from: fixeria, neels. pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-msc/+/40631?usp=email ) Change subject: ran_peer: Avoid paging attempt if not ready ...................................................................... Patch Set 3: (1 comment) File src/libmsc/ran_peer.c: https://gerrit.osmocom.org/c/osmo-msc/+/40631/comment/dfa49d07_d542cceb?usp… : PS3, Line 686: if (!rp->fi || rp->fi->state != RAN_PEER_ST_READY) > Acknowledged Done -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/40631?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: Ia858291f4454e4caf293e1aaf60ea04d2d4a64e9 Gerrit-Change-Number: 40631 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(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-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 14 Jul 2025 15:38:05 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: neels <nhofmeyr(a)sysmocom.de> Comment-In-Reply-To: pespin <pespin(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-msc[master]: msc: Initial implementation of N-PCSTATE.ind
by pespin 14 Jul '25

14 Jul '25
Attention is currently required from: laforge, neels, osmith. pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-msc/+/40630?usp=email ) Change subject: msc: Initial implementation of N-PCSTATE.ind ...................................................................... Patch Set 3: (10 comments) Patchset: PS3: > some optional nitpicks.. Done File include/osmocom/msc/ran_peer.h: https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/5dc978db_d565762c?usp… : PS3, Line 94: struct ran_peer *ran_peer_find_by_addr(const struct sccp_ran_inst *sri, const struct osmo_sccp_addr *peer_addr); > please consider placing orthogonal cosmetic fixes of prior code in a separate patch, because you sho […] Done File src/libmsc/ran_peer.c: https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/a51992a2_2c86a264?usp… : PS3, Line 131: /* N-PCSTATE.ind informs us the peer went down and is no longer reachable: */ > in this comment i expect to read what the *function* does Done File src/libmsc/sccp_ran.c: https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/96c603d3_97769765?usp… : PS3, Line 63: n r > typo Done https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/6c391fe4_c39670cd?usp… : PS3, Line 63: address > you mean PC? PC is a subset of possible SCCP addresses It doesn't really matter, since the SSN is known/hardcoded in this case. https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/42ca709f_41e228dd?usp… : PS3, Line 64: get_ran_ > below you call function ran_peer_find_by_addr(). […] Done https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/85d4da41_6a02a2b0?usp… : PS3, Line 74: LOGP(DMSC, LOGL_DEBUG, "No ran_peer found under remote address: %s\n", osmo_sccp_addr_name(cs7, &rem_addr)); > (if this function becomes public API: error logging should be done at the caller, because these help […] Done https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/6b0d894d_0ae1e076?usp… : PS3, Line 85: LOGP(DMSC, LOGL_DEBUG, "N-PCSTATE ind: affected_pc=%u=%s sp_status=%s remote_sccp_status=%s\n", > (not sure if we should log *all* N-PCSTATE events) It's in debug, so sure we should. https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/facd68d8_674f01aa?usp… : PS3, Line 95: /* See if this marks the point code to have become available, or to have been lost. > hehe i know this comment from somewhere =) high five Yeah I'm reusing stuff from osmo-bsc which had better support already, https://gerrit.osmocom.org/c/osmo-msc/+/40630/comment/050e2f92_9270ddc7?usp… : PS3, Line 146: } > (... this logic exists also in osmo-bsc. […] No, I believe this is really logic of apps should take care of, specially since we'll be improving it at different pace in different apps in the future. -- To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/40630?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-msc Gerrit-Branch: master Gerrit-Change-Id: Ice1b2c163b1b0d134fcaa1c8bf543038a35fabdf Gerrit-Change-Number: 40630 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-CC: laforge <laforge(a)osmocom.org> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Comment-Date: Mon, 14 Jul 2025 15:34:08 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: neels <nhofmeyr(a)sysmocom.de>
1 0
0 0
[S] Change in osmo-iuh[master]: iu_client: add a new event NEW_AREA
by lynxis lazus 14 Jul '25

14 Jul '25
lynxis lazus has submitted this change. ( https://gerrit.osmocom.org/c/osmo-iuh/+/38947?usp=email ) ( 10 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: iu_client: add a new event NEW_AREA ...................................................................... iu_client: add a new event NEW_AREA When the IU client learns a new LAC/RAC or the LAC/RAC has moved from one RNC to another RNC, inform the user via an event. Allows the SGSN to track RACs which uses Iu. Change-Id: I8b1b8c58bf72b00e2705ca87a89a91481bac3470 --- M TODO-RELEASE M include/osmocom/ranap/iu_client.h M src/iu_client.c 3 files changed, 39 insertions(+), 2 deletions(-) Approvals: pespin: Looks good to me, approved laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified diff --git a/TODO-RELEASE b/TODO-RELEASE index ac52f44..b583f7e 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -10,3 +10,4 @@ libosmo-ranap add API ranap_ran_rx_co_decode2() libosmo-ranap deprecate API ranap_ran_rx_co_decode() libosmo-ranap add API iu_client.h: add ranap_iu_page_cs2/ranap_iu_page_ps2 +libosmo-ranap new event RANAP_IU_EVENT_NEW_AREA diff --git a/include/osmocom/ranap/iu_client.h b/include/osmocom/ranap/iu_client.h index 86ae874..465a17d 100644 --- a/include/osmocom/ranap/iu_client.h +++ b/include/osmocom/ranap/iu_client.h @@ -38,11 +38,26 @@ struct osmo_timer_list release_timeout; }; +enum ranap_iu_event_new_area_type { + RANAP_IU_NEW_LAC, + RANAP_IU_NEW_RAC, +}; + +struct ranap_iu_event_new_area { + const struct osmo_rnc_id *rnc_id; + enum ranap_iu_event_new_area_type cell_type; + union { + const struct osmo_location_area_id *lai; + const struct osmo_routing_area_id *rai; + } u; +}; + enum ranap_iu_event_type { RANAP_IU_EVENT_RAB_ASSIGN, RANAP_IU_EVENT_SECURITY_MODE_COMPLETE, RANAP_IU_EVENT_IU_RELEASE, /* An actual Iu Release message was received */ RANAP_IU_EVENT_LINK_INVALIDATED, /* A SUA link was lost or closed down */ + RANAP_IU_EVENT_NEW_AREA, /* Either a new LAC/RAC has been detected */ }; extern const struct value_string ranap_iu_event_type_names[]; diff --git a/src/iu_client.c b/src/iu_client.c index ce3030e..90fd1dc 100644 --- a/src/iu_client.c +++ b/src/iu_client.c @@ -116,6 +116,7 @@ OSMO_VALUE_STRING(RANAP_IU_EVENT_SECURITY_MODE_COMPLETE), OSMO_VALUE_STRING(RANAP_IU_EVENT_IU_RELEASE), OSMO_VALUE_STRING(RANAP_IU_EVENT_LINK_INVALIDATED), + OSMO_VALUE_STRING(RANAP_IU_EVENT_NEW_AREA), { 0, NULL } }; @@ -126,7 +127,7 @@ if (!global_iu_event_cb) return 0; - if (!ue_ctx->notification) + if (ue_ctx && !ue_ctx->notification) return 0; LOGPIU(LOGL_DEBUG, "Submit Iu event to upper layer: %s\n", ranap_iu_event_type_str(type)); @@ -134,6 +135,25 @@ return global_iu_event_cb(ue_ctx, type, data); } +static void global_iu_event_new_area(const struct osmo_rnc_id *rnc_id, const struct osmo_routing_area_id *rai) +{ + struct ranap_iu_event_new_area new_area = (struct ranap_iu_event_new_area) { + .rnc_id = rnc_id, + .cell_type = RANAP_IU_NEW_RAC + }; + + if (rai->rac == OSMO_RESERVED_RAC) { + new_area.cell_type = RANAP_IU_NEW_LAC; + new_area.u.lai = &rai->lac; + } else { + new_area.cell_type = RANAP_IU_NEW_RAC; + new_area.u.rai = rai; + } + + global_iu_event(NULL, RANAP_IU_EVENT_NEW_AREA, &new_area); +} + + static void ue_conn_ctx_release_timeout_cb(void *ctx_) { struct ranap_ue_conn_ctx *ctx = (struct ranap_ue_conn_ctx *)ctx_; @@ -330,12 +350,14 @@ llist_del(&lre->entry); llist_add(&lre->entry, &rnc->lac_rac_list); + global_iu_event_new_area(rnc_id, rai); } else if (!old_rnc) { /* LAC, RAC not recorded yet */ LOGPIU(LOGL_NOTICE, "RNC %s: new LAC/RAC %s\n", osmo_rnc_id_name(rnc_id), osmo_rai_name2(rai)); lre = talloc_zero(rnc, struct iu_lac_rac_entry); lre->rai = *rai; llist_add(&lre->entry, &rnc->lac_rac_list); + global_iu_event_new_area(rnc_id, rai); } /* else, LAC,RAC already recorded with the current RNC. */ @@ -959,7 +981,6 @@ return paged; } - /*********************************************************************** * ***********************************************************************/ -- To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38947?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-iuh Gerrit-Branch: master Gerrit-Change-Id: I8b1b8c58bf72b00e2705ca87a89a91481bac3470 Gerrit-Change-Number: 38947 Gerrit-PatchSet: 20 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-iuh[master]: iu_client: refactor LAC/RAC handling
by lynxis lazus 14 Jul '25

14 Jul '25
lynxis lazus has submitted this change. ( https://gerrit.osmocom.org/c/osmo-iuh/+/38945?usp=email ) ( 6 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: iu_client: refactor LAC/RAC handling ...................................................................... iu_client: refactor LAC/RAC handling The iu client ignored the PLMN which might ran into duplicate RACs. Replace all lac/rac handling by the "new" osmo_routing_area_id struct which has improved handling. Further it allows to use the embedded lac when CS paging is only required. The old gprs_ra_id is still used to contain api stability. RAC with 0xff will be rejected (which should be invalid already, because the SIM is using this value for an invalid entry). Internally RAC = 0xff will be used to differentiate between LAI and RAI. Change-Id: Ie38fa3751cfce1c981d8d0bed1b8ff891593a638 --- M src/iu_client.c 1 file changed, 58 insertions(+), 21 deletions(-) Approvals: laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified pespin: Looks good to me, approved diff --git a/src/iu_client.c b/src/iu_client.c index 7f4ba3d..a9999c0 100644 --- a/src/iu_client.c +++ b/src/iu_client.c @@ -50,10 +50,7 @@ struct iu_lac_rac_entry { struct llist_head entry; - /* LAC: Location Area Code (for CS and PS) */ - uint16_t lac; - /* RAC: Routing Area Code (for PS only) */ - uint8_t rac; + struct osmo_routing_area_id rai; }; /* Entry to cache conn_id <-> sccp_addr mapping in case we receive an empty CR */ @@ -111,6 +108,9 @@ static struct osmo_sccp_user *g_scu; static struct osmo_sccp_addr g_local_sccp_addr; +/* This rac will be used internally. RAC with 0xff will be rejected */ +#define OSMO_RESERVED_RAC 0xff + const struct value_string ranap_iu_event_type_names[] = { OSMO_VALUE_STRING(RANAP_IU_EVENT_RAB_ASSIGN), OSMO_VALUE_STRING(RANAP_IU_EVENT_SECURITY_MODE_COMPLETE), @@ -230,7 +230,7 @@ * If rnc and lre pointers are not NULL, *rnc / *lre are set to NULL if no match is found, or to the * match if a match is found. Return true if a match is found. */ static bool iu_rnc_lac_rac_find(struct ranap_iu_rnc **rnc, struct iu_lac_rac_entry **lre, - uint16_t lac, uint8_t rac) + const struct osmo_routing_area_id *ra_id) { struct ranap_iu_rnc *r; struct iu_lac_rac_entry *e; @@ -242,7 +242,33 @@ llist_for_each_entry(r, &rnc_list, entry) { llist_for_each_entry(e, &r->lac_rac_list, entry) { - if (e->lac == lac && e->rac == rac) { + if (!osmo_rai_cmp(&e->rai, ra_id)) { + if (rnc) + *rnc = r; + if (lre) + *lre = e; + return true; + } + } + } + return false; +} + +/* legacy, do a first match with ignoring PLMN */ +static bool iu_rnc_lac_rac_find_legacy(struct ranap_iu_rnc **rnc, struct iu_lac_rac_entry **lre, + uint16_t lac, uint8_t rac) +{ + struct ranap_iu_rnc *r; + struct iu_lac_rac_entry *e; + + if (rnc) + *rnc = NULL; + if (lre) + *lre = NULL; + + llist_for_each_entry(r, &rnc_list, entry) { + llist_for_each_entry(e, &r->lac_rac_list, entry) { + if (e->rai.lac.lac == lac && e->rai.rac == rac) { if (rnc) *rnc = r; if (lre) @@ -271,8 +297,9 @@ return !strcmp(buf, osmo_sccp_addr_dump(b)); } -static struct ranap_iu_rnc *iu_rnc_register(struct osmo_rnc_id *rnc_id, uint16_t lac, - uint8_t rac, struct osmo_sccp_addr *addr) +static struct ranap_iu_rnc *iu_rnc_register(struct osmo_rnc_id *rnc_id, + const struct osmo_routing_area_id *rai, + struct osmo_sccp_addr *addr) { struct ranap_iu_rnc *rnc; struct ranap_iu_rnc *old_rnc; @@ -283,31 +310,31 @@ if (rnc) { if (!same_sccp_addr(&rnc->sccp_addr, addr)) { - LOGPIU(LOGL_NOTICE, "RNC %s changed its SCCP addr to %s (LAC=%u RAC=%u)\n", - osmo_rnc_id_name(rnc_id), osmo_sccp_addr_dump(addr), lac, rac); + LOGPIU(LOGL_NOTICE, "RNC %s changed its SCCP addr to %s (LAC/RAC %s)\n", + osmo_rnc_id_name(rnc_id), osmo_sccp_addr_dump(addr), osmo_rai_name2(rai)); rnc->sccp_addr = *addr; } } else rnc = iu_rnc_alloc(rnc_id, addr); /* Detect whether the LAC,RAC is already recorded in another RNC */ - iu_rnc_lac_rac_find(&old_rnc, &lre, lac, rac); + iu_rnc_lac_rac_find(&old_rnc, &lre, rai); if (old_rnc && old_rnc != rnc) { - /* LAC,RAC already exists in a different RNC */ - LOGPIU(LOGL_NOTICE, "LAC %u RAC %u moved from RNC %s %s", - lac, rac, osmo_rnc_id_name(&old_rnc->rnc_id), osmo_sccp_addr_dump(&old_rnc->sccp_addr)); + /* LAC, RAC already exists in a different RNC */ + LOGPIU(LOGL_NOTICE, "LAC/RAC %s moved from RNC %s %s", + osmo_rai_name2(rai), + osmo_rnc_id_name(&old_rnc->rnc_id), osmo_sccp_addr_dump(&old_rnc->sccp_addr)); LOGPIUC(LOGL_NOTICE, " to RNC %s %s\n", osmo_rnc_id_name(&rnc->rnc_id), osmo_sccp_addr_dump(&rnc->sccp_addr)); llist_del(&lre->entry); llist_add(&lre->entry, &rnc->lac_rac_list); } else if (!old_rnc) { - /* LAC,RAC not recorded yet */ - LOGPIU(LOGL_NOTICE, "RNC %s: new LAC %u RAC %u\n", osmo_rnc_id_name(rnc_id), lac, rac); + /* LAC, RAC not recorded yet */ + LOGPIU(LOGL_NOTICE, "RNC %s: new LAC/RAC %s\n", osmo_rnc_id_name(rnc_id), osmo_rai_name2(rai)); lre = talloc_zero(rnc, struct iu_lac_rac_entry); - lre->lac = lac; - lre->rac = rac; + lre->rai = *rai; llist_add(&lre->entry, &rnc->lac_rac_list); } /* else, LAC,RAC already recorded with the current RNC. */ @@ -411,7 +438,8 @@ static int ranap_handle_co_initial_ue(void *ctx, RANAP_InitialUE_MessageIEs_t *ies) { struct new_ue_conn_ctx *new_ctx = ctx; - struct gprs_ra_id ra_id; + struct gprs_ra_id ra_id = {}; + struct osmo_routing_area_id ra_id2 = {}; struct osmo_rnc_id rnc_id = {}; uint16_t sai; struct ranap_ue_conn_ctx *ue; @@ -425,6 +453,13 @@ if (ies->presenceMask & INITIALUE_MESSAGEIES_RANAP_RAC_PRESENT) { ra_id.rac = asn1str_to_u8(&ies->rac); + if (ra_id.rac == OSMO_RESERVED_RAC) { + LOGPIU(LOGL_ERROR, + "Rejecting RNC with invalid/internally used RAC 0x%02x\n", ra_id.rac); + return -1; + } + } else { + ra_id.rac = OSMO_RESERVED_RAC; } if (iu_grnc_id_parse(&rnc_id, &ies->globalRNC_ID) != 0) { @@ -437,8 +472,10 @@ msgb_gmmh(msg) = msgb_put(msg, ies->nas_pdu.size); memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size); + gprs_rai_to_osmo(&ra_id2, &ra_id); + /* Make sure we know the RNC Id and LAC+RAC coming in on this connection. */ - rnc = iu_rnc_register(&rnc_id, ra_id.lac, ra_id.rac, &new_ctx->sccp_addr); + rnc = iu_rnc_register(&rnc_id, &ra_id2, &new_ctx->sccp_addr); ue = ue_conn_ctx_alloc(rnc, new_ctx->conn_id); OSMO_ASSERT(ue); @@ -790,7 +827,7 @@ int log_level; int paged = 0; - iu_rnc_lac_rac_find(&rnc, NULL, lac, rac); + iu_rnc_lac_rac_find_legacy(&rnc, NULL, lac, rac); if (rnc) { if (iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi_or_ptmsi, is_ps, 0) == 0) { log_msg = "Paging"; -- To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38945?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-iuh Gerrit-Branch: master Gerrit-Change-Id: Ie38fa3751cfce1c981d8d0bed1b8ff891593a638 Gerrit-Change-Number: 38945 Gerrit-PatchSet: 7 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-CC: daniel <dwillmann(a)sysmocom.de> Gerrit-CC: neels <nhofmeyr(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-iuh[master]: iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2
by lynxis lazus 14 Jul '25

14 Jul '25
lynxis lazus has submitted this change. ( https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email ) Change subject: iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2 ...................................................................... iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2 ranap_iu_page_cs2 and ranap_iu_page_ps2 are using the newer osmocom osmo_location_area_id or osmo_routing_area_id which also contain the PLMN. Change-Id: I1f07e96642737160d387de3e4c3f71d288d356dd --- M TODO-RELEASE M include/osmocom/ranap/iu_client.h M src/iu_client.c 3 files changed, 104 insertions(+), 3 deletions(-) Approvals: Jenkins Builder: Verified lynxis lazus: Looks good to me, approved diff --git a/TODO-RELEASE b/TODO-RELEASE index 34f3506..ac52f44 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -9,3 +9,4 @@ #library what description / commit summary line libosmo-ranap add API ranap_ran_rx_co_decode2() libosmo-ranap deprecate API ranap_ran_rx_co_decode() +libosmo-ranap add API iu_client.h: add ranap_iu_page_cs2/ranap_iu_page_ps2 diff --git a/include/osmocom/ranap/iu_client.h b/include/osmocom/ranap/iu_client.h index 2e72839..86ae874 100644 --- a/include/osmocom/ranap/iu_client.h +++ b/include/osmocom/ranap/iu_client.h @@ -2,6 +2,7 @@ #include <stdbool.h> +#include <osmocom/core/defs.h> #include <osmocom/core/linuxlist.h> #include <osmocom/gsm/gsm48.h> #include <osmocom/sigtran/sccp_sap.h> @@ -65,8 +66,14 @@ int ranap_iu_tx(struct msgb *msg, uint8_t sapi); -int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac); -int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac); +int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac) + OSMO_DEPRECATED("Use ranap_iu_page_cs2 instead"); + +int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac) + OSMO_DEPRECATED("Use ranap_iu_page_ps2 instead"); + +int ranap_iu_page_cs2(const char *imsi, const uint32_t *tmsi, const struct osmo_location_area_id *lai); +int ranap_iu_page_ps2(const char *imsi, const uint32_t *ptmsi, const struct osmo_routing_area_id *rai); int ranap_iu_rab_act(struct ranap_ue_conn_ctx *ue_ctx, struct msgb *msg); int ranap_iu_rab_deact(struct ranap_ue_conn_ctx *ue_ctx, uint8_t rab_id); diff --git a/src/iu_client.c b/src/iu_client.c index a9999c0..ce3030e 100644 --- a/src/iu_client.c +++ b/src/iu_client.c @@ -814,7 +814,7 @@ bool is_ps, uint32_t paging_cause) { struct msgb *msg; - msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps? 1 : 0, paging_cause); + msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps ? 1 : 0, paging_cause); msg->l2h = msg->data; return osmo_sccp_tx_unitdata_msg(g_scu, &g_local_sccp_addr, called_addr, msg); } @@ -856,16 +856,109 @@ return paged; } +/*! Old paging() doesn't use PLMN and transmit paging command only to the first RNC */ int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac) { return iu_page(imsi, tmsi, lac, 0, false); } +/*! Old paging() doesn't use PLMN and transmit paging command only to the first RNC */ int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac) { return iu_page(imsi, ptmsi, lac, rac, true); } +/*! Transmit a single page request towards all RNCs serving the specific LAI (no page retransmission). + * + * \param imsi the imsi as human readable string + * \param tmsi NULL or pointer to the tmsi + * \param lai full Location Area Identifier + * \return amount of paged RNCs. 0 when no RNC found. + */ +int ranap_iu_page_cs2(const char *imsi, const uint32_t *tmsi, const struct osmo_location_area_id *lai) +{ + struct ranap_iu_rnc *rnc; + struct iu_lac_rac_entry *entry; + char log_msg[32] = {}; + int paged = 0; + int rc = 0; + + /* find all RNCs which are serving this LA */ + llist_for_each_entry(rnc, &rnc_list, entry) { + llist_for_each_entry(entry, &rnc->lac_rac_list, entry) { + if (osmo_lai_cmp(&entry->rai.lac, lai)) + continue; + + rc = iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi, false, 0); + if (rc > 0) { + LOGPIU(LOGL_ERROR, "IuCS: Failed to tx Paging RNC %s for LAC %s for IMSI %s / TMSI %08x", + osmo_rnc_id_name(&rnc->rnc_id), + osmo_lai_name(lai), imsi, tmsi ? *tmsi : GSM_RESERVED_TMSI); + } + paged++; + break; + } + } + + if (tmsi) + snprintf(log_msg, sizeof(log_msg), "for TMSI %08x\n", *tmsi); + else + snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi); + + if (paged) + LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on LAI %s for %s", paged, osmo_lai_name(lai), log_msg); + else + LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on LAI %s for %s", osmo_lai_name(lai), log_msg); + + + return paged; +} + +/*! Transmit a single page request towards all RNCs serving the specific RAI (no page retransmission). + * + * \param imsi the imsi as human readable string + * \param ptmsi NULL or pointer to the tmsi + * \param rai full Location Area Identifier + * \return amount of paged RNCs. 0 when no RNC found. + */ +int ranap_iu_page_ps2(const char *imsi, const uint32_t *ptmsi, const struct osmo_routing_area_id *rai) +{ + struct ranap_iu_rnc *rnc; + struct iu_lac_rac_entry *entry; + char log_msg[32] = {}; + int paged = 0; + int rc = 0; + + /* find all RNCs which are serving this RAC */ + llist_for_each_entry(rnc, &rnc_list, entry) { + llist_for_each_entry(entry, &rnc->lac_rac_list, entry) { + if (osmo_rai_cmp(&entry->rai, rai)) + continue; + + rc = iu_tx_paging_cmd(&rnc->sccp_addr, imsi, ptmsi, true, 0); + if (rc > 0) { + LOGPIU(LOGL_ERROR, "IuPS: Failed to tx Paging RNC %s for RAC %s for IMSI %s / P-TMSI %08x", + osmo_rnc_id_name(&rnc->rnc_id), + osmo_rai_name2(rai), imsi, ptmsi ? *ptmsi : GSM_RESERVED_TMSI); + } + paged++; + break; + } + } + + if (ptmsi) + snprintf(log_msg, sizeof(log_msg) - 1, "for PTMSI %08x\n", *ptmsi); + else + snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi); + + if (paged) + LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on RAI %s for %s", paged, osmo_rai_name2(rai), log_msg); + else + LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on RAI %s for %s", osmo_rai_name2(rai), log_msg); + + return paged; +} + /*********************************************************************** * -- To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-iuh Gerrit-Branch: master Gerrit-Change-Id: I1f07e96642737160d387de3e4c3f71d288d356dd Gerrit-Change-Number: 38946 Gerrit-PatchSet: 20 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: daniel <dwillmann(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1 0
0 0
[S] Change in osmo-iuh[master]: iu_client: use new struct osmo_rnc_id
by lynxis lazus 14 Jul '25

14 Jul '25
lynxis lazus has submitted this change. ( https://gerrit.osmocom.org/c/osmo-iuh/+/38944?usp=email ) ( 4 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: iu_client: use new struct osmo_rnc_id ...................................................................... iu_client: use new struct osmo_rnc_id The osmo_rnc_id is a libosmocore type which can be used across different libraries. In preparation to notify the SGSN when a new RAC/LAC is learned. Depends-on: I17a2adedc2c2ab158f40d58280f5df5c6967b8ec (libosmocore) Change-Id: Id8db70bd3d63b0533b637402a91757eb677c38b7 --- M src/iu_client.c 1 file changed, 19 insertions(+), 18 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved laforge: Looks good to me, but someone else must approve diff --git a/src/iu_client.c b/src/iu_client.c index ea5ebe8..7f4ba3d 100644 --- a/src/iu_client.c +++ b/src/iu_client.c @@ -27,6 +27,7 @@ #include <asn1c/asn1helpers.h> +#include <osmocom/gsm/protocol/gsm_04_08_gprs.h> #include <osmocom/ranap/iu_client.h> #include <osmocom/core/logging.h> @@ -73,7 +74,7 @@ struct ranap_iu_rnc { struct llist_head entry; - uint16_t rnc_id; + struct osmo_rnc_id rnc_id; struct osmo_sccp_addr sccp_addr; /* A list of struct iu_lac_rac_entry */ @@ -209,18 +210,18 @@ } } -static struct ranap_iu_rnc *iu_rnc_alloc(uint16_t rnc_id, struct osmo_sccp_addr *addr) +static struct ranap_iu_rnc *iu_rnc_alloc(const struct osmo_rnc_id *rnc_id, struct osmo_sccp_addr *addr) { struct ranap_iu_rnc *rnc = talloc_zero(talloc_iu_ctx, struct ranap_iu_rnc); OSMO_ASSERT(rnc); INIT_LLIST_HEAD(&rnc->lac_rac_list); - rnc->rnc_id = rnc_id; + rnc->rnc_id = *rnc_id; rnc->sccp_addr = *addr; llist_add(&rnc->entry, &rnc_list); - LOGPIU(LOGL_NOTICE, "New RNC %d at %s\n", rnc->rnc_id, osmo_sccp_addr_dump(addr)); + LOGPIU(LOGL_NOTICE, "New RNC %s at %s\n", osmo_rnc_id_name(&rnc->rnc_id), osmo_sccp_addr_dump(addr)); return rnc; } @@ -253,11 +254,11 @@ return false; } -static struct ranap_iu_rnc *iu_rnc_id_find(uint16_t rnc_id) +static struct ranap_iu_rnc *iu_rnc_id_find(struct osmo_rnc_id *rnc_id) { struct ranap_iu_rnc *rnc; llist_for_each_entry(rnc, &rnc_list, entry) { - if (rnc->rnc_id == rnc_id) + if (!osmo_rnc_id_cmp(&rnc->rnc_id, rnc_id)) return rnc; } return NULL; @@ -270,7 +271,7 @@ return !strcmp(buf, osmo_sccp_addr_dump(b)); } -static struct ranap_iu_rnc *iu_rnc_register(uint16_t rnc_id, uint16_t lac, +static struct ranap_iu_rnc *iu_rnc_register(struct osmo_rnc_id *rnc_id, uint16_t lac, uint8_t rac, struct osmo_sccp_addr *addr) { struct ranap_iu_rnc *rnc; @@ -282,8 +283,8 @@ if (rnc) { if (!same_sccp_addr(&rnc->sccp_addr, addr)) { - LOGPIU(LOGL_NOTICE, "RNC %u changed its SCCP addr to %s (LAC=%u RAC=%u)\n", - rnc_id, osmo_sccp_addr_dump(addr), lac, rac); + LOGPIU(LOGL_NOTICE, "RNC %s changed its SCCP addr to %s (LAC=%u RAC=%u)\n", + osmo_rnc_id_name(rnc_id), osmo_sccp_addr_dump(addr), lac, rac); rnc->sccp_addr = *addr; } } else @@ -294,16 +295,16 @@ if (old_rnc && old_rnc != rnc) { /* LAC,RAC already exists in a different RNC */ - LOGPIU(LOGL_NOTICE, "LAC %u RAC %u moved from RNC %u %s", - lac, rac, old_rnc->rnc_id, osmo_sccp_addr_dump(&old_rnc->sccp_addr)); - LOGPIUC(LOGL_NOTICE, " to RNC %u %s\n", - rnc->rnc_id, osmo_sccp_addr_dump(&rnc->sccp_addr)); + LOGPIU(LOGL_NOTICE, "LAC %u RAC %u moved from RNC %s %s", + lac, rac, osmo_rnc_id_name(&old_rnc->rnc_id), osmo_sccp_addr_dump(&old_rnc->sccp_addr)); + LOGPIUC(LOGL_NOTICE, " to RNC %s %s\n", + osmo_rnc_id_name(&rnc->rnc_id), osmo_sccp_addr_dump(&rnc->sccp_addr)); llist_del(&lre->entry); llist_add(&lre->entry, &rnc->lac_rac_list); } else if (!old_rnc) { /* LAC,RAC not recorded yet */ - LOGPIU(LOGL_NOTICE, "RNC %u: new LAC %u RAC %u\n", rnc_id, lac, rac); + LOGPIU(LOGL_NOTICE, "RNC %s: new LAC %u RAC %u\n", osmo_rnc_id_name(rnc_id), lac, rac); lre = talloc_zero(rnc, struct iu_lac_rac_entry); lre->lac = lac; lre->rac = rac; @@ -376,7 +377,7 @@ return osmo_sccp_user_sap_down(g_scu, &prim->oph); } -static int iu_grnc_id_parse(struct iu_grnc_id *dst, struct RANAP_GlobalRNC_ID *src) +static int iu_grnc_id_parse(struct osmo_rnc_id *dst, struct RANAP_GlobalRNC_ID *src) { /* The size is coming from arbitrary sender, check it gracefully */ if (src->pLMNidentity.size != 3) { @@ -411,7 +412,7 @@ { struct new_ue_conn_ctx *new_ctx = ctx; struct gprs_ra_id ra_id; - struct iu_grnc_id grnc_id; + struct osmo_rnc_id rnc_id = {}; uint16_t sai; struct ranap_ue_conn_ctx *ue; struct msgb *msg = msgb_alloc(256, "RANAP->NAS"); @@ -426,7 +427,7 @@ ra_id.rac = asn1str_to_u8(&ies->rac); } - if (iu_grnc_id_parse(&grnc_id, &ies->globalRNC_ID) != 0) { + if (iu_grnc_id_parse(&rnc_id, &ies->globalRNC_ID) != 0) { LOGPIU(LOGL_ERROR, "Failed to parse RANAP Global-RNC-ID IE\n"); return -1; @@ -437,7 +438,7 @@ memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size); /* Make sure we know the RNC Id and LAC+RAC coming in on this connection. */ - rnc = iu_rnc_register(grnc_id.rnc_id, ra_id.lac, ra_id.rac, &new_ctx->sccp_addr); + rnc = iu_rnc_register(&rnc_id, ra_id.lac, ra_id.rac, &new_ctx->sccp_addr); ue = ue_conn_ctx_alloc(rnc, new_ctx->conn_id); OSMO_ASSERT(ue); -- To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38944?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-iuh Gerrit-Branch: master Gerrit-Change-Id: Id8db70bd3d63b0533b637402a91757eb677c38b7 Gerrit-Change-Number: 38944 Gerrit-PatchSet: 5 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-iuh[master]: iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2
by lynxis lazus 14 Jul '25

14 Jul '25
Attention is currently required from: daniel, laforge, neels, pespin. lynxis lazus has posted comments on this change by lynxis lazus. ( https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email ) Change subject: iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2 ...................................................................... Patch Set 20: Code-Review+2 (1 comment) Patchset: PS20: Only Rebased it. Keeping +2 from Pespin -- To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: osmo-iuh Gerrit-Branch: master Gerrit-Change-Id: I1f07e96642737160d387de3e4c3f71d288d356dd Gerrit-Change-Number: 38946 Gerrit-PatchSet: 20 Gerrit-Owner: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: daniel <dwillmann(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: neels <nhofmeyr(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Attention: daniel <dwillmann(a)sysmocom.de> Gerrit-Comment-Date: Mon, 14 Jul 2025 15:29:40 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: Yes
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • ...
  • 150
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.