Commit d56a2e93 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 1909a9e6
...@@ -6,9 +6,15 @@ ...@@ -6,9 +6,15 @@
rf_driver: { rf_driver: {
name: "sdr", name: "sdr",
args: "dev0=/dev/sdr0,dev1=/dev/sdr1", args: "dev0=/dev/sdr0,dev1=/dev/sdr1,dev2=/dev/sdr2@0,dev3=/dev/sdr2@1",
rx_antenna:"tx_rx", rx_antenna:"tx_rx",
tdd_tx_mod: 1, tdd_tx_mod: 1,
cpri_mapping: ",,standard,standard",
cpri_mult: ",,8,8",
cpri_rx_delay: ",,10,10",
cpri_tx_delay: ",,11,11",
cpri_tx_dbm: ",,50,50",
ifname: ",,slaptap9-0,slaptap9-1",
}, },
...@@ -65,6 +71,43 @@ ...@@ -65,6 +71,43 @@
dl_earfcn: 38100, dl_earfcn: 38100,
tac: 0x0001, tac: 0x0001,
}, },
{
rat: "nr",
nr_cell_id: 0x123450x03, // -> CELL1_c
n_id_cell: 3,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
{
rat: "eutra",
cell_id: 0x1A2D00x21, // -> CELL2_a
n_id_cell: 21,
dl_earfcn: 3350,
tac: 0x0001,
},
{
rat: "nr",
nr_cell_id: 0x123450x22, // -> CELL2_b
n_id_cell: 22,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
// Inter-ENB HO // Inter-ENB HO
...@@ -76,6 +119,10 @@ ...@@ -76,6 +119,10 @@
cell_id: 0x02, // + CELL1_b cell_id: 0x02, // + CELL1_b
cross_carrier_scheduling: false, cross_carrier_scheduling: false,
}, },
{
cell_id: 0x21, // + CELL2_a
cross_carrier_scheduling: false,
},
], ],
...@@ -635,6 +682,43 @@ ...@@ -635,6 +682,43 @@
dl_earfcn: 38050, dl_earfcn: 38050,
tac: 0x0001, tac: 0x0001,
}, },
{
rat: "nr",
nr_cell_id: 0x123450x03, // -> CELL1_c
n_id_cell: 3,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
{
rat: "eutra",
cell_id: 0x1A2D00x21, // -> CELL2_a
n_id_cell: 21,
dl_earfcn: 3350,
tac: 0x0001,
},
{
rat: "nr",
nr_cell_id: 0x123450x22, // -> CELL2_b
n_id_cell: 22,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
// Inter-ENB HO // Inter-ENB HO
...@@ -646,6 +730,10 @@ ...@@ -646,6 +730,10 @@
cell_id: 0x01, // + CELL1_a cell_id: 0x01, // + CELL1_a
cross_carrier_scheduling: false, cross_carrier_scheduling: false,
}, },
{
cell_id: 0x21, // + CELL2_a
cross_carrier_scheduling: false,
},
], ],
...@@ -1180,6 +1268,613 @@ ...@@ -1180,6 +1268,613 @@
logicalChannelSR_Prohibit: false, logicalChannelSR_Prohibit: false,
}, },
}, },
]
},
// CELL2_a
{
rf_port: 1,
n_antenna_dl: 2,
n_antenna_ul: 1,
cell_id: 0x21,
tac: 0x0001,
n_id_cell: 21,
dl_earfcn: 3350,
root_sequence_index: 207,
// Handover XXX same code for both LTE and NR
ncell_list: [
// Intra-ENB HO
{
rat: "eutra",
cell_id: 0x1A2D00x01, // -> CELL1_a
n_id_cell: 1,
dl_earfcn: 38050,
tac: 0x0001,
},
{
rat: "eutra",
cell_id: 0x1A2D00x02, // -> CELL1_b
n_id_cell: 2,
dl_earfcn: 38100,
tac: 0x0001,
},
{
rat: "nr",
nr_cell_id: 0x123450x03, // -> CELL1_c
n_id_cell: 3,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
{
rat: "nr",
nr_cell_id: 0x123450x22, // -> CELL2_b
n_id_cell: 22,
gnb_id_bits
dl_nr_arfcn
ssb_nr_arfcn
ul_nr_arfcn
tac
band
ssb_subcarrier_spacing: 30,
ssb_period: 20,
ssb_offset: 0,
ssb_duration: 1,
},
// Inter-ENB HO
],
// Carrier Aggregation // XXX + CA LTE-NR
scell_list: [
{
cell_id: 0x01, // + CELL1_a
cross_carrier_scheduling: false,
},
{
cell_id: 0x02, // + CELL1_b
cross_carrier_scheduling: false,
},
],
// tune LTE parameters for the cell
n_rb_dl: 25,
si_coderate: 0.2,
pdsch_dedicated: {
p_a: -3,
p_b: -1,
},
pdcch_format: 2,
prach_config_index: 4,
initial_cqi: 3,
pucch_dedicated: {
n1_pucch_sr_count: 11,
cqi_pucch_n_rb: 1,
n1_pucch_an_cs_count: 8,
n3_pucch_an_n_rb: 3,
},
m_ri: 8,
transmission_mode: 3,
srs_dedicated: {
srs_bandwidth_config: 2,
srs_bandwidth: 3,
srs_subframe_config: 3,
srs_period: 40,
srs_hopping_bandwidth: 0,
},
drb_config:
[
{
qci: 1,
ims_dedicated_bearer: true,
pdcp_config: {
discardTimer: 100,
pdcp_SN_Size: 7,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 12,
pdcp_SN_SizeDL: 12,
statusReportRequired: false,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 5,
},
dl_um: {
sn_FieldLength: 5,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 7,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 2,
ims_dedicated_bearer: true,
pdcp_config: {
discardTimer: 150,
pdcp_SN_Size: 12,
},
nr_pdcp_config: {
discardTimer: 150,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 10,
},
dl_um: {
sn_FieldLength: 10,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 9,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 3,
pdcp_config: {
discardTimer: 100,
pdcp_SN_Size: 12,
},
nr_pdcp_config: {
discardTimer: 100,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 10,
},
dl_um: {
sn_FieldLength: 10,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 8,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 4,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 10,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 65,
ims_dedicated_bearer: true,
pdcp_config: {
discardTimer: 100,
pdcp_SN_Size: 7,
},
nr_pdcp_config: {
discardTimer: 100,
pdcp_SN_SizeUL: 12,
pdcp_SN_SizeDL: 12,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 5,
},
dl_um: {
sn_FieldLength: 5,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 5,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 66,
ims_dedicated_bearer: true,
pdcp_config: {
discardTimer: 150,
pdcp_SN_Size: 12,
},
nr_pdcp_config: {
discardTimer: 150,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 10,
},
dl_um: {
sn_FieldLength: 10,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 7,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 67,
ims_dedicated_bearer: true,
pdcp_config: {
discardTimer: 100,
pdcp_SN_Size: 12,
},
nr_pdcp_config: {
discardTimer: 100,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 10,
},
dl_um: {
sn_FieldLength: 10,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 6,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 5,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 6,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 6,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 12,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 2,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 7,
pdcp_config: {
discardTimer: 100,
pdcp_SN_Size: 12,
},
nr_pdcp_config: {
discardTimer: 100,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: false,
outOfOrderDelivery: false,
t_Reordering: 0,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_um: {
sn_FieldLength: 10,
},
dl_um: {
sn_FieldLength: 10,
t_Reordering: 35,
},
},
logical_channel_config: {
priority: 13,
prioritisedBitRate: 0,
bucketSizeDuration: 100,
logicalChannelGroup: 2,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 8,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 14,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 2,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 9,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
},
en_dc_split: {
type: "scg",
ul_data_threshold: 0
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 15,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 3,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 69,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 4,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 1,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
{
qci: 70,
pdcp_config: {
discardTimer: 0,
statusReportRequired: true,
},
nr_pdcp_config: {
discardTimer: 0,
pdcp_SN_SizeUL: 18,
pdcp_SN_SizeDL: 18,
statusReportRequired: true,
outOfOrderDelivery: false,
restrict_to_ng_enb: true,
},
rlc_config: {
ul_am: {
t_PollRetransmit: 80,
pollPDU: 64,
pollByte: 125,
maxRetxThreshold: 32,
},
dl_am: {
t_Reordering: 35,
t_StatusProhibit: 10,
},
},
logical_channel_config: {
priority: 11,
prioritisedBitRate: 8,
bucketSizeDuration: 100,
logicalChannelGroup: 2,
logicalChannelSR_Mask: false,
logicalChannelSR_Prohibit: false,
},
},
] ]
}, },
], ],
......
...@@ -12,6 +12,19 @@ json_params_empty = """{ ...@@ -12,6 +12,19 @@ json_params_empty = """{
}""" }"""
# iSHARED appends new shared instance with specified configuration to shared_instance_list.
shared_instance_list = []
def iSHARED(title, slave_reference, cfg):
ishared = {
'slave_title': title,
'slave_reference': slave_reference,
'slap_software_type': "enb",
'_': json.dumps(cfg)
}
shared_instance_list.append(ishared)
return ishared
# 3 cells sharing SDR-based RU consisting of 2 SDR boards (4tx + 4rx ports max) # 3 cells sharing SDR-based RU consisting of 2 SDR boards (4tx + 4rx ports max)
# RU definition is embedded into cell for simplicity of management # RU definition is embedded into cell for simplicity of management
RU1 = { RU1 = {
...@@ -22,7 +35,7 @@ RU1 = { ...@@ -22,7 +35,7 @@ RU1 = {
'n_antenna_ul': 2, 'n_antenna_ul': 2,
} }
CELL1_a = { iSHARED('Cell 1a', '_CELL1_a', {
'cell_type': 'lte', 'cell_type': 'lte',
'rf_mode': 'tdd', 'rf_mode': 'tdd',
'bandwidth': '5 MHz', 'bandwidth': '5 MHz',
...@@ -30,9 +43,9 @@ CELL1_a = { ...@@ -30,9 +43,9 @@ CELL1_a = {
'pci': 1, 'pci': 1,
'cell_id': '0x01', 'cell_id': '0x01',
'ru': RU1, # RU definition embedded into CELL 'ru': RU1, # RU definition embedded into CELL
} })
CELL1_b = { iSHARED('Cell 1b', '_CELL1_b', {
'cell_type': 'lte', 'cell_type': 'lte',
'rf_mode': 'tdd', 'rf_mode': 'tdd',
'bandwidth': '5 MHz', 'bandwidth': '5 MHz',
...@@ -43,9 +56,9 @@ CELL1_b = { ...@@ -43,9 +56,9 @@ CELL1_b = {
'ru_type': 'ruincell_ref', 'ru_type': 'ruincell_ref',
'ruincell_ref': 'CELL1_a' 'ruincell_ref': 'CELL1_a'
} }
} })
CELL1_c = { iSHARED('Cell 1c', '_CELL1_c', {
'cell_type': 'nr', 'cell_type': 'nr',
'rf_mode': 'tdd', 'rf_mode': 'tdd',
'bandwidth': 5, 'bandwidth': 5,
...@@ -57,7 +70,7 @@ CELL1_c = { ...@@ -57,7 +70,7 @@ CELL1_c = {
'ru_type': 'ruincell_ref', # CELL1_c shares RU with CELL1_a and CELL1_b 'ru_type': 'ruincell_ref', # CELL1_c shares RU with CELL1_a and CELL1_b
'ruincell_ref': 'CELL1_b' # referring to RU via CELL1_b -> CELL1_a 'ruincell_ref': 'CELL1_b' # referring to RU via CELL1_b -> CELL1_a
} }
} })
# LTE + NR cells that use CPRI-based Lopcomm radio units # LTE + NR cells that use CPRI-based Lopcomm radio units
# here we instantiate RUs separately since embedding RU into a cell is demonstrated by CELL1_a above # here we instantiate RUs separately since embedding RU into a cell is demonstrated by CELL1_a above
...@@ -82,7 +95,11 @@ RU2_b = copy.deepcopy(RU2_a) ...@@ -82,7 +95,11 @@ RU2_b = copy.deepcopy(RU2_a)
RU2_b['mac_addr'] = 'YYY' RU2_b['mac_addr'] = 'YYY'
RU2_b['cpri_link']['sfp_port'] = 1 RU2_b['cpri_link']['sfp_port'] = 1
CELL2_a = { iSHARED('Radio Unit 2a', '_RU2_a', RU2_a)
iSHARED('Radio Unit 2b', '_RU2_b', RU2_b)
iSHARED('Cell 2a', '_CELL2_a', {
'cell_type': 'lte', 'cell_type': 'lte',
'rf_mode': 'fdd', 'rf_mode': 'fdd',
'bandwidth': '5 MHz', 'bandwidth': '5 MHz',
...@@ -93,9 +110,9 @@ CELL2_a = { ...@@ -93,9 +110,9 @@ CELL2_a = {
'ru_type': 'ru_ref', 'ru_type': 'ru_ref',
'ru_ref': 'RU2_a' 'ru_ref': 'RU2_a'
} }
} })
CELL2_b = { iSHARED('Cell 2b', '_CELL2_b', {
'cell_type': 'nr', 'cell_type': 'nr',
'rf_mode': 'fdd', 'rf_mode': 'fdd',
'bandwidth': 5, 'bandwidth': 5,
...@@ -107,16 +124,10 @@ CELL2_b = { ...@@ -107,16 +124,10 @@ CELL2_b = {
'ru_type': 'ru_ref', 'ru_type': 'ru_ref',
'ru_ref': 'RU2_b' 'ru_ref': 'RU2_b'
} }
} })
jjdumps = lambda obj: json.dumps(json.dumps(obj))
jCELL1_a = jjdumps(CELL1_a) jshared_instance_list = json.dumps(shared_instance_list)
jCELL1_b = jjdumps(CELL1_b)
jCELL1_c = jjdumps(CELL1_c)
jCELL2_a = jjdumps(CELL2_a)
jCELL2_b = jjdumps(CELL2_b)
jRU2_a = jjdumps(RU2_a)
jRU2_b = jjdumps(RU2_b)
json_params = """{ json_params = """{
"earfcn": 126357, "earfcn": 126357,
"tx_gain": 50, "tx_gain": 50,
...@@ -137,20 +148,7 @@ json_params = """{ ...@@ -137,20 +148,7 @@ json_params = """{
"configuration.default_n_antenna_dl": 2, "configuration.default_n_antenna_dl": 2,
"configuration.default_n_antenna_ul": 2, "configuration.default_n_antenna_ul": 2,
"configuration.default_nr_inactivity_timer": 10000, "configuration.default_nr_inactivity_timer": 10000,
"slave-instance-list": [ "slave-instance-list": %(jshared_instance_list)s
{
"slave_title": "Cell 1a",
"slave_reference": "_CELL1_a",
"slap_software_type": "enb",
"_": %(jCELL1_a)s
},
{
"slave_title": "Cell 1b",
"slave_reference": "_CELL1_b",
"slap_software_type": "enb",
"_": %(jCELL1_b)s
}
]
}, },
"directory": { "directory": {
"log": "log", "log": "log",
...@@ -161,38 +159,7 @@ json_params = """{ ...@@ -161,38 +159,7 @@ json_params = """{
} }
}""" % globals() }""" % globals()
"""
{
"slave_title": "Cell 1c",
"slave_reference": "_CELL1_c",
"slap_software_type": "enb",
"_": %(jCELL1_c)s
},
{
"slave_title": "Cell 2a",
"slave_reference": "_CELL2_a",
"slap_software_type": "enb",
"_": %(jCELL2_a)s
},
{
"slave_title": "Cell 2b",
"slave_reference": "_CELL2_b",
"slap_software_type": "enb",
"_": %(jCELL2_b)s
},
{
"slave_title": "Radio Unit 2a",
"slave_reference": "_RU2_a",
"slap_software_type": "enb",
"_": %(jRU2_a)s
},
{
"slave_title": "Radio Unit 2b",
"slave_reference": "_RU2_b",
"slap_software_type": "enb",
"_": %(jRU2_b)s
}
"""
import os import os
from jinja2 import Environment, StrictUndefined, \ from jinja2 import Environment, StrictUndefined, \
......
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