Commit 7d27f4f8 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 71779183
Changelog Changelog
========= =========
Version 1.0.332 (2023-09-04)
-------------
* Add 4G Intra eNB Handover
* Add public websocket URL protected by password
* Reorganize softwares: ORS now need to use software-tdd-ors or software-fdd-ors
* Support multiple cells for BBUs
Version 1.0.330 (2023-07-19) Version 1.0.330 (2023-07-19)
------------- -------------
......
...@@ -226,7 +226,14 @@ ...@@ -226,7 +226,14 @@
rx_gain: {{ rx_gain }}, rx_gain: {{ rx_gain }},
{%- if slapparameter_dict.get('websocket_password', '') %}
com_addr: "[{{ gtp_addr_v6 }}]:9001",
com_auth: {
password: "{{ slapparameter_dict['websocket_password'] }}",
},
{%- else %}
com_addr: "127.0.1.2:9001", com_addr: "127.0.1.2:9001",
{%- endif %}
mme_list: [ mme_list: [
{% if slapparameter_dict.get('mme_list', '') %} {% if slapparameter_dict.get('mme_list', '') %}
...@@ -452,6 +459,23 @@ ...@@ -452,6 +459,23 @@
t_PollRetransmit: 60, t_PollRetransmit: 60,
} }
], ],
meas_config_desc: {
a1_report_type: "rsrp",
a1_rsrp: -70,
a1_hysteresis: 0,
a1_time_to_trigger: 640,
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) }},
},
meas_gap_config: "gp0",
ho_from_meas: true,
}, },
// NR cells (TODO) // NR cells (TODO)
......
...@@ -53,7 +53,14 @@ ...@@ -53,7 +53,14 @@
tx_gain: {{ tx_gain }}, tx_gain: {{ tx_gain }},
rx_gain: {{ rx_gain }}, rx_gain: {{ rx_gain }},
{% endif %} {% endif %}
{%- if slapparameter_dict.get('websocket_password', '') %}
com_addr: "[{{ gtp_addr_v6 }}]:9001",
com_auth: {
password: "{{ slapparameter_dict['websocket_password'] }}",
},
{%- else %}
com_addr: "127.0.1.2:9001", com_addr: "127.0.1.2:9001",
{%- endif %}
amf_list: [ amf_list: [
{% if slapparameter_dict.get('amf_list', '') %} {% if slapparameter_dict.get('amf_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['amf_list']) %} {%- for i, k in enumerate(slapparameter_dict['amf_list']) %}
......
...@@ -95,6 +95,12 @@ ...@@ -95,6 +95,12 @@
"default": "0x0001", "default": "0x0001",
"type": "string" "type": "string"
}, },
"root_sequence_index": {
"title": "Root Sequence Index",
"description": "Range: 0 to 837. Set the PRACH root sequence index (SIB2.rootSequenceIndex field). It must be different for each neighbour cell operating on the same frequency and sharing the same PRACH configuration.",
"type": "number",
"default": 204
},
{%- else %} {%- else %}
"cell_list": { "cell_list": {
"title": "Cell List", "title": "Cell List",
...@@ -142,7 +148,7 @@ ...@@ -142,7 +148,7 @@
"title": "Cell ID", "title": "Cell ID",
"description": "Cell IDs", "description": "Cell IDs",
"type": "string" "type": "string"
}, }
}, },
"type": "object" "type": "object"
} }
...@@ -290,6 +296,74 @@ ...@@ -290,6 +296,74 @@
"type": "object", "type": "object",
"default": {} "default": {}
}, },
"lte_handover_a3_offset": {
"title": "A3 offset for LTE handover",
"description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number",
"default": 6
},
"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",
"type": "number",
"enum": [
0,
40,
64,
80,
100,
128,
160,
256,
320,
480,
512,
640,
1024,
1280,
2560,
5120
],
"default": 480
},
"ncell_list": {
"title": "Neighbour Cell Info",
"description": "Neighbour Cell Info",
"patternProperties": {
".*": {
"properties": {
"dl_earfcn": {
"title": "DL EARFCN",
"description": "Downlink E-UTRA Absolute Radio Frequency Channel Number of the neighbour cell",
"type": "number"
},
"pci": {
"title": "Physical Cell ID",
"description": "Physical Cell ID of the neighbour cell",
"type": "number"
},
"cell_id": {
"title": "Cell ID",
"description": "Concatenation of enb_id and cell_id of the neighbour cell",
"type": "string"
},
"tac": {
"title": "Tracking Area Code",
"description": "Integer (range 0 to 16777215)",
"type": "number"
}
},
"type": "object"
}
},
"type": "object",
"default": {}
},
"websocket_password": {
"title": "Websocket password",
"description": "Activates websocket for remote control and sets password",
"type": "string"
},
"inactivity_timer": { "inactivity_timer": {
"title": "Inactivity Timer", "title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.", "description": "Send RRC connection release after this time (in ms) of network inactivity.",
...@@ -349,6 +423,21 @@ ...@@ -349,6 +423,21 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"xlog_fluentbit_forward_host": {
"title": "Address to Forward Xlog by Fluenbit",
"description": "Address of Remote Fluentd or Fluentbit Server to Forward Xlog",
"type": "string"
},
"xlog_fluentbit_forward_port": {
"title": "Port to Forward Xlog by Fluentbit",
"description": "Optional Port of Remote Fluentd or Fluentbit Server to Forward Xlog",
"type": "string"
},
"xlog_fluentbit_forward_shared_key": {
"title": "Shared Key to Forward Xlog by Fluentbit",
"description": "Secret Key Shared with Remote Fluentd or Fluentbit Server for Authentication when Forwarding Xlog",
"type": "string"
} }
} }
} }
...@@ -5,6 +5,9 @@ parts = ...@@ -5,6 +5,9 @@ parts =
enb-config enb-config
enb-service enb-service
xamari-xlog-service xamari-xlog-service
{% if slapparameter_dict.get('xlog_fluentbit_forward_host') %}
xlog-fluentbit-service
{% endif %}
amarisoft-stats-service amarisoft-stats-service
amarisoft-rf-info-service amarisoft-rf-info-service
# XXX -> ru/lopcomm # XXX -> ru/lopcomm
...@@ -177,7 +180,11 @@ drb_stats_logspec = ...@@ -177,7 +180,11 @@ drb_stats_logspec =
{%- endif %} {%- endif %}
rotatespec = 100MB.9 rotatespec = 100MB.9
logspec = ${:stats_logspec} ${:drb_stats_logspec} logspec = ${:stats_logspec} ${:drb_stats_logspec}
{%- if slapparameter_dict.get("websocket_password", "") %}
websock = ws://[${slap-configuration:ipv6-random}]:9001
{%- else %}
websock = ws://127.0.1.2:9001 websock = ws://127.0.1.2:9001
{%- endif %}
xamari = {{ buildout_directory }}/bin/xamari xamari = {{ buildout_directory }}/bin/xamari
logfile = ${monitor-directory:public}/enb.xlog logfile = ${monitor-directory:public}/enb.xlog
inline = inline =
...@@ -190,6 +197,43 @@ wrapper-path = ${directory:service}/${:_buildout_section_name_} ...@@ -190,6 +197,43 @@ wrapper-path = ${directory:service}/${:_buildout_section_name_}
command-line = ${xamari-xlog-script:output} command-line = ${xamari-xlog-script:output}
hash-files = ${:command-line} hash-files = ${:command-line}
{% if slapparameter_dict.get('xlog_fluentbit_forward_host') %}
[xlog-fluentbit-config]
recipe = slapos.recipe.template
output = ${directory:etc}/${:_buildout_section_name_}.cfg
logfile = ${xamari-xlog-script:logfile}
forward-host = {{ slapparameter_dict.get('xlog_fluentbit_forward_host', '') }}
forward-port = {{ slapparameter_dict.get('xlog_fluentbit_forward_port', '') }}
forward-shared-key = {{ slapparameter_dict.get('xlog_fluentbit_forward_shared_key', '') }}
forward-self-hostname = {{ ors_id['ors-id'] }}
inline =
[SERVICE]
flush 5
[INPUT]
name tail
path ${:logfile}
Read_from_Head True
[OUTPUT]
name forward
match *
Host ${:forward-host}
{%- if slapparameter_dict.get('xlog_fluentbit_forward_port') %}
Port ${:forward-port}
{%- endif %}
Shared_Key ${:forward-shared-key}
Self_Hostname ${:forward-self-hostname}
tls on
tls.verify off
[xlog-fluentbit-service]
recipe = slapos.cookbook:wrapper
fluentbit = {{ fluent_bit_location }}/bin/fluent-bit
fluentbit-config = ${xlog-fluentbit-config:output}
command-line = ${:fluentbit} -c ${:fluentbit-config}
wrapper-path = ${directory:service}/${:_buildout_section_name_}
hash-files = ${:fluentbit-config}
{% endif %}
[amarisoft-stats-template] [amarisoft-stats-template]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do extensions = jinja2.ext.do
...@@ -341,6 +385,9 @@ extra-context = ...@@ -341,6 +385,9 @@ extra-context =
[publish-connection-information] [publish-connection-information]
<= monitor-publish <= monitor-publish
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
{%- if slapparameter_dict.get("websocket_password", "") %}
websocket_url = ws://[${slap-configuration:ipv6-random}]:9001
{%- endif %}
enb-ipv6 = ${slap-configuration:ipv6-random} enb-ipv6 = ${slap-configuration:ipv6-random}
enb-ipv4 = {{ lan_ipv4 }} enb-ipv4 = {{ lan_ipv4 }}
ors-version = {{ ors_version['ors-version'] }} ors-version = {{ ors_version['ors-version'] }}
......
...@@ -13,6 +13,7 @@ extends = ...@@ -13,6 +13,7 @@ extends =
../../component/pygolang/buildout.cfg ../../component/pygolang/buildout.cfg
../../component/git/buildout.cfg ../../component/git/buildout.cfg
../../component/dnsmasq/buildout.cfg ../../component/dnsmasq/buildout.cfg
../../component/fluent-bit/buildout.cfg
parts += parts +=
template template
......
...@@ -54,6 +54,7 @@ param_dict = { ...@@ -54,6 +54,7 @@ param_dict = {
'enb_id': '0x17', 'enb_id': '0x17',
'pci': 250, 'pci': 250,
'tac': '0x1717', 'tac': '0x1717',
'root_sequence_index': '1',
'mme_list': { 'mme_list': {
'10.0.0.1': {'mme_addr': '10.0.0.1'}, '10.0.0.1': {'mme_addr': '10.0.0.1'},
'2001:db8::1': {'mme_addr': '2001:db8::1'}, '2001:db8::1': {'mme_addr': '2001:db8::1'},
...@@ -78,19 +79,23 @@ param_dict = { ...@@ -78,19 +79,23 @@ param_dict = {
'nr_handover_a3_offset': 10, 'nr_handover_a3_offset': 10,
'ncell_list': { 'ncell_list': {
'ORS1': { 'ORS1': {
'dl_earfcn': 100000,
'dl_nr_arfcn': 100000, 'dl_nr_arfcn': 100000,
'ssb_nr_arfcn': 100000, 'ssb_nr_arfcn': 100000,
'pci': 1, 'pci': 1,
'nr_cell_id': '0x0000001', 'nr_cell_id': '0x0000001',
'cell_id': '0x0000001',
'gnb_id_bits': 28, 'gnb_id_bits': 28,
'nr_band': 1, 'nr_band': 1,
'tac': 1 'tac': 1
}, },
'ORS2': { 'ORS2': {
'dl_earfcn': 200000,
'dl_nr_arfcn': 200000, 'dl_nr_arfcn': 200000,
'ssb_nr_arfcn': 200000, 'ssb_nr_arfcn': 200000,
'pci': 2, 'pci': 2,
'nr_cell_id': '0x0000002', 'nr_cell_id': '0x0000002',
'cell_id': '0x0000001',
'gnb_id_bits': 30, 'gnb_id_bits': 30,
'nr_band': 2, 'nr_band': 2,
'tac': 2 'tac': 2
...@@ -145,12 +150,23 @@ def test_enb_conf(self): ...@@ -145,12 +150,23 @@ def test_enb_conf(self):
self.assertEqual(conf['enb_id'], int(enb_param_dict['enb_id'], 16)) self.assertEqual(conf['enb_id'], int(enb_param_dict['enb_id'], 16))
self.assertEqual(conf['cell_list'][0]['n_id_cell'], enb_param_dict['pci']) self.assertEqual(conf['cell_list'][0]['n_id_cell'], enb_param_dict['pci'])
self.assertEqual(conf['cell_list'][0]['tac'], int(enb_param_dict['tac'], 16)) self.assertEqual(conf['cell_list'][0]['tac'], int(enb_param_dict['tac'], 16))
self.assertEqual(conf['cell_list'][0]['root_sequence_index'], int(enb_param_dict['root_sequence_index']))
for p in conf['cell_default']['plmn_list']: for p in conf['cell_default']['plmn_list']:
for n in "plmn attach_without_pdn reserved".split(): for n in "plmn attach_without_pdn reserved".split():
self.assertEqual(p[n], enb_param_dict['plmn_list'][p['plmn']][n]) self.assertEqual(p[n], enb_param_dict['plmn_list'][p['plmn']][n])
for p in conf['mme_list']: for p in conf['mme_list']:
self.assertEqual(p['mme_addr'], enb_param_dict['mme_list'][p['mme_addr']]['mme_addr']) 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'])
with open(conf_file, 'r') as f: with open(conf_file, 'r') as f:
for l in f: for l in f:
if l.startswith('#define N_RB_DL'): if l.startswith('#define N_RB_DL'):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment