lists.osmocom.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
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
List overview
Download
gerrit-log
July 2023
----- 2025 -----
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
gerrit-log@lists.osmocom.org
1 participants
3051 discussions
Start a n
N
ew thread
[M] Change in osmo-bts[master]: scheduler: unify argument names/order for _sched_compose_*_ind()
by fixeria
fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bts/+/33583
) Change subject: scheduler: unify argument names/order for _sched_compose_*_ind() ...................................................................... scheduler: unify argument names/order for _sched_compose_*_ind() This commit aims to make the argument naming/ordering more consistent: * rename l2/l2_len and tch/tch_len to data/data_len; * common arguments first (consistent ordering), specific last. Change-Id: I3d8c90b82f2a55b0c5c2d6b4efb8fd962508534d Related: OS#1572 --- M include/osmo-bts/scheduler_backend.h M src/common/scheduler.c M src/osmo-bts-trx/sched_lchan_pdtch.c M src/osmo-bts-trx/sched_lchan_tchf.c M src/osmo-bts-trx/sched_lchan_tchh.c M src/osmo-bts-trx/sched_lchan_xcch.c 6 files changed, 77 insertions(+), 42 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/83/33583/1 diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h index 3b1388f..d465744 100644 --- a/include/osmo-bts/scheduler_backend.h +++ b/include/osmo-bts/scheduler_backend.h @@ -42,16 +42,18 @@ struct msgb *_sched_dequeue_prim(struct l1sched_ts *l1ts, const struct trx_dl_burst_req *br); int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, - enum trx_chan_type chan, uint8_t *l2, - uint8_t l2_len, float rssi, + enum trx_chan_type chan, + uint8_t *data, uint8_t data_len, + uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, - uint16_t ber10k, enum osmo_ph_pres_info_type presence_info); int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, - enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len, - int16_t ta_offs_256bits, uint16_t ber10k, float rssi, - int16_t link_qual_cb, uint8_t is_sub); + enum trx_chan_type chan, + uint8_t *data, uint8_t data_len, + uint16_t ber10k, float rssi, + int16_t ta_offs_256bits, int16_t link_qual_cb, + uint8_t is_sub); int tx_fcch_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br); int tx_sch_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br); diff --git a/src/common/scheduler.c b/src/common/scheduler.c index 7ea6bfa..fc34491 100644 --- a/src/common/scheduler.c +++ b/src/common/scheduler.c @@ -750,10 +750,10 @@ } int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, - enum trx_chan_type chan, uint8_t *l2, - uint8_t l2_len, float rssi, + enum trx_chan_type chan, + uint8_t *data, uint8_t data_len, + uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, - uint16_t ber10k, enum osmo_ph_pres_info_type presence_info) { struct msgb *msg; @@ -765,7 +765,7 @@ chan_nr |= RSL_CHAN_OSMO_VAMOS_MASK; /* compose primitive */ - msg = l1sap_msgb_alloc(l2_len); + msg = l1sap_msgb_alloc(data_len); l1sap = msgb_l1sap_prim(msg); osmo_prim_init(&l1sap->oph, SAP_GSM_PH, PRIM_PH_DATA, PRIM_OP_INDICATION, msg); @@ -777,9 +777,9 @@ l1sap->u.data.ta_offs_256bits = ta_offs_256bits; l1sap->u.data.lqual_cb = link_qual_cb; l1sap->u.data.pdch_presence_info = presence_info; - msg->l2h = msgb_put(msg, l2_len); - if (l2_len) - memcpy(msg->l2h, l2, l2_len); + msg->l2h = msgb_put(msg, data_len); + if (data_len) + memcpy(msg->l2h, data, data_len); /* forward primitive */ l1sap_up(l1ts->ts->trx, l1sap); @@ -788,9 +788,11 @@ } int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, - enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len, - int16_t ta_offs_256bits, uint16_t ber10k, float rssi, - int16_t link_qual_cb, uint8_t is_sub) + enum trx_chan_type chan, + uint8_t *data, uint8_t data_len, + uint16_t ber10k, float rssi, + int16_t ta_offs_256bits, int16_t link_qual_cb, + uint8_t is_sub) { struct msgb *msg; struct osmo_phsap_prim *l1sap; @@ -802,7 +804,7 @@ chan_nr |= RSL_CHAN_OSMO_VAMOS_MASK; /* compose primitive */ - msg = l1sap_msgb_alloc(tch_len); + msg = l1sap_msgb_alloc(data_len); l1sap = msgb_l1sap_prim(msg); osmo_prim_init(&l1sap->oph, SAP_GSM_PH, PRIM_TCH, PRIM_OP_INDICATION, msg); @@ -814,9 +816,9 @@ l1sap->u.tch.lqual_cb = link_qual_cb; l1sap->u.tch.is_sub = is_sub & 1; - msg->l2h = msgb_put(msg, tch_len); - if (tch_len) - memcpy(msg->l2h, tch, tch_len); + msg->l2h = msgb_put(msg, data_len); + if (data_len) + memcpy(msg->l2h, data, data_len); LOGL1S(DL1P, LOGL_DEBUG, l1ts, chan, l1sap->u.tch.fn, "%s Rx -> RTP: %s\n", gsm_lchan_name(lchan), msgb_hexdump_l2(msg)); diff --git a/src/osmo-bts-trx/sched_lchan_pdtch.c b/src/osmo-bts-trx/sched_lchan_pdtch.c index f12961f..2aa43f9 100644 --- a/src/osmo-bts-trx/sched_lchan_pdtch.c +++ b/src/osmo-bts-trx/sched_lchan_pdtch.c @@ -131,10 +131,12 @@ ber10k = compute_ber10k(n_bits_total, n_errors); first_fn = GSM_TDMA_FN_SUB(bi->fn, 3); - return _sched_compose_ph_data_ind(l1ts, - first_fn, bi->chan, l2, rc, - meas_avg.rssi, meas_avg.toa256, - meas_avg.ci_cb, ber10k, + return _sched_compose_ph_data_ind(l1ts, first_fn, bi->chan, + &l2[0], rc, + ber10k, + meas_avg.rssi, + meas_avg.toa256, + meas_avg.ci_cb, presence_info); } diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c index 9acbf31..b8f8322 100644 --- a/src/osmo-bts-trx/sched_lchan_tchf.c +++ b/src/osmo-bts-trx/sched_lchan_tchf.c @@ -253,10 +253,12 @@ /* FACCH */ if (rc == GSM_MACBLOCK_LEN) { _sched_compose_ph_data_ind(l1ts, fn_begin, bi->chan, - tch_data + amr, GSM_MACBLOCK_LEN, - meas_avg.rssi, meas_avg.toa256, - meas_avg.ci_cb, ber10k, - PRES_INFO_UNKNOWN); + &tch_data[amr], GSM_MACBLOCK_LEN, + ber10k, + meas_avg.rssi, + meas_avg.toa256, + meas_avg.ci_cb, + PRES_INFO_UNKNOWN); /* If we are in SPEECH mode we will generate a fake (BFI) TCH * indication as well. This indication is needed by the higher @@ -273,9 +275,13 @@ return 0; /* TCH or BFI */ - return _sched_compose_tch_ind(l1ts, fn_begin, bi->chan, tch_data, rc, - meas_avg.toa256, ber10k, meas_avg.rssi, - meas_avg.ci_cb, is_sub); + return _sched_compose_tch_ind(l1ts, fn_begin, bi->chan, + &tch_data[0], rc, + ber10k, + meas_avg.rssi, + meas_avg.toa256, + meas_avg.ci_cb, + is_sub); } /* common section for generation of TCH bursts (TCH/H and TCH/F). diff --git a/src/osmo-bts-trx/sched_lchan_tchh.c b/src/osmo-bts-trx/sched_lchan_tchh.c index 8d1aab3..97b8582 100644 --- a/src/osmo-bts-trx/sched_lchan_tchh.c +++ b/src/osmo-bts-trx/sched_lchan_tchh.c @@ -295,10 +295,12 @@ * report gets dropped in process_l1sap_meas_data(). The averaged results * will be sent with the first (see below) and second (see above) BFIs. */ _sched_compose_ph_data_ind(l1ts, fn_begin, bi->chan, - tch_data + amr, GSM_MACBLOCK_LEN, - tch_mode == GSM48_CMODE_SIGN ? meas_avg.rssi : 0, - meas_avg.toa256, meas_avg.ci_cb, ber10k, - PRES_INFO_UNKNOWN); + &tch_data[amr], GSM_MACBLOCK_LEN, + ber10k, + tch_mode == GSM48_CMODE_SIGN ? meas_avg.rssi : 0, + meas_avg.toa256, + meas_avg.ci_cb, + PRES_INFO_UNKNOWN); ber10k = 0; bfi: /* A FACCH/H frame replaces two speech frames, so we need to send two BFIs. @@ -310,9 +312,13 @@ return 0; /* TCH or BFI */ - return _sched_compose_tch_ind(l1ts, fn_begin, bi->chan, tch_data, rc, - meas_avg.toa256, ber10k, meas_avg.rssi, - meas_avg.ci_cb, is_sub); + return _sched_compose_tch_ind(l1ts, fn_begin, bi->chan, + &tch_data[0], rc, + ber10k, + meas_avg.rssi, + meas_avg.toa256, + meas_avg.ci_cb, + is_sub); } /* common section for generation of TCH bursts (TCH/H and TCH/F). diff --git a/src/osmo-bts-trx/sched_lchan_xcch.c b/src/osmo-bts-trx/sched_lchan_xcch.c index 0fccf3e..87561ea 100644 --- a/src/osmo-bts-trx/sched_lchan_xcch.c +++ b/src/osmo-bts-trx/sched_lchan_xcch.c @@ -144,10 +144,12 @@ if (rep_sacch) memcpy(chan_state->ul_bursts_prev, bursts_p, 464); - return _sched_compose_ph_data_ind(l1ts, *first_fn, - bi->chan, l2, l2_len, - meas_avg.rssi, meas_avg.toa256, - meas_avg.ci_cb, ber10k, + return _sched_compose_ph_data_ind(l1ts, *first_fn, bi->chan, + &l2[0], l2_len, + ber10k, + meas_avg.rssi, + meas_avg.toa256, + meas_avg.ci_cb, PRES_INFO_UNKNOWN); } -- To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/33583
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I3d8c90b82f2a55b0c5c2d6b4efb8fd962508534d Gerrit-Change-Number: 33583 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 year, 11 months
1
0
0
0
[S] Change in osmo-bts[master]: [WIP] osmo-bts-trx: rx_tch[fh]_fn(): separate FACCH decoding
by fixeria
fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bts/+/33586
) Change subject: [WIP] osmo-bts-trx: rx_tch[fh]_fn(): separate FACCH decoding ...................................................................... [WIP] osmo-bts-trx: rx_tch[fh]_fn(): separate FACCH decoding Change-Id: I4c6736e84c271240d457998de688c0baf59fe578 --- M src/osmo-bts-trx/sched_lchan_tchf.c 1 file changed, 39 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/86/33586/1 diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c index ac6fbd1..3c34522 100644 --- a/src/osmo-bts-trx/sched_lchan_tchf.c +++ b/src/osmo-bts-trx/sched_lchan_tchf.c @@ -69,6 +69,36 @@ extern const uint8_t sched_tchh_dl_amr_cmi_map[26]; +# if 0 +static int decode_facch(struct l1sched_ts *l1ts, + const struct trx_ul_burst_ind *bi) +{ + struct l1sched_chan_state *l1cs = &l1ts->chan_state[bi->chan] + const sbit_t *bursts_p = chan_state->ul_bursts; + struct l1sched_meas_set meas_avg; + uint8_t data[GSM_MACBLOCK_LEN]; + int n_errors, n_bits_total; + uint16_t ber10k; + + rc = gsm0503_tch_fr_facch_decode(&data[0], BUFTAIL8(bursts_p), + &n_errors, &n_bits_total); + if (rc != GSM_MACBLOCK_LEN) + return rc; + + /* average measurements of the last 8 bursts, obtain TDMA Fn of the first burst */ + trx_sched_meas_avg(l1cs, &meas_avg, SCHED_MEAS_AVG_M_S8N8); + ber10k = compute_ber10k(n_bits_total, n_errors); + + /* meas_avg.fn now contains TDMA frame number of the first burst */ + _sched_compose_ph_data_ind(l1ts, meas_avg.fn, bi->chan, + &data[0], GSM_MACBLOCK_LEN, + meas_avg.rssi, meas_avg.toa256, + meas_avg.ci_cb, ber10k, + PRES_INFO_UNKNOWN); + return 0; +} +#endif + /* Process a single Uplink TCH/F burst received by the PHY. * This function is visualized in file 'doc/trx_sched_tch.txt'. */ int rx_tchf_fn(struct l1sched_ts *l1ts, const struct trx_ul_burst_ind *bi) -- To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/33586
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I4c6736e84c271240d457998de688c0baf59fe578 Gerrit-Change-Number: 33586 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 year, 11 months
1
0
0
0
[S] Change in osmo-bts[master]: scheduler: use size_t for data_len in _sched_compose_*_ind()
by fixeria
fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bts/+/33585
) Change subject: scheduler: use size_t for data_len in _sched_compose_*_ind() ...................................................................... scheduler: use size_t for data_len in _sched_compose_*_ind() The payload size for some CSD channel types is bigger than what an uint8_t can represent, for instance 290 bytes for TCH/F14.4. Change-Id: Id75c55509a017d14dfab2a7b4c67e0742125a113 Related: OS#1572 --- M include/osmo-bts/scheduler_backend.h M src/common/scheduler.c 2 files changed, 17 insertions(+), 4 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/85/33585/1 diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h index 83dd578..820cca7 100644 --- a/include/osmo-bts/scheduler_backend.h +++ b/include/osmo-bts/scheduler_backend.h @@ -43,14 +43,14 @@ int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - const uint8_t *data, uint8_t data_len, + const uint8_t *data, size_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, enum osmo_ph_pres_info_type presence_info); int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - const uint8_t *data, uint8_t data_len, + const uint8_t *data, size_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, uint8_t is_sub); diff --git a/src/common/scheduler.c b/src/common/scheduler.c index dc7d94f..007dd7c 100644 --- a/src/common/scheduler.c +++ b/src/common/scheduler.c @@ -751,7 +751,7 @@ int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - const uint8_t *data, uint8_t data_len, + const uint8_t *data, size_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, enum osmo_ph_pres_info_type presence_info) @@ -789,7 +789,7 @@ int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - const uint8_t *data, uint8_t data_len, + const uint8_t *data, size_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, uint8_t is_sub) -- To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/33585
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: Id75c55509a017d14dfab2a7b4c67e0742125a113 Gerrit-Change-Number: 33585 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 year, 11 months
1
0
0
0
[S] Change in osmo-bts[master]: scheduler: constify *data pointer in _sched_compose_*_ind()
by fixeria
fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bts/+/33584
) Change subject: scheduler: constify *data pointer in _sched_compose_*_ind() ...................................................................... scheduler: constify *data pointer in _sched_compose_*_ind() Change-Id: I617e7ed50d27e047cc2851f5d44d31ad3111ce0a Related: OS#1572 --- M include/osmo-bts/scheduler_backend.h M src/common/scheduler.c 2 files changed, 14 insertions(+), 4 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/84/33584/1 diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h index d465744..83dd578 100644 --- a/include/osmo-bts/scheduler_backend.h +++ b/include/osmo-bts/scheduler_backend.h @@ -43,14 +43,14 @@ int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - uint8_t *data, uint8_t data_len, + const uint8_t *data, uint8_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, enum osmo_ph_pres_info_type presence_info); int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - uint8_t *data, uint8_t data_len, + const uint8_t *data, uint8_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, uint8_t is_sub); diff --git a/src/common/scheduler.c b/src/common/scheduler.c index fc34491..dc7d94f 100644 --- a/src/common/scheduler.c +++ b/src/common/scheduler.c @@ -751,7 +751,7 @@ int _sched_compose_ph_data_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - uint8_t *data, uint8_t data_len, + const uint8_t *data, uint8_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, enum osmo_ph_pres_info_type presence_info) @@ -789,7 +789,7 @@ int _sched_compose_tch_ind(struct l1sched_ts *l1ts, uint32_t fn, enum trx_chan_type chan, - uint8_t *data, uint8_t data_len, + const uint8_t *data, uint8_t data_len, uint16_t ber10k, float rssi, int16_t ta_offs_256bits, int16_t link_qual_cb, uint8_t is_sub) -- To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/33584
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I617e7ed50d27e047cc2851f5d44d31ad3111ce0a Gerrit-Change-Number: 33584 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-MessageType: newchange
1 year, 11 months
1
0
0
0
[S] Change in libosmo-netif[master]: stream: Adapt to new changes
by arehbein
arehbein has abandoned this change. (
https://gerrit.osmocom.org/c/libosmo-netif/+/33199
) Change subject: stream: Adapt to new changes ...................................................................... Abandoned -- To view, visit
https://gerrit.osmocom.org/c/libosmo-netif/+/33199
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-netif Gerrit-Branch: master Gerrit-Change-Id: I5f9a5ce85efb4ed512ff6ca1f3e170d2ffb2ba22 Gerrit-Change-Number: 33199 Gerrit-PatchSet: 1 Gerrit-Owner: arehbein <arehbein(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: laforge <laforge(a)osmocom.org> Gerrit-MessageType: abandon
1 year, 11 months
1
0
0
0
[S] Change in libosmo-gprs[master]: gmm: Accept event LOW_LVL_FAIL in RAU/SR_INITIATED states
by pespin
pespin has submitted this change. (
https://gerrit.osmocom.org/c/libosmo-gprs/+/33566
) Change subject: gmm: Accept event LOW_LVL_FAIL in RAU/SR_INITIATED states ...................................................................... gmm: Accept event LOW_LVL_FAIL in RAU/SR_INITIATED states This even is triggered by the GSM itself due to internal timeouts as a consequence of lower layers not resolving the request (with accept or reject events). Change-Id: Ic1072629595e75c411b421e71f6ffac5dd41da3b --- M src/gmm/gmm_ms_fsm.c 1 file changed, 21 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved diff --git a/src/gmm/gmm_ms_fsm.c b/src/gmm/gmm_ms_fsm.c index 770ede7..f219bbe 100644 --- a/src/gmm/gmm_ms_fsm.c +++ b/src/gmm/gmm_ms_fsm.c @@ -243,6 +243,9 @@ enum gsm48_gmm_cause cause; switch (event) { + case GPRS_GMM_MS_EV_LOW_LVL_FAIL: + gmm_ms_fsm_state_chg(fi, GPRS_GMM_MS_ST_REGISTERED); + break; case GPRS_GMM_MS_EV_RAU_REJECTED: cause = *(uint8_t *)data; /* 3GPP TS 24.008 Figure 4.1b */ @@ -273,6 +276,9 @@ static void st_gmm_ms_sr_initiated(struct osmo_fsm_inst *fi, uint32_t event, void *data) { switch (event) { + case GPRS_GMM_MS_EV_LOW_LVL_FAIL: + gmm_ms_fsm_state_chg(fi, GPRS_GMM_MS_ST_REGISTERED); + break; case GPRS_GMM_MS_EV_SR_REJECTED: gmm_ms_fsm_state_chg(fi, GPRS_GMM_MS_ST_REGISTERED); break; @@ -357,6 +363,7 @@ }, [GPRS_GMM_MS_ST_RAU_INITIATED] = { .in_event_mask = + X(GPRS_GMM_MS_EV_LOW_LVL_FAIL) | X(GPRS_GMM_MS_EV_RAU_REJECTED) | X(GPRS_GMM_MS_EV_RAU_ACCEPTED), .out_state_mask = @@ -367,6 +374,7 @@ }, [GPRS_GMM_MS_ST_SR_INITIATED] = { .in_event_mask = + X(GPRS_GMM_MS_EV_LOW_LVL_FAIL) | X(GPRS_GMM_MS_EV_SR_REJECTED) | X(GPRS_GMM_MS_EV_SR_ACCEPTED), .out_state_mask = -- To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/33566
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs Gerrit-Branch: master Gerrit-Change-Id: Ic1072629595e75c411b421e71f6ffac5dd41da3b Gerrit-Change-Number: 33566 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 year, 11 months
1
0
0
0
[M] Change in libosmo-gprs[master]: rlcmac: tbf_dl: Implement T3192
by pespin
pespin has submitted this change. (
https://gerrit.osmocom.org/c/libosmo-gprs/+/33556
) Change subject: rlcmac: tbf_dl: Implement T3192 ...................................................................... rlcmac: tbf_dl: Implement T3192 Related: OS#5500 Change-Id: I49c9068d1819d6189103908f6f92ce05952b74e6 --- M include/osmocom/gprs/rlcmac/tbf_dl.h M src/rlcmac/rlcmac.c M src/rlcmac/tbf_dl.c M src/rlcmac/tbf_dl_fsm.c M tests/rlcmac/rlcmac_prim_test.err 5 files changed, 68 insertions(+), 6 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved diff --git a/include/osmocom/gprs/rlcmac/tbf_dl.h b/include/osmocom/gprs/rlcmac/tbf_dl.h index 7fb3c9e..104b6e6 100644 --- a/include/osmocom/gprs/rlcmac/tbf_dl.h +++ b/include/osmocom/gprs/rlcmac/tbf_dl.h @@ -35,6 +35,7 @@ }; struct osmo_timer_list t3190; + struct osmo_timer_list t3192; }; struct gprs_rlcmac_dl_tbf *gprs_rlcmac_dl_tbf_alloc(struct gprs_rlcmac_entity *gre); diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c index f9281fb..f35c04d 100644 --- a/src/rlcmac/rlcmac.c +++ b/src/rlcmac/rlcmac.c @@ -50,6 +50,7 @@ { .T=3168, .default_val=5000, .unit = OSMO_TDEF_MS, .desc="Wait for PACKET UPLINK ASSIGNMENT (updated by BCCH SI13) (ms)" }, { .T=3182, .default_val=5, .unit = OSMO_TDEF_S, .desc="Wait for Acknowledgement (s)" }, { .T=3190, .default_val=5, .unit = OSMO_TDEF_S, .desc="Wait for Valid Downlink Data Received from the Network (s)" }, + { .T=3192, .default_val=0, .unit = OSMO_TDEF_MS, .desc="Wait for release of the TBF after reception of the final block (ms)" }, { 0 } /* empty item at the end */ }; @@ -571,9 +572,18 @@ return rc; } +/* Decode T3192. 3GPP TS 44.060 Table 12.24.2: GPRS Cell Options information element details */ +static unsigned int gprs_rlcmac_decode_t3192(unsigned int t3192_encoded) +{ + static const unsigned int decode_t3192_tbl[8] = {500, 1000, 1500, 0, 80, 120, 160, 200}; + OSMO_ASSERT(t3192_encoded <= 7); + return decode_t3192_tbl[t3192_encoded]; +} + int gprs_rlcmac_handle_bcch_si13(const struct gsm48_system_information_type_13 *si13) { int rc; + unsigned int t3192; LOGRLCMAC(LOGL_DEBUG, "Rx SI13 from lower layers\n"); memcpy(g_rlcmac_ctx->si13, si13, GSM_MACBLOCK_LEN); @@ -594,9 +604,9 @@ (g_rlcmac_ctx->si13ro.u.PBCCH_Not_present.GPRS_Cell_Options.T3168 + 1) * 500, OSMO_TDEF_MS); - /* TODO: Update tdef for T3192 as per TS 44.060 Table 12.24.2 - * osmo_tdef_set(g_rlcmac_ctx->T_defs, 3192, si13ro.u.PBCCH_Not_present.GPRS_Cell_Options.T3192, enum osmo_tdef_unit val_unit); - */ + /* Update tdef for T3192 as per TS 44.060 Table 12.24.2 */ + t3192 = gprs_rlcmac_decode_t3192(g_rlcmac_ctx->si13ro.u.PBCCH_Not_present.GPRS_Cell_Options.T3192); + osmo_tdef_set(g_rlcmac_ctx->T_defs, 3192, t3192, OSMO_TDEF_MS); return rc; } @@ -674,6 +684,16 @@ GPRS_RLCMAC_PDCH_ULC_POLL_DL_ASS, gre); } + + /* 9.3.2.6 Release of downlink Temporary Block Flow: + * If the MS, [...] receives a PACKET DOWNLINK ASSIGNMENT with the Control Ack bit + * set to '1' [...] while its timer T3192 is running, the MS shall stop timer T3192, + * consider this downlink TBF released and act upon the new assignments. + */ + if (dlass->CONTROL_ACK && gre->dl_tbf) { + if (osmo_timer_pending(&gre->dl_tbf->t3192)) + gprs_rlcmac_dl_tbf_free(gre->dl_tbf); + } return rc; } diff --git a/src/rlcmac/tbf_dl.c b/src/rlcmac/tbf_dl.c index c6205c3..a7f0ea9 100644 --- a/src/rlcmac/tbf_dl.c +++ b/src/rlcmac/tbf_dl.c @@ -28,6 +28,7 @@ #include <osmocom/gprs/rlcmac/pdch_ul_controller.h> static void gprs_rlcmac_dl_tbf_t3190_timer_cb(void *data); +static void gprs_rlcmac_dl_tbf_t3192_timer_cb(void *data); struct gprs_rlcmac_dl_tbf *gprs_rlcmac_dl_tbf_alloc(struct gprs_rlcmac_entity *gre) { @@ -54,6 +55,7 @@ OSMO_ASSERT(dl_tbf->blkst); osmo_timer_setup(&dl_tbf->t3190, gprs_rlcmac_dl_tbf_t3190_timer_cb, dl_tbf); + osmo_timer_setup(&dl_tbf->t3192, gprs_rlcmac_dl_tbf_t3192_timer_cb, dl_tbf); return dl_tbf; @@ -75,6 +77,7 @@ gre = tbf->gre; osmo_timer_del(&dl_tbf->t3190); + osmo_timer_del(&dl_tbf->t3192); msgb_free(dl_tbf->llc_rx_msg); dl_tbf->llc_rx_msg = NULL; @@ -109,6 +112,29 @@ osmo_timer_schedule(&dl_tbf->t3190, val_sec, 0); } +/* This timer is used on the mobile station side when the mobile station has + * received all of the RLC data blocks. When timer T3192 expires the mobile station + * shall release the resources associated with the TBF (e.g. TFI) and begin to + * monitor its paging channel. */ +static void gprs_rlcmac_dl_tbf_t3192_timer_cb(void *data) +{ + struct gprs_rlcmac_dl_tbf *dl_tbf = data; + + LOGPTBFDL(dl_tbf, LOGL_INFO, "Timeout of T3192\n"); + + gprs_rlcmac_dl_tbf_free(dl_tbf); +} + +void gprs_rlcmac_dl_tbf_t3192_start(struct gprs_rlcmac_dl_tbf *dl_tbf) +{ + unsigned long val_msec; + val_msec = osmo_tdef_get(g_rlcmac_ctx->T_defs, 3192, OSMO_TDEF_MS, -1); + + LOGPTBFDL(dl_tbf, LOGL_INFO, "Starting T3192 (%lu ms)\n", val_msec); + OSMO_ASSERT(gprs_rlcmac_tbf_dl_state(dl_tbf) == GPRS_RLCMAC_TBF_DL_ST_FINISHED); + osmo_timer_schedule(&dl_tbf->t3192, val_msec / 1000, (val_msec % 1000) * 1000); +} + static uint8_t dl_tbf_dl_slotmask(struct gprs_rlcmac_dl_tbf *dl_tbf) { uint8_t dl_slotmask = 0; @@ -161,10 +187,11 @@ goto free_ret; } - /* Stop T3190 if transmitting final Downlink Ack/Nack */ - if (gprs_rlcmac_tbf_dl_state(dl_tbf) == GPRS_RLCMAC_TBF_DL_ST_FINISHED) + /* Transmitting final Downlink Ack/Nack: Stop T3190 (if still armed), re-arm T3192 */ + if (gprs_rlcmac_tbf_dl_state(dl_tbf) == GPRS_RLCMAC_TBF_DL_ST_FINISHED) { osmo_timer_del(&dl_tbf->t3190); - + gprs_rlcmac_dl_tbf_t3192_start(dl_tbf); + } return msg; free_ret: diff --git a/src/rlcmac/tbf_dl_fsm.c b/src/rlcmac/tbf_dl_fsm.c index 342256f..158b802 100644 --- a/src/rlcmac/tbf_dl_fsm.c +++ b/src/rlcmac/tbf_dl_fsm.c @@ -80,6 +80,8 @@ static void st_finished(struct osmo_fsm_inst *fi, uint32_t event, void *data) { + /* Wait to be freed by T3190/T3192. */ + //struct gprs_rlcmac_tbf_dl_fsm_ctx *ctx = (struct gprs_rlcmac_tbf_dl_fsm_ctx *)fi->priv; switch (event) { case GPRS_RLCMAC_TBF_DL_EV_LAST_DL_DATA_RECVD: diff --git a/tests/rlcmac/rlcmac_prim_test.err b/tests/rlcmac/rlcmac_prim_test.err index 087e371..c6a7a73 100644 --- a/tests/rlcmac/rlcmac_prim_test.err +++ b/tests/rlcmac/rlcmac_prim_test.err @@ -911,6 +911,7 @@ DLGLOBAL DEBUG Rx from lower layers: L1CTL-PDCH_RTS.indication DLGLOBAL DEBUG (ts=7,fn=21,usf=0) Tx DL ACK/NACK FinalAck=1 DLGLOBAL DEBUG TBF(DL:NR-0:TLLI-00000001) - V(N): "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIR" R=Received I=Invalid +DLGLOBAL INFO TBF(DL:NR-0:TLLI-00000001) Starting T3192 (0 ms) DLGLOBAL DEBUG Tx to lower layers: L1CTL-PDCH_DATA.request DLGLOBAL INFO DL_TBF_ASS{IDLE}: Deallocated DLGLOBAL INFO DL_TBF{FINISHED}: Deallocated @@ -955,6 +956,7 @@ DLGLOBAL INFO UL_TBF{NEW}: Received Event UL_ASS_START DLGLOBAL INFO UL_TBF{NEW}: state_chg to ASSIGN DLGLOBAL INFO UL_TBF_ASS{IDLE}: state_chg to WAIT_PKT_UL_ASS +DLGLOBAL INFO TBF(DL:NR-0:TLLI-00000001) Starting T3192 (0 ms) DLGLOBAL DEBUG Tx to lower layers: L1CTL-PDCH_DATA.request DLGLOBAL DEBUG Rx from lower layers: L1CTL-PDCH_DATA.indication DLGLOBAL INFO TS=7 FN=26 Rx Pkt UL ASS -- To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/33556
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs Gerrit-Branch: master Gerrit-Change-Id: I49c9068d1819d6189103908f6f92ce05952b74e6 Gerrit-Change-Number: 33556 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 year, 11 months
1
0
0
0
[M] Change in libosmo-gprs[master]: rlcmac: tbf_dl: Implement T3190
by pespin
pespin has submitted this change. (
https://gerrit.osmocom.org/c/libosmo-gprs/+/33554
) Change subject: rlcmac: tbf_dl: Implement T3190 ...................................................................... rlcmac: tbf_dl: Implement T3190 Related: OS#5500 Change-Id: I3f69fde298dcd64d30b9d648a96717a8378864c4 --- M include/osmocom/gprs/rlcmac/tbf_dl.h M src/rlcmac/rlcmac.c M src/rlcmac/tbf_dl.c M src/rlcmac/tbf_dl_fsm.c 4 files changed, 47 insertions(+), 4 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved diff --git a/include/osmocom/gprs/rlcmac/tbf_dl.h b/include/osmocom/gprs/rlcmac/tbf_dl.h index f398c0a..7fb3c9e 100644 --- a/include/osmocom/gprs/rlcmac/tbf_dl.h +++ b/include/osmocom/gprs/rlcmac/tbf_dl.h @@ -33,14 +33,18 @@ struct gprs_rlcmac_rlc_window *w; struct gprs_rlcmac_rlc_dl_window *dlw; }; + + struct osmo_timer_list t3190; }; struct gprs_rlcmac_dl_tbf *gprs_rlcmac_dl_tbf_alloc(struct gprs_rlcmac_entity *gre); void gprs_rlcmac_dl_tbf_free(struct gprs_rlcmac_dl_tbf *dl_tbf); +void gprs_rlcmac_dl_tbf_t3190_start(struct gprs_rlcmac_dl_tbf *dl_tbf); + int gprs_rlcmac_dl_tbf_configure_l1ctl(struct gprs_rlcmac_dl_tbf *dl_tbf); -struct msgb *gprs_rlcmac_dl_tbf_create_pkt_dl_ack_nack(const struct gprs_rlcmac_dl_tbf *dl_tbf); +struct msgb *gprs_rlcmac_dl_tbf_create_pkt_dl_ack_nack(struct gprs_rlcmac_dl_tbf *dl_tbf); int gprs_rlcmac_dl_tbf_rcv_data_block(struct gprs_rlcmac_dl_tbf *dl_tbf, const struct gprs_rlcmac_rlc_data_info *rlc, diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c index 5cf4bb9..f9281fb 100644 --- a/src/rlcmac/rlcmac.c +++ b/src/rlcmac/rlcmac.c @@ -49,6 +49,7 @@ /* T3168: dynamically updated with what's received in BCCH SI13 */ { .T=3168, .default_val=5000, .unit = OSMO_TDEF_MS, .desc="Wait for PACKET UPLINK ASSIGNMENT (updated by BCCH SI13) (ms)" }, { .T=3182, .default_val=5, .unit = OSMO_TDEF_S, .desc="Wait for Acknowledgement (s)" }, + { .T=3190, .default_val=5, .unit = OSMO_TDEF_S, .desc="Wait for Valid Downlink Data Received from the Network (s)" }, { 0 } /* empty item at the end */ }; diff --git a/src/rlcmac/tbf_dl.c b/src/rlcmac/tbf_dl.c index 570b0d7..c6205c3 100644 --- a/src/rlcmac/tbf_dl.c +++ b/src/rlcmac/tbf_dl.c @@ -27,6 +27,8 @@ #include <osmocom/gprs/rlcmac/rlcmac_enc.h> #include <osmocom/gprs/rlcmac/pdch_ul_controller.h> +static void gprs_rlcmac_dl_tbf_t3190_timer_cb(void *data); + struct gprs_rlcmac_dl_tbf *gprs_rlcmac_dl_tbf_alloc(struct gprs_rlcmac_entity *gre) { struct gprs_rlcmac_dl_tbf *dl_tbf; @@ -51,6 +53,8 @@ dl_tbf->blkst = gprs_rlcmac_rlc_block_store_alloc(dl_tbf); OSMO_ASSERT(dl_tbf->blkst); + osmo_timer_setup(&dl_tbf->t3190, gprs_rlcmac_dl_tbf_t3190_timer_cb, dl_tbf); + return dl_tbf; err_tbf_destruct: @@ -70,6 +74,8 @@ tbf = dl_tbf_as_tbf(dl_tbf); gre = tbf->gre; + osmo_timer_del(&dl_tbf->t3190); + msgb_free(dl_tbf->llc_rx_msg); dl_tbf->llc_rx_msg = NULL; @@ -87,6 +93,21 @@ gprs_rlcmac_entity_dl_tbf_freed(gre, dl_tbf); } +static void gprs_rlcmac_dl_tbf_t3190_timer_cb(void *data) +{ + struct gprs_rlcmac_dl_tbf *dl_tbf = data; + + LOGPTBFDL(dl_tbf, LOGL_NOTICE, "Timeout of T3190\n"); + + gprs_rlcmac_dl_tbf_free(dl_tbf); +} + +void gprs_rlcmac_dl_tbf_t3190_start(struct gprs_rlcmac_dl_tbf *dl_tbf) +{ + unsigned long val_sec; + val_sec = osmo_tdef_get(g_rlcmac_ctx->T_defs, 3190, OSMO_TDEF_S, -1); + osmo_timer_schedule(&dl_tbf->t3190, val_sec, 0); +} static uint8_t dl_tbf_dl_slotmask(struct gprs_rlcmac_dl_tbf *dl_tbf) { @@ -113,7 +134,7 @@ return gprs_rlcmac_prim_call_down_cb(rlcmac_prim); } -struct msgb *gprs_rlcmac_dl_tbf_create_pkt_dl_ack_nack(const struct gprs_rlcmac_dl_tbf *dl_tbf) +struct msgb *gprs_rlcmac_dl_tbf_create_pkt_dl_ack_nack(struct gprs_rlcmac_dl_tbf *dl_tbf) { struct msgb *msg; struct bitvec bv; @@ -140,6 +161,10 @@ goto free_ret; } + /* Stop T3190 if transmitting final Downlink Ack/Nack */ + if (gprs_rlcmac_tbf_dl_state(dl_tbf) == GPRS_RLCMAC_TBF_DL_ST_FINISHED) + osmo_timer_del(&dl_tbf->t3190); + return msg; free_ret: @@ -214,7 +239,7 @@ { const struct gprs_rlcmac_rlc_block_info *rdbi; struct gprs_rlcmac_rlc_block *block; - + unsigned int block_idx; const uint16_t ws = gprs_rlcmac_rlc_window_ws(dl_tbf->w); LOGPTBFDL(dl_tbf, LOGL_DEBUG, "DL DATA TFI=%d received (V(Q)=%d .. V(R)=%d)\n", @@ -222,7 +247,8 @@ gprs_rlcmac_rlc_dl_window_v_q(dl_tbf->dlw), gprs_rlcmac_rlc_dl_window_v_r(dl_tbf->dlw)); - unsigned int block_idx; + /* Re-arm T3190: */ + gprs_rlcmac_dl_tbf_t3190_start(dl_tbf); /* Loop over num_blocks */ for (block_idx = 0; block_idx < rlc->num_data_blocks; block_idx++) { diff --git a/src/rlcmac/tbf_dl_fsm.c b/src/rlcmac/tbf_dl_fsm.c index 606b985..342256f 100644 --- a/src/rlcmac/tbf_dl_fsm.c +++ b/src/rlcmac/tbf_dl_fsm.c @@ -58,6 +58,8 @@ /* Configure DL TBF on the lower MAC side: */ gprs_rlcmac_dl_tbf_configure_l1ctl(ctx->dl_tbf); tbf_dl_fsm_state_chg(fi, GPRS_RLCMAC_TBF_DL_ST_FLOW); + /* FIXME: This should ideally be done after TbfStartTime has elapsed: */ + gprs_rlcmac_dl_tbf_t3190_start(ctx->dl_tbf); break; default: OSMO_ASSERT(0); -- To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/33554
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs Gerrit-Branch: master Gerrit-Change-Id: I3f69fde298dcd64d30b9d648a96717a8378864c4 Gerrit-Change-Number: 33554 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 year, 11 months
1
0
0
0
[S] Change in libosmo-gprs[master]: gmm: Accept event LOW_LVL_FAIL in RAU/SR_INITIATED states
by pespin
pespin has posted comments on this change. (
https://gerrit.osmocom.org/c/libosmo-gprs/+/33566
) Change subject: gmm: Accept event LOW_LVL_FAIL in RAU/SR_INITIATED states ...................................................................... Patch Set 2: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/33566
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs Gerrit-Branch: master Gerrit-Change-Id: Ic1072629595e75c411b421e71f6ffac5dd41da3b Gerrit-Change-Number: 33566 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Wed, 05 Jul 2023 14:39:45 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 year, 11 months
1
0
0
0
[M] Change in libosmo-gprs[master]: rlcmac: tbf_dl: Implement T3192
by pespin
pespin has posted comments on this change. (
https://gerrit.osmocom.org/c/libosmo-gprs/+/33556
) Change subject: rlcmac: tbf_dl: Implement T3192 ...................................................................... Patch Set 2: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/33556
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs Gerrit-Branch: master Gerrit-Change-Id: I49c9068d1819d6189103908f6f92ce05952b74e6 Gerrit-Change-Number: 33556 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Wed, 05 Jul 2023 14:39:43 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 year, 11 months
1
0
0
0
← Newer
1
...
273
274
275
276
277
278
279
...
306
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
Results per page:
10
25
50
100
200