Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
105
Merge Requests
105
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
slapos
Commits
b49bc3b3
Commit
b49bc3b3
authored
Dec 02, 2024
by
Joanne Hugé
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simpleran: support handover between 4G and 5G
parent
1468e116
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
833 additions
and
175 deletions
+833
-175
software/simpleran/buildout.hash.cfg
software/simpleran/buildout.hash.cfg
+4
-4
software/simpleran/config/enb.jinja2.cfg
software/simpleran/config/enb.jinja2.cfg
+217
-10
software/simpleran/instance-enb.jinja2.cfg
software/simpleran/instance-enb.jinja2.cfg
+7
-0
software/simpleran/instance-ors-enb-input-schema.json
software/simpleran/instance-ors-enb-input-schema.json
+238
-24
software/simpleran/instance-ors-enb.jinja2.cfg
software/simpleran/instance-ors-enb.jinja2.cfg
+1
-28
software/simpleran/instance-ors-gnb-input-schema.json
software/simpleran/instance-ors-gnb-input-schema.json
+238
-33
software/simpleran/peer/cell/common.json
software/simpleran/peer/cell/common.json
+2
-1
software/simpleran/peer/cell/lte/input-schema.json
software/simpleran/peer/cell/lte/input-schema.json
+10
-1
software/simpleran/peer/cell/nr/input-schema.json
software/simpleran/peer/cell/nr/input-schema.json
+10
-1
software/simpleran/slaplte.jinja2
software/simpleran/slaplte.jinja2
+1
-0
software/simpleran/test/test.py
software/simpleran/test/test.py
+8
-6
software/simpleran/test/test_ors.py
software/simpleran/test/test_ors.py
+97
-67
No files found.
software/simpleran/buildout.hash.cfg
View file @
b49bc3b3
...
...
@@ -24,7 +24,7 @@ md5sum = 307e38207945a9adcfea0263cba9d3a6
[slaplte.jinja2]
_update_hash_filename_ = slaplte.jinja2
md5sum = 8
d6eb90fc1191c3a1b24200df2ebf4fa
md5sum = 8
0f86d108ce8634f9577356ce074a560
[ru_amarisoft-stats.jinja2.py]
_update_hash_filename_ = ru/amarisoft-stats.jinja2.py
...
...
@@ -60,11 +60,11 @@ md5sum = 52da9fe3a569199e35ad89ae1a44c30e
[template-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg
md5sum =
5ff63ef0f043a198436a6b05e350a220
md5sum =
248c284cb8612034695e3bcec279e3a2
[template-ors-enb]
_update_hash_filename_ = instance-ors-enb.jinja2.cfg
md5sum =
585457493ce5302ba1f1073b8a3b877c
md5sum =
f4221fa9088546a40449845dcfb15447
[template-ors-ue]
_update_hash_filename_ = instance-ors-ue.jinja2.cfg
...
...
@@ -88,7 +88,7 @@ md5sum = dd50b4e4780830ddbde28b84af118f18
[enb.jinja2.cfg]
filename = config/enb.jinja2.cfg
md5sum =
573cb004c21aa5f9ad8baf7b4dbbeb43
md5sum =
ac7000a3b6999b51635083619e640e30
[drb_lte.jinja2.cfg]
filename = config/drb_lte.jinja2.cfg
...
...
software/simpleran/config/enb.jinja2.cfg
View file @
b49bc3b3
...
...
@@ -69,6 +69,7 @@
n_id_cell: {{ ncell.pci }},
dl_earfcn: {{ ncell.dl_earfcn }},
tac: {{ ncell.tac }},
plmn: "{{ ncell.plmn }}",
{#- TODO: consider extending peer/cell/lte with
.allowed_meas_bandwidth and .antenna_port_1 #}
allowed_meas_bandwidth: {{ jlte_n_rb_dl(1.4) }}, // (minimum possible bw)
...
...
@@ -83,6 +84,7 @@
ssb_nr_arfcn: {{ ncell.ssb_nr_arfcn }},
ul_nr_arfcn: {{ ncell.ul_nr_arfcn }},
tac: {{ ncell.tac }},
plmn: "{{ ncell.plmn }}",
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
...
...
@@ -465,22 +467,103 @@
],
{# TODO fully expose lte meas_config_desc in generic SR #}
{%- if (len(icell_dict) + len(ipeercell_dict)) > 0 %}
meas_config_desc: {
a1_report_type: "rsrp",
a1_rsrp:
-70
,
a1_hysteresis:
0
,
a1_time_to_trigger:
640,
a1_rsrp:
{{ slapparameter_dict.handover_a1_rsrp }}
,
a1_hysteresis:
{{ slapparameter_dict.handover_a1_hysteresis }}
,
a1_time_to_trigger:
{{ slapparameter_dict.handover_a1_time_to_trigger }},
a2_report_type: "rsrp",
a2_rsrp: -80,
a2_hysteresis: 0,
a2_time_to_trigger: 640,
a3_report_type: "rsrp",
a3_offset: {{ slapparameter_dict.get('lte_handover_a3_offset', 6) }},
a3_hysteresis: 0,
a3_time_to_trigger: {{ slapparameter_dict.get('lte_handover_a3_time_to_trigger', 480) }},
a2_rsrp: {{ slapparameter_dict.handover_a2_rsrp }},
a2_hysteresis: {{ slapparameter_dict.handover_a2_hysteresis }},
a2_time_to_trigger: {{ slapparameter_dict.handover_a2_time_to_trigger }},
eutra_handover: {
{%- if 'a3_rsrp' in slapparameter_dict.eutra_handover.event %}
a3_report_type: "rsrp",
a3_offset: {{ slapparameter_dict.eutra_handover.event.a3_rsrp }},
{%- elif 'a4_rsrp' in slapparameter_dict.eutra_handover.event %}
a4_threshold_rsrp: {{ slapparameter_dict.eutra_handover.event.a4_rsrp }},
{%- elif 'a5_rsrp' in slapparameter_dict.eutra_handover.event %}
a5_threshold1_rsrp: {{ slapparameter_dict.eutra_handover.event.a5_threshold1_rsrp }},
a5_threshold2_rsrp: {{ slapparameter_dict.eutra_handover.event.a5_threshold2_rsrp }},
{%- endif %}
hysteresis: {{ slapparameter_dict.eutra_handover.hysteresis }},
time_to_trigger: {{ slapparameter_dict.eutra_handover.time_to_trigger }}
{%- if len(list(ipeercell_dict|dictsort | selectattr('1._.cell_type', '==', 'nr'))) > 0 %}
},
nr_handover: {
{%- if 'b1_rsrp' in slapparameter_dict.nr_handover.event %}
b1_threshold_rsrp: {{ slapparameter_dict.nr_handover.event.b1_rsrp }},
{%- elif 'b2_rsrp' in slapparameter_dict.nr_handover.event %}
b2_threshold1_rsrp: {{ slapparameter_dict.nr_handover.event.b2_threshold1_rsrp }},
b2_threshold2_rsrp: {{ slapparameter_dict.nr_handover.event.b2_threshold2_rsrp }},
{%- endif %}
hysteresis: {{ slapparameter_dict.nr_handover.hysteresis }},
time_to_trigger: {{ slapparameter_dict.nr_handover.time_to_trigger }}
},
{%- else %}
}
{%- endif %}
},
{%- if slapparameter_dict.handover_meas_gap_config == 'Gap Pattern 1' %}
meas_gap_config: "gp1",
{%- elif slapparameter_dict.handover_meas_gap_config == 'Gap Pattern 0' %}
meas_gap_config: "gp0",
{%- else %}
meas_gap_config: "none",
{%- endif %}
ho_from_meas: true,
{%- set nr_bands = list(ipeercell_dict | dictsort | selectattr('1._.cell_type', '==', 'nr') | map(attribute='1._.nr_band')) | unique %}
{%- set lte_bands = list(ipeercell_dict | dictsort | selectattr('1._.cell_type', '==', 'lte') | map(attribute='1._.lte_band')) %}
requested_freq_bands_nr_mrdc: [
{%- for band in nr_bands -%}
{
rat: "nr",
band_nr: {{ band }},
max_bandwidth_requested_dl: 100,
max_bandwidth_requested_ul: 100,
max_carriers_requested_dl: 2,
max_carriers_requested_ul: 2,
},
{%- endfor %}
{%- for band in lte_bands -%}
{
rat: "eutra",
band_eutra: {{ band }},
ca_bandwidth_class_dl: "b",
ca_bandwidth_class_ul: "b",
},
{%- endfor %}
],
requested_freq_bands_nr: [
{%- for band in nr_bands -%}
{
rat: "nr",
band_nr: {{ band }},
max_bandwidth_requested_dl: 100,
max_bandwidth_requested_ul: 100,
max_carriers_requested_dl: 2,
max_carriers_requested_ul: 2,
},
{%- endfor %}
{%- for band in lte_bands -%}
{
rat: "eutra",
band_eutra: {{ band }},
ca_bandwidth_class_dl: "b",
ca_bandwidth_class_ul: "b",
},
{%- endfor %}
],
requested_eutra_freq_bands: [
{%- for band in lte_bands -%}
{{ band }},
{%- endfor -%}
],
{%- endif %}
},
{%- endif %}
...
...
@@ -992,6 +1075,130 @@
integ_algo_pref: [2, 1],
{# TODO fully expose nr meas_config_desc in generic SR #}
{%- if (len(icell_dict) + len(ipeercell_dict)) > 1 %}
meas_config_desc: {
a1_report_type: "rsrp",
a1_rsrp: {{ slapparameter_dict.handover_a1_rsrp }},
a1_hysteresis: {{ slapparameter_dict.handover_a1_hysteresis }},
a1_time_to_trigger: {{ slapparameter_dict.handover_a1_time_to_trigger }},
a2_report_type: "rsrp",
a2_rsrp: {{ slapparameter_dict.handover_a2_rsrp }},
a2_hysteresis: {{ slapparameter_dict.handover_a2_hysteresis }},
a2_time_to_trigger: {{ slapparameter_dict.handover_a2_time_to_trigger }},
nr_handover: {
{%- if 'a3_rsrp' in slapparameter_dict.nr_handover.event %}
a3_report_type: "rsrp",
a3_offset: {{ slapparameter_dict.nr_handover.event.a3_rsrp }},
{%- elif 'a4_rsrp' in slapparameter_dict.nr_handover.event %}
a4_threshold_rsrp: {{ slapparameter_dict.nr_handover.event.a4_rsrp }},
{%- elif 'a5_rsrp' in slapparameter_dict.nr_handover.event %}
a5_threshold1_rsrp: {{ slapparameter_dict.nr_handover.event.a5_threshold1_rsrp }},
a5_threshold2_rsrp: {{ slapparameter_dict.nr_handover.event.a5_threshold2_rsrp }},
{%- endif %}
hysteresis: {{ slapparameter_dict.nr_nr_handover.hysteresis }},
time_to_trigger: {{ slapparameter_dict.nr_nr_handover.time_to_trigger }}
},
{%- if len(list(ipeercell_dict|dictsort | selectattr('1._.cell_type', '==', 'lte'))) > 0 %}
eutra_handover: {
{%- if 'b1_rsrp' in slapparameter_dict.eutra_handover.event %}
b1_threshold_rsrp: {{ slapparameter_dict.eutra_handover.event.b1_rsrp }},
{%- elif 'b2_rsrp' in slapparameter_dict.eutra_handover.event %}
b2_threshold1_rsrp: {{ slapparameter_dict.eutra_handover.event.b2_threshold1_rsrp }},
b2_threshold2_rsrp: {{ slapparameter_dict.eutra_handover.event.b2_threshold2_rsrp }},
{%- endif %}
hysteresis: {{ slapparameter_dict.eutra_handover.hysteresis }},
time_to_trigger: {{ slapparameter_dict.eutra_handover.time_to_trigger }}
},
{%- endif %}
ssb_rsrq_filter_coeff: 3,
ssb_sinr_filter_coeff: 5
},
{%- if slapparameter_dict.handover_meas_gap_config == 'Gap Pattern 1' %}
meas_gap_config: {
pattern_id: 1
},
{%- elif slapparameter_dict.handover_meas_gap_config == 'Gap Pattern 0' %}
meas_gap_config: {
pattern_id: 0
},
{%- endif %}
ho_from_meas: true,
{%- set nr_bands = list(ipeercell_dict | dictsort | selectattr('1._.cell_type', '==', 'nr') | map(attribute='1._.nr_band')) | unique %}
{%- set lte_bands = list(ipeercell_dict | dictsort | selectattr('1._.cell_type', '==', 'lte') | map(attribute='1._.lte_band')) %}
requested_freq_bands_nr_mrdc: [
{%- for band in nr_bands -%}
{
rat: "nr",
band_nr: {{ band }},
max_bandwidth_requested_dl: 100,
max_bandwidth_requested_ul: 100,
max_carriers_requested_dl: 2,
max_carriers_requested_ul: 2,
},
{%- endfor %}
{%- for band in lte_bands -%}
{
rat: "eutra",
band_eutra: {{ band }},
ca_bandwidth_class_dl: "b",
ca_bandwidth_class_ul: "b",
},
{%- endfor %}
],
requested_freq_bands_nr: [
{%- for band in nr_bands -%}
{
rat: "nr",
band_nr: {{ band }},
max_bandwidth_requested_dl: 100,
max_bandwidth_requested_ul: 100,
max_carriers_requested_dl: 2,
max_carriers_requested_ul: 2,
},
{%- endfor %}
{%- for band in lte_bands -%}
{
rat: "eutra",
band_eutra: {{ band }},
ca_bandwidth_class_dl: "b",
ca_bandwidth_class_ul: "b",
},
{%- endfor %}
],
requested_eutra_freq_bands: [
{%- for band in lte_bands -%}
{{ band }},
{%- endfor -%}
],
{%- endif %}
meas_config_desc: {
a1_report_type: "rsrp",
a1_rsrp: -60,
...
...
software/simpleran/instance-enb.jinja2.cfg
View file @
b49bc3b3
...
...
@@ -7,6 +7,13 @@
'use_ipv4': False,
'gnb_id_bits': 28,
'nssai': {'1': {'sst': 1}},
'handover_a1_rsrp': -70,
'handover_a1_hysteresis': 0,
'handover_a1_time_to_trigger': 640,
'handover_a2_rsrp': -80,
'handover_a2_hysteresis': 0,
'handover_a2_time_to_trigger': 640,
'handover_meas_gap_config': 'Gap Pattern 1',
'xlog_forwarding_enabled': True,
'wendelin_telecom_software_release_url': 'wendelin-telecom-enb-shared-instance',
'xlog_fluentbit_forward_port': 24224,
...
...
software/simpleran/instance-ors-enb-input-schema.json
View file @
b49bc3b3
...
...
@@ -93,15 +93,21 @@
}
}
},
"
lte_handover_a3_offset
"
:
{
"title"
:
"
A3 offset for LTE handover
"
,
"description"
:
"
RSRP gain offset between gNBs which will trigger handover
"
,
"
handover_a1_rsrp
"
:
{
"title"
:
"
Handover A1 event RSRP threshold
"
,
"description"
:
"
Integer, range from -140 to -43. RSRP threshold value in dBm.
"
,
"type"
:
"number"
,
"default"
:
6
"default"
:
-70
},
"lte_handover_time_to_trigger"
:
{
"title"
:
"Time to Trigger for LTE handover"
,
"description"
:
"Time to triger after which LTE handover will be triggered if A3 offset is reached"
,
"handover_a1_hysteresis"
:
{
"title"
:
"Handover A1 event hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A1 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
,
"default"
:
0
},
"handover_a1_time_to_trigger"
:
{
"title"
:
"Handover A1 event time to trigger"
,
"description"
:
"Time in ms during which the A1 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
...
...
@@ -121,29 +127,237 @@
2560
,
5120
],
"default"
:
480
"default"
:
640
},
"handover_a2_rsrp"
:
{
"title"
:
"Handover A2 event RSRP threshold"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold value in dBm."
,
"type"
:
"number"
,
"default"
:
-80
},
"handover_a2_hysteresis"
:
{
"title"
:
"Handover A2 event hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A2 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
,
"default"
:
0
},
"handover_a2_time_to_trigger"
:
{
"title"
:
"Handover A2 event time to trigger"
,
"description"
:
"Time in ms during which the A2 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
],
"default"
:
640
},
"eutra_handover"
:
{
"title"
:
"EUTRA Handover"
,
"type"
:
"object"
,
"default"
:
{
"event"
:
{
"a3_rsrp"
:
6
},
"hysteresis"
:
0
,
"time_to_trigger"
:
480
},
"properties"
:
{
"event"
:
{
"title"
:
"EUTRA Handover event"
,
"type"
:
"object"
,
"oneOf"
:
[
{
"title"
:
"A3 event"
,
"type"
:
"object"
,
"required"
:
[
"a3_rsrp"
],
"properties"
:
{
"a3_rsrp"
:
{
"title"
:
"Handover A3 event RSRP offset"
,
"description"
:
"Integer, range from -140 to -43. RSRP gain offset between eNBs and gNBs which will trigger handover"
,
"type"
:
"number"
}
}
},
{
"title"
:
"A4 event"
,
"type"
:
"object"
,
"required"
:
[
"a4_rsrp"
],
"properties"
:
{
"a4_rsrp"
:
{
"title"
:
"Handover A4 event RSRP threshold"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold value in dBm"
,
"type"
:
"number"
}
}
},
{
"title"
:
"A5 event"
,
"type"
:
"object"
,
"required"
:
[
"a5_threshold1_rsrp"
,
"a5_threshold2_rsrp"
],
"properties"
:
{
"a5_threshold1_rsrp"
:
{
"title"
:
"Handover A5 event RSRP threshold1"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold1 value in dBm"
,
"type"
:
"number"
},
"a5_threshold2_rsrp"
:
{
"title"
:
"Handover A5 event RSRP threshold2"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold2 value in dBm"
,
"type"
:
"number"
}
}
}
]
},
"hysteresis"
:
{
"title"
:
"EUTRA Handover hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A3/A4/A5 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
},
"time_to_trigger"
:
{
"title"
:
"EUTRA Handover time to trigger"
,
"description"
:
"Time in ms during which the A3/A4/A5 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
]
}
}
},
"nr_handover"
:
{
"title"
:
"NR Handover"
,
"type"
:
"object"
,
"default"
:
{
"event"
:
{
"b1_rsrp"
:
-80
},
"hysteresis"
:
0
,
"time_to_trigger"
:
100
},
"properties"
:
{
"event"
:
{
"title"
:
"NR Handover event"
,
"type"
:
"object"
,
"oneOf"
:
[
{
"title"
:
"B1 event"
,
"type"
:
"object"
,
"required"
:
[
"b1_rsrp"
],
"properties"
:
{
"b1_rsrp"
:
{
"title"
:
"Handover B1 event RSRP threshold"
,
"description"
:
"Integer, range from -156 to -30. RSRP threshold value in dBm."
,
"type"
:
"number"
}
}
},
{
"title"
:
"B2 event"
,
"type"
:
"object"
,
"required"
:
[
"b2_threshold1_rsrp"
,
"b2_threshold2_rsrp"
],
"properties"
:
{
"b2_threshold1_rsrp"
:
{
"title"
:
"Handover B2 event RSRP threshold1"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold1 value in dBm"
,
"type"
:
"number"
},
"b2_threshold2_rsrp"
:
{
"title"
:
"Handover B2 event RSRP threshold2"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold2 value in dBm"
,
"type"
:
"number"
}
}
}
]
},
"hysteresis"
:
{
"title"
:
"NR Handover hysteresis"
,
"description"
:
"Integer, range from 0 to 30. NR B1 or B2 hysteresis in 0.5dB steps."
,
"type"
:
"number"
},
"time_to_trigger"
:
{
"title"
:
"NR Handover time to trigger"
,
"description"
:
"Time in ms during which the NR B1 or B2 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
]
}
}
},
"handover_meas_gap_config"
:
{
"title"
:
"Handover measurement gap configuration"
,
"description"
:
"Configuration of the measurement gap. Ignored if no neighbour cells are configured."
,
"type"
:
"string"
,
"enum"
:
[
"None"
,
"Gap Pattern 0"
,
"Gap Pattern 1"
],
"default"
:
"Gap Pattern 1"
},
"ncell_list"
:
{
"title"
:
"Neighbour Cell Info"
,
"description"
:
"Neighbour Cell Info"
,
"patternProperties"
:
{
".*"
:
{
"properties"
:
{
"dl_earfcn"
:
{
"$ref"
:
"peer/cell/lte/input-schema.json#/properties/dl_earfcn"
},
"pci"
:
{
"$ref"
:
"peer/cell/lte/input-schema.json#/properties/pci"
},
"cell_id"
:
{
"$ref"
:
"peer/cell/lte/input-schema.json#/properties/e_cell_id"
},
"tac"
:
{
"$ref"
:
"peer/cell/lte/input-schema.json#/properties/tac"
,
"default"
:
"0x0001"
}
},
"type"
:
"object"
"$ref"
:
"peer/cell/input-schema.json"
}
},
"type"
:
"object"
,
...
...
software/simpleran/instance-ors-enb.jinja2.cfg
View file @
b49bc3b3
...
...
@@ -123,37 +123,10 @@
{#- inject synthesized peer cells #}
{%- for k, ncell in slapparameter_dict.ncell_list|dictsort %}
{%- set peercell = {'cell_kind': 'enb_peer'} %}
{%- macro _(name, default) %}
{%- if default is defined %}
{%- do peercell.update({name: default}) %}
{%- endif %}
{%- if name in ncell %}
{%- do peercell.update({name: ncell[name]}) %}
{%- endif %}
{%- endmacro %}
{%- if enb_mode == 'enb' %}
{%- do peercell.update({'cell_type': 'lte'}) %}
{%- if 'cell_id' in ncell %}
{%- do peercell.update({'e_cell_id': ncell.cell_id}) %}
{%- endif %}
{%- do _('pci') %}
{%- do _('dl_earfcn') %}
{%- do _('tac', '0x0001') %}
{%- elif enb_mode == 'gnb' %}
{%- do peercell.update({'cell_type': 'nr'}) %}
{%- do _('nr_cell_id') %}
{%- do _('gnb_id_bits') %}
{%- do _('pci') %}
{%- do _('dl_nr_arfcn') %}
{%- do _('ssb_nr_arfcn') %}
{%- do _('tac', 1) %}
{%- do _('nr_band') %}
{%- endif %}
{%- do ishared_list.append({
'slave_title': '%s%s' % (iref('PEERCELL'), k),
'slave_reference': False,
'_':
peer
cell | tojson
'_':
n
cell | tojson
})
%}
{%- endfor %}
...
...
software/simpleran/instance-ors-gnb-input-schema.json
View file @
b49bc3b3
...
...
@@ -78,15 +78,57 @@
"nssai"
:
{
"$ref"
:
"instance-enb-input-schema.json#/properties/nssai"
},
"
nr_handover_a3_offset
"
:
{
"title"
:
"
A3 offset for NR handover
"
,
"description"
:
"
RSRP gain offset between gNBs which will trigger handover
"
,
"
handover_a1_rsrp
"
:
{
"title"
:
"
Handover A1 event RSRP threshold
"
,
"description"
:
"
Integer, range from -140 to -43. RSRP threshold value in dBm.
"
,
"type"
:
"number"
,
"default"
:
6
"default"
:
-70
},
"nr_handover_time_to_trigger"
:
{
"title"
:
"Time to Trigger for NR handover"
,
"description"
:
"Time to triger after which NR handover will be triggerd if A3 offset is reached"
,
"handover_a1_hysteresis"
:
{
"title"
:
"Handover A1 event hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A1 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
,
"default"
:
0
},
"handover_a1_time_to_trigger"
:
{
"title"
:
"Handover A1 event time to trigger"
,
"description"
:
"Time in ms during which the A1 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
],
"default"
:
640
},
"handover_a2_rsrp"
:
{
"title"
:
"Handover A2 event RSRP threshold"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold value in dBm."
,
"type"
:
"number"
,
"default"
:
-80
},
"handover_a2_hysteresis"
:
{
"title"
:
"Handover A2 event hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A2 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
,
"default"
:
0
},
"handover_a2_time_to_trigger"
:
{
"title"
:
"Handover A2 event time to trigger"
,
"description"
:
"Time in ms during which the A2 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
...
...
@@ -106,38 +148,201 @@
2560
,
5120
],
"default"
:
100
"default"
:
640
},
"nr_handover"
:
{
"title"
:
"NR Handover"
,
"type"
:
"object"
,
"default"
:
{
"event"
:
{
"a3_rsrp"
:
6
},
"hysteresis"
:
0
,
"time_to_trigger"
:
480
},
"properties"
:
{
"event"
:
{
"title"
:
"NR Handover event"
,
"type"
:
"object"
,
"oneOf"
:
[
{
"title"
:
"A3 event"
,
"type"
:
"object"
,
"required"
:
[
"a3_rsrp"
],
"properties"
:
{
"a3_rsrp"
:
{
"title"
:
"Handover A3 event RSRP offset"
,
"description"
:
"Integer, range from -140 to -43. RSRP gain offset between eNBs and gNBs which will trigger handover"
,
"type"
:
"number"
}
}
},
{
"title"
:
"A4 event"
,
"type"
:
"object"
,
"required"
:
[
"a4_rsrp"
],
"properties"
:
{
"a4_rsrp"
:
{
"title"
:
"Handover A4 event RSRP threshold"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold value in dBm"
,
"type"
:
"number"
}
}
},
{
"title"
:
"A5 event"
,
"type"
:
"object"
,
"required"
:
[
"a5_threshold1_rsrp"
,
"a5_threshold2_rsrp"
],
"properties"
:
{
"a5_threshold1_rsrp"
:
{
"title"
:
"Handover A5 event RSRP threshold1"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold1 value in dBm"
,
"type"
:
"number"
},
"a5_threshold2_rsrp"
:
{
"title"
:
"Handover A5 event RSRP threshold2"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold2 value in dBm"
,
"type"
:
"number"
}
}
}
]
},
"hysteresis"
:
{
"title"
:
"NR Handover hysteresis"
,
"description"
:
"Integer, range from 0 to 30. A3/A4/A5 hysteresis in 0.5dB steps used for the measurement report triggering condition."
,
"type"
:
"number"
},
"time_to_trigger"
:
{
"title"
:
"NR Handover time to trigger"
,
"description"
:
"Time in ms during which the A3/A4/A5 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
]
}
}
},
"eutra_handover"
:
{
"title"
:
"EUTRA Handover"
,
"type"
:
"object"
,
"default"
:
{
"event"
:
{
"b1_rsrp"
:
-80
},
"hysteresis"
:
0
,
"time_to_trigger"
:
100
},
"properties"
:
{
"event"
:
{
"title"
:
"EUTRA Handover event"
,
"type"
:
"object"
,
"oneOf"
:
[
{
"title"
:
"B1 event"
,
"type"
:
"object"
,
"required"
:
[
"b1_rsrp"
],
"properties"
:
{
"b1_rsrp"
:
{
"title"
:
"Handover B1 event RSRP threshold"
,
"description"
:
"Integer, range from -156 to -30. RSRP threshold value in dBm."
,
"type"
:
"number"
}
}
},
{
"title"
:
"B2 event"
,
"type"
:
"object"
,
"required"
:
[
"b2_threshold1_rsrp"
,
"b2_threshold2_rsrp"
],
"properties"
:
{
"b2_threshold1_rsrp"
:
{
"title"
:
"Handover B2 event RSRP threshold1"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold1 value in dBm"
,
"type"
:
"number"
},
"b2_threshold2_rsrp"
:
{
"title"
:
"Handover B2 event RSRP threshold2"
,
"description"
:
"Integer, range from -140 to -43. RSRP threshold2 value in dBm"
,
"type"
:
"number"
}
}
}
]
},
"hysteresis"
:
{
"title"
:
"EUTRA Handover hysteresis"
,
"description"
:
"Integer, range from 0 to 30. EUTRA B1 or B2 hysteresis in 0.5dB steps."
,
"type"
:
"number"
},
"time_to_trigger"
:
{
"title"
:
"EUTRA Handover time to trigger"
,
"description"
:
"Time in ms during which the EUTRA B1 or B2 event condition must be met before triggering the measurement report."
,
"type"
:
"number"
,
"enum"
:
[
0
,
40
,
64
,
80
,
100
,
128
,
160
,
256
,
320
,
480
,
512
,
640
,
1024
,
1280
,
2560
,
5120
]
}
}
},
"handover_meas_gap_config"
:
{
"title"
:
"Handover measurement gap configuration"
,
"description"
:
"Configuration of the measurement gap. Ignored if no neighbour cells are configured."
,
"type"
:
"string"
,
"enum"
:
[
"None"
,
"Gap Pattern 0"
,
"Gap Pattern 1"
],
"default"
:
"Gap Pattern 1"
},
"ncell_list"
:
{
"title"
:
"Neighbour Cell Info"
,
"description"
:
"Neighbour Cell Info"
,
"patternProperties"
:
{
".*"
:
{
"properties"
:
{
"dl_nr_arfcn"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/dl_nr_arfcn"
},
"ssb_nr_arfcn"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/ssb_nr_arfcn"
},
"pci"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/pci"
},
"nr_cell_id"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/nr_cell_id"
},
"gnb_id_bits"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/gnb_id_bits"
},
"nr_band"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/nr_band"
},
"tac"
:
{
"$ref"
:
"peer/cell/nr/input-schema.json#/properties/tac"
,
"default"
:
1
}
},
"type"
:
"object"
"$ref"
:
"peer/cell/input-schema.json"
}
},
"type"
:
"object"
,
...
...
software/simpleran/peer/cell/common.json
View file @
b49bc3b3
...
...
@@ -6,7 +6,8 @@
"cell_type"
,
"cell_kind"
,
"pci"
,
"tac"
"tac"
,
"plmn"
],
"properties"
:
{
"cell_type"
:
{
...
...
software/simpleran/peer/cell/lte/input-schema.json
View file @
b49bc3b3
...
...
@@ -8,13 +8,17 @@
"pci"
,
"tac"
,
"e_cell_id"
,
"dl_earfcn"
"dl_earfcn"
,
"plmn"
],
"properties"
:
{
"cell_type"
:
{
"$ref"
:
"../../../peer/cell/common.json#/properties/cell_type"
,
"const"
:
"lte"
},
"cell_kind"
:
{
"$ref"
:
"../../../peer/cell/common.json#/properties/cell_kind"
},
"e_cell_id"
:
{
"title"
:
"E-UTRAN Cell ID"
,
"description"
:
"28 bit E-UTRAN cell identity. Concatenation of enb_id and cell_id of the neighbour cell."
,
...
...
@@ -28,6 +32,11 @@
},
"tac"
:
{
"$ref"
:
"../../../cell/lte/input-schema.json#/properties/tac"
},
"plmn"
:
{
"title"
:
"Public Land Mobile Network"
,
"description"
:
"Public Land Mobile Network"
,
"type"
:
"string"
}
}
}
software/simpleran/peer/cell/nr/input-schema.json
View file @
b49bc3b3
...
...
@@ -10,13 +10,17 @@
"nr_cell_id"
,
"gnb_id_bits"
,
"dl_nr_arfcn"
,
"nr_band"
"nr_band"
,
"plmn"
],
"properties"
:
{
"cell_type"
:
{
"$ref"
:
"../../../peer/cell/common.json#/properties/cell_type"
,
"const"
:
"nr"
},
"cell_kind"
:
{
"$ref"
:
"../../../peer/cell/common.json#/properties/cell_kind"
},
"nr_cell_id"
:
{
"title"
:
"NR Cell ID"
,
"description"
:
"Concatenation of gnb_id and cell_id of the neighbour cell"
,
...
...
@@ -44,6 +48,11 @@
},
"tac"
:
{
"$ref"
:
"../../../cell/nr/input-schema.json#/$defs/tac"
},
"plmn"
:
{
"title"
:
"Public Land Mobile Network"
,
"description"
:
"Public Land Mobile Network"
,
"type"
:
"string"
}
}
}
software/simpleran/slaplte.jinja2
View file @
b49bc3b3
...
...
@@ -383,6 +383,7 @@
{%- set ipeercell = ishared %}
{%- if _.cell_type == 'lte' %}
{%- do _.setdefault('ul_earfcn', J(jdefault_ul_earfcn(_.dl_earfcn))) %}
{%- do _.setdefault('lte_band', xearfcn_module.band(_.dl_earfcn)[0]["band"]) %}
{%- elif _.cell_type == 'nr' %}
{%- do _.setdefault('ul_nr_arfcn', J(jdefault_ul_nr_arfcn(_.dl_nr_arfcn, _.nr_band))) %}
{%- do _.setdefault('subcarrier_spacing',
...
...
software/simpleran/test/test.py
View file @
b49bc3b3
...
...
@@ -104,20 +104,22 @@ def TAC(tac):
}
# LTE_PEER/NR_PEER return basic parameters to indicate an LTE/NR ENB-PEER-kind cell.
def
LTE_PEER
(
e_cell_id
,
pci
,
tac
):
def
LTE_PEER
(
e_cell_id
,
pci
,
tac
,
plmn
):
return
{
'cell_kind'
:
'enb_peer'
,
'e_cell_id'
:
'0x%07x'
%
e_cell_id
,
'pci'
:
pci
,
'tac'
:
'0x%x'
%
tac
,
'plmn'
:
plmn
,
}
def
NR_PEER
(
nr_cell_id
,
gnb_id_bits
,
pci
,
tac
):
def
NR_PEER
(
nr_cell_id
,
gnb_id_bits
,
pci
,
tac
,
plmn
):
return
{
'cell_kind'
:
'enb_peer'
,
'nr_cell_id'
:
'0x%09x'
%
nr_cell_id
,
'gnb_id_bits'
:
gnb_id_bits
,
'pci'
:
pci
,
'tac'
:
tac
,
'plmn'
:
plmn
,
}
# X2_PEER/XN_PEER return basic parameters to indicate an LTE/NR ENB peer.
...
...
@@ -345,13 +347,13 @@ class ENBTestCase4(RFTestCase4):
_
(
'PEER4'
,
X2_PEER
(
'44.1.1.1'
))
_
(
'PEER5'
,
XN_PEER
(
'55.1.1.1'
))
_
(
'PEERCELL4'
,
LTE
(
700
)
|
LTE_PEER
(
0x12345
,
35
,
0x123
))
_
(
'PEERCELL5'
,
NR
(
520000
,
38
)
|
NR_PEER
(
0x77712
,
22
,
75
,
0x321
))
_
(
'PEERCELL4'
,
LTE
(
700
)
|
LTE_PEER
(
0x12345
,
35
,
0x123
,
"00101"
))
_
(
'PEERCELL5'
,
NR
(
520000
,
38
)
|
NR_PEER
(
0x77712
,
22
,
75
,
0x321
,
"00101"
))
cls
.
ho_inter
=
[
dict
(
rat
=
'eutra'
,
cell_id
=
0x12345
,
n_id_cell
=
35
,
dl_earfcn
=
700
,
tac
=
0x123
),
dict
(
rat
=
'eutra'
,
cell_id
=
0x12345
,
n_id_cell
=
35
,
dl_earfcn
=
700
,
tac
=
0x123
,
plmn
=
"00101"
),
dict
(
rat
=
'nr'
,
nr_cell_id
=
0x77712
,
gnb_id_bits
=
22
,
n_id_cell
=
75
,
dl_nr_arfcn
=
520000
,
ul_nr_arfcn
=
520000
,
ssb_nr_arfcn
=
520090
,
band
=
38
,
tac
=
0x321
),
tac
=
0x321
,
plmn
=
"00101"
),
]
def
CELLcfg
(
i
):
...
...
software/simpleran/test/test_ors.py
View file @
b49bc3b3
...
...
@@ -44,6 +44,7 @@ param_dict = {
'lte_mock'
:
True
,
'tx_gain'
:
17
,
'rx_gain'
:
17
,
'cell_id'
:
'0x01'
,
'pci'
:
250
,
'tac'
:
'0x1717'
,
'root_sequence_index'
:
'1'
,
...
...
@@ -54,26 +55,58 @@ param_dict = {
'inactivity_timer'
:
17
,
'ncell_list'
:
{
'ORS1'
:
{
'dl_earfcn'
:
40000
,
'dl_nr_arfcn'
:
403500
,
'ssb_nr_arfcn'
:
403500
,
'cell_type'
:
'lte'
,
'cell_kind'
:
'enb_peer'
,
'rat'
:
'eutra'
,
'dl_earfcn'
:
38450
,
'pci'
:
1
,
'n
r_cell_id'
:
'0x0000001'
,
'n
_id_cell'
:
1
,
'cell_id'
:
'0x0000001'
,
'
gnb_id_bits'
:
28
,
'
nr_band'
:
34
,
'
tac'
:
1
'
e_cell_id'
:
'0x0000001'
,
'
tac'
:
1
,
'
plmn'
:
"00101"
},
'ORS2'
:
{
'dl_earfcn'
:
50000
,
'dl_nr_arfcn'
:
519000
,
'ssb_nr_arfcn'
:
519000
,
'cell_type'
:
'lte'
,
'cell_kind'
:
'enb_peer'
,
'rat'
:
'eutra'
,
'dl_earfcn'
:
38050
,
'pci'
:
2
,
'n_id_cell'
:
2
,
'cell_id'
:
'0x0000002'
,
'e_cell_id'
:
'0x0000002'
,
'tac'
:
1
,
'plmn'
:
"00101"
},
'ORS3'
:
{
'cell_type'
:
'nr'
,
'cell_kind'
:
'enb_peer'
,
'rat'
:
'nr'
,
'dl_nr_arfcn'
:
520000
,
'ssb_nr_arfcn'
:
520000
,
'ul_nr_arfcn'
:
520000
,
'pci'
:
1
,
'n_id_cell'
:
1
,
'nr_cell_id'
:
'0x0000001'
,
'gnb_id_bits'
:
28
,
'nr_band'
:
41
,
'tac'
:
1
,
'plmn'
:
"00101"
},
'ORS4'
:
{
'cell_type'
:
'nr'
,
'cell_kind'
:
'enb_peer'
,
'rat'
:
'nr'
,
'dl_nr_arfcn'
:
380000
,
'ssb_nr_arfcn'
:
380000
,
'ul_nr_arfcn'
:
380000
,
'pci'
:
2
,
'n_id_cell'
:
2
,
'nr_cell_id'
:
'0x0000002'
,
'cell_id'
:
'0x0000001'
,
'gnb_id_bits'
:
30
,
'nr_band'
:
38
,
'tac'
:
2
'nr_band'
:
39
,
'tac'
:
2
,
'plmn'
:
"00101"
},
},
}
...
...
@@ -91,20 +124,6 @@ enb_param_dict = {
'10.0.0.1'
:
{
'mme_addr'
:
'10.0.0.1'
},
'2001:db8::1'
:
{
'mme_addr'
:
'2001:db8::1'
},
},
'ncell_list'
:
{
'ORS1'
:
{
'dl_earfcn'
:
40000
,
'pci'
:
1
,
'cell_id'
:
'0x0000001'
,
'tac'
:
1
},
'ORS2'
:
{
'dl_earfcn'
:
50000
,
'pci'
:
2
,
'cell_id'
:
'0x0000001'
,
'tac'
:
2
},
},
'xlog_forwarding_enabled'
:
False
,
}
gnb_param_dict
=
{
...
...
@@ -130,26 +149,6 @@ gnb_param_dict = {
'xn_addr'
:
'2001:db8::2'
,
},
},
'ncell_list'
:
{
'ORS1'
:
{
'dl_nr_arfcn'
:
403500
,
'ssb_nr_arfcn'
:
403500
,
'pci'
:
1
,
'nr_cell_id'
:
'0x0000001'
,
'gnb_id_bits'
:
28
,
'nr_band'
:
34
,
'tac'
:
1
},
'ORS2'
:
{
'dl_nr_arfcn'
:
519000
,
'ssb_nr_arfcn'
:
519000
,
'pci'
:
2
,
'nr_cell_id'
:
'0x0000002'
,
'gnb_id_bits'
:
30
,
'nr_band'
:
38
,
'tac'
:
2
},
},
'xlog_forwarding_enabled'
:
False
,
}
gnb_param_dict1
=
{
...
...
@@ -206,14 +205,30 @@ class TestENBParameters(ORSTestCase):
self
.
assertEqual
(
p
[
'mme_addr'
],
enb_param_dict
[
'mme_list'
][
p
[
'mme_addr'
]][
'mme_addr'
])
for
p
in
conf
[
'cell_list'
][
0
][
'ncell_list'
]:
for
k
in
enb_param_dict
[
'ncell_list'
]:
if
p
[
'dl_earfcn'
]
==
gnb_param_dict1
[
'ncell_list'
][
k
][
'dl_earfcn'
]:
break
conf_ncell
=
enb_param_dict
[
'ncell_list'
][
k
]
self
.
assertEqual
(
p
[
'dl_earfcn'
],
conf_ncell
[
'dl_earfcn'
])
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'cell_id'
],
int
(
conf_ncell
[
'cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
for
k
in
param_dict
[
'ncell_list'
]:
if
'dl_earfcn'
in
p
:
if
p
[
'dl_earfcn'
]
==
param_dict
[
'ncell_list'
][
k
].
get
(
'dl_earfcn'
,
0
):
break
elif
'dl_nr_arfcn'
in
p
:
if
p
[
'dl_nr_arfcn'
]
==
param_dict
[
'ncell_list'
][
k
].
get
(
'dl_nr_arfcn'
,
0
):
break
conf_ncell
=
param_dict
[
'ncell_list'
][
k
]
if
'dl_earfcn'
in
p
:
self
.
assertEqual
(
p
[
'dl_earfcn'
],
conf_ncell
[
'dl_earfcn'
])
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'cell_id'
],
int
(
conf_ncell
[
'cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
self
.
assertEqual
(
p
[
'plmn'
],
conf_ncell
[
'plmn'
])
elif
'dl_nr_arfcn'
in
p
:
self
.
assertEqual
(
p
[
'dl_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ssb_nr_arfcn'
],
conf_ncell
[
'ssb_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ul_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
# assumes nr_band is TDD
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'gnb_id_bits'
],
conf_ncell
[
'gnb_id_bits'
])
self
.
assertEqual
(
p
[
'nr_cell_id'
],
int
(
conf_ncell
[
'nr_cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
self
.
assertEqual
(
p
[
'band'
],
conf_ncell
[
'nr_band'
])
self
.
assertEqual
(
p
[
'plmn'
],
conf_ncell
[
'plmn'
])
class
TestGNBParameters1
(
ORSTestCase
):
...
...
@@ -244,20 +259,35 @@ class TestGNBParameters1(ORSTestCase):
self
.
assertEqual
(
p
[
'amf_addr'
],
gnb_param_dict1
[
'amf_list'
][
p
[
'amf_addr'
]][
'amf_addr'
])
for
p
in
conf
[
'xn_peers'
]:
self
.
assertEqual
(
p
,
gnb_param_dict1
[
'xn_peers'
][
p
][
'xn_addr'
])
for
p
in
conf
[
'nr_cell_list'
][
0
][
'ncell_list'
]:
for
k
in
gnb_param_dict1
[
'ncell_list'
]:
if
p
[
'dl_nr_arfcn'
]
==
gnb_param_dict1
[
'ncell_list'
][
k
][
'dl_nr_arfcn'
]:
break
conf_ncell
=
gnb_param_dict1
[
'ncell_list'
][
k
]
self
.
assertEqual
(
p
[
'dl_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ssb_nr_arfcn'
],
conf_ncell
[
'ssb_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ul_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
# assumes nr_band is TDD
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'gnb_id_bits'
],
conf_ncell
[
'gnb_id_bits'
])
self
.
assertEqual
(
p
[
'nr_cell_id'
],
int
(
conf_ncell
[
'nr_cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
self
.
assertEqual
(
p
[
'band'
],
conf_ncell
[
'nr_band'
])
for
k
in
param_dict
[
'ncell_list'
]:
if
'dl_earfcn'
in
p
:
if
p
[
'dl_earfcn'
]
==
param_dict
[
'ncell_list'
][
k
].
get
(
'dl_earfcn'
,
0
):
break
elif
'dl_nr_arfcn'
in
p
:
if
p
[
'dl_nr_arfcn'
]
==
param_dict
[
'ncell_list'
][
k
].
get
(
'dl_nr_arfcn'
,
0
):
break
conf_ncell
=
param_dict
[
'ncell_list'
][
k
]
if
'dl_earfcn'
in
p
:
self
.
assertEqual
(
p
[
'dl_earfcn'
],
conf_ncell
[
'dl_earfcn'
])
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'cell_id'
],
int
(
conf_ncell
[
'cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
self
.
assertEqual
(
p
[
'plmn'
],
conf_ncell
[
'plmn'
])
elif
'dl_nr_arfcn'
in
p
:
self
.
assertEqual
(
p
[
'dl_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ssb_nr_arfcn'
],
conf_ncell
[
'ssb_nr_arfcn'
])
self
.
assertEqual
(
p
[
'ul_nr_arfcn'
],
conf_ncell
[
'dl_nr_arfcn'
])
# assumes nr_band is TDD
self
.
assertEqual
(
p
[
'n_id_cell'
],
conf_ncell
[
'pci'
])
self
.
assertEqual
(
p
[
'gnb_id_bits'
],
conf_ncell
[
'gnb_id_bits'
])
self
.
assertEqual
(
p
[
'nr_cell_id'
],
int
(
conf_ncell
[
'nr_cell_id'
],
16
))
self
.
assertEqual
(
p
[
'tac'
],
conf_ncell
[
'tac'
])
self
.
assertEqual
(
p
[
'band'
],
conf_ncell
[
'nr_band'
])
self
.
assertEqual
(
p
[
'plmn'
],
conf_ncell
[
'plmn'
])
tdd_config
=
conf
[
'nr_cell_list'
][
0
][
'tdd_ul_dl_config'
][
'pattern1'
]
self
.
assertEqual
(
float
(
tdd_config
[
'period'
]),
2.5
)
self
.
assertEqual
(
int
(
tdd_config
[
'dl_slots'
]),
3
)
self
.
assertEqual
(
int
(
tdd_config
[
'dl_symbols'
]),
10
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment