Merge branch 'integration_2025_w48' into 'develop'
Integration `2025.w48` * !3778 CI: Update IP addresses in Aerial gNB config files * !3659 UE NTN - Epoch time handling for Target cell * !3772 CI: Ensure EPC is always terminated in NSA-B200 pipeline * !3773 Fix doc for UTC timestamp * !3759 NR UE: fix bug for SRS generation when freqDomainShift (n_shift) is not 0 * !3774 Use UL functions for Qm/R determination * !3767 Fix DRB integrity failures during handover and re-establishment * !3764 Avoid measGap configuration on handover in intra-freq scenarios * !3768 Fix MIB encoding in F1SetupRequest: use encode_MIB_NR_setup instead of encode_MIB_NR * !3771 CI build analysis: print log file errors * !3703 Taking into account UE capabilities for TBS_lbrm layers * !3561 Implementation of STOP exchange * !3776 Fix reestablishment after handover * !3763 CI: Reduce the tries to attach the UE in CI runs * !3761 fix(FHI 7.2): PRACH frame test * !3616 [FHI72 M-plane] Update the M-plane support to v16.01 * !3790 Correctly copy nFAPI messages * !3779 CFRA: mark RA complete when sending Msg2 - check CI Closes #563 and #1034 See merge request oai/openairinterface5g!3775
This commit is contained in:
@@ -397,9 +397,9 @@ class Cluster:
|
||||
# Analyze the logs
|
||||
collectInfo = {}
|
||||
for image, lf in log_files:
|
||||
ret = cls_containerize.AnalyzeBuildLogs(image, lf)
|
||||
imgStatus = ret['status']
|
||||
msg = f"size {imageSize[image]}, analysis of {os.path.basename(lf)}: {ret['errors']} errors, {ret['warnings']} warnings"
|
||||
imgStatus, errors = cls_containerize.AnalyzeBuildLogs(image, lf)
|
||||
info = f"Analysis of {os.path.basename(lf)}: {imgStatus=}, size {imageSize[image]}, {len(errors)} errors"
|
||||
msg = "\n".join([info] + errors)
|
||||
HTML.CreateHtmlTestRowQueue(image, 'OK' if imgStatus else 'KO', [msg])
|
||||
status = status and imgStatus
|
||||
|
||||
|
||||
@@ -86,9 +86,9 @@ def CreateTag(ranCommitID, ranBranch, ranAllowMerge):
|
||||
return tagToUse
|
||||
|
||||
def AnalyzeBuildLogs(image, lf):
|
||||
errorandwarnings = {}
|
||||
committed = False
|
||||
tagged = False
|
||||
errors = []
|
||||
with open(lf, mode='r') as inputfile:
|
||||
for line in inputfile:
|
||||
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
|
||||
@@ -97,11 +97,13 @@ def AnalyzeBuildLogs(image, lf):
|
||||
# the OpenShift Cluster builder prepends image registry URL
|
||||
lineHasCommit = re.search(r'COMMIT [a-zA-Z0-9\.:/\-]*' + image, str(line)) is not None
|
||||
committed = committed or lineHasCommit
|
||||
errorandwarnings['errors'] = 0 if committed or tagged else 1
|
||||
errorandwarnings['warnings'] = 0
|
||||
errorandwarnings['status'] = committed or tagged
|
||||
logging.info(f"Analyzing {image}, file {lf}: {errorandwarnings}")
|
||||
return errorandwarnings
|
||||
if re.search(r'error:|Errors|ERROR', line):
|
||||
errors.append(f"=> {line.strip()}")
|
||||
status = (committed or tagged) and len(errors) == 0
|
||||
logging.info(f"Analyzing {image}, file {lf}: {status=}, {len(errors)} errors")
|
||||
for e in errors:
|
||||
logging.info(e)
|
||||
return status, errors
|
||||
|
||||
def GetImageName(ssh, svcName, file):
|
||||
ret = ssh.run(f"docker compose -f {file} config --format json {svcName} | jq -r '.services.\"{svcName}\".image'", silent=True)
|
||||
@@ -460,9 +462,9 @@ class Containerize():
|
||||
|
||||
# Analyze the logs
|
||||
for name, lf in log_files:
|
||||
ret = AnalyzeBuildLogs(name, lf)
|
||||
imgStatus = ret['status']
|
||||
msg = f"size {allImagesSize[name]}, analysis of {os.path.basename(lf)}: {ret['errors']} errors, {ret['warnings']} warnings"
|
||||
imgStatus, errors = AnalyzeBuildLogs(name, lf)
|
||||
info = f"Analysis of {os.path.basename(lf)}: {imgStatus=}, size {allImagesSize[name]}, {len(errors)} errors"
|
||||
msg = "\n".join([info] + errors)
|
||||
HTML.CreateHtmlTestRowQueue(name, 'OK' if imgStatus else 'KO', [msg])
|
||||
status = status and imgStatus
|
||||
|
||||
|
||||
@@ -111,10 +111,11 @@ class Module_UE:
|
||||
return self._collectTrace(ctx)
|
||||
return None
|
||||
|
||||
def attach(self, attach_tries = 4, attach_timeout = 60):
|
||||
def attach(self, attach_tries = 3, attach_timeout = 0):
|
||||
ip = None
|
||||
while attach_tries > 0:
|
||||
self._command(self.cmd_dict["attach"])
|
||||
attach_timeout += 20
|
||||
timeout = attach_timeout
|
||||
logging.debug("Waiting for IP address to be assigned")
|
||||
ip = self.getIP(silent=False, reportNonZero=True)
|
||||
|
||||
@@ -53,7 +53,7 @@ security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
ciphering_algorithms = ( "nea2", "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
@@ -63,7 +63,7 @@ security = {
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
drb_integrity = "yes";
|
||||
};
|
||||
|
||||
log_config :
|
||||
|
||||
@@ -195,6 +195,7 @@ RUs = (
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 50;
|
||||
eNB_instances = [0];
|
||||
sl_ahead = 3;
|
||||
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
||||
}
|
||||
);
|
||||
|
||||
@@ -209,7 +209,7 @@ security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
ciphering_algorithms = ( "nea2", "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
@@ -219,7 +219,7 @@ security = {
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
drb_integrity = "yes";
|
||||
};
|
||||
|
||||
log_config :
|
||||
|
||||
@@ -247,6 +247,7 @@
|
||||
<testCase id="060000">
|
||||
<class>UndeployCoreNetwork</class>
|
||||
<desc>Terminate EPC</desc>
|
||||
<always_exec>true</always_exec>
|
||||
<cn_id>ltebox-nepes</cn_id>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/wls_lib/Makefile b/wls_lib/Makefile
|
||||
index 2f8e4b2..e657488 100644
|
||||
index 2f8e4b2..7b99a26 100644
|
||||
--- a/wls_lib/Makefile
|
||||
+++ b/wls_lib/Makefile
|
||||
@@ -1,20 +1,6 @@
|
||||
@@ -23,7 +23,7 @@ index 2f8e4b2..e657488 100644
|
||||
+################################################################
|
||||
+# <COPYRIGHT_TAG>
|
||||
+################################################################
|
||||
|
||||
|
||||
MYCUSTOMTAB=' '
|
||||
MYCUSTOMSPACE='============================================================================================'
|
||||
@@ -24,11 +10,17 @@ MYCUSTOMSPACE1='------------------------------------------------------------'
|
||||
@@ -48,9 +48,12 @@ index 2f8e4b2..e657488 100644
|
||||
else ifeq ($(WIRELESS_SDK_TOOLCHAIN),icx)
|
||||
CC := icx
|
||||
CPP := icx
|
||||
@@ -44,9 +36,9 @@ ifeq ($(WIRELESS_SDK_TARGET_ISA),sse)
|
||||
@@ -42,11 +34,11 @@ endif
|
||||
ifeq ($(WIRELESS_SDK_TARGET_ISA),sse)
|
||||
TARGET_PROCESSOR := -xSSE4.2
|
||||
else ifeq ($(WIRELESS_SDK_TARGET_ISA),avx2)
|
||||
TARGET_PROCESSOR := -xCORE-AVX2
|
||||
- TARGET_PROCESSOR := -xCORE-AVX2
|
||||
+ TARGET_PROCESSOR := -march=core-avx2
|
||||
else ifeq ($(WIRELESS_SDK_TARGET_ISA),avx512)
|
||||
- TARGET_PROCESSOR := -xCORE-AVX512
|
||||
+ TARGET_PROCESSOR := -march=skylake-avx512
|
||||
@@ -63,7 +66,7 @@ index 2f8e4b2..e657488 100644
|
||||
@@ -66,15 +58,38 @@ PROJECT_DIR := ./
|
||||
BUILDDIR := make
|
||||
PROJECT_BINARY := $(PROJECT_NAME).so
|
||||
|
||||
|
||||
+PKGCONF ?= pkg-config
|
||||
+LIBDPDK_VERSION=20.11.3
|
||||
+
|
||||
@@ -79,7 +82,7 @@ index 2f8e4b2..e657488 100644
|
||||
+$(error "Please define RTE_SDK environment variable OR install DPDK version $(LIBDPDK_VERSION)")
|
||||
+endif
|
||||
endif
|
||||
|
||||
|
||||
-RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --cflags-only-I libdpdk)
|
||||
+# At least one of the options is defined
|
||||
+
|
||||
@@ -88,10 +91,10 @@ index 2f8e4b2..e657488 100644
|
||||
+else ifeq ($(DPDK_INSTALLED),1)
|
||||
+ RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig $(PKGCONF) --cflags-only-I libdpdk)
|
||||
+endif
|
||||
|
||||
|
||||
CC_SRC = wls_lib_dpdk.c \
|
||||
syslib.c
|
||||
|
||||
|
||||
+CC_HDR = syslib.h \
|
||||
+ ttypes.h \
|
||||
+ wls.h \
|
||||
@@ -104,74 +107,74 @@ index 2f8e4b2..e657488 100644
|
||||
@@ -84,18 +99,19 @@ CC_FLAGS += -std=gnu11 -Wall -Wno-deprecated-declarations \
|
||||
-Wimplicit-function-declaration \
|
||||
-g -O3 -mcmodel=large $(TARGET_PROCESSOR)
|
||||
|
||||
|
||||
-INC := -I$(RTE_INC)
|
||||
+INC := -I$(RTE_INC) -I../intel_fapi/
|
||||
DEF :=
|
||||
|
||||
|
||||
AS_FLAGS :=
|
||||
AR_FLAGS := rc
|
||||
|
||||
|
||||
PROJECT_OBJ_DIR := $(BUILDDIR)/obj
|
||||
+PROJECT_DEP_DIR := $(PROJECT_OBJ_DIR)/$(PROJECT_NAME).dep.d
|
||||
|
||||
|
||||
CC_OBJS := $(patsubst %.c,%.o,$(CC_SRC))
|
||||
AS_OBJS := $(patsubst %.s,%.o,$(AS_SRC))
|
||||
OBJS := $(CC_OBJS) $(AS_OBJS) $(LIBS)
|
||||
-DIRLIST := $(addprefix $(PROJECT_OBJ_DIR)/,$(sort $(dir $(OBJS))))
|
||||
+DIRLIST := $(addprefix $(PROJECT_OBJ_DIR)/,$(sort $(dir $(OBJS)))) $(PROJECT_DEP_DIR)
|
||||
|
||||
|
||||
CC_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(CC_OBJS))
|
||||
|
||||
|
||||
@@ -104,9 +120,7 @@ CC_FLAGS_FULL := $(CC_FLAGS) $(INC) $(DEF)
|
||||
|
||||
|
||||
AS_FLAGS := $(AS_FLAGS) $(INC)
|
||||
|
||||
|
||||
-PROJECT_DEP_FILE := $(PROJECT_OBJ_DIR)/$(PROJECT_NAME).dep
|
||||
-
|
||||
-ifeq ($(wildcard $(PROJECT_DEP_FILE)),$(PROJECT_DEP_FILE))
|
||||
+ifeq ($(wildcard $(PROJECT_DEP_DIR)),$(PROJECT_DEP_DIR))
|
||||
GENERATE_DEPS :=
|
||||
else
|
||||
|
||||
|
||||
@@ -119,11 +133,11 @@ all : welcome_line $(PROJECT_BINARY)
|
||||
|
||||
|
||||
.PHONY : clear_dep
|
||||
clear_dep:
|
||||
- @$(RM) $(PROJECT_DEP_FILE)
|
||||
- @echo [DEP] $(subst $(PROJECT_OBJ_DIR)/,,$(PROJECT_DEP_FILE))
|
||||
+ @echo [DEP] rm $(PROJECT_DEP_DIR)/$(@F).dep
|
||||
+ @$(RM) $(PROJECT_DEP_DIR)/$(@F).dep
|
||||
|
||||
|
||||
-$(CC_DEPS) :
|
||||
- @$(CC) -MM $(subst __up__,../,$(subst __dep__,,$@)) -MT $(PROJECT_OBJ_DIR)/$(patsubst %.c,%.o,$(subst __up__,../,$(subst __dep__,,$@))) $(CC_FLAGS_FULL) >> $(PROJECT_DEP_FILE)
|
||||
+$(CC_DEPS) : $(PROJECT_DEP_DIR)
|
||||
+ @$(CC) $(CC_FLAGS_FULL) -MM $(subst __up__,../,$(subst __dep__,,$@)) -MT $(PROJECT_OBJ_DIR)/$(patsubst %.c,%.o,$(subst __up__,../,$(subst __dep__,,$@))) >> $(PROJECT_DEP_DIR)/$(@F).dep
|
||||
|
||||
|
||||
.PHONY : generate_deps
|
||||
generate_deps : clear_dep $(CC_DEPS)
|
||||
@@ -136,17 +150,17 @@ echo_start_build :
|
||||
$(DIRLIST) :
|
||||
-@$(MD) $@
|
||||
|
||||
|
||||
-$(CC_OBJTARGETS) :
|
||||
+$(CC_OBJTARGETS) : $(GENERATE_DEPS)
|
||||
@echo [CC] $(subst $(PROJECT_OBJ_DIR)/,,$@)
|
||||
@$(CC) -c $(CC_FLAGS_FULL) -o"$@" $(patsubst %.o,%.c,$(subst $(PROJECT_OBJ_DIR)/,,$@))
|
||||
|
||||
|
||||
-$(AS_OBJTARGETS) :
|
||||
+$(AS_OBJTARGETS) : $(CC_OBJTARGETS) $(CPP_OBJTARGETS)
|
||||
@echo [AS] $(subst $(PROJECT_OBJ_DIR)/,,$@)
|
||||
@$(AS) $(AS_FLAGS) -o"$@" $(patsubst %.o,%.s,$(subst $(PROJECT_OBJ_DIR)/,,$@))
|
||||
|
||||
|
||||
-ifeq ($(wildcard $(PROJECT_DEP_FILE)),$(PROJECT_DEP_FILE))
|
||||
+ifeq ($(wildcard $(PROJECT_DEP_DIR)),$(PROJECT_DEP_DIR))
|
||||
|
||||
|
||||
-include $(PROJECT_DEP_FILE)
|
||||
+include $(PROJECT_DEP_DIR)/*
|
||||
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@@ -156,7 +170,7 @@ clean:
|
||||
@$(RM) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
ifneq ($(wildcard $(PROJECT_DIR)/$(PROJECT_MAKE)),)
|
||||
@@ -179,17 +182,17 @@ index 2f8e4b2..e657488 100644
|
||||
- @$(RM) $(PROJECT_BINARY) $(PROJECT_BINARY_LIB) $(PROJECT_DEP_FILE)
|
||||
+ @$(RM) -rf $(PROJECT_BINARY) $(PROJECT_BINARY_LIB) $(PROJECT_DEP_DIR)
|
||||
endif
|
||||
|
||||
|
||||
xclean: clean
|
||||
@@ -172,7 +186,24 @@ welcome_line :
|
||||
debug : all
|
||||
release : all
|
||||
|
||||
|
||||
-$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(PRE_BUILD) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
+$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
@echo [AR] $(subst $(BUILDDIR)/,,$@)
|
||||
@$(CC) $(CC_OBJTARGETS) $(AS_OBJTARGETS) -shared -fPIC -o $@
|
||||
|
||||
|
||||
+##############################################################
|
||||
+# Install configuration
|
||||
+##############################################################
|
||||
|
||||
@@ -21,7 +21,7 @@ The following options can be specified to trigger the information added in the h
|
||||
- `line_num`: adds the (source code) line number
|
||||
- `time`: add the time since the system started in format `ss.ssssss` (seconds and microseconds sourced from `CLOCK_MONOTONIC`)
|
||||
- `wall_clock`: add the system-wide clock time that measures real (i.e., wall-clock) time in format `ss.ssssss` (seconds and microseconds since 1970-01-01 00:00:00 Coordinated Universal Time (UTC))
|
||||
- `utc_time`: add the UTC (Coordinated Universal Time) time in format `YYYY-MM-DD hh:mm:ss.ssssss UTC`. Note that this time is independent of the current time zone (it shows GMT). Also, printing this time has additional overhead compared to other time methods (due to time conversion and formatting).
|
||||
- `utc_time`: add the UTC (Coordinated Universal Time) time in format `[hh:mm:ss.ssssss]`. Note that this time is independent of the current time zone (it shows GMT). Also, printing this time has additional overhead compared to other time methods (due to time conversion and formatting).
|
||||
|
||||
Note: `time`, `utc_time` and `wall_clock` are mutually exclusive and cannot be used together.
|
||||
|
||||
|
||||
+862
-5
@@ -1243,8 +1243,8 @@ In OAI gNB, we support:
|
||||
```
|
||||
|
||||
The reference specifications:
|
||||
* `O-RAN.WG4.MP.0-v05.00`
|
||||
* `O-RAN.WG4.MP-YANGs-v04.00`
|
||||
* `O-RAN.WG4.MP.0-R004-v16.01`
|
||||
* `O-RAN.WG4.MP-YANGs-R004-v16.01`
|
||||
|
||||
## M-plane prerequisites
|
||||
Before proceeding, please make sure you have a support for 7.2 interface, as described in [Prerequisites](#prerequisites).
|
||||
@@ -1366,7 +1366,7 @@ sudo ldconfig
|
||||
If you would like to install these libraries in the custom path, please replace `/usr/local` default path to e.g. `/opt/mplane-v2`.
|
||||
|
||||
## Benetel O-RU
|
||||
Note: Only v1.2.2 RAN550 and RAN650 have been successfully tested.
|
||||
Note: RAN550/650 v1.2.2 and v1.4.1 have been successfully tested.
|
||||
|
||||
### One time steps
|
||||
Connect to the RU as user `root`, enable the mplane service, and reboot:
|
||||
@@ -1400,6 +1400,8 @@ The reference DU configuration file for two Benetel RAN650:
|
||||
[gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650-mplane.conf)
|
||||
|
||||
In order to run gNB/DU with M-plane, we need to modify Tx gain `att_tx` in RU section, as well as the `fhi_72` section in the configuration file.
|
||||
|
||||
**Important note: Benetel v1.4.1 requires only one VF if the same VLAN tag is used for both C-/U-planes. Otherwise, C-plane will not be properly configured. Benetel v1.2.2 will receive the C-plane packets no matter the DU MAC address value.**
|
||||
Example for one RU:
|
||||
```bash
|
||||
fhi_72 = {
|
||||
@@ -1573,14 +1575,14 @@ sequenceDiagram
|
||||
|
||||
|
||||
<details>
|
||||
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU example run</summary>
|
||||
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU v1.2.2 example run</summary>
|
||||
|
||||
```
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <connect> with username "oranbenetel" and port ID "830".
|
||||
[HW] [MPLANE] Successfuly connected to RU "192.168.80.9" with username "oranbenetel" and port ID "830".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <get> operational datastore.
|
||||
[HW] [MPLANE] Successfully retrieved operational datastore from RU "192.168.80.9".
|
||||
[HW] [MPLANE] RU is already PTP synchronized.
|
||||
[HW] [MPLANE] RU is in "LOCKED" sync state.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.80.9" = <subscribe> with stream "NETCONF" and filter "(null)".
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully subscribed to all notifications from RU "192.168.80.9".
|
||||
@@ -2223,6 +2225,861 @@ sequenceDiagram
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>4x4 MIMO and 100MHz BW with Benetel 550 RU v1.4.1 example run</summary>
|
||||
|
||||
```
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <connect> with username "oranbenetel" and port ID "830".
|
||||
[HW] [MPLANE] Successfuly connected to RU "192.168.81.4" with username "oranbenetel" and port ID "830".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get> operational datastore.
|
||||
[HW] [MPLANE] Successfully retrieved operational datastore from RU "192.168.81.4".
|
||||
[HW] [MPLANE] RU is already PTP synchronized.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <subscribe> with stream "NETCONF" and filter "(null)".
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully subscribed to all notifications from RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = "<supervision-watchdog-reset xmlns="urn:o-ran:supervision:1.0">
|
||||
<supervision-notification-interval>65535</supervision-notification-interval>
|
||||
<guard-timer-overhead>65535</guard-timer-overhead>
|
||||
</supervision-watchdog-reset>".
|
||||
[HW] [MPLANE] Successfully updated supervision timer to (65535+65535)[s] for RU "192.168.81.4".
|
||||
[HW] [MPLANE] Watchdog timer answer:
|
||||
<next-update-at xmlns="urn:o-ran:supervision:1.0">2025-08-29T06:49:32+02:00</next-update-at>
|
||||
|
||||
[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9600.
|
||||
[HW] [MPLANE] IQ bitwidth 16 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9.
|
||||
[HW] [MPLANE] Storing the following information to forward to xran:
|
||||
RU MAC address 70:b3:d5:e1:5b:81
|
||||
MTU 9600
|
||||
IQ bitwidth 9
|
||||
PRACH offset 4
|
||||
DU port bitmask 61440
|
||||
Band sector bitmask 3840
|
||||
CC ID bitmask 240
|
||||
RU port ID bitmask 15
|
||||
DU port ID 0
|
||||
Band sector ID 0
|
||||
CC ID 0
|
||||
RU port ID 0
|
||||
max Tx gain 24.0
|
||||
[HW] [MPLANE] Successfully retrieved all the U-plane info - interface name, TX/RX carrier names, and TX/RX endpoint names.
|
||||
[HW] [MPLANE] Successfully retreived all performance measurement names.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-metadata".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "yang".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-inet-types".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-types".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-schema-mount".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-structure-ext".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-datastores".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-acm".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-factory-default".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-factory-default".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-yang-library".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-monitoring".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "sysrepo-plugind".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-with-defaults".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-notifications".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-origin".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-monitoring".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "ietf-netconf-nmda".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <get-schema> for module "nc-notifications".
|
||||
[HW] [MPLANE] [LIBYANG] ERROR: Data model "notifications" not found in local searchdirs. (path: (null)).
|
||||
[HW] [MPLANE] [LIBYANG] ERROR: Loading "notifications" module failed. (path: (null)).
|
||||
[HW] [MPLANE] [LIBYANG] ERROR: Parsing module "nc-notifications" failed. (path: (null)).
|
||||
[HW] [MPLANE] Unable to load module "nc-notifications" from RU "192.168.81.4".
|
||||
[HW] [MPLANE] Unable to load all yang modules from operational datastore for RU "192.168.81.4". Using yang models present in "models" subfolder.
|
||||
[HW] [MPLANE] Successfully loaded all yang modules for RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <edit-config>:
|
||||
<interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
|
||||
<interface>
|
||||
<name>INTERFACE_0</name>
|
||||
<type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:l2vlan</type>
|
||||
<enabled>true</enabled>
|
||||
<mac-address xmlns="urn:o-ran:interfaces:1.0">70:b3:d5:e1:5b:81</mac-address>
|
||||
<base-interface xmlns="urn:o-ran:interfaces:1.0">eth0</base-interface>
|
||||
<vlan-id xmlns="urn:o-ran:interfaces:1.0">3</vlan-id>
|
||||
</interface>
|
||||
</interfaces>
|
||||
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
|
||||
<rx-window-measurement-interval>10</rx-window-measurement-interval>
|
||||
<tx-measurement-interval>10</tx-measurement-interval>
|
||||
<notification-interval>10</notification-interval>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_TOTAL</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE_C</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<tx-measurement-objects>
|
||||
<measurement-object>TX_TOTAL</measurement-object>
|
||||
<active>false</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</tx-measurement-objects>
|
||||
</performance-measurement-objects>
|
||||
<processing-elements xmlns="urn:o-ran:processing-element:1.0">
|
||||
<transport-session-type>ETH-INTERFACE</transport-session-type>
|
||||
<ru-elements>
|
||||
<name>PLANE_0</name>
|
||||
<transport-flow>
|
||||
<interface-name>INTERFACE_0</interface-name>
|
||||
<eth-flow>
|
||||
<ru-mac-address>70:b3:d5:e1:5b:81</ru-mac-address>
|
||||
<vlan-id>3</vlan-id>
|
||||
<o-du-mac-address>00:11:22:33:44:66</o-du-mac-address>
|
||||
</eth-flow>
|
||||
</transport-flow>
|
||||
</ru-elements>
|
||||
</processing-elements>
|
||||
<user-plane-configuration xmlns="urn:o-ran:uplane-conf:1.0">
|
||||
<low-level-tx-links>
|
||||
<name>PdschLink0</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<tx-array-carrier>TxArray0</tx-array-carrier>
|
||||
<low-level-tx-endpoint>LowLevelTxEndpoint0</low-level-tx-endpoint>
|
||||
</low-level-tx-links>
|
||||
<low-level-tx-links>
|
||||
<name>PdschLink1</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<tx-array-carrier>TxArray1</tx-array-carrier>
|
||||
<low-level-tx-endpoint>LowLevelTxEndpoint1</low-level-tx-endpoint>
|
||||
</low-level-tx-links>
|
||||
<low-level-tx-links>
|
||||
<name>PdschLink2</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<tx-array-carrier>TxArray2</tx-array-carrier>
|
||||
<low-level-tx-endpoint>LowLevelTxEndpoint2</low-level-tx-endpoint>
|
||||
</low-level-tx-links>
|
||||
<low-level-tx-links>
|
||||
<name>PdschLink3</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<tx-array-carrier>TxArray3</tx-array-carrier>
|
||||
<low-level-tx-endpoint>LowLevelTxEndpoint3</low-level-tx-endpoint>
|
||||
</low-level-tx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PuschLink0</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray0</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxEndpoint0</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PrachLink0</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray0</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxPrachEndpoint0</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PuschLink1</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray1</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxEndpoint1</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PrachLink1</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray1</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxPrachEndpoint1</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PuschLink2</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray2</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxEndpoint2</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PrachLink2</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray2</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxPrachEndpoint2</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PuschLink3</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray3</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxEndpoint3</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-rx-links>
|
||||
<name>PrachLink3</name>
|
||||
<processing-element>PLANE_0</processing-element>
|
||||
<rx-array-carrier>RxArray3</rx-array-carrier>
|
||||
<low-level-rx-endpoint>LowLevelRxPrachEndpoint3</low-level-rx-endpoint>
|
||||
</low-level-rx-links>
|
||||
<low-level-tx-endpoints>
|
||||
<name>LowLevelTxEndpoint0</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>0</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-tx-endpoints>
|
||||
<low-level-tx-endpoints>
|
||||
<name>LowLevelTxEndpoint1</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>1</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-tx-endpoints>
|
||||
<low-level-tx-endpoints>
|
||||
<name>LowLevelTxEndpoint2</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>2</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-tx-endpoints>
|
||||
<low-level-tx-endpoints>
|
||||
<name>LowLevelTxEndpoint3</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>3</eaxc-id>
|
||||
</e-axcid>
|
||||
</low-level-tx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint0</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>0</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint0</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>4</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint1</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>1</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint1</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>5</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint2</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>2</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint2</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>6</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxEndpoint3</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>3</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<low-level-rx-endpoints>
|
||||
<name>LowLevelRxPrachEndpoint3</name>
|
||||
<compression>
|
||||
<iq-bitwidth>9</iq-bitwidth>
|
||||
<compression-type>STATIC</compression-type>
|
||||
</compression>
|
||||
<frame-structure>193</frame-structure>
|
||||
<cp-type>NORMAL</cp-type>
|
||||
<cp-length>352</cp-length>
|
||||
<cp-length-other>288</cp-length-other>
|
||||
<offset-to-absolute-frequency-center>0</offset-to-absolute-frequency-center>
|
||||
<ul-fft-sampling-offsets>
|
||||
<scs>KHZ_30</scs>
|
||||
<ul-fft-sampling-offset>0</ul-fft-sampling-offset>
|
||||
</ul-fft-sampling-offsets>
|
||||
<e-axcid>
|
||||
<o-du-port-bitmask>61440</o-du-port-bitmask>
|
||||
<band-sector-bitmask>3840</band-sector-bitmask>
|
||||
<ccid-bitmask>240</ccid-bitmask>
|
||||
<ru-port-bitmask>15</ru-port-bitmask>
|
||||
<eaxc-id>7</eaxc-id>
|
||||
</e-axcid>
|
||||
<non-time-managed-delay-enabled>true</non-time-managed-delay-enabled>
|
||||
</low-level-rx-endpoints>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray0</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>24.0</gain>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
</tx-array-carriers>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray1</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>24.0</gain>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
</tx-array-carriers>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray2</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>24.0</gain>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
</tx-array-carriers>
|
||||
<tx-array-carriers>
|
||||
<name>TxArray3</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<gain>24.0</gain>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
</tx-array-carriers>
|
||||
<rx-array-carriers>
|
||||
<name>RxArray0</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
<gain-correction>0.0</gain-correction>
|
||||
<n-ta-offset>0</n-ta-offset>
|
||||
</rx-array-carriers>
|
||||
<rx-array-carriers>
|
||||
<name>RxArray1</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
<gain-correction>0.0</gain-correction>
|
||||
<n-ta-offset>0</n-ta-offset>
|
||||
</rx-array-carriers>
|
||||
<rx-array-carriers>
|
||||
<name>RxArray2</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
<gain-correction>0.0</gain-correction>
|
||||
<n-ta-offset>0</n-ta-offset>
|
||||
</rx-array-carriers>
|
||||
<rx-array-carriers>
|
||||
<name>RxArray3</name>
|
||||
<absolute-frequency-center>623334</absolute-frequency-center>
|
||||
<center-of-channel-bandwidth>3350010000</center-of-channel-bandwidth>
|
||||
<channel-bandwidth>100000000</channel-bandwidth>
|
||||
<active>ACTIVE</active>
|
||||
<downlink-radio-frame-offset>0</downlink-radio-frame-offset>
|
||||
<downlink-sfn-offset>0</downlink-sfn-offset>
|
||||
<gain-correction>0.0</gain-correction>
|
||||
<n-ta-offset>0</n-ta-offset>
|
||||
</rx-array-carriers>
|
||||
</user-plane-configuration>
|
||||
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully edited the candidate datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <validate> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <commit> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.335228846+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray0",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.368360865+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray1",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.414703766+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray2",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.452921618+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray3",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.471419021+00:00)
|
||||
{
|
||||
"ietf-netconf-notifications:netconf-config-change": {
|
||||
"changed-by": {
|
||||
"username": "root",
|
||||
"session-id": 0
|
||||
},
|
||||
"datastore": "running",
|
||||
"edit": [
|
||||
{
|
||||
"target": "/ietf-interfaces:interfaces/interface[name='INTERFACE_0']",
|
||||
"operation": "create"
|
||||
},
|
||||
{
|
||||
"target": "/ietf-interfaces:interfaces/interface[name='INTERFACE_0']/name",
|
||||
"operation": "create"
|
||||
},
|
||||
...
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.678251110+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray0",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.715498360+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray1",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.830268973+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray2",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:19.853387657+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray3",
|
||||
"state": "BUSY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.515262267+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray0",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.535692962+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray1",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.557423764+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray2",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.579066867+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:rx-array-carriers-state-change": {
|
||||
"rx-array-carriers": [
|
||||
{
|
||||
"name": "RxArray3",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.604192995+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray0",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.629830498+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray1",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.651062685+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray2",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] Received notification from RU "192.168.81.4" at (2025-08-28T10:37:24.672865767+00:00)
|
||||
{
|
||||
"o-ran-uplane-conf:tx-array-carriers-state-change": {
|
||||
"tx-array-carriers": [
|
||||
{
|
||||
"name": "TxArray3",
|
||||
"state": "READY"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[HW] [MPLANE] RU "192.168.81.4" is now ready.
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <edit-config>:
|
||||
<performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0">
|
||||
<rx-window-measurement-interval>10</rx-window-measurement-interval>
|
||||
<tx-measurement-interval>10</tx-measurement-interval>
|
||||
<notification-interval>10</notification-interval>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_TOTAL</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_ON_TIME_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_EARLY_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<rx-window-measurement-objects>
|
||||
<measurement-object>RX_LATE_C</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</rx-window-measurement-objects>
|
||||
<tx-measurement-objects>
|
||||
<measurement-object>TX_TOTAL</measurement-object>
|
||||
<active>true</active>
|
||||
<object-unit>RU</object-unit>
|
||||
<report-info>COUNT</report-info>
|
||||
</tx-measurement-objects>
|
||||
</performance-measurement-objects>
|
||||
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully edited the candidate datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <validate> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully validated candidate datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] RPC request to RU "192.168.81.4" = <commit> candidate datastore.
|
||||
[HW] [MPLANE] RPC reply = OK.
|
||||
[HW] [MPLANE] Successfully commited configuration into running datastore for RU "192.168.81.4".
|
||||
[HW] [MPLANE] Sucessfully activated PM after start-up procedure for RU "192.168.81.4".
|
||||
```
|
||||
</details>
|
||||
|
||||
Note: If you wish to run the fronthaul without M-plane, no need for recompilation, as the library `oran_fhlib_5g` already exists.
|
||||
The only mandatory step is to link `oran_fhlib_5g` to `oai_transpro` library.
|
||||
|
||||
+7
-2
@@ -194,14 +194,19 @@ Clone the Radisys repository (We're currently using the `oai_integration` branch
|
||||
|
||||
git clone https://gerrit.o-ran-sc.org/r/o-du/l2 -b oai-integration
|
||||
|
||||
Build the O-DU
|
||||
Build the O-DU (More details can be found in O-RAN's documentation page [here](https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-l2/en/latest/user-guide.html#i-execution-on-locally-compiling-o-du-high-source-code))
|
||||
|
||||
cd ~/l2/build/odu
|
||||
make clean_all;make odu PHY=INTEL_L1 MACHINE=BIT64 MODE=TDD;make cu_stub NODE=TEST_STUB MACHINE=BIT64 MODE=TDD;make ric_stub NODE=TEST_STUB MACHINE=BIT64 MODE=TDD
|
||||
|
||||
The O-DU requires some virtual interfaces to be setup in order to enable communication between the O-DU, CU_stub and RIC_stub
|
||||
Setup local interfaces for the cu_stub, ric_stub and o_du
|
||||
The IP addresses shown match the ones specified in OSC ODU configuration file, found in <o-du directory>/build/config/tdd_odu_config.xml
|
||||
The parameters referenced are <DU_IP_V4_ADDR>, <CU_IP_V4_ADDR> and <RIC_IP_V4_ADDR>
|
||||
|
||||
sudo ifconfig enp7s0:ODU "192.168.130.81" && sudo ifconfig enp7s0:CU_STUB "192.168.130.82" && sudo ifconfig enp7s0:RIC_STUB "192.168.130.80"
|
||||
sudo ifconfig <interface name>:ODU "192.168.130.81"
|
||||
sudo ifconfig <interface name>:CU_STUB "192.168.130.82"
|
||||
sudo ifconfig <interface name>:RIC_STUB "192.168.130.80"
|
||||
|
||||
Run cu_stu and ric_stub in separate terminals
|
||||
|
||||
|
||||
@@ -720,6 +720,8 @@ int main( int argc, char **argv ) {
|
||||
itti_wait_tasks_end(NULL);
|
||||
printf("Returned from ITTI signal handler\n");
|
||||
|
||||
nfapi_stop_l1();
|
||||
|
||||
if (RC.nb_nr_L1_inst > 0 || RC.nb_RU > 0)
|
||||
stop_L1(0);
|
||||
|
||||
|
||||
@@ -63,12 +63,20 @@ char cpu_buf_recv[RECV_BUF_LEN];
|
||||
|
||||
uint16_t sfn = 0, slot = 0;
|
||||
nv_ipc_t *ipc;
|
||||
nfapi_vnf_config_t *vnf_config = 0;
|
||||
|
||||
void set_config(nfapi_vnf_config_t *conf)
|
||||
void nvIPC_Stop()
|
||||
{
|
||||
vnf_config = conf;
|
||||
LOG_I(NR_MAC, "Received STOP.indication\n");
|
||||
((vnf_t *)get_config())->terminate = true;
|
||||
}
|
||||
|
||||
void nvIPC_send_stop_request()
|
||||
{
|
||||
nfapi_nr_stop_request_scf_t req = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST, .header.phy_id = 0};
|
||||
LOG_I(NR_MAC, "Sending NFAPI STOP.request\n");
|
||||
nfapi_nr_vnf_stop_req(get_config(), get_config()->pnf_list->p5_idx, &req);
|
||||
}
|
||||
|
||||
|
||||
static uint16_t old_sfn = 0;
|
||||
static uint16_t old_slot = 0;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
@@ -84,6 +92,7 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg)
|
||||
uint8_t *end = msg->msg_buf + msg->msg_len;
|
||||
|
||||
// unpack FAPI messages and handle them
|
||||
nfapi_vnf_config_t * vnf_config = get_config();
|
||||
if (vnf_config != 0) {
|
||||
// first, unpack the header
|
||||
fapi_phy_api_msg fapi_msg;
|
||||
@@ -479,7 +488,6 @@ static int aerial_recv_msg(nv_ipc_t *ipc, nv_ipc_msg_t *recv_msg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool recv_task_running = false;
|
||||
void *epoll_recv_task(void *arg)
|
||||
{
|
||||
struct epoll_event ev, events[MAX_EVENTS];
|
||||
@@ -497,11 +505,12 @@ void *epoll_recv_task(void *arg)
|
||||
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, ev.data.fd, &ev) == -1) {
|
||||
LOG_E(NFAPI_VNF, "%s epoll_ctl failed\n", __func__);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
if (!recv_task_running) {
|
||||
recv_task_running = true;
|
||||
}
|
||||
// From here on out the thread is ready to receive data, simulate the reception
|
||||
// of a PARAM.response to get the VNF to send a CONFIG.request
|
||||
nfapi_nr_param_response_scf_t resp_msg = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE};
|
||||
nfapi_vnf_config_t * vnf_config = get_config();
|
||||
vnf_config->nr_param_resp(vnf_config, 1, &resp_msg);
|
||||
while (((vnf_t *)vnf_config)->terminate == false) {
|
||||
LOG_D(NFAPI_VNF, "%s: epoll_wait fd_rx=%d ...\n", __func__, ipc_rx_event_fd);
|
||||
|
||||
int nfds;
|
||||
@@ -524,6 +533,7 @@ void *epoll_recv_task(void *arg)
|
||||
}
|
||||
}
|
||||
close(epoll_fd);
|
||||
ipc->ipc_destroy(ipc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -568,21 +578,18 @@ int nvIPC_Init(nvipc_params_t nvipc_params_s)
|
||||
LOG_I(NFAPI_VNF, "%s: create IPC interface successful\n", __func__);
|
||||
sleep(1);
|
||||
create_recv_thread(nvipc_params_s.nvipc_poll_core);
|
||||
while(!recv_task_running){usleep(100000);}
|
||||
nfapi_nr_param_response_scf_t resp_msg;
|
||||
vnf_config->nr_param_resp(vnf_config, 1, &resp_msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int oai_fapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = (((vnf_info *)vnf_config->user_data)->p7_vnfs[0].config);
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
|
||||
ul_tti_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
ul_tti_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST;
|
||||
|
||||
// int retval = nfapi_vnf_p7_ul_tti_req(p7_config, ul_tti_req);
|
||||
int retval = p7_config->send_p7_msg((vnf_p7_t *)p7_config, &ul_tti_req->header);
|
||||
int retval = p7_config->send_p7_msg(get_p7_vnf(), &ul_tti_req->header);
|
||||
|
||||
if (retval != 0) {
|
||||
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
@@ -598,11 +605,11 @@ int oai_fapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req)
|
||||
|
||||
int oai_fapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = (((vnf_info *)vnf_config->user_data)->p7_vnfs[0].config);
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
ul_dci_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
ul_dci_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST;
|
||||
// int retval = nfapi_vnf_p7_ul_dci_req(p7_config, ul_dci_req);
|
||||
int retval = p7_config->send_p7_msg((vnf_p7_t *)p7_config, &ul_dci_req->header);
|
||||
int retval = p7_config->send_p7_msg(get_p7_vnf(), &ul_dci_req->header);
|
||||
if (retval != 0) {
|
||||
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
} else {
|
||||
@@ -613,12 +620,12 @@ int oai_fapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req)
|
||||
|
||||
int oai_fapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = (((vnf_info *)vnf_config->user_data)->p7_vnfs[0].config);
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
tx_data_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
tx_data_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST;
|
||||
// LOG_D(PHY, "[VNF] %s() TX_REQ sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(tx_data_req->SFN),
|
||||
// tx_data_req->Number_of_PDUs); int retval = nfapi_vnf_p7_tx_data_req(p7_config, tx_data_req);
|
||||
int retval = p7_config->send_p7_msg((vnf_p7_t *)p7_config, &tx_data_req->header);
|
||||
int retval = p7_config->send_p7_msg(get_p7_vnf(), &tx_data_req->header);
|
||||
if (retval != 0) {
|
||||
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
} else {
|
||||
@@ -630,10 +637,10 @@ int oai_fapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
|
||||
|
||||
int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = (((vnf_info *)vnf_config->user_data)->p7_vnfs[0].config);
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
dl_config_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
|
||||
dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||
int retval = p7_config->send_p7_msg((vnf_p7_t *)p7_config, &dl_config_req->header);
|
||||
int retval = p7_config->send_p7_msg(get_p7_vnf(), &dl_config_req->header);
|
||||
dl_config_req->dl_tti_request_body.nPDUs = 0;
|
||||
dl_config_req->dl_tti_request_body.nGroup = 0;
|
||||
|
||||
@@ -644,9 +651,9 @@ int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
||||
}
|
||||
|
||||
int oai_fapi_send_end_request(int cell, uint32_t frame, uint32_t slot){
|
||||
nfapi_vnf_p7_config_t *p7_config = (((vnf_info *)vnf_config->user_data)->p7_vnfs[0].config);
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
nfapi_nr_slot_indication_scf_t nr_slot_resp = {.header.message_id = 0x8F, .sfn = frame, .slot = slot};
|
||||
int retval = p7_config->send_p7_msg((vnf_p7_t *)p7_config, &nr_slot_resp.header);
|
||||
int retval = p7_config->send_p7_msg(get_p7_vnf(), &nr_slot_resp.header);
|
||||
if (retval != 0) {
|
||||
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||
}
|
||||
|
||||
@@ -56,11 +56,13 @@ bool aerial_send_P7_msg_with_data(void *packedBuf,
|
||||
void *dataBuf,
|
||||
uint32_t dataLength,
|
||||
nfapi_nr_p7_message_header_t *header);
|
||||
void set_config(nfapi_vnf_config_t *conf);
|
||||
|
||||
int nvIPC_Init(nvipc_params_t nvipc_params_s);
|
||||
int oai_fapi_send_end_request(int cell_id, uint32_t frame, uint32_t slot);
|
||||
int oai_fapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req);
|
||||
int oai_fapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req);
|
||||
int oai_fapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req);
|
||||
int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req);
|
||||
void nvIPC_Stop();
|
||||
void nvIPC_send_stop_request();
|
||||
#endif // OPENAIRINTERFACE_FAPI_NVIPC_H
|
||||
|
||||
@@ -1780,6 +1780,35 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf
|
||||
return 0;
|
||||
}
|
||||
|
||||
void stop_nr_nfapi_pnf()
|
||||
{
|
||||
#ifdef ENABLE_WLS
|
||||
wls_fapi_nr_pnf_stop();
|
||||
#endif
|
||||
#ifdef ENABLE_SOCKET
|
||||
socket_nfapi_nr_pnf_stop();
|
||||
#endif
|
||||
}
|
||||
static bool has_sent_stop_ind = false;
|
||||
int nr_stop_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi_nr_stop_request_scf_t *req)
|
||||
{
|
||||
if (has_sent_stop_ind) {
|
||||
// STOP.indication already sent, nothing to do
|
||||
return 0;
|
||||
}
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Send STOP.indication\n");
|
||||
nfapi_nr_stop_indication_scf_t resp = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION,
|
||||
.header.phy_id = req->header.phy_id};
|
||||
nfapi_nr_stop_indication(config, &resp);
|
||||
has_sent_stop_ind = true;
|
||||
#ifdef ENABLE_WLS
|
||||
wls_pnf_close(pnf_p5_init_and_receive_pthread);
|
||||
#endif
|
||||
// raise the SIGTERM to simulate CTRL+C
|
||||
raise(SIGTERM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int measurement_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi_measurement_request_t *req) {
|
||||
nfapi_measurement_response_t resp;
|
||||
memset(&resp, 0, sizeof(resp));
|
||||
@@ -2135,6 +2164,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
|
||||
config->nr_param_req = &nr_param_request;
|
||||
config->nr_config_req = &nr_config_request;
|
||||
config->nr_start_req = &nr_start_request;
|
||||
config->nr_stop_req = &nr_stop_request;
|
||||
config->rssi_req = &rssi_request;
|
||||
config->broadcast_detect_req = &broadcast_detect_request;
|
||||
config->system_information_schedule_req = &system_information_schedule_request;
|
||||
|
||||
@@ -38,5 +38,5 @@ int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind);
|
||||
int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind);
|
||||
int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind);
|
||||
int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind);
|
||||
|
||||
void stop_nr_nfapi_pnf();
|
||||
#endif /* NFAPI_PNF_H_ */
|
||||
|
||||
@@ -70,10 +70,25 @@
|
||||
#endif
|
||||
|
||||
#define TEST
|
||||
|
||||
static nfapi_vnf_config_t *config;
|
||||
extern RAN_CONTEXT_t RC;
|
||||
extern UL_RCC_IND_t UL_RCC_INFO;
|
||||
|
||||
nfapi_vnf_config_t * get_config()
|
||||
{
|
||||
return config;
|
||||
}
|
||||
vnf_p7_t *get_p7_vnf()
|
||||
{
|
||||
vnf_info *vnf = config->user_data;
|
||||
return (vnf_p7_t *)vnf->p7_vnfs->config;
|
||||
}
|
||||
|
||||
nfapi_vnf_p7_config_t *get_p7_vnf_config()
|
||||
{
|
||||
return &get_p7_vnf()->_public;
|
||||
}
|
||||
|
||||
int vnf_pack_vendor_extension_tlv(void *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *codec) {
|
||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "vnf_pack_vendor_extension_tlv\n");
|
||||
nfapi_tl_t *tlv = (nfapi_tl_t *)ve;
|
||||
@@ -1251,7 +1266,6 @@ void *configure_nr_p7_vnf(void *ptr)
|
||||
p7_vnf->config->hdr_unpack_func = &fapi_nr_p7_message_header_unpack;
|
||||
p7_vnf->config->pack_func = &fapi_nr_p7_message_pack;
|
||||
p7_vnf->config->send_p7_msg = &wls_vnf_nr_send_p7_message;
|
||||
wls_vnf_set_p7_config(p7_vnf->config);
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_SOCKET
|
||||
@@ -1645,32 +1659,86 @@ void vnf_start_thread(void *ptr) {
|
||||
nfapi_vnf_start((nfapi_vnf_config_t *)ptr);
|
||||
}
|
||||
|
||||
static vnf_info vnf;
|
||||
static bool has_stop_ind = false;
|
||||
static bool waiting_stop_ind = false;
|
||||
int nr_stop_ind_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_stop_indication_scf_t *resp)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_STOP_IND idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||
has_stop_ind = true;
|
||||
#ifdef ENABLE_AERIAL
|
||||
nvIPC_Stop();
|
||||
#endif
|
||||
#ifdef ENABLE_SOCKET
|
||||
nfapi_vnf_p7_stop(get_p7_vnf_config());
|
||||
#endif
|
||||
#ifdef ENABLE_WLS
|
||||
wls_vnf_stop();
|
||||
#endif
|
||||
if (!waiting_stop_ind) {
|
||||
// hasn't been initialized yet, means the PNF stopped before the VNF did
|
||||
// raise a SIGINT to stop the VNF
|
||||
raise(SIGINT);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void stop_nr_nfapi_vnf()
|
||||
{
|
||||
if (has_stop_ind) {
|
||||
// If it got here with the STOP.indication flag already set, it means it was triggered by the PNF,
|
||||
// no need to send a STOP.request
|
||||
return;
|
||||
}
|
||||
#ifdef ENABLE_WLS
|
||||
wls_vnf_send_stop_request();
|
||||
#endif
|
||||
#ifdef ENABLE_AERIAL
|
||||
nvIPC_send_stop_request();
|
||||
#endif
|
||||
#ifdef ENABLE_SOCKET
|
||||
socket_nfapi_send_stop_request((vnf_t *)config);
|
||||
#endif
|
||||
waiting_stop_ind = true;
|
||||
uint64_t counter = 0;
|
||||
vnf_p7_t *p7_vnf = get_p7_vnf();
|
||||
while (p7_vnf->terminate == 0 && counter < 50) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Not terminated yet, counter %ld\n", counter);
|
||||
usleep(1000);
|
||||
counter++;
|
||||
}
|
||||
if (p7_vnf->terminate == 0) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "STOP.indication timed out, exiting\n");
|
||||
nfapi_nr_stop_indication_scf_t msg = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION, .header.phy_id = 0};
|
||||
config->nr_stop_ind(config, 0, &msg);
|
||||
} else {
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Terminated, exiting\n");
|
||||
}
|
||||
}
|
||||
|
||||
void configure_nr_nfapi_vnf(eth_params_t params)
|
||||
{
|
||||
#ifndef ENABLE_AERIAL
|
||||
nfapi_setmode(NFAPI_MODE_VNF);
|
||||
#endif
|
||||
memset(&vnf, 0, sizeof(vnf));
|
||||
memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
|
||||
vnf.p7_vnfs[0].timing_window = 30;
|
||||
vnf.p7_vnfs[0].periodic_timing_enabled = 0;
|
||||
vnf.p7_vnfs[0].aperiodic_timing_enabled = 0;
|
||||
vnf.p7_vnfs[0].periodic_timing_period = 1;
|
||||
vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||
vnf_info *vnf = calloc(1, sizeof(vnf_info));
|
||||
memset(vnf->p7_vnfs, 0, sizeof(vnf->p7_vnfs));
|
||||
vnf->p7_vnfs[0].timing_window = 30;
|
||||
vnf->p7_vnfs[0].periodic_timing_enabled = 0;
|
||||
vnf->p7_vnfs[0].aperiodic_timing_enabled = 0;
|
||||
vnf->p7_vnfs[0].periodic_timing_period = 1;
|
||||
vnf->p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||
#ifndef ENABLE_AERIAL
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO,
|
||||
"[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n",
|
||||
"[VNF] %s() vnf->p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n",
|
||||
__FUNCTION__,
|
||||
vnf.p7_vnfs[0].config,
|
||||
vnf->p7_vnfs[0].config,
|
||||
params.my_addr,
|
||||
params.my_portc);
|
||||
strcpy(vnf.p7_vnfs[0].local_addr, params.my_addr);
|
||||
vnf.p7_vnfs[0].local_port = params.my_portd;
|
||||
strcpy(vnf->p7_vnfs[0].local_addr, params.my_addr);
|
||||
vnf->p7_vnfs[0].local_port = params.my_portd;
|
||||
#endif
|
||||
vnf.p7_vnfs[0].mac = (mac_t *)malloc(sizeof(mac_t));
|
||||
nfapi_vnf_config_t *config = nfapi_vnf_config_create();
|
||||
vnf->p7_vnfs[0].mac = malloc(sizeof(mac_t));
|
||||
config = nfapi_vnf_config_create();
|
||||
config->malloc = malloc;
|
||||
config->free = free;
|
||||
config->vnf_p5_port = params.my_portc;
|
||||
@@ -1688,9 +1756,10 @@ void configure_nr_nfapi_vnf(eth_params_t params)
|
||||
config->nr_param_resp = &nr_param_resp_cb;
|
||||
config->nr_config_resp = &nr_config_resp_cb;
|
||||
config->nr_start_resp = &nr_start_resp_cb;
|
||||
config->nr_stop_ind = &nr_stop_ind_cb;
|
||||
config->nr_error_ind = &nr_error_ind_cb;
|
||||
config->vendor_ext = &vendor_nr_ext_cb;
|
||||
config->user_data = &vnf;
|
||||
config->user_data = vnf;
|
||||
// To allow custom vendor extentions to be added to nfapi
|
||||
config->codec_config.unpack_vendor_extension_tlv = &vnf_nr_unpack_vendor_extension_tlv;
|
||||
config->codec_config.pack_vendor_extension_tlv = &vnf_nr_pack_vendor_extension_tlv;
|
||||
@@ -1727,7 +1796,6 @@ void configure_nr_nfapi_vnf(eth_params_t params)
|
||||
config->hdr_unpack_func = &fapi_nr_message_header_unpack;
|
||||
config->pack_func = &fapi_nr_p5_message_pack;
|
||||
config->send_p5_msg = &aerial_nr_send_p5_message;
|
||||
set_config(config);
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__);
|
||||
nfapi_vnf_pnf_info_t *pnf = (nfapi_vnf_pnf_info_t *)malloc(sizeof(nfapi_vnf_pnf_info_t));
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf);
|
||||
@@ -1736,7 +1804,6 @@ void configure_nr_nfapi_vnf(eth_params_t params)
|
||||
pnf->connected = 1;
|
||||
// Add needed parameters
|
||||
|
||||
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||
pnf_info *pnf_info = vnf->pnfs;
|
||||
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
@@ -1773,18 +1840,23 @@ void configure_nr_nfapi_vnf(eth_params_t params)
|
||||
|
||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) {
|
||||
nfapi_setmode(NFAPI_MODE_VNF);
|
||||
memset(&vnf, 0, sizeof(vnf));
|
||||
memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
|
||||
vnf.p7_vnfs[0].timing_window = 32;
|
||||
vnf.p7_vnfs[0].periodic_timing_enabled = 1;
|
||||
vnf.p7_vnfs[0].aperiodic_timing_enabled = 0;
|
||||
vnf.p7_vnfs[0].periodic_timing_period = 10;
|
||||
vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", __FUNCTION__, vnf.p7_vnfs[0].config, vnf_addr, vnf_p5_port);
|
||||
strcpy(vnf.p7_vnfs[0].local_addr, vnf_addr);
|
||||
vnf.p7_vnfs[0].local_port = vnf_p7_port;
|
||||
vnf.p7_vnfs[0].mac = (mac_t *)malloc(sizeof(mac_t));
|
||||
nfapi_vnf_config_t *config = nfapi_vnf_config_create();
|
||||
vnf_info *vnf = calloc(1, sizeof(vnf_info));
|
||||
memset(vnf->p7_vnfs, 0, sizeof(vnf->p7_vnfs));
|
||||
vnf->p7_vnfs[0].timing_window = 32;
|
||||
vnf->p7_vnfs[0].periodic_timing_enabled = 1;
|
||||
vnf->p7_vnfs[0].aperiodic_timing_enabled = 0;
|
||||
vnf->p7_vnfs[0].periodic_timing_period = 10;
|
||||
vnf->p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO,
|
||||
"[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n",
|
||||
__FUNCTION__,
|
||||
vnf->p7_vnfs[0].config,
|
||||
vnf_addr,
|
||||
vnf_p5_port);
|
||||
strcpy(vnf->p7_vnfs[0].local_addr, vnf_addr);
|
||||
vnf->p7_vnfs[0].local_port = vnf_p7_port;
|
||||
vnf->p7_vnfs[0].mac = malloc(sizeof(mac_t));
|
||||
config = nfapi_vnf_config_create();
|
||||
config->malloc = malloc;
|
||||
config->free = free;
|
||||
config->vnf_p5_port = vnf_p5_port;
|
||||
@@ -1803,7 +1875,7 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int
|
||||
config->config_resp = &config_resp_cb;
|
||||
config->start_resp = &start_resp_cb;
|
||||
config->vendor_ext = &vendor_ext_cb;
|
||||
config->user_data = &vnf;
|
||||
config->user_data = vnf;
|
||||
// To allow custom vendor extentions to be added to nfapi
|
||||
config->codec_config.unpack_vendor_extension_tlv = &vnf_unpack_vendor_extension_tlv;
|
||||
config->codec_config.pack_vendor_extension_tlv = &vnf_pack_vendor_extension_tlv;
|
||||
@@ -1820,7 +1892,7 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int
|
||||
}
|
||||
|
||||
int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
dl_config_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
dl_config_req->header.message_id = NFAPI_DL_CONFIG_REQUEST;
|
||||
LOG_D(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__,
|
||||
@@ -1856,7 +1928,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
|
||||
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
||||
{
|
||||
LOG_D(NR_PHY, "Entering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n", dl_config_req->SFN, dl_config_req->Slot);
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
|
||||
dl_config_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
|
||||
@@ -1875,7 +1947,7 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
||||
int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
|
||||
{
|
||||
LOG_D(NR_PHY, "Entering oai_nfapi_nr_tx_data_req sfn:%d,slot:%d\n", tx_data_req->SFN, tx_data_req->Slot);
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
tx_data_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
tx_data_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST;
|
||||
//LOG_D(PHY, "[VNF] %s() TX_REQ sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(tx_req->sfn_sf), tx_req->tx_request_body.number_of_pdus);
|
||||
@@ -1892,7 +1964,7 @@ int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
|
||||
|
||||
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
||||
{
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
tx_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
tx_req->header.message_id = NFAPI_TX_REQUEST;
|
||||
//LOG_D(PHY, "[VNF] %s() TX_REQ sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(tx_req->sfn_sf), tx_req->tx_request_body.number_of_pdus);
|
||||
@@ -1908,7 +1980,7 @@ int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
||||
}
|
||||
|
||||
int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req) {
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
ul_dci_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
ul_dci_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST;
|
||||
//LOG_D(PHY, "[VNF] %s() HI_DCI0_REQ sfn_sf:%d dci:%d hi:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req->hi_dci0_request_body.number_of_dci, hi_dci0_req->hi_dci0_request_body.number_of_hi);
|
||||
@@ -1924,7 +1996,7 @@ int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req) {
|
||||
}
|
||||
|
||||
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
hi_dci0_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST;
|
||||
//LOG_D(PHY, "[VNF] %s() HI_DCI0_REQ sfn_sf:%d dci:%d hi:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req->hi_dci0_request_body.number_of_dci, hi_dci0_req->hi_dci0_request_body.number_of_hi);
|
||||
@@ -1960,7 +2032,7 @@ static void remove_ul_config_req_pdu(int index, nfapi_ul_config_request_t *ul_co
|
||||
}
|
||||
|
||||
int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req) {
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
|
||||
ul_tti_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
ul_tti_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST;
|
||||
@@ -1980,7 +2052,7 @@ int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req) {
|
||||
}
|
||||
|
||||
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
ul_config_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
ul_config_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
|
||||
//LOG_D(PHY, "[VNF] %s() header message_id:%02x\n", __FUNCTION__, ul_config_req->header.message_id);
|
||||
@@ -2040,7 +2112,7 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
|
||||
int oai_nfapi_ue_release_req(nfapi_ue_release_request_t *release_req){
|
||||
if(release_req->ue_release_request_body.number_of_TLVs <= 0)
|
||||
return 0;
|
||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||
nfapi_vnf_p7_config_t *p7_config = get_p7_vnf_config();
|
||||
|
||||
release_req->header.phy_id = 1; // HACK TODO FIXME - need to pass this around!!!!
|
||||
release_req->header.message_id = NFAPI_UE_RELEASE_REQUEST;
|
||||
|
||||
@@ -148,5 +148,8 @@ typedef struct {
|
||||
|
||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
|
||||
void configure_nr_nfapi_vnf(eth_params_t params);
|
||||
|
||||
void stop_nr_nfapi_vnf();
|
||||
nfapi_vnf_config_t *get_config();
|
||||
vnf_p7_t *get_p7_vnf();
|
||||
nfapi_vnf_p7_config_t *get_p7_vnf_config();
|
||||
#endif /* NFAPI_VNF_H_ */
|
||||
|
||||
@@ -36,4 +36,5 @@ bool pnf_nr_send_p5_message(pnf_t *pnf, nfapi_nr_p4_p5_message_header_t *msg, ui
|
||||
bool pnf_nr_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_header_t* header, uint32_t msg_len);
|
||||
void *pnf_start_p5_thread(void *ptr);
|
||||
void *pnf_nr_p7_thread_start(void *ptr);
|
||||
void socket_nfapi_nr_pnf_stop();
|
||||
#endif // SOCKET_PNF_H
|
||||
|
||||
@@ -31,4 +31,5 @@ bool vnf_nr_send_p5_msg(vnf_t *vnf, uint16_t p5_idx, nfapi_nr_p4_p5_message_head
|
||||
bool vnf_nr_send_p7_msg(vnf_p7_t *vnf_p7, nfapi_nr_p7_message_header_t* header);
|
||||
void vnf_start_p5_thread(void* ptr);
|
||||
void* vnf_nr_start_p7_thread(void* ptr);
|
||||
void socket_nfapi_send_stop_request(vnf_t *vnf);
|
||||
#endif // SOCKET_VNF_H
|
||||
|
||||
@@ -20,6 +20,15 @@
|
||||
*/
|
||||
#include "socket_pnf.h"
|
||||
#include "nfapi.h"
|
||||
static nfapi_pnf_config_t *config;
|
||||
void socket_nfapi_nr_pnf_stop()
|
||||
{
|
||||
AssertFatal(config->nr_stop_req, "STOP.request Handler should be set!");
|
||||
nfapi_nr_stop_request_scf_t req = {0};
|
||||
req.header.phy_id = 0;
|
||||
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST;
|
||||
config->nr_stop_req(config, 0, &req);
|
||||
}
|
||||
|
||||
bool pnf_nr_send_p5_message(pnf_t *pnf, nfapi_nr_p4_p5_message_header_t *msg, uint32_t msg_len)
|
||||
{
|
||||
@@ -148,7 +157,7 @@ bool pnf_nr_send_p7_message(pnf_p7_t *pnf_p7, nfapi_nr_p7_message_header_t *head
|
||||
void *pnf_start_p5_thread(void *ptr)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] IN PNF NFAPI start thread %s\n", __FUNCTION__);
|
||||
nfapi_pnf_config_t *config = (nfapi_pnf_config_t *)ptr;
|
||||
config = (nfapi_pnf_config_t *)ptr;
|
||||
struct sched_param sp;
|
||||
sp.sched_priority = 20;
|
||||
pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp);
|
||||
|
||||
@@ -20,9 +20,26 @@
|
||||
*/
|
||||
#include "socket_vnf.h"
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "nfapi.h"
|
||||
#include "nfapi_vnf.h"
|
||||
#include <common/platform_constants.h>
|
||||
#include "nfapi/oai_integration/vendor_ext.h" //TODO: Remove this include when removing the Aerial transport stuff
|
||||
|
||||
|
||||
void socket_stop_nfapi_p5_p7()
|
||||
{
|
||||
get_p7_vnf()->terminate = 1;
|
||||
get_config()->pnf_disconnect_indication = NULL;
|
||||
}
|
||||
|
||||
void socket_nfapi_send_stop_request(vnf_t *vnf)
|
||||
{
|
||||
nfapi_nr_stop_request_scf_t req = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST, .header.phy_id = 0};
|
||||
nfapi_nr_vnf_stop_req(&vnf->_public, 0, &req);
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Sent NFAPI STOP.request\n");
|
||||
}
|
||||
|
||||
static bool send_p5_msg(vnf_t *vnf, nfapi_vnf_pnf_info_t *pnf, const void *msg, int len, uint8_t stream)
|
||||
{
|
||||
int result = socket_send_p5_msg(vnf->sctp, pnf->p5_sock, &pnf->p5_pnf_sockaddr, msg, len, stream);
|
||||
@@ -279,7 +296,6 @@ static int nfapi_nr_vnf_p5_start(nfapi_vnf_config_t *config)
|
||||
// Verify that config is not null
|
||||
if (config == 0)
|
||||
return -1;
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
||||
|
||||
int p5ListenSock, p5Sock;
|
||||
@@ -293,7 +309,7 @@ static int nfapi_nr_vnf_p5_start(nfapi_vnf_config_t *config)
|
||||
struct sctp_initmsg initMsg = {0};
|
||||
int noDelay;
|
||||
|
||||
vnf_t *vnf = (vnf_t *)(config);
|
||||
vnf_t *vnf = (vnf_t *)(get_config());
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Starting P5 VNF connection on port %u\n", config->vnf_p5_port);
|
||||
|
||||
@@ -747,8 +763,8 @@ static int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t *config)
|
||||
return -1;
|
||||
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
||||
|
||||
vnf_p7_t *vnf_p7 = (vnf_p7_t *)config;
|
||||
vnf_p7_t *vnf_p7 = get_p7_vnf();
|
||||
vnf_p7 = (vnf_p7_t *)config;
|
||||
|
||||
// Create p7 receive udp port
|
||||
// todo : this needs updating for Ipv6
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include "wls_lib.h"
|
||||
#include "nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h"
|
||||
#include "nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h"
|
||||
|
||||
|
||||
@@ -30,4 +30,6 @@ bool wls_pnf_nr_send_p7_message(pnf_p7_t* pnf_p7,nfapi_nr_p7_message_header_t *m
|
||||
void *wls_fapi_pnf_nr_start_thread(void *ptr);
|
||||
int wls_fapi_nr_pnf_start();
|
||||
void wls_pnf_set_p7_config(void *p7_config);
|
||||
void wls_fapi_nr_pnf_stop();
|
||||
void wls_pnf_close(pthread_t p5_thread);
|
||||
#endif // OPENAIRINTERFACE_WLS_PNF_H
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
|
||||
void *wls_fapi_vnf_nr_start_thread(void *ptr);
|
||||
int wls_fapi_nr_vnf_start();
|
||||
void wls_vnf_set_p7_config(void *p7_config);
|
||||
bool wls_vnf_nr_send_p5_message(vnf_t *vnf,uint16_t p5_idx, nfapi_nr_p4_p5_message_header_t* msg, uint32_t msg_len);
|
||||
bool wls_vnf_nr_send_p7_message(vnf_p7_t* vnf_p7,nfapi_nr_p7_message_header_t* msg);
|
||||
void wls_vnf_send_stop_request();
|
||||
void wls_vnf_stop();
|
||||
#endif //OPENAIRINTERFACE_WLS_VNF_H
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "wls_common.h"
|
||||
|
||||
#include "wls_lib.h"
|
||||
void fill_fapi_list_elem(p_fapi_api_queue_elem_t currElem, p_fapi_api_queue_elem_t nextElem, const uint8_t msgType, const uint8_t numMsgInBlock, const uint32_t alignOffset)
|
||||
{
|
||||
currElem->msg_type = msgType;
|
||||
@@ -90,9 +90,19 @@ uint8_t wls_send_fapi_msg(PWLS_MAC_CTX pWls, const uint16_t message_id, const in
|
||||
{
|
||||
int num_avail_blocks = WLS_NumBlocks(pWls->hWls);
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG,"num_avail_blocks is %d\n", num_avail_blocks);
|
||||
int counter = 0;
|
||||
while (num_avail_blocks < 2) {
|
||||
num_avail_blocks = WLS_NumBlocks(pWls->hWls);
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG,"num_avail_blocks is %d\n", num_avail_blocks);
|
||||
if (message_id == NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION) {
|
||||
// In the case of the STOP.indication, it can happen that this is called after the VNF stopped
|
||||
// For example, if it crashed for some reason, in that case, implement a timeout and return
|
||||
usleep(10 * 1000);
|
||||
counter++;
|
||||
if (counter == 10) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* get PA blocks for header and msg */
|
||||
uint64_t pa_hdr = dequeueBlock(pWls);
|
||||
|
||||
@@ -29,9 +29,10 @@
|
||||
#include <pnf_p7.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "wls_lib.h"
|
||||
#include "pnf.h"
|
||||
#include "nr_nfapi_p7.h"
|
||||
#include "nr_fapi_p5.h"
|
||||
#include "nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h"
|
||||
|
||||
// A copy of the PNF P7 config is needed for the message processing thread, in other transport mechanisms where P7 is handled in a
|
||||
// different thread, the config is passed to it upon the thread creation
|
||||
@@ -65,6 +66,28 @@ void *wls_fapi_pnf_nr_start_thread(void *ptr)
|
||||
return (void *)0;
|
||||
}
|
||||
|
||||
void wls_pnf_close(pthread_t p5_thread)
|
||||
{
|
||||
_this->terminate = 1;
|
||||
WLS_WakeUp(wls_mac_get_ctx()->hWls);
|
||||
pthread_join(p5_thread, NULL);
|
||||
if (WLS_Close(wls_mac_get_ctx()->hWls) != 0) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] WLS_CLose call failed...\n");
|
||||
} else {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] WLS_CLose called successfully...\n");
|
||||
}
|
||||
rte_eal_cleanup();
|
||||
}
|
||||
|
||||
void wls_fapi_nr_pnf_stop()
|
||||
{
|
||||
AssertFatal(cfg->nr_stop_req, "STOP.request Handler should be set!");
|
||||
nfapi_nr_stop_request_scf_t req = {0};
|
||||
req.header.phy_id = 0;
|
||||
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST;
|
||||
cfg->nr_stop_req(cfg, 0, &req);
|
||||
}
|
||||
|
||||
int wls_fapi_nr_pnf_start()
|
||||
{
|
||||
int64_t ret;
|
||||
@@ -194,6 +217,9 @@ bool wls_pnf_nr_send_p7_message(pnf_p7_t *pnf_p7, nfapi_nr_p7_message_header_t *
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "num_avail_blocks is %d\n", num_avail_blocks);
|
||||
while (num_avail_blocks < 2) {
|
||||
num_avail_blocks = WLS_NumBlocks(pWls->hWls);
|
||||
if (_this->terminate) {
|
||||
return false;
|
||||
}
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "num_avail_blocks is %d\n", num_avail_blocks);
|
||||
}
|
||||
/* get PA blocks for header and msg */
|
||||
@@ -254,7 +280,7 @@ void phy_mac_recv()
|
||||
bool to_return = false;
|
||||
while (_this->terminate == 0) {
|
||||
int numMsgToGet = WLS_Wait(pWls->hWls);
|
||||
if (numMsgToGet == 0) {
|
||||
if (numMsgToGet == 0 || _this->terminate) {
|
||||
continue;
|
||||
}
|
||||
uint64_t PAs[numMsgToGet];
|
||||
@@ -279,6 +305,11 @@ void phy_mac_recv()
|
||||
}
|
||||
}
|
||||
}
|
||||
// A STOP.indication might have been processed, which set's terminate to 1
|
||||
// don't return pages in that case
|
||||
if (_this->terminate) {
|
||||
break;
|
||||
}
|
||||
if (to_return) {
|
||||
// We only return the pages to be enqueued in case we're using the OAI VNF,
|
||||
// The Radisys O-DU handles enqueueing the blocks differently, and also doesn't handle receiving a single block
|
||||
|
||||
@@ -21,26 +21,23 @@
|
||||
#include "wls_vnf.h"
|
||||
|
||||
#include "vnf_p7.h"
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "wls_lib.h"
|
||||
#include <rte_eal.h>
|
||||
#include <rte_string_fns.h>
|
||||
#include <rte_common.h>
|
||||
#include <rte_lcore.h>
|
||||
#include <rte_debug.h>
|
||||
#include <nr_fapi_p5.h>
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include <rte_errno.h>
|
||||
#include <unistd.h>
|
||||
#include <common/platform_constants.h>
|
||||
#include <sys/wait.h>
|
||||
#include "nfapi_vnf.h"
|
||||
|
||||
static nfapi_vnf_config_t *config;
|
||||
static WLS_MAC_CTX wls_mac_iface;
|
||||
vnf_t *_vnf = NULL;
|
||||
// A copy of the VNF P7 config is needed for the message processing thread, in other transport mechanisms where P7 is handled in a
|
||||
// different thread, the config is passed to it upon the thread creation
|
||||
nfapi_vnf_p7_config_t *wls_vnf_p7_config = NULL;
|
||||
|
||||
void wls_vnf_set_p7_config(void *p7_config)
|
||||
{
|
||||
wls_vnf_p7_config = (nfapi_vnf_p7_config_t *)p7_config;
|
||||
}
|
||||
|
||||
static PWLS_MAC_CTX wls_mac_get_ctx(void)
|
||||
{
|
||||
@@ -99,17 +96,54 @@ static bool wls_mac_create_mem_array(PWLS_MAC_MEM_SRUCT pMemArray, void *pMemArr
|
||||
return true;
|
||||
}
|
||||
|
||||
void mac_dpdk_init()
|
||||
bool primary_process_running(int argc, char *argv[])
|
||||
{
|
||||
char *my_argv[] = {"OAI_VNF", "-c3", "--proc-type=auto", "--file-prefix", WLS_DEV_NAME, "--iova-mode=pa"};
|
||||
printf("\nCalling rte_eal_init: ");
|
||||
for (unsigned long i = 0; i < RTE_DIM(my_argv); i++) {
|
||||
printf("%s ", my_argv[i]);
|
||||
}
|
||||
printf("\n");
|
||||
// If the PNF was stopped normally, this is enough, as the mp_socket file does not exist
|
||||
if (access("/var/run/dpdk/" WLS_DEV_NAME "/mp_socket", W_OK | R_OK) != 0)
|
||||
return false;
|
||||
|
||||
if (rte_eal_init(RTE_DIM(my_argv), my_argv) < 0)
|
||||
rte_panic("\nCannot init EAL\n");
|
||||
// If we run rte_eal_init before the primary process is running, it will result in a 'Connection Refused' error in the logs, but
|
||||
// the call itself will succeed ( retval not -1 )
|
||||
//
|
||||
// We can use rte_eal_primary_proc_alive to determine if the primary process is running, the issue is that since the init had a
|
||||
// refused connection, if we try to open WLS after rte_eal_primary_proc_alive reports that the primary is running, it will fail,
|
||||
// since rte_eal_init failed to connect to the primary process, and we can't call rte_eal_init in the same process more than once,
|
||||
// or it will result in an EALREADY error
|
||||
//
|
||||
// Given this, a new process is created that calls rte_eal_init and checks whether the primary process is running, exiting
|
||||
// right after and reporting to our VNF the primary status
|
||||
//
|
||||
// When the VNF receives the status from the forked process that the
|
||||
// primary process is running, it then calls rte_eal_init, which at this point we know will be successful, and continue to open
|
||||
// the WLS instance
|
||||
pid_t pid = fork();
|
||||
if (pid == 0) {
|
||||
// We set the log level to emergency , effectively disabling logs in the child process
|
||||
// This prevents too many logs being printed out to the terminal while we wait for the primary process to be available
|
||||
rte_log_set_global_level(RTE_LOG_EMERG);
|
||||
AssertFatal(rte_eal_init(argc, argv) != -1, "rte_eal_init() failed\n");
|
||||
int status = rte_eal_primary_proc_alive(NULL) == 0;
|
||||
rte_eal_cleanup();
|
||||
_exit(status);
|
||||
}
|
||||
int status;
|
||||
waitpid(pid, &status, 0);
|
||||
return WIFEXITED(status) && WEXITSTATUS(status) == 0;
|
||||
}
|
||||
|
||||
bool mac_dpdk_init()
|
||||
{
|
||||
char *my_argv[] = {"OAI_VNF", "-c3", "--proc-type=secondary", "--file-prefix", WLS_DEV_NAME, "--iova-mode=pa"};
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "\nCalling rte_eal_init: ");
|
||||
for (int i = 0; i < RTE_DIM(my_argv); i++) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s ", my_argv[i]);
|
||||
}
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "\n");
|
||||
while (!primary_process_running(RTE_DIM(my_argv), my_argv)) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "DPDK primary process not available yet, retrying in 1 second...\n");
|
||||
sleep(1);
|
||||
}
|
||||
return rte_eal_init(RTE_DIM(my_argv), my_argv) >= 0;
|
||||
}
|
||||
|
||||
static uint32_t wls_mac_alloc_mem_array(PWLS_MAC_MEM_SRUCT pMemArray, void **ppBlock)
|
||||
@@ -258,7 +292,7 @@ for(int i = 0 ; i< pWls->nTotalBlocks; i++){
|
||||
void* pMsg = wls_mac_alloc_buffer(pWls, 0, i);
|
||||
/* Enqueue all blocks */
|
||||
nBlocks += WLS_EnqueueBlock(pWls->hWls, WLS_VA2PA(pWls->hWls, pMsg));
|
||||
}
|
||||
}
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "\nAllocated %d Blocks \n", nBlocks);
|
||||
return true;
|
||||
}
|
||||
@@ -274,6 +308,33 @@ static int vnf_wls_init()
|
||||
return 1;
|
||||
}
|
||||
|
||||
void wls_vnf_stop()
|
||||
{
|
||||
vnf_p7_t *p7_vnf = get_p7_vnf();
|
||||
_vnf->terminate = 1;
|
||||
p7_vnf->terminate = 1;
|
||||
rte_eal_cleanup();
|
||||
}
|
||||
|
||||
void wls_vnf_send_stop_request()
|
||||
{
|
||||
PWLS_MAC_CTX pWls = wls_mac_get_ctx();
|
||||
nfapi_nr_stop_request_scf_t req = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST, .header.phy_id = 0};
|
||||
vnf_p7_t *p7_vnf = get_p7_vnf();
|
||||
nfapi_vnf_config_t * config = get_config();
|
||||
if (p7_vnf == NULL || pWls->hWls == NULL) {
|
||||
nfapi_nr_stop_indication_scf_t msg;
|
||||
msg.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION;
|
||||
msg.header.phy_id = 0;
|
||||
config->nr_stop_ind(config, 0, &msg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pWls->hWls != NULL) {
|
||||
nfapi_nr_vnf_stop_req(config, 0, &req);
|
||||
}
|
||||
}
|
||||
|
||||
void *wls_fapi_vnf_nr_start_thread(void *ptr)
|
||||
{
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] IN WLS PNF NFAPI start thread %s\n", __FUNCTION__);
|
||||
@@ -294,11 +355,11 @@ static void procPhyMessages(uint32_t msg_size, void *msg_buf, uint16_t msg_id)
|
||||
case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
|
||||
case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION:
|
||||
vnf_nr_handle_p4_p5_message(msg_buf, msg_size, 0, config);
|
||||
vnf_nr_handle_p4_p5_message(msg_buf, msg_size, 0, get_config());
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST ... NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: {
|
||||
vnf_nr_handle_p7_message(msg_buf, msg_size + NFAPI_NR_P7_HEADER_LENGTH, (vnf_p7_t *)wls_vnf_p7_config);
|
||||
vnf_nr_handle_p7_message(msg_buf, msg_size + NFAPI_NR_P7_HEADER_LENGTH, get_p7_vnf());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -308,6 +369,7 @@ static void procPhyMessages(uint32_t msg_size, void *msg_buf, uint16_t msg_id)
|
||||
|
||||
int wls_fapi_nr_vnf_start(nfapi_vnf_config_t *cfg)
|
||||
{
|
||||
nfapi_vnf_config_t * config = get_config();
|
||||
config = cfg;
|
||||
|
||||
if (config == 0) {
|
||||
@@ -333,7 +395,7 @@ int wls_fapi_nr_vnf_start(nfapi_vnf_config_t *cfg)
|
||||
PWLS_MAC_CTX pWls = wls_mac_get_ctx();
|
||||
while (_vnf->terminate == 0) {
|
||||
int numMsgToGet = WLS_Wait(pWls->hWls);
|
||||
if (numMsgToGet == 0) {
|
||||
if (numMsgToGet == 0 || _vnf->terminate) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -351,6 +413,9 @@ int wls_fapi_nr_vnf_start(nfapi_vnf_config_t *cfg)
|
||||
procPhyMessages(len, (void *)(msg + 1), msg->msg_type);
|
||||
}
|
||||
}
|
||||
if (_vnf->terminate) {
|
||||
break;
|
||||
}
|
||||
for (int i = 0; i < pa_idx; i++) {
|
||||
if (WLS_EnqueueBlock(pWls->hWls, PAs[i]) == -1) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Error in WLS_EnqueueBlock for block %lu\n", PAs[i]);
|
||||
@@ -403,7 +468,7 @@ bool wls_vnf_nr_send_p7_message(vnf_p7_t *vnf_p7, nfapi_nr_p7_message_header_t *
|
||||
AssertFatal(fapiMsgElem, "WLS_PA2VA failed for fapiMsgElem\n");
|
||||
//memcpy((uint8_t *)(fapiMsgElem + 1), message, packed_len + NFAPI_HEADER_LENGTH);
|
||||
const uint8_t wls_header[] = {1, 0}; // num_messages , opaque_handle
|
||||
|
||||
|
||||
fill_fapi_list_elem(headerElem, fapiMsgElem, FAPI_VENDOR_MSG_HEADER_IND, 1, 2);
|
||||
memcpy((uint8_t *)(headerElem + 1), wls_header, 2);
|
||||
int packed_len = ((nfapi_vnf_p7_config_t *)vnf_p7)->pack_func(msg, (fapiMsgElem + 1), NFAPI_MAX_PACKED_MESSAGE_SIZE, NULL);
|
||||
|
||||
@@ -1254,6 +1254,10 @@ uint8_t pack_nr_p5_message_body(nfapi_nr_p4_p5_message_header_t *header,
|
||||
result = pack_stop_request(header, ppWritePackedMsg, end, config);
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION:
|
||||
result = pack_nr_stop_indication(header, ppWritePackedMsg, end, config);
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
|
||||
result = pack_stop_response(header, ppWritePackedMsg, end, config);
|
||||
break;
|
||||
@@ -2447,6 +2451,10 @@ bool nfapi_nr_p5_message_unpack(void *pMessageBuf,
|
||||
result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION:
|
||||
result = unpack_nr_stop_indication(&pReadPackedMessage, end, pMessageHeader, config);
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
|
||||
result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
|
||||
break;
|
||||
|
||||
@@ -497,6 +497,14 @@ int nfapi_nr_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_nr_start_response_
|
||||
*/
|
||||
int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp);
|
||||
|
||||
/*! Send the STOP.indication
|
||||
* \param config A pointer to a pnf configuration
|
||||
* \param resp A pointer to the message structure
|
||||
* \return 0 for success, -1 for failure
|
||||
*
|
||||
*/
|
||||
int nfapi_nr_stop_indication(nfapi_pnf_config_t* config, nfapi_nr_stop_indication_scf_t* resp);
|
||||
|
||||
/*! Send the MEASUREMENT.response
|
||||
* \param config A pointer to a pnf configuraiton
|
||||
* \param resp A pointer to the message structure
|
||||
|
||||
@@ -387,6 +387,18 @@ int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp)
|
||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_stop_response_t));
|
||||
}
|
||||
|
||||
int nfapi_nr_stop_indication(nfapi_pnf_config_t* config, nfapi_nr_stop_indication_scf_t* resp)
|
||||
{
|
||||
if (config == NULL || resp == NULL) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pnf_t* _this = (pnf_t*)(config);
|
||||
AssertFatal(config->send_p5_msg, "Function pointer must be configured|");
|
||||
return config->send_p5_msg(_this, &(resp->header), sizeof(nfapi_nr_stop_indication_scf_t));
|
||||
}
|
||||
|
||||
int nfapi_pnf_measurement_resp(nfapi_pnf_config_t* config, nfapi_measurement_response_t* resp)
|
||||
{
|
||||
if (config == NULL || resp == NULL)
|
||||
|
||||
@@ -728,34 +728,19 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7,
|
||||
ret_dl_tti->SFN = sfn;
|
||||
ret_dl_tti->Slot = slot;
|
||||
ret_dl_tti->dl_tti_request_body.nPDUs = 0;
|
||||
nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req;
|
||||
if (dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot) {
|
||||
copy_dl_tti_request(dl_tti_req, ret_dl_tti);
|
||||
tx_slot_buffer->dl_tti_req.SFN = -1;
|
||||
tx_slot_buffer->dl_tti_req.Slot = -1;
|
||||
}
|
||||
|
||||
ret_tx_data->SFN = sfn;
|
||||
ret_tx_data->Slot = slot;
|
||||
ret_tx_data->Number_of_PDUs = 0;
|
||||
nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req;
|
||||
nfapi_nr_tx_data_request_t* txd = &tx_slot_buffer->tx_data_req;
|
||||
if (dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot && txd->SFN == sfn && txd->Slot == slot) {
|
||||
nfapi_nr_dl_tti_request_body_t* p_tti = &dl_tti_req->dl_tti_request_body;
|
||||
int ret_idx = 0;
|
||||
for (int i = 0; i < p_tti->nPDUs; ++i) {
|
||||
int tx_index = p_tti->dl_tti_pdu_list[i].pdsch_pdu.pdsch_pdu_rel15.pduIndex - 1;
|
||||
if (tx_index >= txd->Number_of_PDUs) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR,
|
||||
"%4d.%2d no corresponding tx_data.request for dl_tti.request index %d, dropping\n",
|
||||
sfn,
|
||||
slot,
|
||||
tx_index);
|
||||
continue;
|
||||
}
|
||||
ret_dl_tti->dl_tti_request_body.dl_tti_pdu_list[ret_idx] = p_tti->dl_tti_pdu_list[i];
|
||||
// TODO avoid huge copy
|
||||
ret_tx_data->pdu_list[ret_idx] = txd->pdu_list[i];
|
||||
ret_idx++;
|
||||
}
|
||||
ret_dl_tti->dl_tti_request_body.nPDUs = ret_idx;
|
||||
ret_tx_data->Number_of_PDUs = ret_idx;
|
||||
|
||||
tx_slot_buffer->dl_tti_req.SFN = -1;
|
||||
tx_slot_buffer->dl_tti_req.Slot = -1;
|
||||
if (txd->SFN == sfn && txd->Slot == slot) {
|
||||
copy_tx_data_request(txd, ret_tx_data);
|
||||
tx_slot_buffer->tx_data_req.SFN = -1;
|
||||
tx_slot_buffer->tx_data_req.Slot = -1;
|
||||
}
|
||||
@@ -764,10 +749,7 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7,
|
||||
ret_ul_tti->Slot = slot;
|
||||
ret_ul_tti->n_pdus = 0;
|
||||
if (tx_slot_buffer->ul_tti_req.SFN == sfn && tx_slot_buffer->ul_tti_req.Slot == slot) {
|
||||
nfapi_nr_ul_tti_request_t* p = &tx_slot_buffer->ul_tti_req;
|
||||
ret_ul_tti->n_pdus = p->n_pdus;
|
||||
for (int i = 0; i < p->n_pdus; ++i)
|
||||
ret_ul_tti->pdus_list[i] = p->pdus_list[i];
|
||||
copy_ul_tti_request(&tx_slot_buffer->ul_tti_req, ret_ul_tti);
|
||||
tx_slot_buffer->ul_tti_req.SFN = -1;
|
||||
tx_slot_buffer->ul_tti_req.Slot = -1;
|
||||
}
|
||||
@@ -776,10 +758,7 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7,
|
||||
ret_ul_dci->Slot = slot;
|
||||
ret_ul_dci->numPdus = 0;
|
||||
if (tx_slot_buffer->ul_dci_req.SFN == sfn && tx_slot_buffer->ul_dci_req.Slot == slot) {
|
||||
nfapi_nr_ul_dci_request_t* p = &tx_slot_buffer->ul_dci_req;
|
||||
ret_ul_dci->numPdus = p->numPdus;
|
||||
for (int i = 0; i < p->numPdus; ++i)
|
||||
ret_ul_dci->ul_dci_pdu_list[i] = p->ul_dci_pdu_list[i];
|
||||
copy_ul_dci_request(&tx_slot_buffer->ul_dci_req, ret_ul_dci);
|
||||
tx_slot_buffer->ul_dci_req.SFN = -1;
|
||||
tx_slot_buffer->ul_dci_req.Slot = -1;
|
||||
}
|
||||
|
||||
@@ -210,6 +210,24 @@ typedef struct nfapi_vnf_config
|
||||
int (*pnf_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp);
|
||||
int (*pnf_nr_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_start_response_t* resp);
|
||||
|
||||
/*! A callback for the STOP.indication
|
||||
* \param config A pointer to the vnf configuration
|
||||
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
||||
* \param ind A data structure for the decoded STOP.indication This will
|
||||
* have been allocated on the stack.
|
||||
* \return not currently used.
|
||||
*
|
||||
* The STOP.indication contains the result of the STOP.request
|
||||
*
|
||||
*
|
||||
* ind may contain pointers to dynamically allocated sub structures
|
||||
* such as the vendor_extention. The dynamically allocated structure will
|
||||
* be deallocated on return. If the client wishes to 'keep' the structures
|
||||
* then the substructure pointers should be set to 0 and then the client should
|
||||
* use the codec_config.deallocate function to release it at a future point
|
||||
*/
|
||||
int (*nr_stop_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_stop_indication_scf_t* ind);
|
||||
|
||||
/*! A callback for the PNF_STOP.resp
|
||||
* \param config A pointer to the vnf configuration
|
||||
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
||||
@@ -640,6 +658,7 @@ int nfapi_nr_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_star
|
||||
* \return 0 means success, -1 failure
|
||||
*/
|
||||
int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_request_t* req);
|
||||
int nfapi_nr_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_stop_request_scf_t* req);
|
||||
|
||||
/*! Send the MEASUREMENT.request
|
||||
* \param config A pointer to a vnf config
|
||||
|
||||
@@ -665,6 +665,30 @@ void vnf_nr_handle_error_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_co
|
||||
}
|
||||
}
|
||||
|
||||
void vnf_nr_handle_stop_indication(void* pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||
{
|
||||
// ensure it's valid
|
||||
if (pRecvMsg == NULL || config == NULL) {
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||
} else {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received STOP.indication\n");
|
||||
|
||||
nfapi_nr_stop_indication_scf_t msg;
|
||||
|
||||
// unpack the message
|
||||
if (config->unpack_func(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config)) {
|
||||
if (config->nr_stop_ind) {
|
||||
(config->nr_stop_ind)(config, p5_idx, &msg);
|
||||
}
|
||||
} else {
|
||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
// make sure to release any dynamic part of the message
|
||||
if (msg.vendor_extension)
|
||||
config->codec_config.deallocate(msg.vendor_extension);
|
||||
}
|
||||
}
|
||||
|
||||
void vnf_handle_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||
{
|
||||
@@ -1172,6 +1196,10 @@ void vnf_nr_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfa
|
||||
vnf_handle_stop_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||
break;
|
||||
|
||||
case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION:
|
||||
vnf_nr_handle_stop_indication(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
if(messageHeader.message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
|
||||
|
||||
@@ -665,6 +665,18 @@ int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_reques
|
||||
|
||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_stop_request_t));
|
||||
}
|
||||
|
||||
int nfapi_nr_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_stop_request_scf_t* req)
|
||||
{
|
||||
if (config == 0 || req == 0)
|
||||
return -1;
|
||||
|
||||
vnf_t* _this = (vnf_t*)(config);
|
||||
AssertFatal(config->send_p5_msg, "Function pointer must be configured\n");
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Sending NFAPI STOP.request\n");
|
||||
return config->send_p5_msg(_this, p5_idx, &req->header, sizeof(nfapi_nr_stop_request_scf_t));
|
||||
}
|
||||
|
||||
int nfapi_vnf_measurement_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_measurement_request_t* req)
|
||||
{
|
||||
if(config == 0 || req == 0)
|
||||
|
||||
@@ -293,7 +293,7 @@ bool generate_srs_nr(const NR_DL_FRAME_PARMS *frame_parms,
|
||||
}
|
||||
uint8_t k_l_offset = 0; // If the SRS is configured by the IE SRS-PosResource-r16, the quantity k_l_offset is
|
||||
// given by TS 38.211 - Table 6.4.1.4.3-2, otherwise k_l_offset = 0.
|
||||
uint8_t k_0_overbar_p = (nr_srs_info->n_shift * NR_NB_SC_PER_RB + (K_TC_p + k_l_offset)) % K_TC;
|
||||
uint8_t k_0_overbar_p = nr_srs_info->n_shift * NR_NB_SC_PER_RB + (K_TC_p + k_l_offset) % K_TC;
|
||||
uint8_t k_0_p = k_0_overbar_p + K_TC * M_sc_b_SRS * sum_n_b;
|
||||
nr_srs_info->k_0_p[p_index][l_line] = k_0_p;
|
||||
|
||||
|
||||
@@ -75,9 +75,6 @@ bool wls_vnf_nr_send_p7_message(vnf_p7_t *vnf_p7, nfapi_nr_p7_message_header_t *
|
||||
return false;
|
||||
}
|
||||
|
||||
void wls_vnf_set_p7_config(void *p7_config)
|
||||
{
|
||||
}
|
||||
|
||||
bool wls_vnf_nr_send_p5_message(vnf_t *vnf,uint16_t p5_idx, nfapi_nr_p4_p5_message_header_t* msg, uint32_t msg_len)
|
||||
{
|
||||
@@ -108,3 +105,27 @@ void wls_pnf_set_p7_config(void *p7_config)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void wls_fapi_nr_pnf_stop()
|
||||
{
|
||||
}
|
||||
|
||||
void wls_pnf_close(pthread_t p5_thread)
|
||||
{
|
||||
}
|
||||
|
||||
void wls_vnf_send_stop_request()
|
||||
{
|
||||
}
|
||||
|
||||
void wls_vnf_stop()
|
||||
{
|
||||
}
|
||||
|
||||
void socket_nfapi_nr_pnf_stop()
|
||||
{
|
||||
}
|
||||
|
||||
void socket_nfapi_send_stop_request(vnf_t *vnf)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -308,13 +308,21 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
||||
break;
|
||||
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
|
||||
int tx_data_idx = dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15.pduIndex;
|
||||
DevAssert(tx_data_idx < TX_req->Number_of_PDUs);
|
||||
// reuse dlsch variables, as there are multiple very large memory
|
||||
// buffers
|
||||
gNB->dlsch[num_pdsch].pdsch_pdu = &dl_tti_pdu->pdsch_pdu;
|
||||
gNB->dlsch[num_pdsch].pdu = (uint8_t *)TX_req->pdu_list[tx_data_idx].TLVs[0].value.direct;
|
||||
DevAssert(num_pdsch < gNB->max_nb_pdsch);
|
||||
num_pdsch++;
|
||||
if (tx_data_idx < TX_req->Number_of_PDUs && TX_req->pdu_list[tx_data_idx].PDU_index == tx_data_idx) {
|
||||
// reuse dlsch variables, as there are multiple very large memory
|
||||
// buffers
|
||||
gNB->dlsch[num_pdsch].pdsch_pdu = &dl_tti_pdu->pdsch_pdu;
|
||||
gNB->dlsch[num_pdsch].pdu = (uint8_t *)TX_req->pdu_list[tx_data_idx].TLVs[0].value.direct;
|
||||
DevAssert(num_pdsch < gNB->max_nb_pdsch);
|
||||
num_pdsch++;
|
||||
} else {
|
||||
LOG_E(NR_PHY,
|
||||
"%4d.%2d no corresponding tx_data.request for dl_tti.request index %d (out of %d)\n",
|
||||
frame,
|
||||
slot,
|
||||
tx_data_idx,
|
||||
TX_req->Number_of_PDUs);
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,8 +278,8 @@ static void configure_srs_info(fapi_nr_ul_config_srs_pdu *srs_config_pdu, nr_srs
|
||||
nr_srs_info->n_SRS_cs = srs_config_pdu->cyclic_shift;
|
||||
nr_srs_info->n_ID_SRS = srs_config_pdu->sequence_id;
|
||||
// It adjusts the SRS allocation to align with the common resource block grid in multiples of four
|
||||
nr_srs_info->n_shift = srs_config_pdu->frequency_position;
|
||||
nr_srs_info->n_RRC = srs_config_pdu->frequency_shift;
|
||||
nr_srs_info->n_shift = srs_config_pdu->frequency_shift;
|
||||
nr_srs_info->n_RRC = srs_config_pdu->frequency_position;
|
||||
nr_srs_info->groupOrSequenceHopping = srs_config_pdu->group_or_sequence_hopping;
|
||||
nr_srs_info->l_offset = srs_config_pdu->time_start_position;
|
||||
nr_srs_info->T_SRS = srs_config_pdu->t_srs;
|
||||
|
||||
@@ -79,6 +79,16 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void stop_nr_nfapi_vnf()
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void stop_nr_nfapi_pnf()
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void fill_scc_sim(NR_ServingCellConfigCommon_t *scc, uint64_t *ssb_bitmap, int N_RB_DL, int N_RB_UL, int mu_dl, int mu_ul);
|
||||
void fix_scc(NR_ServingCellConfigCommon_t *scc, uint64_t ssbmap);
|
||||
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
|
||||
|
||||
@@ -1127,7 +1127,7 @@ f1ap_gnb_du_system_info_t *get_sys_info(NR_BCCH_BCH_Message_t *mib, const NR_BCC
|
||||
|
||||
sys_info->mib = calloc_or_fail(buf_len, sizeof(*sys_info->mib));
|
||||
DevAssert(mib != NULL);
|
||||
sys_info->mib_length = encode_MIB_NR(mib, 0, sys_info->mib, buf_len);
|
||||
sys_info->mib_length = encode_MIB_NR_setup(mib->message.choice.mib, 0, sys_info->mib, buf_len);
|
||||
DevAssert(sys_info->mib_length == buf_len);
|
||||
|
||||
DevAssert(sib1 != NULL);
|
||||
@@ -1356,6 +1356,18 @@ static void config_pdcp(configmodule_interface_t *cfg, nr_pdcp_configuration_t *
|
||||
pdcp_config->drb.discard_timer = config_get_processedint(cfg, &pdcp_params[CONFIG_NR_PDCP_DRB_DISCARD_TIMER_IDX]);
|
||||
}
|
||||
|
||||
void nfapi_stop_l1()
|
||||
{
|
||||
if (NFAPI_MODE && (NFAPI_MODE == NFAPI_MODE_AERIAL || NFAPI_MODE == NFAPI_MODE_VNF)) {
|
||||
stop_nr_nfapi_vnf();
|
||||
} else if (NFAPI_MODE && NFAPI_MODE == NFAPI_MODE_PNF) {
|
||||
// PNF should just wait for the STOP.request to come from the L2
|
||||
// If instead it was stopped first, in some cases it makes sense for it to terminate itself (WLS)
|
||||
// Sends a STOP.indication to the VNF
|
||||
stop_nr_nfapi_pnf();
|
||||
}
|
||||
}
|
||||
|
||||
static void get_bwp_config(nr_mac_config_t *configuration)
|
||||
{
|
||||
char path[MAX_OPTNAME_SIZE * 2 + 8];
|
||||
|
||||
@@ -64,7 +64,7 @@ f1ap_gnb_du_system_info_t *get_sys_info(NR_BCCH_BCH_Message_t *mib, const NR_BCC
|
||||
int gNB_app_handle_f1ap_gnb_cu_configuration_update(f1ap_gnb_cu_configuration_update_t *gnb_cu_cfg_update);
|
||||
MessageDef *RCconfig_NR_CU_E1(const E1_t *entity);
|
||||
ngran_node_t get_node_type(void);
|
||||
|
||||
void nfapi_stop_l1();
|
||||
#ifdef E2_AGENT
|
||||
#include "openair2/E2AP/e2_agent_arg.h"
|
||||
e2_agent_args_t RCconfig_NR_E2agent(void);
|
||||
|
||||
@@ -1099,6 +1099,13 @@ void nr_mac_configure_sib1(gNB_MAC_INST *nrmac, const plmn_id_t *plmn, uint64_t
|
||||
AssertFatal(cc->sib1_bcch_length > 0, "could not encode SIB1\n");
|
||||
}
|
||||
|
||||
static bool process_addmod_bearers_cellGroupConfig(NR_UE_sched_ctrl_t *sched_ctrl, const NR_RLC_BearerConfig_t *conf)
|
||||
{
|
||||
int priority = conf->mac_LogicalChannelConfig->ul_SpecificParameters->priority;
|
||||
nr_lc_config_t c = {.lcid = conf->logicalChannelIdentity, .priority = priority};
|
||||
return nr_mac_add_lcid(sched_ctrl, &c);
|
||||
}
|
||||
|
||||
bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup)
|
||||
{
|
||||
/* ideally, instead of this function, "users" of this function should call
|
||||
@@ -1120,7 +1127,9 @@ bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t
|
||||
}
|
||||
int ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||
configure_UE_BWP(nrmac, nrmac->common_channels[0].ServingCellConfigCommon, UE, false, ss_type, -1, -1);
|
||||
process_addmod_bearers_cellGroupConfig(&UE->UE_sched_ctrl, CellGroup->rlc_BearerToAddModList);
|
||||
const struct NR_CellGroupConfig__rlc_BearerToAddModList *l = CellGroup->rlc_BearerToAddModList;
|
||||
for (int i = 0; l != NULL && i < l->list.count; ++i)
|
||||
process_addmod_bearers_cellGroupConfig(&UE->UE_sched_ctrl, CellGroup->rlc_BearerToAddModList->list.array[i]);
|
||||
AssertFatal(CellGroup->rlc_BearerToReleaseList == NULL, "cannot release bearers while adding new UEs\n");
|
||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
||||
LOG_I(NR_MAC, "Added new UE %x with initial CellGroup\n", rnti);
|
||||
@@ -1139,14 +1148,23 @@ void nr_mac_prepare_ra_ue(gNB_MAC_INST *nrmac, NR_UE_info_t *UE)
|
||||
uint8_t num_preamble = cfra->resources.choice.ssb->ssb_ResourceList.list.count;
|
||||
ra->preambles.num_preambles = num_preamble;
|
||||
NR_COMMON_channels_t *cc = &nrmac->common_channels[0];
|
||||
char buf[200];
|
||||
int idx = 0;
|
||||
for (int i = 0; i < cc->num_active_ssb; i++) {
|
||||
for (int j = 0; j < num_preamble; j++) {
|
||||
if (cc->ssb_index[i] == cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ssb) {
|
||||
// one dedicated preamble for each beam
|
||||
ra->preambles.preamble_list[i] = cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ra_PreambleIndex;
|
||||
if (idx < sizeof(buf) - 1)
|
||||
idx += snprintf(buf + idx, sizeof(buf) - idx, " %d", ra->preambles.preamble_list[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG_I(NR_MAC, "Added new %s process for UE RNTI %04x with initial CellGroup\n", ra->cfra ? "CFRA" : "CBRA", UE->rnti);
|
||||
LOG_I(NR_MAC,
|
||||
"Added new %s process for UE RNTI %04x with initial CellGroup and %d preamble(s): %s\n",
|
||||
ra->cfra ? "CFRA" : "CBRA",
|
||||
UE->rnti,
|
||||
num_preamble,
|
||||
buf);
|
||||
}
|
||||
|
||||
@@ -785,6 +785,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
|
||||
{
|
||||
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
|
||||
NR_RA_t *ra = UE->ra;
|
||||
DevAssert(!ra->cfra);
|
||||
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
|
||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
|
||||
@@ -1451,6 +1452,11 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
||||
return;
|
||||
|
||||
const NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
|
||||
// check the feasibility of Msg3, the actual Msg3 allocation
|
||||
// is further below. In the case of CFRA, we don't need Msg3, but 38.321
|
||||
// §5.1.4 does not clearly exclude Msg3, and UL TA might still be useful.
|
||||
// Before the change in this commit, we used CFRA but required Msg3, which
|
||||
// COTS UE would often (but not always) send.
|
||||
bool ret = get_feasible_msg3_tda(scc,
|
||||
get_delta_for_k2(ul_bwp->scs),
|
||||
ul_bwp->tdaList_Common,
|
||||
@@ -1523,6 +1529,7 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
||||
return;
|
||||
}
|
||||
|
||||
// get an actual Msg3 allocation in CBRA
|
||||
bool msg3_ret = nr_get_Msg3alloc(nr_mac, CC_id, slotP, frameP, UE);
|
||||
if (!msg3_ret) {
|
||||
reset_beam_status(&nr_mac->beam_info, ra->Msg3_frame, ra->Msg3_slot, UE->UE_beam_index, n_slots_frame, ra->Msg3_beam.new_beam);
|
||||
@@ -1609,27 +1616,31 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
||||
// DL TX request
|
||||
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[TX_req->Number_of_PDUs];
|
||||
|
||||
// Program UL processing for Msg3
|
||||
// If CFRA: 38.321 §5.1.4 does not clearly say (to me) if UL grant should be
|
||||
// dropped or not, and COTS UE would often send Msg3 if we configured CFRA
|
||||
// but required Msg3. Also, "if RAR includes a MAC subPDU with RAPID: [...]
|
||||
// indicate the reception of an acknowledgement for SI request to upper
|
||||
// layers." which is not the case here.
|
||||
nr_add_msg3(module_idP, CC_id, frameP, slotP, UE, (uint8_t *)&tx_req->TLVs[0].value.direct[0]);
|
||||
|
||||
// Start RA contention resolution timer in Msg3 transmission slot (current slot + K2)
|
||||
// 3GPP TS 38.321 Section 5.1.5 Contention Resolution
|
||||
start_ra_contention_resolution_timer(
|
||||
ra,
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ra_ContentionResolutionTimer,
|
||||
*ul_bwp->tdaList_Common->list.array[ra->Msg3_tda_id]->k2 + get_NTN_Koffset(scc),
|
||||
ul_bwp->scs);
|
||||
if (!ra->cfra) {
|
||||
LOG_D(NR_MAC,
|
||||
"UE %04x: %d.%d: Setting RA-Msg3 reception for SFN.Slot %d.%d\n",
|
||||
UE->rnti,
|
||||
frameP,
|
||||
slotP,
|
||||
ra->Msg3_frame,
|
||||
ra->Msg3_slot);
|
||||
|
||||
LOG_D(NR_MAC,
|
||||
"UE %04x: %d.%d: Setting RA-Msg3 reception (%s) for SFN.Slot %d.%d\n",
|
||||
UE->rnti,
|
||||
frameP,
|
||||
slotP,
|
||||
ra->cfra ? "CFRA" : "CBRA",
|
||||
ra->Msg3_frame,
|
||||
ra->Msg3_slot);
|
||||
// Start RA contention resolution timer in Msg3 transmission slot (current slot + K2)
|
||||
// 3GPP TS 38.321 Section 5.1.5 Contention Resolution
|
||||
start_ra_contention_resolution_timer(
|
||||
ra,
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ra_ContentionResolutionTimer,
|
||||
*ul_bwp->tdaList_Common->list.array[ra->Msg3_tda_id]->k2 + get_NTN_Koffset(scc),
|
||||
ul_bwp->scs);
|
||||
|
||||
LOG_A(NR_MAC, "%d.%d Send RAR to RA-RNTI %04x\n", frameP, slotP, ra->RA_rnti);
|
||||
}
|
||||
|
||||
tx_req->PDU_index = pduindex;
|
||||
tx_req->num_TLV = 1;
|
||||
@@ -1654,6 +1665,7 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
||||
vrb_map[bwp_info.bwpStart + rb + rbStart] |= SL_to_bitmap(tda_info.startSymbolIndex, tda_info.nrOfSymbols);
|
||||
}
|
||||
|
||||
// In CFRA: in Msg3 handling, will unconditionally mark succeeded
|
||||
ra->ra_state = nrRA_WAIT_Msg3;
|
||||
}
|
||||
|
||||
@@ -1675,6 +1687,7 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||
NR_SearchSpace_t *ss = sched_ctrl->search_space;
|
||||
NR_RA_t *ra = UE->ra;
|
||||
DevAssert(!ra->cfra);
|
||||
const char *ra_type_str = ra->ra_type == RA_2_STEP ? "MsgB" : "Msg4";
|
||||
NR_ControlResourceSet_t *coreset = sched_ctrl->coreset;
|
||||
AssertFatal(coreset != NULL, "Coreset cannot be null for RA %s\n", ra_type_str);
|
||||
|
||||
@@ -1113,7 +1113,12 @@ void post_process_dlsch(gNB_MAC_INST *nr_mac, post_process_pdsch_t *pdsch, NR_UE
|
||||
// TODO: verify the case where maxMIMO_Layers is NULL, in which case
|
||||
// in principle maxMIMO_layers should be given by the maximum number of layers
|
||||
// for PDSCH supported by the UE for the serving cell (5.4.2.1 of 38.212)
|
||||
long maxMIMO_Layers = UE->sc_info.maxMIMO_Layers_PDSCH ? *UE->sc_info.maxMIMO_Layers_PDSCH : 1;
|
||||
long ue_supp_nl = ue_supported_dl_layers(scc, UE->capability);
|
||||
long maxMIMO_Layers = UE->sc_info.maxMIMO_Layers_PDSCH ? *UE->sc_info.maxMIMO_Layers_PDSCH : ue_supp_nl;
|
||||
if (maxMIMO_Layers < 1) {
|
||||
LOG_D(NR_MAC, "Both maxMIMO_Layers_PDSCH and UE supported layers are not present, defaulting to 1\n");
|
||||
maxMIMO_Layers = 1;
|
||||
}
|
||||
const int nl_tbslbrm = min(maxMIMO_Layers, 4);
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = prepare_pdsch_pdu(dl_tti_pdsch_pdu,
|
||||
nr_mac,
|
||||
@@ -1395,5 +1400,4 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
|
||||
/* PREPROCESSOR */
|
||||
gNB_mac->pre_processor_dl(gNB_mac, &pdsch);
|
||||
|
||||
}
|
||||
|
||||
@@ -3963,23 +3963,6 @@ void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_
|
||||
free_cellGroupConfig(cellGroup_for_UE);
|
||||
}
|
||||
|
||||
/* \brief add bearers from CellGroupConfig.
|
||||
*
|
||||
* This is a kind of hack, as this should be processed through a F1 UE Context
|
||||
* setup request, but some modes do not use that (NSA/do-ra/phy_test). */
|
||||
void process_addmod_bearers_cellGroupConfig(NR_UE_sched_ctrl_t *sched_ctrl, const struct NR_CellGroupConfig__rlc_BearerToAddModList *addmod)
|
||||
{
|
||||
if (addmod == NULL)
|
||||
return; /* nothing to do */
|
||||
|
||||
for (int i = 0; i < addmod->list.count; ++i) {
|
||||
const NR_RLC_BearerConfig_t *conf = addmod->list.array[i];
|
||||
int lcid = conf->logicalChannelIdentity;
|
||||
nr_lc_config_t c = {.lcid = lcid};
|
||||
nr_mac_add_lcid(sched_ctrl, &c);
|
||||
}
|
||||
}
|
||||
|
||||
long get_lcid_from_drbid(int drb_id)
|
||||
{
|
||||
return drb_id + 3; /* LCID is DRB + 3 */
|
||||
|
||||
@@ -725,13 +725,6 @@ static void handle_nr_ul_harq(gNB_MAC_INST *nrmac,
|
||||
|
||||
static void handle_msg3_failed_rx(gNB_MAC_INST *mac, NR_RA_t *ra, rnti_t rnti, int harq_round_max)
|
||||
{
|
||||
// for CFRA (NSA) do not schedule retransmission of msg3
|
||||
if (ra->cfra) {
|
||||
LOG_W(NR_MAC, "UE %04x RA failed at state %s (NSA msg3 reception failed)\n", rnti, nrra_text[ra->ra_state]);
|
||||
nr_release_ra_UE(mac, rnti);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ra->msg3_round >= harq_round_max - 1) {
|
||||
LOG_W(NR_MAC, "UE %04x RA failed at state %s (Reached msg3 max harq rounds)\n", rnti, nrra_text[ra->ra_state]);
|
||||
nr_release_ra_UE(mac, rnti);
|
||||
@@ -756,6 +749,7 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
|
||||
const uint16_t rssi)
|
||||
{
|
||||
gNB_MAC_INST *mac = RC.nrmac[mod_id];
|
||||
NR_ServingCellConfigCommon_t *scc = mac->common_channels[0].ServingCellConfigCommon;
|
||||
NR_UE_info_t *UE = find_ra_UE(&mac->UE_info, rnti);
|
||||
if (!UE) {
|
||||
LOG_E(NR_MAC, "UL SDU discarded. Couldn't finde UE with RNTI %04x \n", rnti);
|
||||
@@ -768,8 +762,36 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
|
||||
return;
|
||||
}
|
||||
|
||||
// CFRA: we scheduled Msg3 (which does not exist in CFRA, see also
|
||||
// nr_generate_Msg2()). We did not mark RA as complete right away, as the
|
||||
// DLSCH scheduler might schedule in the same slot as Msg2 if RLC has data
|
||||
// (which can only happen in do-ra), so we mark it as complete now.
|
||||
bool cfra = ra->cfra;
|
||||
if (ra->cfra) {
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||
nr_mac_reset_ul_failure(sched_ctrl);
|
||||
reset_dl_harq_list(sched_ctrl);
|
||||
reset_ul_harq_list(sched_ctrl);
|
||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration in SA
|
||||
// in NSA (or do-ra) there is no reconfiguration in NR
|
||||
int ss_type = IS_SA_MODE(get_softmodem_params()) ? NR_SearchSpace__searchSpaceType_PR_common
|
||||
: NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||
configure_UE_BWP(mac, scc, UE, false, ss_type, -1, -1);
|
||||
// initialize ta_frame in case there is no Msg3 received
|
||||
UE->UE_sched_ctrl.ta_frame = (frame + 100) % MAX_FRAME_NUMBER;
|
||||
if (!transition_ra_connected_nr_ue(mac, UE)) {
|
||||
LOG_E(NR_MAC, "cannot add UE %04x: list is full\n", UE->rnti);
|
||||
delete_nr_ue_data(UE, NULL, &mac->UE_info.uid_allocator);
|
||||
} else {
|
||||
LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", UE->rnti);
|
||||
}
|
||||
}
|
||||
|
||||
const int target_snrx10 = mac->pusch_target_snrx10;
|
||||
if (!sdu) { // NACK
|
||||
if (cfra) // no Msg3 on CFRA, no problem
|
||||
return;
|
||||
|
||||
if (ra->ra_state != nrRA_WAIT_Msg3)
|
||||
return;
|
||||
|
||||
@@ -799,10 +821,11 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
|
||||
|
||||
if (no_sig) {
|
||||
LOG_W(NR_MAC, "MSG3 ULSCH with no signal\n");
|
||||
handle_msg3_failed_rx(mac, ra, rnti, mac->ul_bler.harq_round_max);
|
||||
if (!cfra)
|
||||
handle_msg3_failed_rx(mac, ra, rnti, mac->ul_bler.harq_round_max);
|
||||
return;
|
||||
}
|
||||
if (ra->ra_type == RA_2_STEP) {
|
||||
if (!cfra && ra->ra_type == RA_2_STEP) {
|
||||
// random access pusch with RA-RNTI
|
||||
if (ra->RA_rnti != rnti) {
|
||||
LOG_E(NR_MAC, "expected TC_RNTI %04x to match current RNTI %04x\n", ra->RA_rnti, rnti);
|
||||
@@ -826,94 +849,76 @@ static void nr_rx_ra_sdu(const module_id_t mod_id,
|
||||
UE_scheduling_control->ta_update = timing_advance;
|
||||
UE_scheduling_control->raw_rssi = rssi;
|
||||
LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n", UE->rnti, UE_scheduling_control->tpc0, UE_scheduling_control->ta_update);
|
||||
NR_ServingCellConfigCommon_t *scc = mac->common_channels[0].ServingCellConfigCommon;
|
||||
if (ra->cfra) {
|
||||
LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", UE->rnti);
|
||||
nr_mac_reset_ul_failure(UE_scheduling_control);
|
||||
reset_dl_harq_list(UE_scheduling_control);
|
||||
reset_ul_harq_list(UE_scheduling_control);
|
||||
process_addmod_bearers_cellGroupConfig(&UE->UE_sched_ctrl, UE->CellGroup->rlc_BearerToAddModList);
|
||||
int ss_type;
|
||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration in SA
|
||||
// in NSA (or do-ra) there is no reconfiguration in NR
|
||||
if (IS_SA_MODE(get_softmodem_params()))
|
||||
ss_type = NR_SearchSpace__searchSpaceType_PR_common;
|
||||
else
|
||||
ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||
configure_UE_BWP(mac, scc, UE, false, ss_type, -1, -1);
|
||||
if (!transition_ra_connected_nr_ue(mac, UE)) {
|
||||
LOG_E(NR_MAC, "cannot add UE %04x: list is full\n", UE->rnti);
|
||||
delete_nr_ue_data(UE, NULL, &mac->UE_info.uid_allocator);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
LOG_D(NR_MAC, "[RAPROC] Received %s:\n", ra->ra_type == RA_2_STEP ? "MsgA-PUSCH" : "Msg3");
|
||||
for (uint32_t k = 0; k < sdu_len; k++) {
|
||||
LOG_D(NR_MAC, "(%i): 0x%x\n", k, sdu[k]);
|
||||
}
|
||||
|
||||
// 3GPP TS 38.321 Section 5.4.3 Multiplexing and assembly
|
||||
// Logical channels shall be prioritised in accordance with the following order (highest priority listed first):
|
||||
// - MAC CE for C-RNTI, or data from UL-CCCH;
|
||||
// This way, we need to process MAC CE for C-RNTI if RA is active and it is present in the MAC PDU
|
||||
// Search for MAC CE for C-RNTI
|
||||
rnti_t crnti = lcid_crnti_lookahead(sdu, sdu_len);
|
||||
if (crnti != 0) { // 3GPP TS 38.321 Table 7.1-1: RNTI values, RNTI 0x0000: N/A
|
||||
// Replace the current UE by the UE identified by C-RNTI
|
||||
NR_UE_info_t *old_UE = find_nr_UE(&mac->UE_info, crnti);
|
||||
if (!old_UE) {
|
||||
// The UE identified by C-RNTI no longer exists at the gNB
|
||||
// Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better
|
||||
// solution may be implemented
|
||||
LOG_W(NR_MAC, "No UE found with C-RNTI %04x, ignoring Msg3 to have UE come back with new RA attempt\n", UE->rnti);
|
||||
nr_release_ra_UE(mac, rnti);
|
||||
return;
|
||||
}
|
||||
// in case UE beam has changed
|
||||
old_UE->UE_beam_index = UE->UE_beam_index;
|
||||
// Reset UL failure for old UE
|
||||
nr_mac_reset_ul_failure(&old_UE->UE_sched_ctrl);
|
||||
// Reset HARQ processes
|
||||
reset_dl_harq_list(&old_UE->UE_sched_ctrl);
|
||||
reset_ul_harq_list(&old_UE->UE_sched_ctrl);
|
||||
LOG_D(NR_MAC, "[RAPROC] Received %s:\n", ra->ra_type == RA_2_STEP ? "MsgA-PUSCH" : "Msg3");
|
||||
for (uint32_t k = 0; k < sdu_len; k++) {
|
||||
LOG_D(NR_MAC, "(%i): 0x%x\n", k, sdu[k]);
|
||||
}
|
||||
|
||||
// Only trigger RRCReconfiguration if UE is not performing RRCReestablishment
|
||||
// The RRCReconfiguration will be triggered by the RRCReestablishmentComplete
|
||||
if (!old_UE->reconfigSpCellConfig) {
|
||||
LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x, triggering RRC Reconfiguration\n", crnti);
|
||||
// Trigger RRCReconfiguration
|
||||
nr_mac_trigger_reconfiguration(mac, old_UE, -1);
|
||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration
|
||||
configure_UE_BWP(mac, scc, old_UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
||||
}
|
||||
// 3GPP TS 38.321 Section 5.4.3 Multiplexing and assembly
|
||||
// Logical channels shall be prioritised in accordance with the following order (highest priority listed first):
|
||||
// - MAC CE for C-RNTI, or data from UL-CCCH;
|
||||
// This way, we need to process MAC CE for C-RNTI if RA is active and it is present in the MAC PDU
|
||||
// Search for MAC CE for C-RNTI
|
||||
rnti_t crnti = lcid_crnti_lookahead(sdu, sdu_len);
|
||||
if (crnti != 0) { // 3GPP TS 38.321 Table 7.1-1: RNTI values, RNTI 0x0000: N/A
|
||||
// Replace the current UE by the UE identified by C-RNTI
|
||||
NR_UE_info_t *old_UE = find_nr_UE(&mac->UE_info, crnti);
|
||||
if (!old_UE) {
|
||||
// The UE identified by C-RNTI no longer exists at the gNB
|
||||
// Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better
|
||||
// solution may be implemented
|
||||
LOG_W(NR_MAC, "No UE found with C-RNTI %04x, ignoring Msg3 to have UE come back with new RA attempt\n", UE->rnti);
|
||||
nr_release_ra_UE(mac, rnti);
|
||||
LOG_A(NR_MAC, "%4d.%2d RA with C-RNTI %04x complete\n", frame, slot, crnti);
|
||||
|
||||
// Decode the entire MAC PDU
|
||||
// It may have multiple MAC subPDUs, for example, a MAC subPDU with LCID 1 caring a RRCReestablishmentComplete
|
||||
nr_process_mac_pdu(mod_id, old_UE, CC_id, frame, slot, sdu, sdu_len, -1);
|
||||
return;
|
||||
}
|
||||
// in case UE beam has changed
|
||||
old_UE->UE_beam_index = UE->UE_beam_index;
|
||||
// Reset UL failure for old UE
|
||||
nr_mac_reset_ul_failure(&old_UE->UE_sched_ctrl);
|
||||
// Reset HARQ processes
|
||||
reset_dl_harq_list(&old_UE->UE_sched_ctrl);
|
||||
reset_ul_harq_list(&old_UE->UE_sched_ctrl);
|
||||
|
||||
// UE Contention Resolution Identity
|
||||
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4
|
||||
// First byte corresponds to R/LCID MAC sub-header
|
||||
memcpy(ra->cont_res_id, &sdu[1], sizeof(uint8_t) * 6);
|
||||
// Only trigger RRCReconfiguration if UE is not performing RRCReestablishment
|
||||
// The RRCReconfiguration will be triggered by the RRCReestablishmentComplete
|
||||
if (!old_UE->reconfigSpCellConfig) {
|
||||
LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x, triggering RRC Reconfiguration\n", crnti);
|
||||
// Trigger RRCReconfiguration
|
||||
nr_mac_trigger_reconfiguration(mac, old_UE, -1);
|
||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration
|
||||
configure_UE_BWP(mac, scc, old_UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
||||
}
|
||||
nr_release_ra_UE(mac, rnti);
|
||||
LOG_A(NR_MAC, "%4d.%2d RA with C-RNTI %04x complete\n", frame, slot, crnti);
|
||||
|
||||
// Decode MAC PDU
|
||||
// the function is only called to decode the contention resolution sub-header
|
||||
// harq_pid set a non-valid value because it is not used in this call
|
||||
nr_process_mac_pdu(mod_id, UE, CC_id, frame, slot, sdu, sdu_len, -1);
|
||||
|
||||
LOG_I(NR_MAC,
|
||||
"Activating scheduling %s for TC_RNTI 0x%04x (state %s)\n",
|
||||
ra->ra_type == RA_2_STEP ? "MsgB" : "Msg4",
|
||||
UE->rnti,
|
||||
nrra_text[ra->ra_state]);
|
||||
ra->ra_state = ra->ra_type == RA_2_STEP ? nrRA_MsgB : nrRA_Msg4;
|
||||
LOG_D(NR_MAC, "TC_RNTI 0x%04x next RA state %s\n", UE->rnti, nrra_text[ra->ra_state]);
|
||||
// Decode the entire MAC PDU
|
||||
// It may have multiple MAC subPDUs, for example, a MAC subPDU with LCID 1 caring a RRCReestablishmentComplete
|
||||
nr_process_mac_pdu(mod_id, old_UE, CC_id, frame, slot, sdu, sdu_len, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cfra)
|
||||
return; // rest not relevant for CFRA
|
||||
|
||||
// UE Contention Resolution Identity
|
||||
// Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to fill in Msg4
|
||||
// First byte corresponds to R/LCID MAC sub-header
|
||||
memcpy(ra->cont_res_id, &sdu[1], sizeof(uint8_t) * 6);
|
||||
|
||||
// Decode MAC PDU
|
||||
// the function is only called to decode the contention resolution sub-header
|
||||
// harq_pid set a non-valid value because it is not used in this call
|
||||
nr_process_mac_pdu(mod_id, UE, CC_id, frame, slot, sdu, sdu_len, -1);
|
||||
|
||||
LOG_I(NR_MAC,
|
||||
"Activating scheduling %s for TC_RNTI 0x%04x (state %s)\n",
|
||||
ra->ra_type == RA_2_STEP ? "MsgB" : "Msg4",
|
||||
UE->rnti,
|
||||
nrra_text[ra->ra_state]);
|
||||
ra->ra_state = ra->ra_type == RA_2_STEP ? nrRA_MsgB : nrRA_Msg4;
|
||||
LOG_D(NR_MAC, "TC_RNTI 0x%04x next RA state %s\n", UE->rnti, nrra_text[ra->ra_state]);
|
||||
return;
|
||||
}
|
||||
|
||||
static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
@@ -2081,8 +2086,8 @@ static int pf_ul(gNB_MAC_INST *nrmac,
|
||||
|
||||
/* Create UE_sched for UEs eligibale for new data transmission*/
|
||||
/* Calculate coefficient*/
|
||||
const uint8_t Qm = nr_get_Qm_dl(selected_mcs, current_BWP->mcs_table);
|
||||
const uint16_t R = nr_get_code_rate_dl(selected_mcs, current_BWP->mcs_table);
|
||||
const uint8_t Qm = nr_get_Qm_ul(selected_mcs, current_BWP->mcs_table);
|
||||
const uint16_t R = nr_get_code_rate_ul(selected_mcs, current_BWP->mcs_table);
|
||||
const uint32_t tbs = nr_compute_tbs(Qm,
|
||||
R,
|
||||
1, /* rbSize */
|
||||
@@ -2375,10 +2380,9 @@ nfapi_nr_pusch_pdu_t *prepare_pusch_pdu(nfapi_nr_ul_tti_request_t *future_ul_tti
|
||||
long *maxMIMO_Layers = UE->sc_info.maxMIMO_Layers_PUSCH;
|
||||
if (!maxMIMO_Layers && ul_bwp && ul_bwp->pusch_Config)
|
||||
maxMIMO_Layers = ul_bwp->pusch_Config->maxRank;
|
||||
long lbrm_layers = maxMIMO_Layers ? *maxMIMO_Layers : ue_supported_ul_layers(UE->capability);
|
||||
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
|
||||
pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(ul_bwp->mcs_table,
|
||||
UE->sc_info.ul_bw_tbslbrm,
|
||||
*maxMIMO_Layers);
|
||||
pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(ul_bwp->mcs_table, UE->sc_info.ul_bw_tbslbrm, lbrm_layers);
|
||||
}
|
||||
/* PUSCH PTRS */
|
||||
if (sched_pusch->dmrs_info.ptrsConfig) {
|
||||
|
||||
@@ -480,9 +480,6 @@ bool nr_mac_check_ul_failure(gNB_MAC_INST *nrmac, int rnti, NR_UE_sched_ctrl_t *
|
||||
|
||||
void nr_mac_trigger_reconfiguration(const gNB_MAC_INST *nrmac, const NR_UE_info_t *UE, int new_bwp_id);
|
||||
|
||||
void process_addmod_bearers_cellGroupConfig(NR_UE_sched_ctrl_t *sched_ctrl,
|
||||
const struct NR_CellGroupConfig__rlc_BearerToAddModList *addmod);
|
||||
|
||||
bool nr_mac_add_lcid(NR_UE_sched_ctrl_t *sched_ctrl, const nr_lc_config_t *c);
|
||||
nr_lc_config_t *nr_mac_get_lc_config(NR_UE_sched_ctrl_t* sched_ctrl, int lcid);
|
||||
bool nr_mac_remove_lcid(NR_UE_sched_ctrl_t *sched_ctrl, long lcid);
|
||||
|
||||
@@ -681,11 +681,9 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
/* new UE: tell the UE to reestablish RLC */
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *addmod = new_CellGroup->rlc_BearerToAddModList;
|
||||
for (int i = 0; i < addmod->list.count; ++i) {
|
||||
asn1cCallocOne(addmod->list.array[i]->reestablishRLC, NR_RLC_BearerConfig__reestablishRLC_true);
|
||||
for (int i = 1; i < seq_arr_size(&UE->UE_sched_ctrl.lc_config); ++i) {
|
||||
nr_lc_config_t *lc_config = seq_arr_at(&UE->UE_sched_ctrl.lc_config, i);
|
||||
nr_rlc_reestablish_entity(UE->rnti, lc_config->lcid);
|
||||
}
|
||||
NR_RLC_BearerConfig_t *bc = addmod->list.array[i];
|
||||
asn1cCallocOne(bc->reestablishRLC, NR_RLC_BearerConfig__reestablishRLC_true);
|
||||
nr_rlc_reestablish_entity(UE->rnti, bc->logicalChannelIdentity);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -585,22 +585,13 @@ static void config_csiim(int do_csirs,
|
||||
}
|
||||
|
||||
|
||||
void set_dl_maxmimolayers(NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
int maxMIMO_layers)
|
||||
long ue_supported_dl_layers(const NR_ServingCellConfigCommon_t *scc, const NR_UE_NR_Capability_t *uecap)
|
||||
{
|
||||
if(!pdsch_servingcellconfig->ext1)
|
||||
pdsch_servingcellconfig->ext1=calloc(1,sizeof(*pdsch_servingcellconfig->ext1));
|
||||
if(!pdsch_servingcellconfig->ext1->maxMIMO_Layers)
|
||||
pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers));
|
||||
|
||||
NR_SCS_SpecificCarrier_t *scs_carrier = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0];
|
||||
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||
const frequency_range_t freq_range = get_freq_range_from_band(band);
|
||||
const int scs = scs_carrier->subcarrierSpacing;
|
||||
const int bw_size = scs_carrier->carrierBandwidth;
|
||||
|
||||
NR_FeatureSets_t *fs = uecap ? uecap->featureSets : NULL;
|
||||
if (fs) {
|
||||
const int bw_mhz = get_supported_bw_mhz(freq_range, get_supported_band_index(scs, freq_range, bw_size));
|
||||
@@ -610,16 +601,29 @@ void set_dl_maxmimolayers(NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig,
|
||||
if (scs == dl_fs->supportedSubcarrierSpacingDL &&
|
||||
supported_bw_comparison(bw_mhz, &dl_fs->supportedBandwidthDL, dl_fs->channelBW_90mhz) &&
|
||||
dl_fs->maxNumberMIMO_LayersPDSCH) {
|
||||
long ue_supported_layers = (2 << *dl_fs->maxNumberMIMO_LayersPDSCH);
|
||||
if (maxMIMO_layers == -1)
|
||||
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = NR_MAX_SUPPORTED_DL_LAYERS < ue_supported_layers ? NR_MAX_SUPPORTED_DL_LAYERS : ue_supported_layers;
|
||||
else
|
||||
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = maxMIMO_layers < ue_supported_layers ? maxMIMO_layers : ue_supported_layers;
|
||||
return;
|
||||
return (2 << *dl_fs->maxNumberMIMO_LayersPDSCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void set_dl_maxmimolayers(NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
int maxMIMO_layers)
|
||||
{
|
||||
if(!pdsch_servingcellconfig->ext1)
|
||||
pdsch_servingcellconfig->ext1 = calloc(1, sizeof(*pdsch_servingcellconfig->ext1));
|
||||
if(!pdsch_servingcellconfig->ext1->maxMIMO_Layers)
|
||||
pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1, sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers));
|
||||
|
||||
long l = ue_supported_dl_layers(scc, uecap);
|
||||
long ue_supported_layers = l > 1 ? l : 2; // min UE supported layers = 2
|
||||
if (maxMIMO_layers == -1)
|
||||
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = min(NR_MAX_SUPPORTED_DL_LAYERS, ue_supported_layers);
|
||||
else
|
||||
*pdsch_servingcellconfig->ext1->maxMIMO_Layers = min(maxMIMO_layers, ue_supported_layers);
|
||||
}
|
||||
|
||||
// TODO: Implement to b_SRS = 1 and b_SRS = 2
|
||||
@@ -3735,10 +3739,11 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
||||
return cellGroupConfig;
|
||||
}
|
||||
|
||||
static long set_ul_max_layers(const nr_mac_config_t *configuration, const NR_UE_NR_Capability_t *uecap)
|
||||
long ue_supported_ul_layers(const NR_UE_NR_Capability_t *uecap)
|
||||
{
|
||||
long ul_max_layers = 1;
|
||||
if (uecap && uecap->featureSets
|
||||
if (uecap
|
||||
&& uecap->featureSets
|
||||
&& uecap->featureSets->featureSetsUplinkPerCC
|
||||
&& uecap->featureSets->featureSetsUplinkPerCC->list.count > 0) {
|
||||
NR_FeatureSetUplinkPerCC_t *ul_feature_setup_per_cc = uecap->featureSets->featureSetsUplinkPerCC->list.array[0];
|
||||
@@ -3754,11 +3759,15 @@ static long set_ul_max_layers(const nr_mac_config_t *configuration, const NR_UE_
|
||||
ul_max_layers = 1;
|
||||
}
|
||||
}
|
||||
ul_max_layers = min(ul_max_layers, configuration->pusch_AntennaPorts);
|
||||
}
|
||||
return ul_max_layers;
|
||||
}
|
||||
|
||||
static long set_ul_max_layers(const nr_mac_config_t *configuration, const NR_UE_NR_Capability_t *uecap)
|
||||
{
|
||||
return min(ue_supported_ul_layers(uecap), configuration->pusch_AntennaPorts);
|
||||
}
|
||||
|
||||
NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_mac_config_t *configuration,
|
||||
const NR_UE_NR_Capability_t *uecap,
|
||||
|
||||
@@ -134,5 +134,6 @@ NR_CellGroupConfig_t * update_cellGroupConfig_for_BWP_switch(NR_CellGroupConfig_
|
||||
NR_MeasurementTimingConfiguration_t *get_nr_mtc(uint8_t *buf, uint32_t len);
|
||||
measgap_config_t create_measgap_config(const NR_MeasurementTimingConfiguration_t *mtc, int scs, int min_rxtxtime);
|
||||
int encode_measgap_config(const measgap_config_t *c, uint8_t *buf);
|
||||
|
||||
long ue_supported_ul_layers(const NR_UE_NR_Capability_t *uecap);
|
||||
long ue_supported_dl_layers(const NR_ServingCellConfigCommon_t *scc, const NR_UE_NR_Capability_t *uecap);
|
||||
#endif
|
||||
|
||||
@@ -1063,15 +1063,10 @@ static void cuup_notify_reestablishment(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* According to current understanding of E1 specifications, it is not needed
|
||||
* to send security information because this does not change.
|
||||
* But let's keep the code here in case it's needed.
|
||||
*/
|
||||
// Always send security information
|
||||
/* During reestablishment, for DRB integrity protection security keys change (KgNB* is derived),
|
||||
* so security information MUST be sent to CU-UP to update DRB security keys. */
|
||||
req.secInfo = malloc_or_fail(sizeof(*req.secInfo));
|
||||
fill_security_info(rrc, ue_p, req.secInfo);
|
||||
#endif
|
||||
|
||||
/* Send E1 Bearer Context Modification Request (3GPP TS 38.463) */
|
||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, ue_p);
|
||||
@@ -3407,26 +3402,7 @@ void rrc_gNB_generate_UeContextSetupRequest(const gNB_RRC_INST *rrc,
|
||||
}
|
||||
|
||||
nr_rrc_du_container_t *du = get_du_for_ue((gNB_RRC_INST *)rrc, ue_p->rrc_ue_id);
|
||||
byte_array_t *meas_timing_config = NULL;
|
||||
if (du->mtc && ue_p->measConfig && ue_p->measConfig->measObjectToAddModList) {
|
||||
NR_MeasObjectToAddModList_t *mo_list = ue_p->measConfig->measObjectToAddModList;
|
||||
NR_ARFCN_ValueNR_t ssbFrequency0;
|
||||
for (int i = 0; i < mo_list->list.count; i++) {
|
||||
NR_MeasObjectToAddMod_t *mo = mo_list->list.array[i];
|
||||
if (mo->measObject.present == NR_MeasObjectToAddMod__measObject_PR_measObjectNR) {
|
||||
NR_MeasObjectNR_t *monr = mo->measObject.choice.measObjectNR;
|
||||
if (i == 0) {
|
||||
ssbFrequency0 = *monr->ssbFrequency;
|
||||
} else if (ssbFrequency0 != *monr->ssbFrequency) {
|
||||
meas_timing_config = calloc_or_fail(1, sizeof(*meas_timing_config));
|
||||
meas_timing_config->buf = calloc_or_fail(1, NR_RRC_BUF_SIZE);
|
||||
meas_timing_config->len = do_NR_MeasurementTimingConfiguration(du->mtc, meas_timing_config->buf, NR_RRC_BUF_SIZE);
|
||||
cu2du.meas_timing_config = meas_timing_config;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cu2du.meas_timing_config = get_meas_timing_config(du->mtc, ue_p->measConfig);
|
||||
|
||||
int nb_srb = 1;
|
||||
f1ap_srb_to_setup_t *srbs = calloc_or_fail(nb_srb, sizeof(*srbs));
|
||||
|
||||
@@ -1192,7 +1192,11 @@ int rrc_gNB_process_Handover_Request(gNB_RRC_INST *rrc, instance_t instance, nga
|
||||
// Activate SRBs
|
||||
activate_srb(UE, SRB1);
|
||||
activate_srb(UE, SRB2);
|
||||
nr_rrc_pdcp_config_security(UE, false);
|
||||
// During N2 handover, the UE continues using the old security context from the source gNB
|
||||
// until it receives and processes the RRC Reconfiguration with masterKeyUpdate. The first
|
||||
// PDUs sent after CFRA are still ciphered with the old keys. The target gNB must enable
|
||||
// ciphering during handover setup to correctly decipher and verify integrity of these PDUs.
|
||||
nr_rrc_pdcp_config_security(UE, true);
|
||||
|
||||
// Process all PDU Session Resource Setup items from handover request
|
||||
DevAssert(msg->nb_of_pdusessions <= NGAP_MAX_PDU_SESSION);
|
||||
|
||||
@@ -192,12 +192,7 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
|
||||
meas_config->buf = calloc_or_fail(1, NR_RRC_BUF_SIZE);
|
||||
meas_config->len = do_NR_MeasConfig(ue->measConfig, meas_config->buf, NR_RRC_BUF_SIZE);
|
||||
|
||||
byte_array_t *meas_timing_config = NULL;
|
||||
if (target_du->mtc) {
|
||||
meas_timing_config = calloc_or_fail(1, sizeof(*meas_timing_config));
|
||||
meas_timing_config->buf = calloc_or_fail(1, NR_RRC_BUF_SIZE);
|
||||
meas_timing_config->len = do_NR_MeasurementTimingConfiguration(target_du->mtc, meas_timing_config->buf, NR_RRC_BUF_SIZE);
|
||||
}
|
||||
byte_array_t *meas_timing_config = get_meas_timing_config(target_du->mtc, ue->measConfig);
|
||||
|
||||
byte_array_t *hpi = malloc_or_fail(sizeof(*hpi));
|
||||
*hpi = copy_byte_array(*ho_prep_info);
|
||||
@@ -618,3 +613,31 @@ void nr_HO_N2_trigger_telnet(gNB_RRC_INST *rrc, uint32_t neighbour_pci, uint32_t
|
||||
|
||||
nr_rrc_trigger_n2_ho(rrc, UE, scell_du->nr_pci, neighbour);
|
||||
}
|
||||
|
||||
// This function detects if there are at least two different ssbFrequency values, and if so, returns meas_timing_config;
|
||||
// otherwise, it returns NULL. When you return NULL, the measurement gaps will not be configured.
|
||||
byte_array_t *get_meas_timing_config(const NR_MeasurementTimingConfiguration_t *mtc, const NR_MeasConfig_t *measConfig)
|
||||
{
|
||||
if (!mtc || !measConfig || !measConfig->measObjectToAddModList)
|
||||
return NULL;
|
||||
|
||||
byte_array_t *meas_timing_config = NULL;
|
||||
NR_MeasObjectToAddModList_t *mo_list = measConfig->measObjectToAddModList;
|
||||
NR_ARFCN_ValueNR_t ssbFrequency0 = 0;
|
||||
for (int i = 0; i < mo_list->list.count; i++) {
|
||||
NR_MeasObjectToAddMod_t *mo = mo_list->list.array[i];
|
||||
if (mo->measObject.present != NR_MeasObjectToAddMod__measObject_PR_measObjectNR)
|
||||
continue;
|
||||
NR_MeasObjectNR_t *monr = mo->measObject.choice.measObjectNR;
|
||||
if (i == 0) {
|
||||
ssbFrequency0 = *monr->ssbFrequency;
|
||||
} else if (ssbFrequency0 != *monr->ssbFrequency) {
|
||||
meas_timing_config = calloc_or_fail(1, sizeof(*meas_timing_config));
|
||||
meas_timing_config->buf = calloc_or_fail(1, NR_RRC_BUF_SIZE);
|
||||
meas_timing_config->len = do_NR_MeasurementTimingConfiguration(mtc, meas_timing_config->buf, NR_RRC_BUF_SIZE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return meas_timing_config;
|
||||
}
|
||||
|
||||
@@ -108,4 +108,6 @@ void rrc_gNB_trigger_reconfiguration_for_handover(gNB_RRC_INST *rrc, gNB_RRC_UE_
|
||||
|
||||
void nr_rrc_trigger_n2_ho_target(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue);
|
||||
|
||||
byte_array_t *get_meas_timing_config(const NR_MeasurementTimingConfiguration_t *mtc, const NR_MeasConfig_t *measConfig);
|
||||
|
||||
#endif /* RRC_GNB_MOBILITY_H_ */
|
||||
|
||||
+52
-10
@@ -210,7 +210,7 @@ static void get_epochtime_from_sib19scheduling(NR_UE_RRC_SI_INFO *SI_info, int *
|
||||
slot);
|
||||
}
|
||||
|
||||
static int eval_epoch_time(NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *ntncfg, int frame)
|
||||
static int eval_epoch_time(NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *ntncfg, int frame, bool is_targetcell)
|
||||
{
|
||||
int epoch_frame = 0, epoch_subframe = 0;
|
||||
int diff_frames = 0;
|
||||
@@ -229,11 +229,19 @@ static int eval_epoch_time(NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *ntnc
|
||||
ntncfg->epochTime_r17->sfn_r17 = epoch_frame;
|
||||
ntncfg->epochTime_r17->subFrameNR_r17 = epoch_subframe;
|
||||
}
|
||||
// For serving cell, the field sfn indicates the current SFN or the next upcoming SFN
|
||||
// after the frame where the message indicating the epochTime is received
|
||||
// i.e. Epochframe can be present or future SFN
|
||||
diff_frames = (epoch_frame - frame + 1024) % 1024; // According to 38.331 Epochtime is defined for serving cell like this
|
||||
LOG_I(NR_RRC, "Epoch frame %d, ahead by %d frames\n", epoch_frame, diff_frames);
|
||||
if (is_targetcell) {
|
||||
// For Target cell,the SFN nearest to the frame needs to be considered
|
||||
// i.e. Epochframe can be in the past or future
|
||||
int diff1 = (frame - epoch_frame + 1024) % 1024;
|
||||
int diff2 = (epoch_frame - frame + 1024) % 1024;
|
||||
diff_frames = (diff1 < diff2) ? -diff1 : diff2;
|
||||
} else {
|
||||
// For serving cell, the field sfn indicates the current SFN or the next upcoming SFN
|
||||
// after the frame where the message indicating the epochTime is received
|
||||
// i.e. Epochframe can be present or future SFN
|
||||
diff_frames = (epoch_frame - frame + 1024) % 1024; // According to 38.331 Epochtime is defined for serving cell like this
|
||||
}
|
||||
LOG_I(NR_RRC, "Epoch frame %d ahead by %d frames\n", epoch_frame, diff_frames);
|
||||
return diff_frames;
|
||||
}
|
||||
|
||||
@@ -257,11 +265,11 @@ static int get_ntn_timervalues(NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *
|
||||
return sib19_timer_ms;
|
||||
}
|
||||
|
||||
static void nr_rrc_process_ntnconfig(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *ntncfg, int frame)
|
||||
static void nr_rrc_process_ntnconfig(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_info, NR_NTN_Config_r17_t *ntncfg, int frame, bool is_targetcell)
|
||||
{
|
||||
SI_info->SInfo_r17.sib19_validity = true;
|
||||
// Check if Epochtime is sent or not
|
||||
int diff_frames = eval_epoch_time(SI_info, ntncfg, frame);
|
||||
int diff_frames = eval_epoch_time(SI_info, ntncfg, frame, is_targetcell);
|
||||
|
||||
if (ntncfg->ntn_UlSyncValidityDuration_r17) { // ulsyncvalidity duration configured
|
||||
int val430_ms = 0, sib19_timer_ms = 0;
|
||||
@@ -361,7 +369,7 @@ static void nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si,
|
||||
sib19 = typeandinfo->choice.sib19_v1700;
|
||||
if (g_log->log_component[NR_RRC].level >= OAILOG_DEBUG)
|
||||
xer_fprint(stdout, &asn_DEF_NR_SIB19_r17, (const void *)sib19);
|
||||
nr_rrc_process_ntnconfig(rrc, SI_info, sib19->ntn_Config_r17, frame);
|
||||
nr_rrc_process_ntnconfig(rrc, SI_info, sib19->ntn_Config_r17, frame, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -1454,6 +1462,11 @@ static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(NR_UE_RRC_INST_t *rrc,
|
||||
uint8_t *const bufferP,
|
||||
const uint8_t buffer_len)
|
||||
{
|
||||
// MIB received on the target cell. Now process target ntncfg once new timing is received.
|
||||
if (phycellid == rrc->phyCellID && rrc->target_ntncfg) {
|
||||
rrc->process_target_ntncfg = true;
|
||||
}
|
||||
|
||||
NR_BCCH_BCH_Message_t *bcch_message = NULL;
|
||||
rrc->phyCellID = phycellid;
|
||||
rrc->arfcn_ssb = ssb_arfcn;
|
||||
@@ -1754,13 +1767,20 @@ static void nr_rrc_process_reconfigurationWithSync(NR_UE_RRC_INST_t *rrc,
|
||||
|
||||
// 3GPP TS38.331 section 5.3.5.5.2
|
||||
nr_timer_stop(&tac->T430);
|
||||
|
||||
if (rrc->target_ntncfg) {
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_NTN_Config_r17, rrc->target_ntncfg);
|
||||
rrc->target_ntncfg = NULL;
|
||||
rrc->process_target_ntncfg = false;
|
||||
}
|
||||
if (reconfigurationWithSync->spCellConfigCommon &&
|
||||
reconfigurationWithSync->spCellConfigCommon->ext2 &&
|
||||
reconfigurationWithSync->spCellConfigCommon->ext2->ntn_Config_r17) {
|
||||
NR_NTN_Config_r17_t *ntncfg = reconfigurationWithSync->spCellConfigCommon->ext2->ntn_Config_r17;
|
||||
// EPOCH time is always sent if NTN config is sent through DCCH
|
||||
AssertFatal(ntncfg->epochTime_r17, "NTN-CONFIG sent in dedicated mode should have EPOCHTIME\n");
|
||||
nr_rrc_process_ntnconfig(rrc, &rrc->perNB[gNB_index].SInfo, ntncfg, rrc->current_frame);
|
||||
const int copy_result = asn_copy(&asn_DEF_NR_NTN_Config_r17, (void **)&rrc->target_ntncfg, ntncfg);
|
||||
AssertFatal(copy_result == 0, "unable to copy NR_NTN_Config_r17_t\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2626,6 +2646,13 @@ void *rrc_nrue(void *notUsed)
|
||||
nr_rrc_handle_timers(rrc);
|
||||
NR_UE_RRC_SI_INFO *SInfo = &rrc->perNB[NRRRC_FRAME_PROCESS(msg_p).gnb_id].SInfo;
|
||||
nr_rrc_SI_timers(SInfo);
|
||||
if (rrc->process_target_ntncfg) {
|
||||
// Process target NTNCFG as the target cells timing is acquired
|
||||
nr_rrc_process_ntnconfig(rrc, &rrc->perNB[NRRRC_FRAME_PROCESS(msg_p).gnb_id].SInfo, rrc->target_ntncfg, rrc->current_frame, true);
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_NTN_Config_r17, rrc->target_ntncfg);
|
||||
rrc->target_ntncfg = NULL;
|
||||
rrc->process_target_ntncfg = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case NR_RRC_MAC_INAC_IND:
|
||||
@@ -2806,6 +2833,14 @@ static void nr_rrc_initiate_rrcReestablishment(NR_UE_RRC_INST_t *rrc, NR_Reestab
|
||||
set_DRB_status(rrc, i, RB_SUSPENDED);
|
||||
}
|
||||
}
|
||||
|
||||
// Free Target NTNcfg is stored
|
||||
if (rrc->target_ntncfg) {
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_NTN_Config_r17, rrc->target_ntncfg);
|
||||
rrc->target_ntncfg = NULL;
|
||||
rrc->process_target_ntncfg = false;
|
||||
}
|
||||
|
||||
// release the MCG SCell(s), if configured
|
||||
// no SCell configured in our implementation
|
||||
|
||||
@@ -2996,6 +3031,13 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
|
||||
asn1cFreeStruc(asn_DEF_NR_UE_TimersAndConstants, tac->sib1_TimersAndConstants);
|
||||
}
|
||||
|
||||
// Free Target NTNcfg is stored
|
||||
if (rrc->target_ntncfg) {
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_NTN_Config_r17, rrc->target_ntncfg);
|
||||
rrc->target_ntncfg = NULL;
|
||||
rrc->process_target_ntncfg = false;
|
||||
}
|
||||
|
||||
// reset MAC
|
||||
NR_UE_MAC_reset_cause_t cause = (rrc->nrRrcState == RRC_STATE_DETACH_NR) ? DETACH : GO_TO_IDLE;
|
||||
nr_mac_rrc_message_t rrc_msg = {0};
|
||||
|
||||
@@ -268,6 +268,8 @@ typedef struct NR_UE_RRC_INST_s {
|
||||
NR_SL_PreconfigurationNR_r16_t *sl_preconfig;
|
||||
// NTN params
|
||||
bool is_NTN_UE;
|
||||
NR_NTN_Config_r17_t *target_ntncfg;
|
||||
bool process_target_ntncfg;
|
||||
notifiedFIFO_t *mac_input_nf;
|
||||
} NR_UE_RRC_INST_t;
|
||||
|
||||
|
||||
@@ -59,24 +59,7 @@ bool connect_mplane(ru_session_t *ru_session)
|
||||
void disconnect_mplane(void *rus_disconnect)
|
||||
{
|
||||
ru_session_list_t *ru_session_list = (ru_session_list_t *)rus_disconnect;
|
||||
|
||||
for (size_t i = 0; i <ru_session_list->num_rus; i++) {
|
||||
ru_session_t *ru_session = &ru_session_list->ru_session[i];
|
||||
if (ru_session->session == NULL)
|
||||
continue;
|
||||
MP_LOG_I("Sending PM de-activation request for RU \"%s\".\n", ru_session->ru_ip_add);
|
||||
bool success = pm_conf(ru_session, "false");
|
||||
if (success)
|
||||
MP_LOG_I("Successfully de-activated PM for RU \"%s\".\n", ru_session->ru_ip_add);
|
||||
MP_LOG_I("Disconnecting from RU \"%s\".\n", ru_session->ru_ip_add);
|
||||
nc_session_free(ru_session->session, NULL);
|
||||
ru_session->session = NULL;
|
||||
#ifdef MPLANE_V1
|
||||
ly_ctx_destroy((struct ly_ctx *)ru_session->ctx, NULL);
|
||||
#elif defined MPLANE_V2
|
||||
ly_ctx_destroy((struct ly_ctx *)ru_session->ctx);
|
||||
#endif
|
||||
}
|
||||
free_ru_session_list(ru_session_list);
|
||||
|
||||
nc_client_destroy();
|
||||
}
|
||||
|
||||
@@ -141,6 +141,43 @@ bool init_mplane(ru_session_list_t *ru_session_list)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void init_ru_notif(ru_session_t *ru_session, const char* buffer)
|
||||
{
|
||||
char* usage_state = get_ru_xml_node(buffer, "usage-state");
|
||||
if (usage_state != NULL && strcmp(usage_state, "busy") == 0) {
|
||||
ru_session->ru_notif.rx_carrier_state = BUSY_CARRIER;
|
||||
ru_session->ru_notif.tx_carrier_state = BUSY_CARRIER;
|
||||
ru_session->ru_notif.config_change = true;
|
||||
} else if (usage_state != NULL && strcmp(usage_state, "active") == 0) {
|
||||
ru_session->ru_notif.rx_carrier_state = READY_CARRIER;
|
||||
ru_session->ru_notif.tx_carrier_state = READY_CARRIER;
|
||||
ru_session->ru_notif.config_change = true;
|
||||
} else { // "idle" or NULL
|
||||
ru_session->ru_notif.rx_carrier_state = DISABLED_CARRIER;
|
||||
ru_session->ru_notif.tx_carrier_state = DISABLED_CARRIER;
|
||||
ru_session->ru_notif.config_change = false;
|
||||
}
|
||||
|
||||
char *oper_state = get_ru_xml_node(buffer, "oper-state");
|
||||
ru_session->ru_notif.hardware.oper_state = (str_to_enum_oper(oper_state) != OPER_COUNT) ? str_to_enum_oper(oper_state) : ENABLED_OPER;
|
||||
|
||||
char *admin_state = get_ru_xml_node(buffer, "admin-state");
|
||||
ru_session->ru_notif.hardware.admin_state = (str_to_enum_admin(admin_state) != ADMIN_COUNT) ? str_to_enum_admin(admin_state) : UNLOCKED_ADMIN;
|
||||
|
||||
char *avail_state = get_ru_xml_node(buffer, "availability-state");
|
||||
ru_session->ru_notif.hardware.avail_state = (str_to_enum_avail(avail_state) != AVAIL_COUNT) ? str_to_enum_avail(avail_state) : NORMAL_AVAIL;
|
||||
|
||||
char *ptp_state = get_ru_xml_node(buffer, "sync-state");
|
||||
ru_session->ru_notif.ptp_state = str_to_enum_ptp(ptp_state);
|
||||
MP_LOG_I("RU is in \"%s\" sync state.\n", ptp_state);
|
||||
|
||||
free(usage_state);
|
||||
free(oper_state);
|
||||
free(admin_state);
|
||||
free(avail_state);
|
||||
free(ptp_state);
|
||||
}
|
||||
|
||||
bool manage_ru(ru_session_t *ru_session, const openair0_config_t *oai, const size_t num_rus)
|
||||
{
|
||||
bool success = false;
|
||||
@@ -149,12 +186,8 @@ bool manage_ru(ru_session_t *ru_session, const openair0_config_t *oai, const siz
|
||||
success = get_mplane(ru_session, &operational_ds);
|
||||
AssertError(success, return false, "[MPLANE] Unable to continue: could not get RU answer via get_mplane().\n");
|
||||
|
||||
bool ptp_state = false;
|
||||
const char *sync_state = get_ru_xml_node(operational_ds, "sync-state");
|
||||
if (strcmp(sync_state, "LOCKED") == 0) {
|
||||
MP_LOG_I("RU is already PTP synchronized.\n");
|
||||
ptp_state = true;
|
||||
}
|
||||
// init RU notifications
|
||||
init_ru_notif(ru_session, operational_ds);
|
||||
|
||||
/* 1) as per M-plane spec, RU must be in supervised mode,
|
||||
where stream = NULL && filter = "/o-ran-supervision:supervision-notification";
|
||||
@@ -163,7 +196,6 @@ bool manage_ru(ru_session_t *ru_session, const openair0_config_t *oai, const siz
|
||||
=> since more than one subscription at the time within one session is not possible, we will subscribe to all notifications */
|
||||
const char *stream = "NETCONF";
|
||||
const char *filter = NULL;
|
||||
ru_session->ru_notif.ptp_state = ptp_state;
|
||||
success = subscribe_mplane(ru_session, stream, filter, (void *)&ru_session->ru_notif);
|
||||
AssertError(success, return false, "[MPLANE] Unable to continue: could not get RU answer via subscribe_mplane().\n");
|
||||
|
||||
@@ -189,26 +221,18 @@ bool manage_ru(ru_session_t *ru_session, const openair0_config_t *oai, const siz
|
||||
success = load_yang_models(ru_session, operational_ds);
|
||||
AssertError(success, return false, "[MPLANE] Unable to load yang models.\n");
|
||||
|
||||
if (ru_session->ru_notif.ptp_state) {
|
||||
char *content = NULL;
|
||||
success = configure_ru_from_yang(ru_session, oai, num_rus, &content);
|
||||
AssertError(success, return false, "[MPLANE] Unable to create content for <edit-config> RPC for start-up procedure.\n");
|
||||
while (1) {
|
||||
sleep(5);
|
||||
if (!ru_session->ru_notif.ptp_state && !ru_session->ru_notif.hardware.oper_state && !ru_session->ru_notif.hardware.admin_state && !ru_session->ru_notif.hardware.avail_state) {
|
||||
char *content = NULL;
|
||||
success = configure_ru_from_yang(ru_session, oai, num_rus, &content);
|
||||
AssertError(success, return false, "[MPLANE] Unable to create content for <edit-config> RPC for start-up procedure.\n");
|
||||
|
||||
success = edit_val_commmit_rpc(ru_session, content);
|
||||
AssertError(success, return false, "[MPLANE] Unable to continue.\n");
|
||||
free(content);
|
||||
}
|
||||
|
||||
const char *usage_state = get_ru_xml_node(operational_ds, "usage-state");
|
||||
MP_LOG_I("Usage state = \"%s\" for RU \"%s\".\n", usage_state, ru_session->ru_ip_add);
|
||||
if (strcmp(usage_state, "busy") == 0) { // carriers are already activated
|
||||
ru_session->ru_notif.rx_carrier_state = true;
|
||||
ru_session->ru_notif.tx_carrier_state = true;
|
||||
ru_session->ru_notif.config_change = true;
|
||||
} else {
|
||||
ru_session->ru_notif.rx_carrier_state = false;
|
||||
ru_session->ru_notif.tx_carrier_state = false;
|
||||
ru_session->ru_notif.config_change = false;
|
||||
success = edit_val_commmit_rpc(ru_session, content);
|
||||
AssertError(success, return false, "[MPLANE] Unable to continue.\n");
|
||||
free(content);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(operational_ds);
|
||||
|
||||
@@ -20,11 +20,145 @@
|
||||
*/
|
||||
|
||||
#include "ru-mplane-api.h"
|
||||
#include "init-mplane.h"
|
||||
#include "xml/get-xml.h"
|
||||
#include "common/utils/assertions.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <libyang/libyang.h>
|
||||
#include <nc_client.h>
|
||||
|
||||
static void free_pm_stats(pm_stats_t *src)
|
||||
{
|
||||
// free Rx window measurements
|
||||
for (size_t i = 0; i < src->rx_num; i++) {
|
||||
free(src->rx_window_meas[i]);
|
||||
}
|
||||
free(src->rx_window_meas);
|
||||
|
||||
// free Tx measurements
|
||||
for (size_t i = 0; i < src->tx_num; i++) {
|
||||
free(src->tx_meas[i]);
|
||||
}
|
||||
free(src->tx_meas);
|
||||
}
|
||||
|
||||
static void free_uplane_info(uplane_info_t *src)
|
||||
{
|
||||
for (size_t i = 0; i < src->num; i++) {
|
||||
free(src->name[i]);
|
||||
}
|
||||
free(src->name);
|
||||
}
|
||||
|
||||
static void free_ru_mplane_config(ru_mplane_config_t *src)
|
||||
{
|
||||
// free DU MAC address(es) and VLAN tag(s)
|
||||
for (size_t i = 0; i < src->num_cu_planes; i++) {
|
||||
free(src->du_mac_addr[i]);
|
||||
}
|
||||
free(src->du_mac_addr);
|
||||
free(src->vlan_tag);
|
||||
|
||||
// free interface name
|
||||
free(src->interface_name);
|
||||
|
||||
// free endpoints and carriers
|
||||
free_uplane_info(&src->tx_endpoints);
|
||||
free_uplane_info(&src->rx_endpoints);
|
||||
free_uplane_info(&src->tx_carriers);
|
||||
free_uplane_info(&src->rx_carriers);
|
||||
}
|
||||
|
||||
static void free_ru_session(ru_session_t *src)
|
||||
{
|
||||
// username
|
||||
free(src->username);
|
||||
|
||||
// if no RU connected to, free only the initialized RU IP address
|
||||
if (src->session == NULL) {
|
||||
free(src->ru_ip_add);
|
||||
return;
|
||||
}
|
||||
|
||||
// disconnect from the RU
|
||||
MP_LOG_I("Sending PM de-activation request for RU \"%s\".\n", src->ru_ip_add);
|
||||
bool success = pm_conf(src, "false");
|
||||
if (success)
|
||||
MP_LOG_I("Successfully de-activated PM for RU \"%s\".\n", src->ru_ip_add);
|
||||
MP_LOG_I("Disconnecting from RU \"%s\".\n", src->ru_ip_add);
|
||||
|
||||
// free RU IP address
|
||||
free(src->ru_ip_add);
|
||||
// free RU M-plane config
|
||||
free_ru_mplane_config(&src->ru_mplane_config);
|
||||
// free NETCONF session
|
||||
nc_session_free(src->session, NULL);
|
||||
src->session = NULL;
|
||||
// free libyang context
|
||||
#ifdef MPLANE_V1
|
||||
ly_ctx_destroy((struct ly_ctx *)src->ctx, NULL);
|
||||
#elif defined MPLANE_V2
|
||||
ly_ctx_destroy((struct ly_ctx *)src->ctx);
|
||||
#endif
|
||||
// free only the RU MAC addressin xran M-plane info
|
||||
free(src->xran_mplane.ru_mac_addr);
|
||||
// nothing to free in ru_notif
|
||||
// free PM stats
|
||||
free_pm_stats(&src->pm_stats);
|
||||
}
|
||||
|
||||
void free_ru_session_list(ru_session_list_t *src)
|
||||
{
|
||||
// DU key pair
|
||||
for (size_t i = 0; i < 2; i++) {
|
||||
free(src->du_key_pair[i]);
|
||||
}
|
||||
free(src->du_key_pair);
|
||||
|
||||
// RU session
|
||||
for (size_t i = 0; i < src->num_rus; i++) {
|
||||
free_ru_session(&src->ru_session[i]);
|
||||
}
|
||||
free(src->ru_session);
|
||||
}
|
||||
|
||||
oper_state_e str_to_enum_oper(const char* value) {
|
||||
#define X(name, str) if (value != NULL && strcmp(value, str) == 0) return name;
|
||||
OPER_STATE
|
||||
#undef X
|
||||
return OPER_COUNT;
|
||||
};
|
||||
|
||||
admin_state_e str_to_enum_admin(const char* value) {
|
||||
#define X(name, str) if (value != NULL && strcmp(value, str) == 0) return name;
|
||||
ADMIN_STATE
|
||||
#undef X
|
||||
return ADMIN_COUNT;
|
||||
};
|
||||
|
||||
avail_state_e str_to_enum_avail(const char* value) {
|
||||
#define X(name, str) if (value != NULL && strcmp(value, str) == 0) return name;
|
||||
AVAIL_STATE
|
||||
#undef X
|
||||
return AVAIL_COUNT;
|
||||
};
|
||||
|
||||
ptp_state_e str_to_enum_ptp(const char* value) {
|
||||
#define X(name, str) if (value != NULL && strcmp(value, str) == 0) return name;
|
||||
PTP_STATE
|
||||
#undef X
|
||||
return PTP_COUNT;
|
||||
};
|
||||
|
||||
carrier_state_e str_to_enum_carrier(const char* value) {
|
||||
#define X(name, str) if (value != NULL && strcmp(value, str) == 0) return name;
|
||||
CARRIER_STATE
|
||||
#undef X
|
||||
return CARRIER_COUNT;
|
||||
};
|
||||
|
||||
static void free_match_list(char **match_list, size_t count)
|
||||
{
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
@@ -63,13 +197,15 @@ static void fix_benetel_setting(xran_mplane_t *xran_mplane, const uint32_t inter
|
||||
bool get_config_for_xran(const char *buffer, const int max_num_ant, xran_mplane_t *xran_mplane)
|
||||
{
|
||||
/* some O-RU vendors are not fully compliant as per M-plane specifications */
|
||||
const char *ru_vendor = get_ru_xml_node(buffer, "mfg-name");
|
||||
char *ru_vendor = get_ru_xml_node(buffer, "mfg-name");
|
||||
|
||||
// RU MAC
|
||||
xran_mplane->ru_mac_addr = get_ru_xml_node(buffer, "mac-address"); // TODO: support for VVDN, as it defines multiple MAC addresses
|
||||
|
||||
// MTU
|
||||
const uint32_t interface_mtu = (uint32_t)atoi(get_ru_xml_node(buffer, "l2-mtu"));
|
||||
char *int_mtu_str = get_ru_xml_node(buffer, "l2-mtu");
|
||||
const uint32_t interface_mtu = (uint32_t)atoi(int_mtu_str);
|
||||
free(int_mtu_str);
|
||||
|
||||
// IQ bitwidth
|
||||
char **match_list = NULL;
|
||||
@@ -107,14 +243,17 @@ bool get_config_for_xran(const char *buffer, const int max_num_ant, xran_mplane_
|
||||
free_match_list(match_list, count);
|
||||
|
||||
// Managed delay support
|
||||
const char *managed_delay = get_ru_xml_node(buffer, "managed-delay-support");
|
||||
char *managed_delay = get_ru_xml_node(buffer, "managed-delay-support");
|
||||
xran_mplane->managed_delay = (strcasecmp(managed_delay, "NON_MANAGED") == 0) ? false : true;
|
||||
free(managed_delay);
|
||||
|
||||
// Store the max gain
|
||||
xran_mplane->max_tx_gain = (double)atof(get_ru_xml_node(buffer, "max-gain"));
|
||||
char *max_tx_gain_str = get_ru_xml_node(buffer, "max-gain");
|
||||
xran_mplane->max_tx_gain = (double)atof(max_tx_gain_str);
|
||||
free(max_tx_gain_str);
|
||||
|
||||
// Model name
|
||||
const char *model_name = get_ru_xml_node(buffer, "model-name");
|
||||
char *model_name = get_ru_xml_node(buffer, "model-name");
|
||||
|
||||
if (strcasecmp(ru_vendor, "BENETEL") == 0 /* || strcmp(ru_vendor, "VVDN-LPRU") == 0 || strcmp(ru_vendor, "Metanoia") == 0 */) {
|
||||
fix_benetel_setting(xran_mplane, interface_mtu, first_iq_width, max_num_ant, model_name);
|
||||
@@ -150,6 +289,9 @@ bool get_config_for_xran(const char *buffer, const int max_num_ant, xran_mplane_
|
||||
xran_mplane->ru_port,
|
||||
xran_mplane->max_tx_gain);
|
||||
|
||||
free(ru_vendor);
|
||||
free(model_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -185,7 +327,7 @@ bool get_uplane_info(const char *buffer, ru_mplane_config_t *ru_mplane_config)
|
||||
|
||||
bool get_pm_object_list(const char *buffer, pm_stats_t *pm_stats)
|
||||
{
|
||||
const char *ru_vendor = get_ru_xml_node(buffer, "mfg-name");
|
||||
char *ru_vendor = get_ru_xml_node(buffer, "mfg-name");
|
||||
if (strcasecmp(ru_vendor, "BENETEL") == 0) {
|
||||
pm_stats->start_up_timing = false;
|
||||
} else {
|
||||
@@ -200,5 +342,7 @@ bool get_pm_object_list(const char *buffer, pm_stats_t *pm_stats)
|
||||
|
||||
MP_LOG_I("Successfully retreived all performance measurement names.\n");
|
||||
|
||||
free(ru_vendor);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -31,10 +31,86 @@
|
||||
#define MP_LOG_I(x, args...) LOG_I(HW, "[MPLANE] " x, ##args)
|
||||
#define MP_LOG_W(x, args...) LOG_W(HW, "[MPLANE] " x, ##args)
|
||||
|
||||
#define OPER_STATE \
|
||||
X(ENABLED_OPER, "enabled") \
|
||||
X(DISABLED_OPER, "disabled")
|
||||
|
||||
typedef enum {
|
||||
#define X(name, str) name,
|
||||
OPER_STATE
|
||||
#undef X
|
||||
OPER_COUNT
|
||||
} oper_state_e;
|
||||
|
||||
oper_state_e str_to_enum_oper(const char* value);
|
||||
|
||||
#define ADMIN_STATE \
|
||||
X(UNLOCKED_ADMIN, "unlocked") \
|
||||
X(SHUTTING_DOWN_ADMIN, "shutting-down") \
|
||||
X(LOCKED_ADMIN, "locked")
|
||||
|
||||
typedef enum {
|
||||
#define X(name, str) name,
|
||||
ADMIN_STATE
|
||||
#undef X
|
||||
ADMIN_COUNT
|
||||
} admin_state_e;
|
||||
|
||||
admin_state_e str_to_enum_admin(const char* value);
|
||||
|
||||
#define AVAIL_STATE \
|
||||
X(NORMAL_AVAIL, "NORMAL") \
|
||||
X(DEGRADED_AVAIL, "DEGRADED") \
|
||||
X(FAULTY_AVAIL, "FAULTY")
|
||||
|
||||
typedef enum {
|
||||
#define X(name, str) name,
|
||||
AVAIL_STATE
|
||||
#undef X
|
||||
AVAIL_COUNT
|
||||
} avail_state_e;
|
||||
|
||||
avail_state_e str_to_enum_avail(const char* value);
|
||||
|
||||
typedef struct {
|
||||
bool ptp_state;
|
||||
bool rx_carrier_state;
|
||||
bool tx_carrier_state;
|
||||
oper_state_e oper_state; // "enabled", "disabled"
|
||||
admin_state_e admin_state; // "unlocked", "shutting-down", "locked"
|
||||
avail_state_e avail_state; // "NORMAL", "DEGRADED", "FAULTY"
|
||||
} hardware_notif_t;
|
||||
|
||||
#define PTP_STATE \
|
||||
X(LOCKED_PTP, "LOCKED") \
|
||||
X(FREERUN_PTP, "FREERUN") \
|
||||
X(HOLDOVER_PTP, "HOLDOVER")
|
||||
|
||||
typedef enum {
|
||||
#define X(name, str) name,
|
||||
PTP_STATE
|
||||
#undef X
|
||||
PTP_COUNT
|
||||
} ptp_state_e;
|
||||
|
||||
ptp_state_e str_to_enum_ptp(const char* value);
|
||||
|
||||
#define CARRIER_STATE \
|
||||
X(READY_CARRIER, "READY") \
|
||||
X(DISABLED_CARRIER, "DISABLED") \
|
||||
X(BUSY_CARRIER, "BUSY")
|
||||
|
||||
typedef enum {
|
||||
#define X(name, str) name,
|
||||
CARRIER_STATE
|
||||
#undef X
|
||||
CARRIER_COUNT
|
||||
} carrier_state_e;
|
||||
|
||||
carrier_state_e str_to_enum_carrier(const char* value);
|
||||
|
||||
typedef struct {
|
||||
hardware_notif_t hardware;
|
||||
ptp_state_e ptp_state; // "LOCKED", "FREERUN", "HOLDOVER"
|
||||
carrier_state_e rx_carrier_state; // "READY", "DISABLED", "BUSY"
|
||||
carrier_state_e tx_carrier_state; // "READY", "DISABLED", "BUSY"
|
||||
bool config_change;
|
||||
// to be extended with any notification callback
|
||||
|
||||
@@ -112,6 +188,8 @@ typedef struct {
|
||||
|
||||
} ru_session_list_t;
|
||||
|
||||
void free_ru_session_list(ru_session_list_t *src);
|
||||
|
||||
bool get_config_for_xran(const char *buffer, const int max_num_ant, xran_mplane_t *xran_mplane);
|
||||
|
||||
bool get_uplane_info(const char *buffer, ru_mplane_config_t *ru_mplane_config);
|
||||
|
||||
@@ -30,13 +30,8 @@
|
||||
static void recv_notif_v1(const struct nc_notif *notif, ru_notif_t *answer)
|
||||
{
|
||||
const char *node_name = notif->tree->child->attr->name;
|
||||
const char *value = notif->tree->child->attr->value_str;
|
||||
if (strcmp(node_name, "sync-state")) {
|
||||
if (strcmp(value, "LOCKED") == 0) {
|
||||
answer->ptp_state = true;
|
||||
} else {
|
||||
answer->ptp_state = false;
|
||||
}
|
||||
answer->ptp_state = str_to_enum_ptp(notif->tree->child->attr->value_str);
|
||||
}
|
||||
|
||||
// carriers state - to be filled
|
||||
@@ -52,6 +47,8 @@ static void notif_clb_v1(struct nc_session *session, const struct nc_notif *noti
|
||||
MP_LOG_I("\nReceived notification at (%s)\n%s\n", notif->datetime, subs_reply);
|
||||
|
||||
recv_notif_v1(notif, answer);
|
||||
|
||||
free(subs_reply);
|
||||
}
|
||||
#elif MPLANE_V2
|
||||
static void log_v2_pm_info(const char *ru_ip_add, struct lyd_node_inner *stats)
|
||||
@@ -85,33 +82,36 @@ static void log_v2_pm_info(const char *ru_ip_add, struct lyd_node_inner *stats)
|
||||
meas_list[7], count_list[7]);
|
||||
}
|
||||
|
||||
static void get_hardware_states(struct lyd_node_inner *op, ru_notif_t *answer)
|
||||
{
|
||||
struct lyd_node *child = NULL;
|
||||
LY_LIST_FOR(op->child, child) {
|
||||
if (strcmp(child->schema->name, "admin-state") == 0) {
|
||||
answer->hardware.admin_state = str_to_enum_admin(lyd_get_value(child));
|
||||
} else if (strcmp(child->schema->name, "availability-state") == 0) {
|
||||
answer->hardware.avail_state = str_to_enum_avail(lyd_get_value(child));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void recv_notif_v2(struct lyd_node_inner *op, ru_notif_t *answer)
|
||||
{
|
||||
const char *notif = op->schema->name;
|
||||
|
||||
if (strcmp(notif, "synchronization-state-change") == 0) {
|
||||
const char *value = lyd_get_value(op->child);
|
||||
if (strcmp(value, "LOCKED") == 0) {
|
||||
answer->ptp_state = true;
|
||||
} else { // "FREERUN" or "HOLDOVER"
|
||||
answer->ptp_state = false;
|
||||
}
|
||||
answer->ptp_state = str_to_enum_ptp(lyd_get_value(op->child));
|
||||
} else if (strcmp(notif, "rx-array-carriers-state-change") == 0) {
|
||||
const char *value = lyd_get_value(lyd_child(op->child)->next);
|
||||
if (strcmp(value, "READY") == 0) {
|
||||
answer->rx_carrier_state = true;
|
||||
} else { // "DISABLED" or "BUSY"
|
||||
answer->rx_carrier_state = false;
|
||||
}
|
||||
answer->rx_carrier_state = str_to_enum_carrier(lyd_get_value(lyd_child(op->child)->next));
|
||||
} else if (strcmp(notif, "tx-array-carriers-state-change") == 0) {
|
||||
const char *value = lyd_get_value(lyd_child(op->child)->next);
|
||||
if (strcmp(value, "READY") == 0) {
|
||||
answer->tx_carrier_state = true;
|
||||
} else { // "DISABLED" or "BUSY"
|
||||
answer->tx_carrier_state = false;
|
||||
}
|
||||
answer->tx_carrier_state = str_to_enum_carrier(lyd_get_value(lyd_child(op->child)->next));
|
||||
} else if (strcmp(notif, "netconf-config-change") == 0) {
|
||||
answer->config_change = true;
|
||||
} else if (strcmp(notif, "hardware-state-oper-enabled") == 0) {
|
||||
answer->hardware.oper_state = ENABLED_OPER;
|
||||
get_hardware_states(op, answer);
|
||||
} else if (strcmp(notif, "hardware-state-oper-disabled") == 0) {
|
||||
answer->hardware.oper_state = DISABLED_OPER;
|
||||
get_hardware_states(op, answer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,11 +126,14 @@ static void notif_clb_v2(struct nc_session *session, const struct lyd_node *envp
|
||||
struct lyd_node_inner *op_inner = (struct lyd_node_inner *)op;
|
||||
if (strcmp(op_inner->schema->name, "measurement-result-stats") == 0) {
|
||||
log_v2_pm_info(ru_ip_add, op_inner);
|
||||
free(subs_reply);
|
||||
return;
|
||||
}
|
||||
MP_LOG_I("Received notification from RU \"%s\" at (%s)\n%s\n", ru_ip_add, ((struct lyd_node_opaq *)lyd_child(envp))->value, subs_reply);
|
||||
|
||||
recv_notif_v2(op_inner, answer);
|
||||
|
||||
free(subs_reply);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -23,8 +23,9 @@
|
||||
|
||||
#include <libxml/parser.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static char *find_ru_xml_node(xmlNode *node, const char *filter)
|
||||
static xmlChar *find_ru_xml_node(xmlNode *node, const char *filter)
|
||||
{
|
||||
for (xmlNode *cur_node = node; cur_node; cur_node = cur_node->next) {
|
||||
if (cur_node->type != XML_ELEMENT_NODE)
|
||||
@@ -39,9 +40,9 @@ static char *find_ru_xml_node(xmlNode *node, const char *filter)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (char *)xmlNodeGetContent(target_node);
|
||||
return xmlNodeGetContent(target_node);
|
||||
}
|
||||
char *answer = find_ru_xml_node(cur_node->children, filter);
|
||||
xmlChar *answer = find_ru_xml_node(cur_node->children, filter);
|
||||
if (answer != NULL) {
|
||||
return answer;
|
||||
}
|
||||
@@ -56,7 +57,13 @@ char *get_ru_xml_node(const char *buffer, const char *filter)
|
||||
xmlDoc *doc = xmlReadMemory(buffer, len, NULL, NULL, 0);
|
||||
xmlNode *root_element = xmlDocGetRootElement(doc);
|
||||
|
||||
return find_ru_xml_node(root_element->children, filter);
|
||||
xmlChar *content = find_ru_xml_node(root_element->children, filter);
|
||||
|
||||
char *value = strdup((char *)content);
|
||||
xmlFree(content);
|
||||
xmlFreeDoc(doc);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static void find_ru_xml_list(xmlNode *node, const char *filter, char ***match_list, size_t *count)
|
||||
@@ -74,11 +81,12 @@ static void find_ru_xml_list(xmlNode *node, const char *filter, char ***match_li
|
||||
break;
|
||||
}
|
||||
}
|
||||
const char *content = (const char *)xmlNodeGetContent(name_node ? name_node : cur_node);
|
||||
xmlChar *content = xmlNodeGetContent(name_node ? name_node : cur_node);
|
||||
if (content) {
|
||||
*match_list = realloc(*match_list, (*count + 1) * sizeof(char *));
|
||||
(*match_list)[*count] = strdup(content);
|
||||
(*match_list)[*count] = strdup((char *)content);
|
||||
(*count)++;
|
||||
xmlFree(content);
|
||||
}
|
||||
}
|
||||
find_ru_xml_list(cur_node->children, filter, match_list, count);
|
||||
@@ -93,4 +101,6 @@ void get_ru_xml_list(const char *buffer, const char *filter, char ***match_list,
|
||||
xmlNode *root_element = xmlDocGetRootElement(doc);
|
||||
|
||||
find_ru_xml_list(root_element->children, filter, match_list, count);
|
||||
|
||||
xmlFreeDoc(doc);
|
||||
}
|
||||
|
||||
@@ -233,85 +233,91 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
ret = lyd_new_path(NULL, (struct ly_ctx *)ru_session->ctx, "/o-ran-uplane-conf:user-plane-configuration", NULL, 0, root);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create root \"user-plane-configuration\" node.\n");
|
||||
|
||||
if (ru_session->ru_mplane_config.rx_carriers.num != 1 || ru_session->ru_mplane_config.tx_carriers.num !=1)
|
||||
MP_LOG_I("Only one carrier supported at the moment.\n");
|
||||
|
||||
const size_t num_rx_ch = oai->rx_num_channels / num_rus;
|
||||
|
||||
// RX carriers
|
||||
struct lyd_node *rx_carrier_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "rx-array-carriers", 0, &rx_carrier_node, ru_session->ru_mplane_config.rx_carriers.name[0]);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"rx-array-carriers\" node.\n");
|
||||
const size_t num_rx_carriers = (ru_session->ru_mplane_config.rx_carriers.num == 1) ? 1 : num_rx_ch;
|
||||
for (size_t i = 0; i < num_rx_carriers; i++) {
|
||||
struct lyd_node *rx_carrier_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "rx-array-carriers", 0, &rx_carrier_node, ru_session->ru_mplane_config.rx_carriers.name[i]);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"rx-array-carriers\" node.\n");
|
||||
|
||||
char rx_freq[16];
|
||||
snprintf(rx_freq, sizeof(rx_freq), "%.0f", oai->rx_freq[0]);
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "center-of-channel-bandwidth", rx_freq, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"center-of-channel-bandwidth\" node.\n");
|
||||
char rx_freq[16];
|
||||
snprintf(rx_freq, sizeof(rx_freq), "%.0f", oai->rx_freq[0]);
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "center-of-channel-bandwidth", rx_freq, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"center-of-channel-bandwidth\" node.\n");
|
||||
|
||||
char rx_arfcn[16];
|
||||
snprintf(rx_arfcn, sizeof(rx_arfcn), "%d", to_nrarfcn(oai->nr_band, oai->rx_freq[0], oai->nr_scs_for_raster, oai->rx_bw));
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "absolute-frequency-center", rx_arfcn, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"absolute-frequency-center\" node.\n");
|
||||
char rx_arfcn[16];
|
||||
snprintf(rx_arfcn, sizeof(rx_arfcn), "%d", to_nrarfcn(oai->nr_band, oai->rx_freq[0], oai->nr_scs_for_raster, oai->rx_bw));
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "absolute-frequency-center", rx_arfcn, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"absolute-frequency-center\" node.\n");
|
||||
|
||||
char rx_bw[16];
|
||||
snprintf(rx_bw, sizeof(rx_bw), "%.0f", oai->rx_bw);
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "channel-bandwidth", rx_bw, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"channel-bandwidth\" node.\n");
|
||||
char rx_bw[16];
|
||||
snprintf(rx_bw, sizeof(rx_bw), "%.0f", oai->rx_bw);
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "channel-bandwidth", rx_bw, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"channel-bandwidth\" node.\n");
|
||||
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "downlink-radio-frame-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-radio-frame-offset\" node.\n");
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "downlink-radio-frame-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-radio-frame-offset\" node.\n");
|
||||
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "downlink-sfn-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-sfn-offset\" node.\n");
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "downlink-sfn-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-sfn-offset\" node.\n");
|
||||
|
||||
// gain offset applied uniformly across all array elements or layers
|
||||
// needs to be within <gain-correction-range>
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "gain-correction", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"gain-correction\" node.\n");
|
||||
// gain offset applied uniformly across all array elements or layers
|
||||
// needs to be within <gain-correction-range>
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "gain-correction", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"gain-correction\" node.\n");
|
||||
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "n-ta-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"n-ta-offset\" node.\n");
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "n-ta-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"n-ta-offset\" node.\n");
|
||||
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "active", "ACTIVE", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"active\" node.\n");
|
||||
ret = lyd_new_term(rx_carrier_node, NULL, "active", "ACTIVE", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"active\" node.\n");
|
||||
}
|
||||
|
||||
const size_t num_tx_ch = oai->tx_num_channels / num_rus;
|
||||
|
||||
// TX carriers
|
||||
struct lyd_node *tx_carrier_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "tx-array-carriers", 0, &tx_carrier_node, ru_session->ru_mplane_config.tx_carriers.name[0]);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"tx-array-carriers\" node.\n");
|
||||
const size_t num_tx_carriers = (ru_session->ru_mplane_config.tx_carriers.num == 1) ? 1 : num_tx_ch;
|
||||
for (size_t i = 0; i < num_tx_carriers; i++) {
|
||||
struct lyd_node *tx_carrier_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "tx-array-carriers", 0, &tx_carrier_node, ru_session->ru_mplane_config.tx_carriers.name[i]);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"tx-array-carriers\" node.\n");
|
||||
|
||||
char tx_freq[16];
|
||||
snprintf(tx_freq, sizeof(tx_freq), "%.0f", oai->tx_freq[0]);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "center-of-channel-bandwidth", tx_freq, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"center-of-channel-bandwidth\" node.\n");
|
||||
char tx_freq[16];
|
||||
snprintf(tx_freq, sizeof(tx_freq), "%.0f", oai->tx_freq[0]);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "center-of-channel-bandwidth", tx_freq, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"center-of-channel-bandwidth\" node.\n");
|
||||
|
||||
char tx_arfcn[16];
|
||||
snprintf(tx_arfcn, sizeof(tx_arfcn), "%d", to_nrarfcn(oai->nr_band, oai->tx_freq[0], oai->nr_scs_for_raster, oai->tx_bw));
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "absolute-frequency-center", tx_arfcn, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"absolute-frequency-center\" node.\n");
|
||||
char tx_arfcn[16];
|
||||
snprintf(tx_arfcn, sizeof(tx_arfcn), "%d", to_nrarfcn(oai->nr_band, oai->tx_freq[0], oai->nr_scs_for_raster, oai->tx_bw));
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "absolute-frequency-center", tx_arfcn, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"absolute-frequency-center\" node.\n");
|
||||
|
||||
char tx_bw[16];
|
||||
snprintf(tx_bw, sizeof(tx_bw), "%.0f", oai->tx_bw);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "channel-bandwidth", tx_bw, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"channel-bandwidth\" node.\n");
|
||||
char tx_bw[16];
|
||||
snprintf(tx_bw, sizeof(tx_bw), "%.0f", oai->tx_bw);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "channel-bandwidth", tx_bw, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"channel-bandwidth\" node.\n");
|
||||
|
||||
// oai->tx_gain takes the value of att_tx from the RU section of gNB config file
|
||||
// we assume the same gain is applied to all channels; same as above for the frequency
|
||||
const double tx_gain_value = ((oai->tx_gain[0] * 10000) < ru_session->xran_mplane.max_tx_gain) ? (oai->tx_gain[0] * 10000) : ru_session->xran_mplane.max_tx_gain;
|
||||
char tx_gain_str[8];
|
||||
snprintf(tx_gain_str, sizeof(tx_gain_str), "%.f", tx_gain_value);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "gain", tx_gain_str, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"gain\" node.\n");
|
||||
// oai->tx_gain takes the value of att_tx from the RU section of gNB config file
|
||||
// we assume the same gain is applied to all channels; same as above for the frequency
|
||||
const double tx_gain_value = ((oai->tx_gain[0] * 10000) < ru_session->xran_mplane.max_tx_gain) ? (oai->tx_gain[0] * 10000) : ru_session->xran_mplane.max_tx_gain;
|
||||
char tx_gain_str[8];
|
||||
snprintf(tx_gain_str, sizeof(tx_gain_str), "%.f", tx_gain_value);
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "gain", tx_gain_str, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"gain\" node.\n");
|
||||
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "downlink-radio-frame-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-radio-frame-offset\" node.\n");
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "downlink-radio-frame-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-radio-frame-offset\" node.\n");
|
||||
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "downlink-sfn-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-sfn-offset\" node.\n");
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "downlink-sfn-offset", "0", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"downlink-sfn-offset\" node.\n");
|
||||
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "active", "ACTIVE", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"active\" node.\n");
|
||||
ret = lyd_new_term(tx_carrier_node, NULL, "active", "ACTIVE", 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"active\" node.\n");
|
||||
}
|
||||
|
||||
// PUSCH & PRACH endpoints
|
||||
const size_t num_rx_ch = oai->rx_num_channels / num_rus;
|
||||
for (size_t i = 0; i < num_rx_ch; i++) {
|
||||
struct lyd_node *pusch_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "low-level-rx-endpoints", 0, &pusch_node, ru_session->ru_mplane_config.rx_endpoints.name[i]);
|
||||
@@ -330,7 +336,6 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
}
|
||||
|
||||
// PDSCH endpoints
|
||||
const size_t num_tx_ch = oai->tx_num_channels / num_rus;
|
||||
for (size_t i = 0; i < num_tx_ch; i++) {
|
||||
struct lyd_node *pdsch_node = NULL;
|
||||
ret = lyd_new_list(*root, NULL, "low-level-tx-endpoints", 0, &pdsch_node, ru_session->ru_mplane_config.tx_endpoints.name[i]);
|
||||
@@ -342,6 +347,7 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
|
||||
// PUSCH and PRACH links
|
||||
for (size_t i = 0; i < num_rx_ch; i++) {
|
||||
const size_t rx_carrier_id = (num_rx_carriers == 1) ? 0 : i;
|
||||
// PUSCH
|
||||
struct lyd_node *pusch_link_node = NULL;
|
||||
char pusch_link[16];
|
||||
@@ -352,7 +358,7 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
ret = lyd_new_term(pusch_link_node, NULL, "processing-element", u_proc_elem, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"processing-element\" node.\n");
|
||||
|
||||
ret = lyd_new_term(pusch_link_node, NULL, "rx-array-carrier", ru_session->ru_mplane_config.rx_carriers.name[0], 0, NULL);
|
||||
ret = lyd_new_term(pusch_link_node, NULL, "rx-array-carrier", ru_session->ru_mplane_config.rx_carriers.name[rx_carrier_id], 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"rx-array-carrier\" node.\n");
|
||||
|
||||
ret = lyd_new_term(pusch_link_node, NULL, "low-level-rx-endpoint", ru_session->ru_mplane_config.rx_endpoints.name[i], 0, NULL);
|
||||
@@ -368,7 +374,7 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
ret = lyd_new_term(prach_link_node, NULL, "processing-element", u_proc_elem, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"processing-element\" node.\n");
|
||||
|
||||
ret = lyd_new_term(prach_link_node, NULL, "rx-array-carrier", ru_session->ru_mplane_config.rx_carriers.name[0], 0, NULL);
|
||||
ret = lyd_new_term(prach_link_node, NULL, "rx-array-carrier", ru_session->ru_mplane_config.rx_carriers.name[rx_carrier_id], 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"rx-array-carrier\" node.\n");
|
||||
|
||||
const size_t prach_endpoint_name_offset = i + (ru_session->ru_mplane_config.rx_endpoints.num / 2);
|
||||
@@ -378,6 +384,7 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
|
||||
// PDSCH links
|
||||
for (size_t i = 0; i < num_tx_ch; i++) {
|
||||
const size_t tx_carrier_id = (num_tx_carriers == 1) ? 0 : i;
|
||||
struct lyd_node *pdsch_link_node = NULL;
|
||||
char pdsch_link[16];
|
||||
snprintf(pdsch_link, sizeof(pdsch_link), "%s%ld", "PdschLink", i);
|
||||
@@ -387,7 +394,7 @@ static bool create_uplane_conf_v2(const ru_session_t *ru_session, const openair0
|
||||
ret = lyd_new_term(pdsch_link_node, NULL, "processing-element", u_proc_elem, 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"processing-element\" node.\n");
|
||||
|
||||
ret = lyd_new_term(pdsch_link_node, NULL, "tx-array-carrier", ru_session->ru_mplane_config.tx_carriers.name[0], 0, NULL);
|
||||
ret = lyd_new_term(pdsch_link_node, NULL, "tx-array-carrier", ru_session->ru_mplane_config.tx_carriers.name[tx_carrier_id], 0, NULL);
|
||||
VERIFY_SUCCESS(ret == LY_SUCCESS, "[MPLANE] Failed to create \"tx-array-carrier\" node.\n");
|
||||
|
||||
ret = lyd_new_term(pdsch_link_node, NULL, "low-level-tx-endpoint", ru_session->ru_mplane_config.tx_endpoints.name[i], 0, NULL);
|
||||
|
||||
@@ -42,20 +42,30 @@ static bool store_schemas(xmlNode *node, ru_session_t *ru_session, struct ly_ctx
|
||||
if (strcmp((const char *)cur_node->name, "schema") == 0) {
|
||||
|
||||
xmlNode *name_node = xmlFirstElementChild(cur_node);
|
||||
char *module_name = (char *)xmlNodeGetContent(name_node);
|
||||
xmlChar *module_name = xmlNodeGetContent(name_node);
|
||||
xmlNode *revision_node = xmlNextElementSibling(name_node);
|
||||
char *module_revision = (char *)xmlNodeGetContent(revision_node);
|
||||
xmlChar *module_revision = xmlNodeGetContent(revision_node);
|
||||
xmlNode *format_node = xmlNextElementSibling(revision_node);
|
||||
char *module_format = (char *)xmlNodeGetContent(format_node);
|
||||
xmlChar *module_format = xmlNodeGetContent(format_node);
|
||||
|
||||
if (strcmp(module_format, "yang") != 0)
|
||||
if (strcmp((char*)module_format, "yang") != 0) {
|
||||
xmlFree(module_name);
|
||||
xmlFree(module_revision);
|
||||
xmlFree(module_format);
|
||||
continue;
|
||||
}
|
||||
|
||||
MP_LOG_I("RPC request to RU \"%s\" = <get-schema> for module \"%s\".\n", ru_session->ru_ip_add, module_name);
|
||||
struct nc_rpc *get_schema_rpc = nc_rpc_getschema(module_name, module_revision, "yang", param);
|
||||
struct nc_rpc *get_schema_rpc = nc_rpc_getschema((char*)module_name, (char*)module_revision, "yang", param);
|
||||
char *schema_data = NULL;
|
||||
bool success = rpc_send_recv((struct nc_session *)ru_session->session, get_schema_rpc, wd, timeout, &schema_data);
|
||||
AssertError(success, return false, "[MPLANE] Unable to get schema for module \"%s\" from RU \"%s\".\n", module_name, ru_session->ru_ip_add);
|
||||
if (!success) {
|
||||
MP_LOG_W("[MPLANE] Unable to get schema for module \"%s\" from RU \"%s\".\n", module_name, ru_session->ru_ip_add);
|
||||
xmlFree(module_name);
|
||||
xmlFree(module_revision);
|
||||
xmlFree(module_format);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (schema_data) {
|
||||
#ifdef MPLANE_V1
|
||||
@@ -68,11 +78,21 @@ static bool store_schemas(xmlNode *node, ru_session_t *ru_session, struct ly_ctx
|
||||
if (!mod) {
|
||||
MP_LOG_W("Unable to load module \"%s\" from RU \"%s\".\n", module_name, ru_session->ru_ip_add);
|
||||
nc_rpc_free(get_schema_rpc);
|
||||
#ifdef MPLANE_V1
|
||||
ly_ctx_destroy(*ctx, NULL);
|
||||
#elif defined MPLANE_V2
|
||||
ly_ctx_destroy(*ctx);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
xmlFree(module_name);
|
||||
xmlFree(module_revision);
|
||||
xmlFree(module_format);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
nc_rpc_free(get_schema_rpc);
|
||||
xmlFree(module_name);
|
||||
xmlFree(module_revision);
|
||||
xmlFree(module_format);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +125,7 @@ bool load_yang_models(ru_session_t *ru_session, const char *buffer)
|
||||
xmlNode *root_element = xmlDocGetRootElement(doc);
|
||||
|
||||
bool success = load_from_operational_ds(root_element->children, ru_session, ctx);
|
||||
xmlFreeDoc(doc);
|
||||
if (success) {
|
||||
MP_LOG_I("Successfully loaded all yang modules from operational datastore for RU \"%s\".\n", ru_session->ru_ip_add);
|
||||
return true;
|
||||
@@ -116,7 +137,7 @@ bool load_yang_models(ru_session_t *ru_session, const char *buffer)
|
||||
1) the yang models order is not good - the dependancy models have to be loaded first
|
||||
2) earlier O-RAN yang versions (e.g. v4) is not properly defined (i.e. optional parameters should not be included by default) */
|
||||
const char *yang_dir = YANG_MODELS;
|
||||
const char *yang_models[] = {"ietf-interfaces", "iana-if-type", "ietf-ip", "iana-hardware", "ietf-hardware", "o-ran-interfaces", "o-ran-module-cap", "o-ran-compression-factors", "o-ran-processing-element", "o-ran-uplane-conf", "ietf-netconf-acm", "ietf-crypto-types", "o-ran-file-management", "o-ran-performance-management"};
|
||||
const char *yang_models[] = {"ietf-interfaces", "iana-if-type", "ietf-ip", "iana-hardware", "ietf-hardware", "o-ran-wg4-features", "o-ran-interfaces", "o-ran-module-cap", "o-ran-compression-factors", "ietf-crypto-types", "o-ran-usermgmt", "o-ran-processing-element", "o-ran-hardware", "o-ran-common-yang-types", "o-ran-delay-management", "o-ran-uplane-conf", "ietf-netconf-acm", "o-ran-file-management", "o-ran-performance-management"};
|
||||
|
||||
#ifdef MPLANE_V1
|
||||
*ctx = ly_ctx_new(yang_dir, 0);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,449 @@
|
||||
module o-ran-common-yang-types {
|
||||
yang-version 1.1;
|
||||
namespace "urn:o-ran:common-yang-types:1.0";
|
||||
prefix "o-ran-types";
|
||||
|
||||
import ietf-inet-types {
|
||||
prefix inet;
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module defines ORAN common YANG types.
|
||||
|
||||
Copyright 2023 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the above disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the above disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the Members of the O-RAN Alliance nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2023-08-14" {
|
||||
description
|
||||
"version 2.0.0
|
||||
|
||||
1) New availability status typedef";
|
||||
|
||||
reference "ORAN-WG1.IM.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 1.1.0
|
||||
|
||||
1) style guide corrections";
|
||||
|
||||
reference "ORAN-WG1.IM.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2020-10-10" {
|
||||
description
|
||||
"version 1.0.0
|
||||
|
||||
1) Initial creation";
|
||||
|
||||
reference "ORAN-WG1.IM.0-v01.00";
|
||||
}
|
||||
|
||||
typedef version {
|
||||
type string {
|
||||
pattern '[0-9]+(\.[0-9]+){1,2}';
|
||||
}
|
||||
description
|
||||
"Definition used to represent a version of an interface.";
|
||||
}
|
||||
|
||||
typedef timezone-name {
|
||||
type string;
|
||||
description
|
||||
"A time zone name as used by the Time Zone Database,
|
||||
sometimes referred to as the 'Olson Database'.
|
||||
|
||||
The complete set of valid values is defined in
|
||||
https://www.iana.org/time-zones.
|
||||
|
||||
The exact set of supported values is an
|
||||
implementation-specific matter.";
|
||||
|
||||
reference
|
||||
"RFC 6557: Procedures for Maintaining the Time Zone Database
|
||||
IANA Time Zone Database https://www.iana.org/time-zones ";
|
||||
}
|
||||
|
||||
typedef protocol {
|
||||
type enumeration {
|
||||
enum ECPRI {
|
||||
description
|
||||
"Indicates that an O-RU supports the ecpri header format
|
||||
for the C/U plane";
|
||||
}
|
||||
enum IEEE-1914-3 {
|
||||
description
|
||||
"Indicates that an O-RU supports the 1914.3 header format
|
||||
for the C/U plane";
|
||||
}
|
||||
}
|
||||
description "the type of C/U plane protocol";
|
||||
}
|
||||
|
||||
typedef duplex-scheme {
|
||||
type enumeration {
|
||||
enum TDD {
|
||||
description
|
||||
"TDD scheme";
|
||||
}
|
||||
enum FDD {
|
||||
description
|
||||
"FDD scheme";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Type of duplex scheme O-RU supports.";
|
||||
}
|
||||
|
||||
typedef active {
|
||||
type enumeration {
|
||||
enum INACTIVE {
|
||||
description
|
||||
"Carrier does not provide signal - transmission is disabled";
|
||||
}
|
||||
enum SLEEP{
|
||||
description
|
||||
"Carrier is fully configured and was active but is energy saving mode";
|
||||
}
|
||||
enum ACTIVE{
|
||||
description
|
||||
"Carrier is fully configured and properly providing the signal";
|
||||
}
|
||||
}
|
||||
description "the active status of a carrier";
|
||||
}
|
||||
|
||||
typedef state {
|
||||
type enumeration {
|
||||
enum DISABLED {
|
||||
description
|
||||
"Array carrier is not active - transmission of signal is disabled.";
|
||||
}
|
||||
enum BUSY {
|
||||
description
|
||||
"Array carrier is processing an operation requested by change of active parameter.
|
||||
When array carriers is BUSY the transmission of signal is not guaranteed.";
|
||||
}
|
||||
enum READY {
|
||||
description
|
||||
"Array carrier had completed activation operation - is active and transmission of signal is ongoing.";
|
||||
}
|
||||
}
|
||||
description "the state on an array carrier";
|
||||
}
|
||||
|
||||
typedef transport-session {
|
||||
type enumeration {
|
||||
enum ETHERNET {
|
||||
description "VLAN based CUS Transport ";
|
||||
}
|
||||
enum UDP_IP {
|
||||
// if-feature o-ran-int:UDPIP-BASED-CU-PLANE; How to handle enum value constrained by feature defined in o-ran-interface.yang?
|
||||
description "UDP/IP based CUS Transport ";
|
||||
}
|
||||
enum ALIAS_MAC{
|
||||
// if-feature o-ran-int:ALIASMAC-BASED-CU-PLANE; How to handle enum value constrained by feature defined in o-ran-interface.yang?
|
||||
description "Alias MAC address based CUS Transport ";
|
||||
}
|
||||
enum SHARED_CELL {
|
||||
// if-feature o-ran-elements:SHARED_CELL; How to handle enum value constrained by feature defined in o-ran-processing-element.yang?
|
||||
description "VLAN based CUS Transport used for Shared Cell scenario";
|
||||
}
|
||||
}
|
||||
description "the transport session type";
|
||||
}
|
||||
|
||||
typedef netconf-client-id {
|
||||
type union {
|
||||
type inet:ip-address;
|
||||
type inet:uri;
|
||||
}
|
||||
description "A NETCONF client identifier";
|
||||
}
|
||||
|
||||
typedef ca-ra-server-id {
|
||||
type union {
|
||||
type inet:ip-address;
|
||||
type inet:uri;
|
||||
}
|
||||
description "A CA/RA Server identifier";
|
||||
}
|
||||
|
||||
typedef segw-id {
|
||||
type union {
|
||||
type inet:ip-address;
|
||||
type inet:uri;
|
||||
}
|
||||
description "A SeGW identifier";
|
||||
}
|
||||
|
||||
typedef pcp {
|
||||
type uint8 {
|
||||
range "0..7";
|
||||
}
|
||||
description
|
||||
"Priority Code Point. PCP is a 3-bit field that refers to the
|
||||
class of service applied to a VLAN tagged frame. The
|
||||
field specifies a priority value between 0 and 7, these values
|
||||
can be used by quality of service (QoS) to prioritize
|
||||
different classes of traffic.";
|
||||
reference
|
||||
"IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
|
||||
}
|
||||
|
||||
typedef vlan-id {
|
||||
type uint16 {
|
||||
range "1..4094";
|
||||
}
|
||||
description
|
||||
"The VLAN-ID that uniquely identifies a VLAN. This is the 12-bit VLAN-ID
|
||||
used in the VLAN Tag header.";
|
||||
reference "[802.1q] 9.6";
|
||||
}
|
||||
|
||||
typedef geographic-coordinate-degree {
|
||||
type decimal64 {
|
||||
fraction-digits 8;
|
||||
}
|
||||
description
|
||||
"Decimal degree (DD) used to express latitude and longitude
|
||||
geographic coordinates.";
|
||||
}
|
||||
|
||||
typedef prach-preamble-format {
|
||||
type enumeration {
|
||||
enum LTE-0 {
|
||||
description
|
||||
"LTE PRACH Preamble format 0";
|
||||
}
|
||||
enum LTE-1 {
|
||||
description
|
||||
"LTE PRACH Preamble format 1";
|
||||
}
|
||||
enum LTE-2 {
|
||||
description
|
||||
"LTE PRACH Preamble format 2";
|
||||
}
|
||||
enum LTE-3 {
|
||||
description
|
||||
"LTE PRACH Preamble format 3";
|
||||
}
|
||||
enum LTE-4 {
|
||||
description
|
||||
"LTE PRACH Preamble format 4";
|
||||
}
|
||||
enum LTE-NB0 {
|
||||
description
|
||||
"LTE Narrowband PRACH format 0";
|
||||
}
|
||||
enum LTE-NB1 {
|
||||
description
|
||||
"LTE Narrowband PRACH format 1";
|
||||
}
|
||||
enum NR-0 {
|
||||
description
|
||||
"5GNR PRACH Preamble format 0";
|
||||
}
|
||||
enum NR-1 {
|
||||
description
|
||||
"5GNR PRACH Preamble format 1";
|
||||
}
|
||||
enum NR-2 {
|
||||
description
|
||||
"5GNR PRACH Preamble format 2";
|
||||
}
|
||||
enum NR-3 {
|
||||
description
|
||||
"5GNR PRACH Preamble format 3";
|
||||
}
|
||||
enum NR-A1 {
|
||||
description
|
||||
"5GNR PRACH Preamble format A1";
|
||||
}
|
||||
enum NR-A2 {
|
||||
description
|
||||
"5GNR PRACH Preamble format A2";
|
||||
}
|
||||
enum NR-A3 {
|
||||
description
|
||||
"5GNR PRACH Preamble format A3";
|
||||
}
|
||||
enum NR-B1 {
|
||||
description
|
||||
"5GNR PRACH Preamble format B1";
|
||||
}
|
||||
enum NR-B2 {
|
||||
description
|
||||
"5GNR PRACH Preamble format B2";
|
||||
}
|
||||
enum NR-B3 {
|
||||
description
|
||||
"5GNR PRACH Preamble format B3";
|
||||
}
|
||||
enum NR-B4 {
|
||||
description
|
||||
"5GNR PRACH Preamble format B4";
|
||||
}
|
||||
enum NR-C0 {
|
||||
description
|
||||
"5GNR PRACH Preamble format C0";
|
||||
}
|
||||
enum NR-C2 {
|
||||
description
|
||||
"5GNR PRACH Preamble format C2";
|
||||
}
|
||||
enum LTE-NB0-a {
|
||||
description
|
||||
"LTE Narrowband PRACH format 0-a";
|
||||
}
|
||||
enum LTE-NB1-a {
|
||||
description
|
||||
"LTE Narrowband PRACH format 1-a";
|
||||
}
|
||||
enum LTE-NB2 {
|
||||
description
|
||||
"LTE Narrowband PRACH format 2";
|
||||
}
|
||||
}
|
||||
|
||||
description
|
||||
"PRACH preamble format definition";
|
||||
}
|
||||
|
||||
typedef polarisation_type {
|
||||
type enumeration {
|
||||
enum MINUS_45 {
|
||||
description "MINUS_45";
|
||||
}
|
||||
enum ZERO {
|
||||
description "ZERO";
|
||||
}
|
||||
enum PLUS_45 {
|
||||
description "PLUS_45";
|
||||
}
|
||||
enum PLUS_90 {
|
||||
description "PLUS_90";
|
||||
}
|
||||
}
|
||||
description "Type definition for polarisations";
|
||||
}
|
||||
|
||||
typedef bandwidth {
|
||||
type uint32 {
|
||||
range "200 | 1400 | 3000 | 5000 | 10000 | 15000 | 20000 | 25000 |
|
||||
30000 | 40000 | 50000 | 60000 | 70000 | 80000 | 90000 | 100000
|
||||
| 200000 | 400000" ;
|
||||
}
|
||||
units kilohertz;
|
||||
description
|
||||
"transmission bandwidth configuration in units of kHz -
|
||||
covering NBIoT through to New Radio - see 38.104";
|
||||
}
|
||||
|
||||
typedef scs-config-type {
|
||||
type enumeration {
|
||||
enum KHZ_15 {
|
||||
value 0;
|
||||
description
|
||||
"15kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_30 {
|
||||
value 1;
|
||||
description
|
||||
"30kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_60 {
|
||||
value 2;
|
||||
description
|
||||
"60kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_120 {
|
||||
value 3;
|
||||
description
|
||||
"120kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_240 {
|
||||
value 4;
|
||||
description
|
||||
"240kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_1_25 {
|
||||
value 12;
|
||||
description
|
||||
"1,25kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_3_75 {
|
||||
value 13;
|
||||
description
|
||||
"3.75kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_5 {
|
||||
value 14;
|
||||
description
|
||||
"5kHz sub carrier spacing";
|
||||
}
|
||||
enum KHZ_7_5 {
|
||||
value 15;
|
||||
description
|
||||
"7.5kHz sub carrier spacing";
|
||||
}
|
||||
}
|
||||
|
||||
description
|
||||
"Scs configuration type definition";
|
||||
}
|
||||
|
||||
typedef availability-status {
|
||||
type union {
|
||||
type empty;
|
||||
type enumeration {
|
||||
enum FAILED {
|
||||
description
|
||||
"The resource has an internal fault that prevents it from operating.
|
||||
The operational state is disabled.";
|
||||
}
|
||||
enum DEPENDENCY {
|
||||
description
|
||||
"The resource cannot operate because some other resource on which it
|
||||
depends is unavailable. The operational state is disabled.";
|
||||
}
|
||||
}
|
||||
}
|
||||
description
|
||||
"When the value of this attribute is empty set, this implies that none of
|
||||
the status conditions described in the enumerations are present. Only current relevant status for M-plane defined are listed here";
|
||||
reference "CCITT Rec. X.731 (1992 E) 8.1.2.3";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,7 +13,7 @@ module o-ran-compression-factors {
|
||||
"This module defines the module capabilities for
|
||||
the O-RAN Radio Unit U-Plane configuration.
|
||||
|
||||
Copyright 2020 the O-RAN Alliance.
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
@@ -39,6 +39,46 @@ module o-ran-compression-factors {
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 16.0.0
|
||||
|
||||
1) Clarify handling of deprecated leaf compression-format.
|
||||
2) Add in SINR compression details";
|
||||
|
||||
reference "ORAN-WG4.M.0-v16.00";
|
||||
}
|
||||
|
||||
revision "2023-08-14" {
|
||||
description
|
||||
"version 13.0.0
|
||||
|
||||
1) New compression methods BFP-SRES-MASK-IN-SEC-HEADER and MOD-SRES-MASK-IN-SEC-HEADER.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v13.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 8.0.0
|
||||
|
||||
1) typographical corrections in descriptions.
|
||||
2) Configuration for Beamforming weights were added together with changes
|
||||
and updates to compressions.
|
||||
3) add new beamspace compression enumeration for BEAMSPACE_TYPEII.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v08.00";
|
||||
}
|
||||
|
||||
revision "2021-03-22" {
|
||||
description
|
||||
"version 4.1.0
|
||||
|
||||
1) typographical corrections in descriptions.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v04.00";
|
||||
}
|
||||
|
||||
revision "2020-08-10" {
|
||||
description
|
||||
"version 4.0.0
|
||||
@@ -62,7 +102,7 @@ module o-ran-compression-factors {
|
||||
description
|
||||
"version 1.1.0
|
||||
|
||||
1) changes related to compression bitwidth presentation";
|
||||
1) changes related to compression bit-width presentation";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
@@ -82,6 +122,171 @@ module o-ran-compression-factors {
|
||||
"Presence of this feature means that O-RU supports configurable fs-offset for compression.";
|
||||
}
|
||||
|
||||
typedef ci-compression-method-def {
|
||||
type enumeration {
|
||||
enum NO_COMPRESSION {
|
||||
description
|
||||
"No compression will be used";
|
||||
}
|
||||
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum BLOCK_SCALING {
|
||||
description
|
||||
"Block scaling compression and decompresion will be used";
|
||||
}
|
||||
|
||||
enum U_LAW {
|
||||
description
|
||||
"u-Law compression and decompresion method will be used";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Available compression methods for channel information (e.g., ST6).";
|
||||
}
|
||||
|
||||
typedef compression-type-def {
|
||||
type enumeration {
|
||||
enum STATIC {
|
||||
description
|
||||
"Indicates that static compression method will be used (both compression and IQ bitwidth)";
|
||||
}
|
||||
enum DYNAMIC {
|
||||
description
|
||||
"Indicates that dynamic compression method will be used";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Compression type that O-DU wants to be supported";
|
||||
}
|
||||
|
||||
typedef bf-compression-method-def {
|
||||
type enumeration {
|
||||
enum NO_COMPRESSION {
|
||||
description
|
||||
"No compression will be used";
|
||||
}
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum BLOCK_SCALING {
|
||||
description
|
||||
"Block scaling compression and decompresion will be used";
|
||||
}
|
||||
|
||||
enum U_LAW {
|
||||
description
|
||||
"u-Law compression and decompresion method will be used";
|
||||
}
|
||||
|
||||
enum BEAMSPACE {
|
||||
description
|
||||
"Beamspace compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum VOID_1 {
|
||||
description
|
||||
"Leftover of modulation, not to be used for beamforming weights";
|
||||
}
|
||||
|
||||
enum VOID_2 {
|
||||
description
|
||||
"Leftover of block-floating-point-selective-re-sending, not to be used for beamforming weights";
|
||||
}
|
||||
|
||||
enum VOID_3 {
|
||||
description
|
||||
"Leftover of modulation-compression-selective-re-sending, not to be used for beamforming weights";
|
||||
}
|
||||
|
||||
enum BEAMSPACE_TYPEII {
|
||||
description
|
||||
"Beamspace compression typeII and decompression will be used ";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Available compression methods for beamforming weights.";
|
||||
}
|
||||
|
||||
typedef compression-method-def {
|
||||
type enumeration {
|
||||
enum NO_COMPRESSION {
|
||||
description
|
||||
"No compression";
|
||||
}
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression method";
|
||||
}
|
||||
|
||||
enum BLOCK_SCALING {
|
||||
description
|
||||
"Block scaling compression and decompresion method";
|
||||
}
|
||||
|
||||
enum U_LAW {
|
||||
description
|
||||
"u-Law compression and decompresion method";
|
||||
}
|
||||
|
||||
enum VOID_1 {
|
||||
description
|
||||
"Leftover of beamspace, not to be used for IQ data.";
|
||||
}
|
||||
|
||||
enum MODULATION {
|
||||
description
|
||||
"Modulation compression and decompression method";
|
||||
}
|
||||
|
||||
enum BLOCK-FLOATING-POINT-SELECTIVE-RE-SENDING {
|
||||
description
|
||||
"block floating point with selective re sending
|
||||
compression and decompression method";
|
||||
}
|
||||
|
||||
enum MODULATION-COMPRESSION-SELECTIVE-RE-SENDING {
|
||||
description
|
||||
"modulation compression with selective re sending
|
||||
compression and decompression method";
|
||||
}
|
||||
enum BFP-SRES-MASK-IN-SEC-HEADER {
|
||||
description
|
||||
"block floating point with selective re sending
|
||||
compression and decompression method with selective re sending mask in the section header ";
|
||||
}
|
||||
|
||||
enum MOD-SRES-MASK-IN-SEC-HEADER {
|
||||
description
|
||||
"modulation compression with selective re sending
|
||||
compression and decompression method with selective re sending mask in the section header";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Available compression methods for the data.";
|
||||
}
|
||||
|
||||
typedef sinr-compression-method-def {
|
||||
type enumeration {
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum NO_COMPRESSION {
|
||||
description
|
||||
"No compression will be used";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Available compression methods for the SINR.";
|
||||
}
|
||||
|
||||
grouping compression-method-grouping {
|
||||
description
|
||||
"Grouping for compression method.";
|
||||
@@ -89,68 +294,148 @@ module o-ran-compression-factors {
|
||||
leaf iq-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
"Bit-width to be used in compression";
|
||||
}
|
||||
|
||||
leaf compression-method {
|
||||
type enumeration {
|
||||
enum NO_COMPRESSION {
|
||||
description
|
||||
"No compression will be used";
|
||||
}
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum BLOCK_SCALING {
|
||||
description
|
||||
"Block scaling compression and decompresion will be used";
|
||||
}
|
||||
|
||||
enum U_LAW {
|
||||
description
|
||||
"u-Law compression and decompresion method will be used";
|
||||
}
|
||||
|
||||
enum BEAMSPACE {
|
||||
description
|
||||
"Beamspace compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum MODULATION {
|
||||
description
|
||||
"Modulation compression and decompression will be used";
|
||||
}
|
||||
enum BLOCK-FLOATING-POINT-SELECTIVE-RE-SENDING {
|
||||
description
|
||||
"block floating point with selective re sending
|
||||
compression and decompression will be used";
|
||||
}
|
||||
enum MODULATION-COMPRESSION-SELECTIVE-RE-SENDING {
|
||||
description
|
||||
"modulation compression with selective re sending
|
||||
compression and decompression will be used";
|
||||
}
|
||||
}
|
||||
type compression-method-def;
|
||||
description
|
||||
"Compresion method which can be supported by the O-RU";
|
||||
"Compression method which can be supported by the O-RU";
|
||||
}
|
||||
}
|
||||
|
||||
grouping compression-details {
|
||||
description "";
|
||||
|
||||
leaf iq-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
}
|
||||
|
||||
leaf compression-type {
|
||||
type compression-type-def;
|
||||
mandatory true;
|
||||
description
|
||||
"Compression type that O-DU wants to be supported";
|
||||
}
|
||||
|
||||
leaf bitwidth {
|
||||
when "../compression-type = 'STATIC'";
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"Bitwidth to be used in compression.
|
||||
This has since been replaced in M-Plane version
|
||||
2.0.0 with the iq-bitwidth schema node";
|
||||
}
|
||||
|
||||
leaf compression-method {
|
||||
type compression-method-def;
|
||||
description
|
||||
"Compression method which can be supported by the O-RU";
|
||||
}
|
||||
|
||||
uses compresion-format-grp {
|
||||
status deprecated;
|
||||
}
|
||||
}
|
||||
|
||||
grouping bf-compression-details {
|
||||
description "Compression formats defined for beamforming";
|
||||
|
||||
leaf iq-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
}
|
||||
|
||||
leaf compression-type {
|
||||
type compression-type-def;
|
||||
mandatory true;
|
||||
description
|
||||
"Compression type that O-DU wants to be supported";
|
||||
}
|
||||
|
||||
leaf bitwidth {
|
||||
when "../compression-type = 'STATIC'";
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"Bitwidth to be used in compression.
|
||||
This has since been replaced in M-Plane version
|
||||
2.0.0 with the iq-bitwidth schema node";
|
||||
}
|
||||
|
||||
leaf compression-method {
|
||||
type bf-compression-method-def;
|
||||
description
|
||||
"Compression method which can be supported by the beamforming";
|
||||
}
|
||||
|
||||
uses compresion-format-grp {
|
||||
status deprecated;
|
||||
}
|
||||
}
|
||||
|
||||
grouping sinr-compression-details {
|
||||
description "Compression formats defined for SINR";
|
||||
|
||||
leaf sinr-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
}
|
||||
|
||||
leaf sinr-compression-method {
|
||||
type sinr-compression-method-def;
|
||||
description
|
||||
"Compression method which can be supported by the SINR.";
|
||||
}
|
||||
|
||||
leaf sinr-block-size {
|
||||
type uint8;
|
||||
description
|
||||
"Block size used for reporting SINR.
|
||||
If the parameter is absent, then the SINR values are sent without zero-padding
|
||||
i.e., the block size is equal to the number of SINR values
|
||||
|
||||
Please refer to CUS specification clause 7.2.10 for more details.";
|
||||
}
|
||||
}
|
||||
|
||||
// *********** Deprecated ***********
|
||||
|
||||
grouping compression-formats {
|
||||
status deprecated;
|
||||
description
|
||||
"Grouping deicated to list compression formats as choice";
|
||||
"Grouping deicated to list compression formats as choice.";
|
||||
|
||||
uses compresion-format-grp {
|
||||
status deprecated;
|
||||
}
|
||||
}
|
||||
|
||||
grouping compresion-format-grp {
|
||||
status deprecated;
|
||||
description
|
||||
"Grouping to for compression format choice";
|
||||
|
||||
choice compression-format {
|
||||
status deprecated;
|
||||
description
|
||||
"Choice of compression format for particular element";
|
||||
"Choice of compression format for particular element.
|
||||
Note: This method is deprecated. All should be done as emumeration as details are configured
|
||||
by udCompHdr in CU-Plane messaging.
|
||||
NOTE: Changing the configuration from any compression format to no compression would require
|
||||
a delete-config followed by an edit-config";
|
||||
|
||||
case no-compresison {
|
||||
description "Compression for beam weights is not supported.";
|
||||
}
|
||||
|
||||
case block-floating-point {
|
||||
description "Block floating point compression and decompression is supported.";
|
||||
description "Block floating-point compression and decompression is supported.";
|
||||
|
||||
leaf exponent {
|
||||
type uint8 {
|
||||
@@ -162,7 +447,7 @@ module o-ran-compression-factors {
|
||||
|
||||
case block-floating-point-selective-re-sending {
|
||||
description
|
||||
"Block floating point with selective re sending compression and decompression is supported.";
|
||||
"Block floating-point with selective re sending compression and decompression is supported.";
|
||||
|
||||
leaf sres-exponent {
|
||||
type uint8 {
|
||||
@@ -173,7 +458,7 @@ module o-ran-compression-factors {
|
||||
}
|
||||
|
||||
case block-scaling {
|
||||
description "Block scaling compression and decompresion is supported.";
|
||||
description "Block scaling compression and decompression is supported.";
|
||||
leaf block-scalar {
|
||||
type uint8;
|
||||
description
|
||||
@@ -182,7 +467,7 @@ module o-ran-compression-factors {
|
||||
}
|
||||
|
||||
case u-law {
|
||||
description "u-Law compression and decompresion method is supported.";
|
||||
description "u-Law compression and decompression method is supported.";
|
||||
leaf comp-bit-width {
|
||||
type uint8 {
|
||||
range "0..15";
|
||||
@@ -218,7 +503,7 @@ module o-ran-compression-factors {
|
||||
type uint8 {
|
||||
range "0..1";
|
||||
}
|
||||
description "Constallation shift flag";
|
||||
description "Constellation shift flag";
|
||||
}
|
||||
|
||||
leaf mod-comp-scaler {
|
||||
@@ -235,7 +520,7 @@ module o-ran-compression-factors {
|
||||
type uint8 {
|
||||
range "0..1";
|
||||
}
|
||||
description "Constallation shift flag";
|
||||
description "Constellation shift flag";
|
||||
}
|
||||
|
||||
leaf sres-mod-comp-scaler {
|
||||
@@ -250,54 +535,50 @@ module o-ran-compression-factors {
|
||||
}
|
||||
|
||||
grouping compression-params {
|
||||
status deprecated;
|
||||
description
|
||||
"Parameters to define compression";
|
||||
|
||||
leaf compression-type {
|
||||
type enumeration {
|
||||
enum STATIC {
|
||||
description
|
||||
"Indicates that static compression method will be used (both compression and IQ bitwidth)";
|
||||
}
|
||||
enum DYNAMIC {
|
||||
description
|
||||
"Indicates that dynamic compression method will be used";
|
||||
}
|
||||
}
|
||||
type compression-type-def;
|
||||
mandatory true;
|
||||
description
|
||||
"Compression type that O-DU wants to be supported";
|
||||
}
|
||||
|
||||
// *********** TO BE REMOVED ***********
|
||||
leaf bitwidth {
|
||||
when "../compression-type = 'STATIC'";
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"Bitwidth to be used in compression.
|
||||
"Bit-width to be used in compression.
|
||||
This has since been replaced in M-Plane version
|
||||
2.0.0 with the iq-bitwidth schema node";
|
||||
}
|
||||
// *************************************
|
||||
|
||||
uses compression-formats;
|
||||
uses compression-formats {
|
||||
status deprecated;
|
||||
}
|
||||
}
|
||||
|
||||
grouping compression-parameters {
|
||||
status deprecated;
|
||||
description
|
||||
"Parameters used to define description type";
|
||||
|
||||
leaf iq-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
"Bit-width to be used in compression";
|
||||
}
|
||||
|
||||
uses compression-formats;
|
||||
uses compression-formats {
|
||||
status deprecated;
|
||||
}
|
||||
}
|
||||
|
||||
grouping format-of-iq-sample {
|
||||
status deprecated;
|
||||
description
|
||||
"Indicates module capabilities about IQ samples";
|
||||
|
||||
@@ -312,17 +593,20 @@ module o-ran-compression-factors {
|
||||
type boolean;
|
||||
|
||||
description
|
||||
"Informs if O-RU supports realtime variable bit with";
|
||||
"Informs if O-RU supports real-time variable bit with";
|
||||
}
|
||||
|
||||
list compression-method-supported {
|
||||
uses compression-parameters;
|
||||
status deprecated;
|
||||
uses compression-parameters {
|
||||
status deprecated;
|
||||
}
|
||||
|
||||
description
|
||||
"List of supported compression methods by O-RU
|
||||
Note: if O-RU supports different compression methods per endpoint
|
||||
then please refer do endpoints to have information what
|
||||
exactly is supported on a paticular endpoint";
|
||||
exactly is supported on a particular endpoint";
|
||||
}
|
||||
|
||||
leaf syminc-supported {
|
||||
@@ -353,16 +637,6 @@ module o-ran-compression-factors {
|
||||
}
|
||||
}
|
||||
|
||||
// *********** Deprecated End ***********
|
||||
|
||||
grouping compression-details {
|
||||
description "";
|
||||
|
||||
leaf iq-bitwidth {
|
||||
type uint8;
|
||||
description
|
||||
"Bitwidth to be used in compression";
|
||||
}
|
||||
|
||||
uses compression-params;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,591 @@
|
||||
module o-ran-delay-management {
|
||||
yang-version 1.1;
|
||||
namespace "urn:o-ran:delay:1.0";
|
||||
prefix "o-ran-delay";
|
||||
|
||||
import o-ran-wg4-features {
|
||||
prefix "feat";
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module covers off aspects of O-DU to O-RU delay management,
|
||||
including configuration data related to O-RU transmission and reception
|
||||
windows.
|
||||
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the above disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the above disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the Members of the O-RAN Alliance nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 16.0.0
|
||||
|
||||
1) Removing the range to align bandwidth type to same bandwidth type as
|
||||
in uplane-config module and module-cap modules.
|
||||
2) Add in Ta3-2g data processing delay";
|
||||
|
||||
reference "ORAN-WG4.M.0-v16.00";
|
||||
}
|
||||
|
||||
revision "2024-04-15" {
|
||||
description
|
||||
"version 15.0.0
|
||||
|
||||
1) add support for for beamforming list and delay profiles(s) per endpoint.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v15.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) introducing new feature for ACK NACK feedback.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 8.0.0
|
||||
|
||||
1) typographical corrections in descriptions.
|
||||
2) add new schema node beam-context-gap-period.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v08.00";
|
||||
}
|
||||
|
||||
revision "2020-08-10" {
|
||||
description
|
||||
"version 4.0.0
|
||||
|
||||
1) introduction of new t1a-max-cp-dl leaf to enable decoupled timing between C- and U-Plane";
|
||||
|
||||
reference "ORAN-WG4.M.0-v04.00";
|
||||
}
|
||||
|
||||
revision "2019-07-03" {
|
||||
description
|
||||
"version 1.1.0
|
||||
|
||||
1) fixing descriptions of ta3-min and ta3-max.
|
||||
2) introducing grouping/uses to enable model re-use by WG5";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2019-02-04" {
|
||||
description
|
||||
"version 1.0.0
|
||||
|
||||
1) imported model from xRAN
|
||||
2) changed namespace and reference from xran to o-ran";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
|
||||
feature ADAPTIVE-RU-PROFILE {
|
||||
description
|
||||
"This feature indicates that the O-RU supports adaptive O-RU delay profile
|
||||
based on information provided by the NETCONF client.";
|
||||
}
|
||||
|
||||
typedef bandwidth {
|
||||
type uint32;
|
||||
units kilohertz;
|
||||
description
|
||||
"transmission bandwidth configuration in units of kHz -
|
||||
covering NB-IoT through to New Radio.
|
||||
Value shall correspond to a value defined in 38.104.";
|
||||
}
|
||||
|
||||
grouping bandwidth-configuration {
|
||||
description
|
||||
"Grouping for bandwidth and SCS configuration";
|
||||
|
||||
leaf bandwidth {
|
||||
type bandwidth;
|
||||
description
|
||||
"transmission bandwidth configuration in units of kHz -
|
||||
covering NBIoT through to New Radio - see 38.104";
|
||||
}
|
||||
leaf subcarrier-spacing {
|
||||
type uint32 {
|
||||
range "0 .. 240000 ";
|
||||
}
|
||||
units Hertz;
|
||||
description "sub-carrier spacing in Hz";
|
||||
}
|
||||
}
|
||||
|
||||
grouping t2a-up {
|
||||
description
|
||||
"configuration of t2a for uplink";
|
||||
|
||||
leaf t2a-min-up {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving IQ data
|
||||
message over the fronthaul interface and transmitting
|
||||
the corresponding first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-up {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the earliest allowable time when a data packet is received before
|
||||
the corresponding first IQ sample is transmitted at the antenna";
|
||||
}
|
||||
}
|
||||
|
||||
grouping t2a-cp-dl {
|
||||
description
|
||||
"Grouping for t2a CP for downlink";
|
||||
|
||||
leaf t2a-min-cp-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving downlink
|
||||
real time control plane message over the fronthaul interface and
|
||||
transmitting the corresponding first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-cp-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the earliest allowable time when a downlink real time control message
|
||||
is received before the corresponding first IQ sample is transmitted at
|
||||
the antenna";
|
||||
}
|
||||
}
|
||||
|
||||
grouping ta3 {
|
||||
description
|
||||
"Grouping for ta3 configuration";
|
||||
|
||||
leaf ta3-min {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting the first data sample over the
|
||||
fronthaul interface";
|
||||
}
|
||||
leaf ta3-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the maximum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting the last data sample over the
|
||||
fronthaul interface";
|
||||
}
|
||||
}
|
||||
|
||||
grouping t2a-cp-ul {
|
||||
description
|
||||
"Grouping for t2a CP uplink";
|
||||
|
||||
leaf t2a-min-cp-ul {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving real time
|
||||
up-link control plane message over the fronthaul interface and
|
||||
receiving the first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-cp-ul {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the earliest allowable time when a real time up-link control message
|
||||
is received before the corresponding first IQ sample is received at
|
||||
the antenna";
|
||||
}
|
||||
}
|
||||
|
||||
grouping ta3-ack {
|
||||
description
|
||||
"Grouping for ta3-ack configuration";
|
||||
leaf ta3-min-ack {
|
||||
type int32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum delay between the DL/UL air reference point (tDL=0 or tUL=0) of symbol M
|
||||
and the time O-RU sends section type 8 (ACK/NACK feedback) to O-DU.
|
||||
This value can be negative, which indicates it is in advance of the air reference point.
|
||||
This leaf only exists if section extension 22 (ACK/NACK request) and section type 8 (ACK/NACK feedback)
|
||||
are supported by at least one endpoint.";
|
||||
}
|
||||
|
||||
leaf ta3-max-ack {
|
||||
type int32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the maximum delay between the DL/UL air reference point (tDL=0 or tUL=0) of symbol M
|
||||
and the time O-RU sends section type 8 (ACK/NACK feedback) to O-DU.
|
||||
This value can be negative, which indicates it is in advance of the air reference point.
|
||||
This leaf only exists if section extension 22 (ACK/NACK request) and section type 8 (ACK/NACK feedback)
|
||||
are supported by at least one endpoint.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping ta3-2g {
|
||||
description
|
||||
"Grouping for ta3-2g configuration";
|
||||
|
||||
leaf ta3-min-2g {
|
||||
if-feature feat:RRM-MEAS-REPORTING;
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"The minimum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting a C-Plane message carrying RRM measurements
|
||||
over the fronthaul interface.
|
||||
|
||||
Please refer to CUS specification clause 4.4.3 for more details.";
|
||||
}
|
||||
leaf ta3-max-2g {
|
||||
if-feature feat:RRM-MEAS-REPORTING;
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"The maximum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting a C-Plane message carrying RRM measurements
|
||||
over the fronthaul interface.
|
||||
|
||||
Please refer to CUS specification clause 4.4.3 for more details.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping ru-delay-profile {
|
||||
description
|
||||
"Grouping for RU delay profile";
|
||||
|
||||
uses t2a-up;
|
||||
uses t2a-cp-dl;
|
||||
|
||||
leaf tcp-adv-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
mandatory true;
|
||||
description
|
||||
"the time difference (advance) between the reception window for
|
||||
downlink real time Control messages and reception window for the
|
||||
corresponding IQ data messages.";
|
||||
}
|
||||
|
||||
uses ta3;
|
||||
uses t2a-cp-ul;
|
||||
uses ta3-ack;
|
||||
uses ta3-2g;
|
||||
}
|
||||
|
||||
grouping o-du-delay-profile {
|
||||
description
|
||||
"Grouping for O-DU delay profile";
|
||||
|
||||
leaf t1a-max-up {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the earliest possible time which the O-DU can support transmitting
|
||||
an IQ data message prior to transmission of the corresponding IQ
|
||||
samples at the antenna";
|
||||
}
|
||||
leaf tx-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"The maximum amount of time which the O-DU requires to transmit
|
||||
all downlink user plane IQ data message for a symbol";
|
||||
}
|
||||
leaf ta4-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the latest possible time which the O-DU can support receiving the
|
||||
last uplink user plane IQ data message for a symbol.";
|
||||
}
|
||||
leaf rx-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"The maximum time difference the O-DU can support between
|
||||
receiving the first user plane IQ data message for a symbol and
|
||||
receiving the last user plane IQ data message for the same symbol";
|
||||
}
|
||||
leaf t1a-max-cp-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"The earliest possible time which the O-DU can support transmitting the
|
||||
downlink real time control message prior to transmission of the
|
||||
corresponding IQ samples at the antenna.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping t12 {
|
||||
description
|
||||
"Grouping for t12";
|
||||
|
||||
leaf t12-min {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum measured delay between DU port-ID and O-RU port-ID";
|
||||
}
|
||||
// additional leaf added by Samsung
|
||||
leaf t12-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the maximum measured delay between CU port-ID and O-RU port-ID";
|
||||
}
|
||||
}
|
||||
|
||||
grouping t34 {
|
||||
description
|
||||
"Grouping for t34";
|
||||
|
||||
leaf t34-min {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum measured delay between O-RU port-ID and CU port-ID";
|
||||
}
|
||||
// additional leaf added by Samsung
|
||||
leaf t34-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the maximum measured delay between O-RU port-ID and CU port-ID";
|
||||
}
|
||||
}
|
||||
|
||||
grouping non-default-ru-delay-profile {
|
||||
description
|
||||
"Grouping for O-RU delay profile different from the default value in ru-delay-profile.";
|
||||
leaf t2a-min-up {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving IQ data
|
||||
message over the fronthaul interface and transmitting
|
||||
the corresponding first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-up {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the earliest allowable time when a data packet is received before
|
||||
the corresponding first IQ sample is transmitted at the antenna";
|
||||
}
|
||||
leaf t2a-min-cp-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving downlink
|
||||
real time control plane message over the fronthaul interface and
|
||||
transmitting the corresponding first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-cp-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the earliest allowable time when a downlink real time control message
|
||||
is received before the corresponding first IQ sample is transmitted at
|
||||
the antenna";
|
||||
}
|
||||
leaf tcp-adv-dl {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the time difference (advance) between the reception window for
|
||||
downlink real time Control messages and reception window for the
|
||||
corresponding IQ data messages.";
|
||||
}
|
||||
leaf ta3-min {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting the first data sample over the
|
||||
fronthaul interface";
|
||||
}
|
||||
leaf ta3-max {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the maximum O-RU data processing delay between receiving an IQ sample
|
||||
at the antenna and transmitting the last data sample over the
|
||||
fronthaul interface";
|
||||
}
|
||||
leaf t2a-min-cp-ul {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum O-RU data processing delay between receiving real time
|
||||
up-link control plane message over the fronthaul interface and
|
||||
receiving the first IQ sample at the antenna";
|
||||
}
|
||||
leaf t2a-max-cp-ul {
|
||||
type uint32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the earliest allowable time when a real time up-link control message
|
||||
is received before the corresponding first IQ sample is received at
|
||||
the antenna";
|
||||
}
|
||||
leaf ta3-min-ack {
|
||||
type int32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the minimum delay between the DL/UL air reference point (tDL=0 or tUL=0) of symbol M
|
||||
and the time O-RU sends section type 8 (ACK/NACK feedback) to O-DU.
|
||||
This value can be negative, which indicates it is in advance of the air reference point.
|
||||
This leaf only exists if section extension 22 (ACK/NACK request) and section type 8 (ACK/NACK feedback)
|
||||
are supported by at least one endpoint.";
|
||||
}
|
||||
leaf ta3-max-ack {
|
||||
type int32;
|
||||
units nanoseconds;
|
||||
description
|
||||
"the maximum delay between the DL/UL air reference point (tDL=0 or tUL=0) of symbol M
|
||||
and the time O-RU sends section type 8 (ACK/NACK feedback) to O-DU.
|
||||
This value can be negative, which indicates it is in advance of the air reference point.
|
||||
This leaf only exists if section extension 22 (ACK/NACK request) and section type 8 (ACK/NACK feedback)
|
||||
are supported by at least one endpoint.";
|
||||
}
|
||||
|
||||
uses ta3-2g;
|
||||
}
|
||||
|
||||
grouping delay-management-group {
|
||||
description "a delay management grouping";
|
||||
list bandwidth-scs-delay-state {
|
||||
key "bandwidth subcarrier-spacing";
|
||||
description
|
||||
"Array of structures containing sets of parameters for delay management.";
|
||||
|
||||
uses bandwidth-configuration;
|
||||
|
||||
container ru-delay-profile {
|
||||
config false;
|
||||
description "container for O-RU delay parameters";
|
||||
|
||||
uses ru-delay-profile;
|
||||
}
|
||||
}
|
||||
|
||||
list non-default-ru-delay-profile {
|
||||
if-feature feat:BF-DELAY-PROFILE;
|
||||
key "delay-profile-id";
|
||||
description
|
||||
"Sets of parameters defined when o-ru supported multiple delay profiles,
|
||||
only the parameters that are different from the default delay profile are defined.";
|
||||
leaf delay-profile-id {
|
||||
type uint16 {
|
||||
range "1..max";
|
||||
}
|
||||
description
|
||||
"Used to identify the set of delay profile that are different from the default delay profile.
|
||||
Value '0' is reserved to refer to default value";
|
||||
}
|
||||
list non-default-bandwidth-scs-delay-state {
|
||||
key "bandwidth subcarrier-spacing";
|
||||
description
|
||||
"Array of structures containing sets of parameters for delay management.";
|
||||
uses bandwidth-configuration;
|
||||
container non-default-ru-delay-profile {
|
||||
config false;
|
||||
description
|
||||
"O-RU delay parameters that are different from the default delay profile.
|
||||
If a parameter doesn't exist, this parameter will use the defalt value determined in ru-delay-profile.";
|
||||
uses non-default-ru-delay-profile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
container adaptive-delay-configuration {
|
||||
if-feature ADAPTIVE-RU-PROFILE;
|
||||
description "container for adaptive delay parameters";
|
||||
list bandwidth-scs-delay-state {
|
||||
key "bandwidth subcarrier-spacing";
|
||||
description
|
||||
"Array of structures containing sets of parameters for delay management.";
|
||||
|
||||
uses bandwidth-configuration;
|
||||
|
||||
container o-du-delay-profile {
|
||||
description
|
||||
"O-DU provided delay profile for adaptive delay configuration";
|
||||
|
||||
uses o-du-delay-profile;
|
||||
}
|
||||
}
|
||||
|
||||
container transport-delay {
|
||||
description
|
||||
"O-DU provided transport-delay parameters";
|
||||
uses t12;
|
||||
uses t34;
|
||||
}
|
||||
}
|
||||
|
||||
leaf beam-context-gap-period {
|
||||
type uint16;
|
||||
units microseconds;
|
||||
description
|
||||
"Time gap between the end of reception window of the C-Plane message(Msg-A) with new beam weights for a given beamId and end of the reception window
|
||||
of the C-Plane message(Msg-B) that cites the same beamId without weights in the new context.
|
||||
Note: Value of '0' indicates that the end of the Msg-A and Msg-B reception windows are perfectly aligned, which should allow Msg-B to use the new
|
||||
beamforming weights with a '0' microsecond beam-context-gap-period. Value of '65535' implies infinite gap, which means a beamId may not be reused
|
||||
at all in a different context (applicable only to weight-based dynamic beamforming). If O-DU chooses not to interpret/honor this value, behaviour
|
||||
of O-RU is unpredictable if a beamId has new weights loaded in one context and is reused in a different context. Please refer the CUS-Plane spec
|
||||
Section 'Weight-based dynamic beamforming' for detailed description";
|
||||
}
|
||||
}
|
||||
container delay-management {
|
||||
description "top-level tree covering off O-DU to O-RU delay management";
|
||||
|
||||
uses delay-management-group;
|
||||
}
|
||||
}
|
||||
@@ -3,10 +3,12 @@ module o-ran-file-management {
|
||||
namespace "urn:o-ran:file-management:1.0";
|
||||
prefix "o-ran-file-mgmt";
|
||||
|
||||
import ietf-crypto-types {
|
||||
prefix "ct";
|
||||
}
|
||||
|
||||
import ietf-netconf-acm {
|
||||
prefix nacm;
|
||||
reference
|
||||
"RFC 8341: Network Configuration Access Control Model";
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
@@ -16,7 +18,7 @@ module o-ran-file-management {
|
||||
description
|
||||
"This module defines the configuration and operations for handling upload.
|
||||
|
||||
Copyright 2019 the O-RAN Alliance.
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
@@ -42,6 +44,52 @@ module o-ran-file-management {
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 10.2.0
|
||||
|
||||
1) Improve YANG description enforce typing of IPv6 addresses";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2023-04-10" {
|
||||
description
|
||||
"version 10.1.0
|
||||
|
||||
1) Remove crypto-types dependency";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) added password for FTPES
|
||||
2) clarified path/folder description ";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 7.1.0
|
||||
|
||||
1) typographical corrections";
|
||||
|
||||
reference "ORAN-WG4.M.0-v07.00";
|
||||
}
|
||||
|
||||
revision "2021-07-26" {
|
||||
description
|
||||
"version 7.0.0
|
||||
|
||||
1) added FTPES support";
|
||||
|
||||
reference "ORAN-WG4.M.0-v07.00";
|
||||
}
|
||||
|
||||
revision "2019-07-03" {
|
||||
description
|
||||
"version 1.1.0
|
||||
@@ -63,21 +111,157 @@ module o-ran-file-management {
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
/***********************************************/
|
||||
/* Identities for Asymmetric Key Algorithms */
|
||||
/***********************************************/
|
||||
|
||||
identity asymmetric-key-algorithm {
|
||||
description
|
||||
"Base identity from which all asymmetric key
|
||||
encryption Algorithm.";
|
||||
}
|
||||
|
||||
identity rsa1024 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 1024-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity rsa2048 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 2048-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity rsa3072 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 3072-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity rsa4096 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 4096-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity rsa7680 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 7680-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity rsa15360 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The RSA algorithm using a 15360-bit key.";
|
||||
reference
|
||||
"RFC 8017:
|
||||
PKCS #1: RSA Cryptography Specifications Version 2.2.";
|
||||
}
|
||||
|
||||
identity secp192r1 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The ECDSA algorithm using a NIST P256 Curve.";
|
||||
reference
|
||||
"RFC 6090:
|
||||
Fundamental Elliptic Curve Cryptography Algorithms.";
|
||||
}
|
||||
identity secp224r1 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The ECDSA algorithm using a NIST P256 Curve.";
|
||||
reference
|
||||
"RFC 6090:
|
||||
Fundamental Elliptic Curve Cryptography Algorithms.";
|
||||
}
|
||||
|
||||
identity secp256r1 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The ECDSA algorithm using a NIST P256 Curve.";
|
||||
reference
|
||||
"RFC 6090:
|
||||
Fundamental Elliptic Curve Cryptography Algorithms.";
|
||||
}
|
||||
|
||||
identity secp384r1 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The ECDSA algorithm using a NIST P256 Curve.";
|
||||
reference
|
||||
"RFC 6090:
|
||||
Fundamental Elliptic Curve Cryptography Algorithms.";
|
||||
}
|
||||
|
||||
identity secp521r1 {
|
||||
base asymmetric-key-algorithm;
|
||||
description
|
||||
"The ECDSA algorithm using a NIST P256 Curve.";
|
||||
reference
|
||||
"RFC 6090:
|
||||
Fundamental Elliptic Curve Cryptography Algorithms.";
|
||||
}
|
||||
|
||||
/**********************************************************/
|
||||
/* Typedefs for identityrefs to above base identities */
|
||||
/**********************************************************/
|
||||
|
||||
typedef asymmetric-key-algorithm-ref {
|
||||
type identityref {
|
||||
base asymmetric-key-algorithm;
|
||||
}
|
||||
description
|
||||
"This typedef enables importing modules to easily define an
|
||||
identityref to the 'asymmetric-key-algorithm'
|
||||
base identity.";
|
||||
}
|
||||
|
||||
grouping file-path-grouping {
|
||||
description "Complete logical path of the file to upload/download
|
||||
(no wildcard is allowed) ex : /o-RAN/log/syslog.1";
|
||||
description "Grouping, that provides local path and remote path for the
|
||||
purpose of File Management scenarios.";
|
||||
|
||||
|
||||
leaf local-logical-file-path {
|
||||
type string;
|
||||
mandatory true;
|
||||
description "Local logical file path";
|
||||
description "URI specifying the complete logical path relative to the root of the logical file system
|
||||
structure (the common root for o-ran/log, o-ran/pm, o-ran/transceiver or o-ran/beamforming) of the file
|
||||
to upload/download (no wildcard is allowed), including a file name and its extension.
|
||||
Example: 'o-ran/log/file_1.abc', where 'o-ran/log/' represents relative path to folder containing log files
|
||||
as specified by O-RAN, 'file_1' represents desired filename and 'abc' represents desired filename's extension.
|
||||
The content shall conform to RFC3986 'Uniform Resource Identifier (URI): Generic Syntax'";
|
||||
}
|
||||
|
||||
leaf remote-file-path {
|
||||
type string;
|
||||
mandatory true;
|
||||
description "URI specifying the remote-file-path on O-DU/NMS.
|
||||
Format:sftp://<username>@<host>[:port]/path";
|
||||
description "URI specifying the remote-file-path on O-DU/SMO or on stand-alone file server.
|
||||
The content shall conform to RFC3986 'Uniform Resource Identifier (URI): Generic Syntax'.
|
||||
When upload/download is via sftp, the format shall be of the form
|
||||
sftp://<username>@<host>[:port]/path
|
||||
When upload/download is via ftpes, the format shall be of the form
|
||||
ftpes://<username>@<host>[:port]/path
|
||||
IPv6 addresses are distinguished by enclosing the IP literal within square brackets ('[' and ']') as defined by RFC3986 e.g., sftp://user@[2001:0:130F::9C0:876A:130B]:22/path.
|
||||
|
||||
Note, ftpes is not an IANA registered URI scheme, but used here to signal
|
||||
that a file transfer should be performed over FTPES";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +286,7 @@ module o-ran-file-management {
|
||||
}
|
||||
|
||||
grouping credential-information {
|
||||
description "Type of authentication to use for SFTP upload or download.";
|
||||
description "Type of authentication to use for file upload or download.";
|
||||
choice credentials {
|
||||
case password {
|
||||
container password {
|
||||
@@ -111,21 +295,22 @@ module o-ran-file-management {
|
||||
type string;
|
||||
mandatory true;
|
||||
description
|
||||
"password needed for O-RU authentication.";
|
||||
"password used for O-RU authentication to sFTP server for the associated username defined in the remote-file-path.";
|
||||
}
|
||||
description
|
||||
"password for O-RU authentication method in use";
|
||||
"password for O-RU authentication method in use. This information
|
||||
shall be ignored by an O-RU that is using FTPES based file transfer";
|
||||
}
|
||||
container server {
|
||||
list keys {
|
||||
key algorithm;
|
||||
ordered-by user;
|
||||
uses ct:public-key-grouping;
|
||||
uses public-key-grouping;
|
||||
description
|
||||
"List of allowed algorithms with its keys";
|
||||
}
|
||||
description
|
||||
"Key for sFTP server authentication";
|
||||
"SSH Key for file server authentication";
|
||||
}
|
||||
}
|
||||
case certificate {
|
||||
@@ -134,9 +319,22 @@ module o-ran-file-management {
|
||||
description
|
||||
"certificate authentication method in use";
|
||||
}
|
||||
|
||||
}
|
||||
description "";
|
||||
}
|
||||
container application-layer-credential{
|
||||
|
||||
leaf appl-password {
|
||||
type string;
|
||||
description
|
||||
"The parameter represents the password which may be needed for O-RU application level authentication.
|
||||
For example, to perform authenticatation towards an FTPes server which does not allow anonymous account,
|
||||
in addition to X.509v3 certificate for TLS authentication, password configured here need to be used together with username defined in the remote-file-path ";
|
||||
}
|
||||
description
|
||||
"Application layer credential information";
|
||||
}
|
||||
}
|
||||
|
||||
grouping retrieve-input {
|
||||
@@ -144,12 +342,13 @@ module o-ran-file-management {
|
||||
leaf logical-path {
|
||||
type string;
|
||||
mandatory true;
|
||||
description "O-RAN unit of which the files are to be listed.
|
||||
ex : O-RAN/log, o-RAN/PM, O-RAN/transceiver";
|
||||
description "URL specifying the logical path relative to the root of the logical file system
|
||||
structure (the common root for o-ran/log, o-ran/pm, o-ran/transceiver or o-ran/beamforming)
|
||||
of the files to be listed.";
|
||||
}
|
||||
leaf file-name-filter {
|
||||
type string;
|
||||
description "Filter which are to be applied on the result list of file names (* is allowed as wild-card).";
|
||||
description "Filter which needs to be applied on the result list of file names (* is allowed as wild-card).";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,10 +362,48 @@ module o-ran-file-management {
|
||||
}
|
||||
}
|
||||
|
||||
grouping public-key-grouping {
|
||||
description
|
||||
"A public key.
|
||||
|
||||
The 'algorithm' and 'public-key' nodes are not
|
||||
mandatory because they MAY be defined in <operational>.
|
||||
Implementations SHOULD assert that these values are
|
||||
either configured or that they exist in <operational>.";
|
||||
leaf algorithm {
|
||||
nacm:default-deny-write;
|
||||
type asymmetric-key-algorithm-ref;
|
||||
must '../public-key';
|
||||
description
|
||||
"Identifies the key's algorithm. More specifically,
|
||||
this leaf specifies how the 'public-key' binary leaf
|
||||
is encoded.";
|
||||
reference
|
||||
"RFC CCCC: Common YANG Data Types for Cryptography";
|
||||
}
|
||||
leaf public-key {
|
||||
nacm:default-deny-write;
|
||||
type binary;
|
||||
must '../algorithm';
|
||||
description
|
||||
"A binary that contains the value of the public key. The
|
||||
interpretation of the content is defined by the key
|
||||
algorithm. For example, a DSA key is an integer, an RSA
|
||||
key is represented as RSAPublicKey as defined in
|
||||
RFC 8017, and an Elliptic Curve Cryptography (ECC) key
|
||||
is represented using the 'publicKey' described in
|
||||
RFC 5915.";
|
||||
reference
|
||||
"RFC 8017: Public-Key Cryptography Standards (PKCS) #1:
|
||||
RSA Cryptography Specifications Version 2.2.
|
||||
RFC 5915: Elliptic Curve Private Key Structure.";
|
||||
}
|
||||
}
|
||||
|
||||
// RPCs
|
||||
|
||||
rpc file-upload {
|
||||
description "File upload over SFTP from equipment to NETCONF client";
|
||||
description "Management plane trigger to upload file from O-RU to file-server";
|
||||
input {
|
||||
uses file-path-grouping;
|
||||
uses credential-information;
|
||||
@@ -187,15 +424,9 @@ module o-ran-file-management {
|
||||
}
|
||||
}
|
||||
|
||||
notification file-upload-notification {
|
||||
uses file-path-grouping;
|
||||
uses output-status-grouping;
|
||||
description "";
|
||||
}
|
||||
|
||||
rpc file-download {
|
||||
description
|
||||
"Management plane triggered to generate the download file of O-RU.";
|
||||
"Management plane trigger to download file from file-server to O-RU.";
|
||||
input {
|
||||
uses file-path-grouping;
|
||||
uses credential-information;
|
||||
@@ -205,6 +436,12 @@ module o-ran-file-management {
|
||||
}
|
||||
}
|
||||
|
||||
notification file-upload-notification {
|
||||
uses file-path-grouping;
|
||||
uses output-status-grouping;
|
||||
description "";
|
||||
}
|
||||
|
||||
notification file-download-event {
|
||||
uses file-path-grouping;
|
||||
uses output-status-grouping;
|
||||
|
||||
@@ -0,0 +1,461 @@
|
||||
module o-ran-hardware {
|
||||
yang-version 1.1;
|
||||
namespace "urn:o-ran:hardware:1.0";
|
||||
prefix "o-ran-hw";
|
||||
|
||||
import ietf-hardware {
|
||||
prefix hw;
|
||||
}
|
||||
import iana-hardware {
|
||||
prefix ianahw;
|
||||
}
|
||||
import ietf-yang-types {
|
||||
prefix yang;
|
||||
}
|
||||
import o-ran-wg4-features {
|
||||
prefix or-feat;
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module defines the YANG definitions for managing the O-RAN hardware.
|
||||
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the above disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the above disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the Members of the O-RAN Alliance nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-04-15" {
|
||||
description
|
||||
"version 15.0.0
|
||||
|
||||
1) Added support for new fan tray component.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v15.00";
|
||||
}
|
||||
|
||||
revision "2023-08-14" {
|
||||
description
|
||||
"version 13.0.0
|
||||
|
||||
1) New connector types for RS485 and external IO";
|
||||
|
||||
reference "ORAN-WG4.M.0-v13.00";
|
||||
}
|
||||
|
||||
revision "2022-12-05" {
|
||||
description
|
||||
"version 10.1.0
|
||||
|
||||
1) Clarifications for Network Energy Saving";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) introduction of O-RU connector functionality.
|
||||
2) fixing constraints";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 5.2.0
|
||||
|
||||
1) typographical corrections in descriptions.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2021-03-22" {
|
||||
description
|
||||
"version 5.1.0
|
||||
|
||||
1) typographical corrections in descriptions.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-12-10" {
|
||||
description
|
||||
"version 5.0.0
|
||||
|
||||
1) added date-last-service leaf used in pnfRegistration";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-04-17" {
|
||||
description
|
||||
"version 3.0.0
|
||||
|
||||
1) added new leaf to indicate whether O-RU supports dying gasp
|
||||
2) added new identities for PA and FPGA";
|
||||
|
||||
reference "ORAN-WG4.M.0-v03.00";
|
||||
}
|
||||
|
||||
revision "2019-07-03" {
|
||||
description
|
||||
"version 1.1.0
|
||||
|
||||
1) added new identities to accommodate cross working group use of
|
||||
o-ran-hardware and associated set of augmentations that are backwards
|
||||
compatible to version 1.0.0";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2019-02-04" {
|
||||
description
|
||||
"version 1.0.0
|
||||
|
||||
1) imported model from xRAN
|
||||
2) changed namespace and reference from xran to o-ran";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
feature ENERGYSAVING {
|
||||
description
|
||||
"Indicates that the Radio Unit supports energy saving state.";
|
||||
}
|
||||
|
||||
// identity statements
|
||||
identity O-RAN-RADIO {
|
||||
base ianahw:module;
|
||||
description
|
||||
"Module used as it represents a self-contained sub-system
|
||||
used in /hw:/hardware/hw:component/hw:class to represent
|
||||
an O-RAN RU";
|
||||
}
|
||||
|
||||
identity O-RAN-HW-COMPONENT {
|
||||
base ianahw:module;
|
||||
description
|
||||
"Module used as it represents a self-contained sub-system
|
||||
used in /hw:/hardware/hw:component/hw:class to represent
|
||||
any O-RAN hardware component";
|
||||
}
|
||||
|
||||
identity O-DU-COMPONENT {
|
||||
base O-RAN-HW-COMPONENT;
|
||||
description
|
||||
"Used in /hw:/hardware/hw:component/hw:class to represent
|
||||
any O-RAN defined O-DU hardware component";
|
||||
}
|
||||
|
||||
identity O-RAN-FAN-TRAY {
|
||||
base O-RAN-HW-COMPONENT;
|
||||
description
|
||||
"Used in /hw:/hardware/hw:component/hw:class to represent
|
||||
any O-RAN defined fan tray hardware component.";
|
||||
}
|
||||
|
||||
identity O-RU-COMPONENT {
|
||||
base O-RAN-HW-COMPONENT;
|
||||
description
|
||||
"Used in /hw:/hardware/hw:component/hw:class to represent
|
||||
any O-RAN defined O-RU hardware component, including a stand-alone
|
||||
O-RU or an O-RU component integrated into a multi-module system.";
|
||||
}
|
||||
|
||||
identity O-RU-POWER-AMPLIFIER {
|
||||
base O-RU-COMPONENT;
|
||||
description
|
||||
"Used in /hw:/hardware/hw:component/hw:class to represent
|
||||
an O-RU's power amplifier, and may be used for reporting
|
||||
measurements on a per class basis";
|
||||
}
|
||||
|
||||
identity O-RU-FPGA {
|
||||
base O-RU-COMPONENT;
|
||||
description
|
||||
"Used in /hw:/hardware/hw:component/hw:class to represent
|
||||
an FPGA in an O-RU, and may be used for reporting
|
||||
measurements on a per class basis";
|
||||
}
|
||||
|
||||
identity O-RU-CONNECTOR {
|
||||
base ianahw:hardware-class;
|
||||
description
|
||||
"This identity is applicable if the hardware class is some sort
|
||||
of O-RU connector.";
|
||||
}
|
||||
|
||||
identity O-RU-ANTENNA-CONNECTOR {
|
||||
base O-RU-CONNECTOR;
|
||||
description
|
||||
"This identity is applicable if the hardware class is some sort
|
||||
of connector capable of interfacing between an O-RU and some
|
||||
antenna function.";
|
||||
}
|
||||
|
||||
identity O-RU-FEEDER {
|
||||
base O-RU-ANTENNA-CONNECTOR;
|
||||
description
|
||||
"This identity is applicable if the hardware class is an
|
||||
antenna feeder.";
|
||||
}
|
||||
|
||||
identity O-RU-BF-CAL {
|
||||
base O-RU-ANTENNA-CONNECTOR;
|
||||
description
|
||||
"This identity is applicable if the hardware class is for
|
||||
beamforming calibration.";
|
||||
}
|
||||
|
||||
identity O-RU-RS485 {
|
||||
base O-RU-CONNECTOR;
|
||||
description
|
||||
"This identity is applicable if the hardware class is some sort
|
||||
of connector capable of interfacing between an O-RU and Antenna
|
||||
Line Devices using RS-485 electrical standard.";
|
||||
}
|
||||
|
||||
identity O-RU-EXTIO {
|
||||
base O-RU-CONNECTOR;
|
||||
description
|
||||
"This identity is applicable if the hardware class is some sort
|
||||
of connector capable of interfacing between an O-RU external I/O lines.";
|
||||
}
|
||||
|
||||
// typedef statements
|
||||
typedef energysaving-state {
|
||||
type enumeration {
|
||||
enum UNKNOWN {
|
||||
description
|
||||
"The O-RU is unable to report its energy saving state.";
|
||||
}
|
||||
enum SLEEPING {
|
||||
description
|
||||
"The O-RU is in energy saving state. In this mode M-Plane connection is active. Depending
|
||||
on the O-RU's design - other planes, functions and hardware components which are not needed
|
||||
by the O-RU in energy saving state can be disabled or switched off by the O-RU autonomously.";
|
||||
}
|
||||
enum AWAKE {
|
||||
description
|
||||
"The O-RU is not in an energy saving state.";
|
||||
}
|
||||
}
|
||||
description
|
||||
"New typedef since ietf-hardware only covers power-state
|
||||
for redundancy purposes, not to indicate energy saving operations.
|
||||
For details please see O-RAN WG4 M-Plane specification, clause 9.1.3 'Modify state'";
|
||||
}
|
||||
|
||||
typedef availability-type {
|
||||
type enumeration {
|
||||
enum UNKNOWN {
|
||||
description "The Radio Unit is unable to report its availability state.";
|
||||
}
|
||||
enum NORMAL {
|
||||
description
|
||||
"The equipment is functioning correctly.";
|
||||
}
|
||||
enum DEGRADED {
|
||||
description
|
||||
"The equipment may be reporting a major alarm or may be reporting a critical
|
||||
alarm that is only impacting one or more subcomponent, but where the
|
||||
equipment's implementation permit it to continue operation (server traffic)
|
||||
in a degraded state.
|
||||
|
||||
Used for example, when the equipment has M identical sub-components and
|
||||
when a critical alarm is impacting only N subcomponents, where N<M.";
|
||||
}
|
||||
enum FAULTY {
|
||||
description
|
||||
"The (sub-)components impacted by the critical alarm(s) impact the
|
||||
ability of the equipment to continue operation (serve traffic).";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Equipment's availability-state is derived by matching active faults
|
||||
and their impact to module's operation and enables an equipment to indicate
|
||||
that even though it may have one or more critical alarms, it can continue
|
||||
to serve traffic.";
|
||||
}
|
||||
|
||||
// common WG4 and cross-WG augmentations using O-RAN-RADIO identity
|
||||
|
||||
augment "/hw:hardware/hw:component" {
|
||||
when "(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-RADIO')) or
|
||||
(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";
|
||||
description "New O-RAN parameters for o-ran hardware";
|
||||
|
||||
container label-content {
|
||||
config false;
|
||||
description
|
||||
"Which set of attributes are printed on the Radio Unit's label";
|
||||
leaf model-name {
|
||||
type boolean;
|
||||
description
|
||||
"indicates whether model-name is included on the equipment's label";
|
||||
}
|
||||
leaf serial-number {
|
||||
type boolean;
|
||||
description
|
||||
"indicates whether serial number is included on the equipment's label";
|
||||
}
|
||||
}
|
||||
leaf product-code {
|
||||
type string;
|
||||
config false;
|
||||
mandatory true;
|
||||
description
|
||||
"O-RAN term that is distinct from model-name in ietf-hardware.";
|
||||
}
|
||||
leaf energy-saving-enabled {
|
||||
if-feature "ENERGYSAVING";
|
||||
type boolean;
|
||||
default false;
|
||||
description
|
||||
"This parameter enables the O-RU to enter into energy saving state if there is no need to keep processing
|
||||
paths working.
|
||||
TRUE is used to permit the O-RU to enter energy saving state. If there is still need keep any
|
||||
processing path, functions or HW components working.
|
||||
The O-RU shall keep necessary processing paths working if there is any [tr]x-array-carrier with
|
||||
'state' != DISABLED.
|
||||
There may be also additional implementation-specific conditions which may require keeping processing paths,
|
||||
functions or HW components working.
|
||||
FALSE is used to prohibit the O-RU to enter or to stay in energy saving state. This value is also used
|
||||
to awake the O-RU from sleeping when the O-RU is already in energy saving state. Setting this value has
|
||||
no effect on [tr]x-array-carrier::active.
|
||||
When the O-RU enters energy saving state, the O-RU shall reduce its power consumption to the lowest level
|
||||
whilst M-plane remains available. Ongoing Netconf session(s) shall not be affected when the O-RU enters
|
||||
energy saving state.
|
||||
The O-RU uses RO node power-state to inform if the O-RU is in energy saving state.
|
||||
NETCONF client should set energy-saving-enabled to FALSE to ensure O-RU is ready to immediately activate a
|
||||
carrier.";
|
||||
}
|
||||
leaf dying-gasp-support {
|
||||
type boolean;
|
||||
default false;
|
||||
config false;
|
||||
description
|
||||
"indicates whether the O-RU supports the dying gasp
|
||||
capability";
|
||||
}
|
||||
leaf last-service-date {
|
||||
if-feature "or-feat:NON-PERSISTENT-MPLANE";
|
||||
type yang:date-and-time;
|
||||
description
|
||||
"Date of last service or repair of hardware component. How this gets
|
||||
populated is a vendor specific issue.";
|
||||
reference
|
||||
"3GPP 32.692";
|
||||
}
|
||||
}
|
||||
|
||||
augment "/hw:hardware/hw:component" {
|
||||
when "(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-RADIO')) or
|
||||
(derived-from-or-self(hw:class, 'ianahw:port')) or
|
||||
(derived-from-or-self(hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";
|
||||
description "New O-RAN parameters for o-ran naming";
|
||||
leaf o-ran-name {
|
||||
type leafref {
|
||||
path "/hw:hardware/hw:component/hw:name";
|
||||
}
|
||||
must "re-match(current(),'[a-zA-Z0-9][a-zA-Z0-9\\.\\-_]{0,253}[a-zA-Z0-9]')" {
|
||||
error-message "Name must match pattern and length.";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RAN name needed to bind and match with the name of hw element,
|
||||
to be compliant with O-RAN naming convention.";
|
||||
}
|
||||
}
|
||||
|
||||
augment "/hw:hardware/hw:component/hw:state" {
|
||||
when "(derived-from-or-self(../hw:class, 'o-ran-hw:O-RAN-RADIO')) or
|
||||
(derived-from-or-self(../hw:class, 'o-ran-hw:O-RAN-HW-COMPONENT'))";
|
||||
description
|
||||
"new O-RAN defined state";
|
||||
leaf power-state {
|
||||
if-feature "ENERGYSAVING";
|
||||
type energysaving-state;
|
||||
config false;
|
||||
description
|
||||
"The current power saving state for this component.
|
||||
Note - hw:/hardware/component/state/standby-state defined in RFC 4268 is
|
||||
used for redundancy purposes but not for power saving operations.";
|
||||
}
|
||||
leaf availability-state {
|
||||
type availability-type;
|
||||
config false;
|
||||
description
|
||||
"Equipment's availability-state is derived by matching active faults
|
||||
and their impact to module's operation and enables an equipment to indicate
|
||||
that even though it may have one or more critical alarms, it can continue
|
||||
to serve traffic.";
|
||||
}
|
||||
}
|
||||
|
||||
augment "/hw:hardware/hw:component" {
|
||||
when "(derived-from-or-self(hw:class, 'o-ran-hw:O-RU-ANTENNA-CONNECTOR'))";
|
||||
description "New O-RAN parameters for O-RAN Antenna connectors";
|
||||
|
||||
leaf connector-label {
|
||||
type string;
|
||||
config false;
|
||||
description
|
||||
"the label used to identify the connector on an O-RU ";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// augmentations to Notifications
|
||||
|
||||
augment "/hw:hardware-state-oper-enabled" {
|
||||
description "new availability state";
|
||||
leaf availability-state {
|
||||
if-feature hw:hardware-state;
|
||||
type leafref {
|
||||
path "/hw:hardware/hw:component/hw:state/o-ran-hw:availability-state";
|
||||
}
|
||||
description
|
||||
"The availability-state of the O-RU.";
|
||||
}
|
||||
}
|
||||
|
||||
augment "/hw:hardware-state-oper-disabled" {
|
||||
description "new availability state";
|
||||
leaf availability-state {
|
||||
if-feature hw:hardware-state;
|
||||
type leafref {
|
||||
path "/hw:hardware/hw:component/hw:state/o-ran-hw:availability-state";
|
||||
}
|
||||
description
|
||||
"The availability-state of the O-RU.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,16 +32,20 @@ module o-ran-interfaces {
|
||||
prefix "ianahw";
|
||||
}
|
||||
|
||||
import o-ran-wg4-features {
|
||||
prefix "feat";
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module defines the YANG definitions for managng the O-RAN
|
||||
"This module defines the YANG definitions for managing the O-RAN
|
||||
interfaces.
|
||||
|
||||
Copyright 2020 the O-RAN Alliance.
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
@@ -67,6 +71,52 @@ module o-ran-interfaces {
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 16.0.0
|
||||
|
||||
1) added new MACsec bypass policy.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v16.00";
|
||||
}
|
||||
|
||||
revision "2024-04-15" {
|
||||
description
|
||||
"version 15.0.0
|
||||
|
||||
1) added new config false only leaf for maximum payload size.
|
||||
2) new configuration for TCP MSS.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v15.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 5.2.0
|
||||
|
||||
1) typographical corrections in descriptions.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2021-03-22" {
|
||||
description
|
||||
"version 5.1.0
|
||||
|
||||
1) typographical corrections in descriptions.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-12-10" {
|
||||
description
|
||||
"version 5.0.0
|
||||
|
||||
1) new functionality to describe over subscribed resources";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-04-17" {
|
||||
description
|
||||
"version 1.2.0
|
||||
@@ -108,7 +158,6 @@ module o-ran-interfaces {
|
||||
based transport for the CU plane.";
|
||||
}
|
||||
|
||||
|
||||
typedef pcp {
|
||||
type uint8 {
|
||||
range "0..7";
|
||||
@@ -123,6 +172,21 @@ module o-ran-interfaces {
|
||||
"IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
|
||||
}
|
||||
|
||||
typedef mss {
|
||||
type uint16;
|
||||
description
|
||||
"Type definition for TCP Maximum Segment Size.";
|
||||
}
|
||||
|
||||
typedef ethertype-string {
|
||||
type string {
|
||||
pattern '([0-9A-Fa-f]{2}(:[0-9A-Fa-f]{2}))';
|
||||
}
|
||||
description
|
||||
"A 2 octect hexadecimal string with octets represented as hex digits
|
||||
separated by colons.";
|
||||
}
|
||||
|
||||
grouping cos-marking {
|
||||
description
|
||||
"Configuration data for CU Plane ethernet CoS marking.
|
||||
@@ -220,6 +284,146 @@ module o-ran-interfaces {
|
||||
}
|
||||
}
|
||||
|
||||
grouping tcp-config {
|
||||
description "grouping for per-interface tcp configuration";
|
||||
|
||||
container tcp {
|
||||
presence "tcp configuration";
|
||||
description "per interface TCP configuration";
|
||||
|
||||
leaf mss-adjust {
|
||||
type mss;
|
||||
description
|
||||
"Maximum Segment Size (MSS) used in the MSS Option sent
|
||||
in the TCP initial handshake over this interface and
|
||||
which specifies an upper bound for the TCP MSS of packets
|
||||
that can be received on this interface.
|
||||
|
||||
NOTE, this can be used to reduce the packet size for NETCONF/TLS
|
||||
or NETCONF/SSH to reduce head-of-line blocking due to M-Plane
|
||||
packets sent over the fronthaul downlink interface";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouping macsec-bypass-grouping {
|
||||
description "grouping for MACsec bypass policy";
|
||||
|
||||
container macsec-bypass-policy {
|
||||
if-feature feat:MACSEC-BYPASS-POLICY;
|
||||
description
|
||||
"This is a top level container for MACsec policies.
|
||||
These policies can only be enforced on the base
|
||||
Ethernet interface.
|
||||
|
||||
MAC, EtherType and vlan-id based policies are defined to
|
||||
be applied to the base-interface.
|
||||
|
||||
VLAN based policies can additionally be implicitly
|
||||
enforced by configuring the SecY on a VLAN interface and
|
||||
do not use this container.";
|
||||
|
||||
list policy {
|
||||
key "name";
|
||||
description
|
||||
"Each policy list entry has a matching criteria. Any frame
|
||||
matching the criteris will be forwarded via the uncontrolled port.";
|
||||
leaf name {
|
||||
type string;
|
||||
description
|
||||
"The name of the MACsec policy.";
|
||||
}
|
||||
choice policy-type {
|
||||
|
||||
case mac {
|
||||
leaf-list destination-mac-address {
|
||||
type yang:mac-address;
|
||||
description
|
||||
"Destination IEEE 802 Media Access Control (MAC)
|
||||
address of frames egressing via interface.";
|
||||
}
|
||||
}
|
||||
case ethertype {
|
||||
leaf-list ethertype {
|
||||
type ethertype-string;
|
||||
description
|
||||
"list of ethertypes in frames egressing the interface.";
|
||||
}
|
||||
}
|
||||
case vlan-id {
|
||||
leaf-list vlan-id {
|
||||
type uint16 {
|
||||
range "1..4094";
|
||||
}
|
||||
description
|
||||
"list of vlan-ids in frames egressing the interface.";
|
||||
}
|
||||
}
|
||||
description
|
||||
"choice of policy types";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouping macsec-bypass-capabilities {
|
||||
description "grouping for MACsec bypass capabilities";
|
||||
|
||||
container macsec-bypass-capabilities {
|
||||
if-feature feat:MACSEC-BYPASS-POLICY;
|
||||
config false;
|
||||
description
|
||||
"This is a container for MACsec bypass capabilities.";
|
||||
|
||||
leaf per-interface-policy-list-max-elements {
|
||||
type uint16;
|
||||
default 100;
|
||||
description
|
||||
"the maximum number of list of elements
|
||||
for each instance of the list
|
||||
/if:interfaces/if:interface/o-ran-int:/macsec-bypass-policy/o-ran-int/policy.";
|
||||
}
|
||||
leaf cummulative-policy-list-max-elements {
|
||||
type uint16;
|
||||
default 100;
|
||||
description
|
||||
"the maximum cummulative number of list entries for
|
||||
all instances of the list
|
||||
/if:interfaces/if:interface/o-ran-int:/macsec-bypass-policy/o-ran-int/policy";
|
||||
}
|
||||
leaf-list supported-policy {
|
||||
type enumeration {
|
||||
enum MAC {
|
||||
description
|
||||
"O-RU supports MAC address based by-pass policies
|
||||
for frames egressing a base-interface.";
|
||||
}
|
||||
enum ETHERTYPE {
|
||||
description
|
||||
"O-RU supports ethertype based by-pass policies
|
||||
for frames egressing a base-interface.";
|
||||
}
|
||||
enum VLAN {
|
||||
description
|
||||
"O-RU supports vlan-id based by-pass policies
|
||||
for frames egressing a base-interface.";
|
||||
}
|
||||
}
|
||||
description
|
||||
"The type of mac bypass policies supported by the O-RU
|
||||
on frames egressing a base-interface.
|
||||
|
||||
An O-RU supporting the MACSEC-BYPASS-POLICY shall include
|
||||
at least one of the defined policies in this list.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rpc reset-interface-counters {
|
||||
description
|
||||
"Management plane triggered restart of the interface counters.";
|
||||
}
|
||||
|
||||
// Cross Working Group Augmentations Follow
|
||||
|
||||
// Cross Working Group augmentations for basic Ethernet leafs
|
||||
@@ -245,6 +449,27 @@ module o-ran-interfaces {
|
||||
4-8 byte overhead of any known (i.e. explicitly matched by
|
||||
a child sub-interface) 801.1Q VLAN tags.";
|
||||
}
|
||||
|
||||
leaf maximum-ethernet-payload-size {
|
||||
type uint16 {
|
||||
range "1500 .. 9000";
|
||||
}
|
||||
units bytes;
|
||||
config false;
|
||||
description
|
||||
"The maximum size of the Ethernet payload that an O-RU can transmit
|
||||
or receive on the interface (excluding any frame header,
|
||||
maximum frame payload size, frame checksum
|
||||
sequence and any 802.1Q tag).
|
||||
|
||||
TAKE NOTE - THE FORMULA IN THIS DESCRIPTION DIFFERS FROM THE
|
||||
FORMULA IN THE DESCRIPTION OF THE l2-mtu LEAF.
|
||||
|
||||
THIS LEAF CORRESPONDS TO THE DATA/PAYLOAD **ONLY** AND DOES **NOT**
|
||||
INCLUDE ANY OTHER FRAME OVERHEAD LIKE SOURCE/DESTINATION ADDRESSES,
|
||||
LENGTH, 802.1Q TAGS OR FCS.";
|
||||
}
|
||||
|
||||
leaf vlan-tagging {
|
||||
type boolean;
|
||||
default true;
|
||||
@@ -261,8 +486,45 @@ module o-ran-interfaces {
|
||||
equipment.";
|
||||
}
|
||||
uses cos-marking;
|
||||
|
||||
// interface-grouping insert - begin;
|
||||
|
||||
leaf-list interface-groups-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/o-ran-int:interface-grouping/o-ran-int:interfaces-groups/o-ran-int:interface-group-id";
|
||||
}
|
||||
config false;
|
||||
description
|
||||
"an optional leaf used when the sustained rate able to be supported by an interface
|
||||
is less than nominal bit rate indicated by o-ran-transceiver.yang
|
||||
|
||||
Identifies interface grouping particular physical hardware MAC address belongs to.";
|
||||
}
|
||||
|
||||
// interface-grouping insert - end;
|
||||
}
|
||||
|
||||
// augmentation for MACsec bypass policies
|
||||
augment "/if:interfaces/if:interface" {
|
||||
when "if:type = 'ianaift:ethernetCsmacd'" {
|
||||
description "Applies to Ethernet interfaces";
|
||||
}
|
||||
if-feature feat:MACSEC-BYPASS-POLICY;
|
||||
description
|
||||
"Augment the interface model with bypass parameters for
|
||||
base Ethernet interface";
|
||||
|
||||
uses macsec-bypass-grouping;
|
||||
}
|
||||
|
||||
augment "/if:interfaces" {
|
||||
if-feature feat:MACSEC-BYPASS-POLICY;
|
||||
description "augmentation for MACsec bypass capabilitites";
|
||||
|
||||
uses macsec-bypass-capabilities;
|
||||
}
|
||||
|
||||
|
||||
// Cross Working Group augmentation for l2vlan interfaces for VLAN definition
|
||||
|
||||
augment "/if:interfaces/if:interface" {
|
||||
@@ -276,7 +538,7 @@ module o-ran-interfaces {
|
||||
"The base interface must have VLAN tagging enabled.";
|
||||
}
|
||||
description
|
||||
"The base interface for the VLAN sub-interafce.";
|
||||
"The base interface for the VLAN sub-interface.";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type uint16 {
|
||||
@@ -287,7 +549,7 @@ module o-ran-interfaces {
|
||||
}
|
||||
}
|
||||
|
||||
// Cross Working Group augmention for both ethernetCsmacd and l2vlan interfaces
|
||||
// Cross Working Group augmentation for both ethernetCsmacd and l2vlan interfaces
|
||||
|
||||
augment "/if:interfaces/if:interface" {
|
||||
when "(if:type = 'ianaift:ethernetCsmacd') or
|
||||
@@ -306,7 +568,7 @@ module o-ran-interfaces {
|
||||
}
|
||||
}
|
||||
|
||||
// Cross Working Group augmention to ietf-ip covering DSCP for M-Plane
|
||||
// Cross Working Group augmentation to ietf-ip covering DSCP for M-Plane
|
||||
|
||||
augment "/if:interfaces/if:interface/ip:ipv4" {
|
||||
description "augments for IPv4 based M-Plane transport";
|
||||
@@ -325,28 +587,44 @@ augment "/if:interfaces/if:interface/ip:ipv6" {
|
||||
}
|
||||
}
|
||||
|
||||
// Cross Working Group augmentation to ietf-ip covering TCP MSS for M-Plane
|
||||
|
||||
augment "/if:interfaces/if:interface/ip:ipv4" {
|
||||
if-feature feat:PER-INT-TCP-MSS;
|
||||
description "augments for IPv4 based CUS transport";
|
||||
uses tcp-config;
|
||||
}
|
||||
augment "/if:interfaces/if:interface/ip:ipv6" {
|
||||
if-feature feat:PER-INT-TCP-MSS;
|
||||
description "augments for IPv6 based CUS transport";
|
||||
uses tcp-config;
|
||||
}
|
||||
|
||||
|
||||
// WG4 Specific Augmentations Follow
|
||||
|
||||
// WG4 Augmentation for basic Ethernet leafs
|
||||
|
||||
augment "/if:interfaces/if:interface" {
|
||||
if-feature ALIASMAC-BASED-CU-PLANE;
|
||||
when "if:type = 'ianaift:ethernetCsmacd'" {
|
||||
description
|
||||
"Applies to WG4 Ethernet interfaces for alias MAC based CU-Plane";
|
||||
}
|
||||
if-feature ALIASMAC-BASED-CU-PLANE;
|
||||
description
|
||||
"Augment the interface model with parameters for
|
||||
base Ethernet interface";
|
||||
|
||||
leaf-list alias-macs {
|
||||
type yang:mac-address;
|
||||
|
||||
description
|
||||
"Augments interfaces with range of alias MAC addresses.";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// WG4 Augmention for both ethernetCsmacd and l2vlan interfaces
|
||||
// WG4 Augmentation for both ethernetCsmacd and l2vlan interfaces
|
||||
|
||||
augment "/if:interfaces/if:interface" {
|
||||
when "(if:type = 'ianaift:ethernetCsmacd') or
|
||||
@@ -358,9 +636,11 @@ augment "/if:interfaces/if:interface/ip:ipv6" {
|
||||
both ethernetCsmacd and l2vlan interfaces.";
|
||||
leaf mac-address {
|
||||
type yang:mac-address;
|
||||
|
||||
description
|
||||
"The MAC address of the interface.";
|
||||
}
|
||||
|
||||
container port-reference {
|
||||
description
|
||||
"a port reference used by other O-RAN modules";
|
||||
@@ -391,7 +671,7 @@ augment "/if:interfaces/if:interface/ip:ipv6" {
|
||||
}
|
||||
}
|
||||
|
||||
// WG4 specific augmention to ietf-ip covering DSCP for CUS Plane
|
||||
// WG4 specific augmentation to ietf-ip covering DSCP for CUS Plane
|
||||
|
||||
augment "/if:interfaces/if:interface/ip:ipv4" {
|
||||
if-feature UDPIP-BASED-CU-PLANE;
|
||||
@@ -406,9 +686,51 @@ augment "/if:interfaces/if:interface/ip:ipv6" {
|
||||
|
||||
// Other Working Group Specific Augmentations Follow Here
|
||||
|
||||
// interface-grouping insert - begin;
|
||||
|
||||
rpc reset-interface-counters {
|
||||
description
|
||||
"Management plane triggered restart of the interface counters.";
|
||||
augment "/if:interfaces" {
|
||||
description "augments interfaces for groupings of physical hardware addresses that can be used to group Ethernet ports";
|
||||
|
||||
container interface-grouping {
|
||||
|
||||
presence
|
||||
"indicates maximum sustained throughput of an O-RU is less than the combined bandwidth of all physical ports";
|
||||
|
||||
config false;
|
||||
|
||||
description
|
||||
"A container used by an O-RU where the maximum sustained throughput
|
||||
of an O-RU is less than the combined bandwidth of all physical ports";
|
||||
|
||||
list interfaces-groups {
|
||||
key interface-group-id;
|
||||
description "List of interface groups.";
|
||||
|
||||
leaf interface-group-id {
|
||||
type uint8;
|
||||
description "interface group identifier.";
|
||||
}
|
||||
|
||||
leaf max-sustainable-ingress-bandwidth {
|
||||
type uint32;
|
||||
units Mbps;
|
||||
description
|
||||
"Maximum sustainable ingress bandwidth the interface group can handle. The sustainable bandwidth is calculated
|
||||
over one radio frame.
|
||||
|
||||
The peak ingress bandwidth may exceed the sustainable bandwidth for periods shorter than a radio frame period.";
|
||||
}
|
||||
|
||||
leaf max-sustainable-egress-bandwidth {
|
||||
type uint32;
|
||||
units Mbps;
|
||||
description
|
||||
"Maximum sustainable egress bandwidth the interface group can handle. The sustainable bandwidth is calculated
|
||||
over one radio frame.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// interface-grouping insert - end;
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,10 @@ module o-ran-module-cap {
|
||||
|
||||
import o-ran-compression-factors {
|
||||
prefix "cf";
|
||||
revision-date 2020-08-10;
|
||||
}
|
||||
|
||||
import o-ran-wg4-features {
|
||||
prefix "or-feat";
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
@@ -17,7 +20,7 @@ module o-ran-module-cap {
|
||||
"This module defines the module capabilities for
|
||||
the O-RAN Radio Unit.
|
||||
|
||||
Copyright 2020 the O-RAN Alliance.
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
@@ -43,6 +46,116 @@ module o-ran-module-cap {
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-04-15" {
|
||||
description
|
||||
"version 15.0.0
|
||||
|
||||
1) add support for multiple beamid tables.
|
||||
2) remove import by revision date for o-ran-compression-factors.
|
||||
3) Support for deep hibernate sleep mode.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v15.00";
|
||||
}
|
||||
|
||||
revision "2023-12-11" {
|
||||
description
|
||||
"version 14.0.0
|
||||
|
||||
1) Introduce bundle-offset-in-se11-supported";
|
||||
|
||||
reference "ORAN-WG4.M.0-v14.00";
|
||||
}
|
||||
|
||||
revision "2023-08-14" {
|
||||
description
|
||||
"version 13.0.0
|
||||
|
||||
1) Introduce TRX-control and advanced sleep modes";
|
||||
|
||||
reference "ORAN-WG4.M.0-v13.00";
|
||||
}
|
||||
|
||||
revision "2023-04-10" {
|
||||
description
|
||||
"version 12.0.0
|
||||
|
||||
1) Clarify the parameter number-of-spatial-streams
|
||||
2) Introduce NB-IoT";
|
||||
|
||||
reference "ORAN-WG4.M.0-v12.00";
|
||||
}
|
||||
|
||||
revision "2022-12-05" {
|
||||
description
|
||||
"version 11.0.0
|
||||
|
||||
1) Deprecation of power-related capabilities and addition of min-gain
|
||||
2) se6 rb bit handling for rbgSize equal to zero";
|
||||
|
||||
reference "ORAN-WG4.M.0-v11.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) clarified description statements for component carrier
|
||||
2) style guide corrections
|
||||
3) introducing new feature for ACK NACK feedback
|
||||
4) deprecation for params in band-capabilities";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2022-04-18" {
|
||||
description
|
||||
"version 9.0.0
|
||||
|
||||
1) aded new parameter st6-4byte-alignment-required";
|
||||
|
||||
reference "ORAN-WG4.M.0-v09.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 8.0.0
|
||||
|
||||
1) Typographical corrections in descriptions.
|
||||
2) deprecation of compression-method-grouping";
|
||||
|
||||
reference "ORAN-WG4.M.0-v08.00";
|
||||
}
|
||||
|
||||
revision "2021-07-26" {
|
||||
description
|
||||
"version 7.0.0
|
||||
|
||||
1) Added support for external antenna delay handling ";
|
||||
|
||||
reference "ORAN-WG4.M.0-v07.00";
|
||||
}
|
||||
|
||||
revision "2021-03-22" {
|
||||
description
|
||||
"version 5.1.0
|
||||
|
||||
1) typographical corrections in descriptions.
|
||||
2) removed non-ASCII characters
|
||||
3) clarified number-of-ru-ports_dl/ul description ";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-12-10" {
|
||||
description
|
||||
"version 5.0.0
|
||||
|
||||
1) added support for optimising coupling-via-frequency-and-time-with-priorities
|
||||
by adding enhancement to existing method through a new leaf node";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
revision "2020-08-10" {
|
||||
description
|
||||
"version 4.0.0
|
||||
@@ -55,7 +168,7 @@ module o-ran-module-cap {
|
||||
to Section Description Priority to serve for CUS-Plane C";
|
||||
|
||||
reference "ORAN-WG4.M.0-v04.00";
|
||||
}
|
||||
}
|
||||
|
||||
revision "2020-04-17" {
|
||||
description
|
||||
@@ -68,8 +181,8 @@ module o-ran-module-cap {
|
||||
5) Enable PRACH preamble formats supported to be signalled by O-RU
|
||||
6) adding support for selective RE sending
|
||||
7) supporting new section extension for grouping multiple ports
|
||||
8) signalling to enable O-RU to ndicate is requires unique ecpri sequence id
|
||||
for eAxC_IDs serving for UL and DL for the same carrier component";
|
||||
8) signalling to enable O-RU to indicate is requires unique ecpri sequence id
|
||||
for eAxC_IDs serving for UL and DL for the same Component Carrier";
|
||||
|
||||
reference "ORAN-WG4.M.0-v03.00";
|
||||
}
|
||||
@@ -191,24 +304,26 @@ module o-ran-module-cap {
|
||||
}
|
||||
|
||||
grouping compression-method-grouping {
|
||||
status deprecated;
|
||||
description
|
||||
"Grouping for compression method.";
|
||||
"Grouping for compression method.
|
||||
Note: This grouping is deprecated. Please use the one from o-ran-compression-factors module.";
|
||||
|
||||
leaf compression-method {
|
||||
type enumeration {
|
||||
enum BLOCK_FLOATING_POINT {
|
||||
description
|
||||
"Block floating point compression and decompression will be used";
|
||||
"Block floating-point compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum BLOCK_SCALING {
|
||||
description
|
||||
"Block scaling compression and decompresion will be used";
|
||||
"Block scaling compression and decompression will be used";
|
||||
}
|
||||
|
||||
enum U_LAW {
|
||||
description
|
||||
"u-Law compression and decompresion method will be used";
|
||||
"u-Law compression and decompression method will be used";
|
||||
}
|
||||
|
||||
enum BEAMSPACE {
|
||||
@@ -223,7 +338,7 @@ module o-ran-module-cap {
|
||||
|
||||
enum BLOCK-FLOATING-POINT-SELECTIVE-RE-SENDING {
|
||||
description
|
||||
"block floating point with selective re sending
|
||||
"block floating-point with selective re sending
|
||||
compression and decompression will be used";
|
||||
}
|
||||
enum MODULATION-COMPRESSION-SELECTIVE-RE-SENDING {
|
||||
@@ -233,7 +348,7 @@ module o-ran-module-cap {
|
||||
}
|
||||
}
|
||||
description
|
||||
"Compresion method which can be supported by the O-RU.
|
||||
"Compression method which can be supported by the O-RU.
|
||||
An O-RU may further refine the applicability of compression
|
||||
methods per endpoint using o-ran-uplane-conf.yang model";
|
||||
}
|
||||
@@ -241,20 +356,20 @@ module o-ran-module-cap {
|
||||
|
||||
grouping sub-band-max-min-ul-dl-frequency {
|
||||
description
|
||||
"Grouping for defining max and min supported frequency - dl and ul.";
|
||||
"Grouping for defining max and min supported frequency - DL and UL.";
|
||||
|
||||
leaf max-supported-frequency-dl {
|
||||
type uint64;
|
||||
description
|
||||
"This value indicates Maximum supported downlink frequency in the
|
||||
LAA subband. Value unit is Hz.";
|
||||
LAA sub-band. Value unit is Hz.";
|
||||
}
|
||||
|
||||
leaf min-supported-frequency-dl {
|
||||
type uint64;
|
||||
description
|
||||
"This value indicates Minimum supported downlink frequency in the
|
||||
LAA subband. Value unit is Hz.";
|
||||
LAA sub-band. Value unit is Hz.";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,7 +388,7 @@ module o-ran-module-cap {
|
||||
type boolean;
|
||||
|
||||
description
|
||||
"Informs if O-RU supports realtime variable bit with";
|
||||
"Informs if O-RU supports real-time variable bit with";
|
||||
}
|
||||
|
||||
list compression-method-supported {
|
||||
@@ -293,7 +408,7 @@ module o-ran-module-cap {
|
||||
"List of supported compression methods by O-RU
|
||||
Note: if O-RU supports different compression methods per endpoint
|
||||
then please refer to endpoints to have information what
|
||||
exactly is supported on paticular endpoint";
|
||||
exactly is supported on particular endpoint";
|
||||
}
|
||||
|
||||
leaf variable-bit-width-per-channel-supported {
|
||||
@@ -331,6 +446,29 @@ module o-ran-module-cap {
|
||||
Note - little endian support does not invalidate bigendian support.";
|
||||
}
|
||||
|
||||
leaf st6-4byte-alignment-required {
|
||||
type boolean;
|
||||
default false;
|
||||
|
||||
description
|
||||
"An optional flag indicating whether O-RU requires 4-byte aligned Section Type 6 or not.
|
||||
If 4-byte aligned Section Type 6 is required, O-RU shall set this flag to 'true'.
|
||||
If the leaf is ommitted or set to 'false', the O-RU operates using 1-byte aligned Section Type 6.
|
||||
An O-DU recovering a value of 'true' shall ensure that Section Type 6 shall be
|
||||
sent with 4-byte aligned messages, as described in clause 'Elements for the C-Plane Protocol' of
|
||||
the CUS-Plane specification.";
|
||||
}
|
||||
|
||||
leaf se6-rb-bit-supported {
|
||||
type boolean;
|
||||
default false;
|
||||
|
||||
description
|
||||
"If this leaf node has a value 'true', then O-DU may use the 'rb' bit, in which case
|
||||
when the O-DU sets the 'rb' bit to one, it shall also set the value of 'rbgsize' to zero and the
|
||||
O-RU shall interpret the value of 'rb' bit as applicable to this data section. Refer 'SE 6: Non-contiguous
|
||||
PRB allocation in time and frequency domain' requirement #3 of the CUS-Plane specification.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping scs-a-b {
|
||||
@@ -351,7 +489,7 @@ module o-ran-module-cap {
|
||||
grouping ul-mixed-num-required-guard-rbs {
|
||||
description
|
||||
"Required number of guard resource blocks for the combination of
|
||||
subcarrier spacing values for uplink";
|
||||
sub-carrier spacing values for uplink";
|
||||
uses scs-a-b;
|
||||
leaf number-of-guard-rbs-ul{
|
||||
type uint8;
|
||||
@@ -365,7 +503,7 @@ module o-ran-module-cap {
|
||||
grouping dl-mixed-num-required-guard-rbs {
|
||||
description
|
||||
"Required number of guard resource blocks for the combination of
|
||||
subcarrier spacing values for uplink";
|
||||
sub-carrier spacing values for uplink";
|
||||
uses scs-a-b;
|
||||
leaf number-of-guard-rbs-dl{
|
||||
type uint8;
|
||||
@@ -376,6 +514,98 @@ module o-ran-module-cap {
|
||||
}
|
||||
}
|
||||
|
||||
grouping sleep-mode-capability-info {
|
||||
description
|
||||
"Grouping for sleep mode capabilities supported by the O-RU.";
|
||||
|
||||
list sleep-modes {
|
||||
key "sleep-mode-type";
|
||||
description
|
||||
"List of sleep mode type supported.";
|
||||
|
||||
leaf sleep-mode-type {
|
||||
type enumeration {
|
||||
enum SLEEP_MODE_0 {
|
||||
description "O-RU supports Sleep Mode 0.";
|
||||
}
|
||||
enum SLEEP_MODE_1 {
|
||||
description "O-RU supports Sleep Mode 1.";
|
||||
}
|
||||
enum SLEEP_MODE_2 {
|
||||
description "O-RU supports Sleep Mode 2.";
|
||||
}
|
||||
enum SLEEP_MODE_3 {
|
||||
description "O-RU supports Sleep Mode 3.";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Type of sleep mode supported.";
|
||||
}
|
||||
|
||||
leaf wake-up-duration {
|
||||
type uint32;
|
||||
units microseconds;
|
||||
description "Wake-up duration for a particular sleep mode.";
|
||||
}
|
||||
|
||||
leaf wake-up-duration-guaranteed {
|
||||
type boolean;
|
||||
description
|
||||
"Informs whether the O-RU guarantees the wakeup duration for a particular sleep mode.
|
||||
For sleep-mode-type reported as 'SLEEP_MODE_0', the wake-up-duration-guaranteed shall be reported as 'true'";
|
||||
}
|
||||
}
|
||||
|
||||
leaf defined-duration-sleep-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if the O-RU supports the defined-duration sleep functionality.";
|
||||
}
|
||||
|
||||
leaf undefined-duration-sleep-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if the O-RU supports the undefined-duration sleep functionality.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping trx-control-capability-info {
|
||||
description
|
||||
"A grouping with parameters for TRX-CONTROL capabilities supported by the O-RU";
|
||||
|
||||
list supported-trx-control-masks {
|
||||
key "index";
|
||||
description
|
||||
"List of supported TRX control masks.";
|
||||
|
||||
leaf index {
|
||||
type uint8;
|
||||
description
|
||||
"Index to the list.";
|
||||
}
|
||||
|
||||
leaf mask-name {
|
||||
type string;
|
||||
description
|
||||
"Unique name for each supported TRX control mask.";
|
||||
}
|
||||
|
||||
leaf antenna-mask {
|
||||
type binary;
|
||||
description
|
||||
"Supported Antenna Mask.";
|
||||
}
|
||||
}
|
||||
uses sleep-mode-capability-info;
|
||||
}
|
||||
|
||||
grouping asm-capability-info {
|
||||
description
|
||||
"A grouping with parameters for advanced sleep mode capabilities supported by the O-RU";
|
||||
|
||||
uses sleep-mode-capability-info;
|
||||
}
|
||||
|
||||
grouping ru-capabilities {
|
||||
description
|
||||
"Structure representing set of capabilities.";
|
||||
@@ -409,43 +639,78 @@ module o-ran-module-cap {
|
||||
leaf number-of-ru-ports-ul {
|
||||
type uint8;
|
||||
description
|
||||
"Assuming all endpoints support time-managed traffic AND non-time-managed traffic (choice is as per configuration)
|
||||
- the number of O-RU ports for uplink is the product of number of spatial streams (leaf number-of-spatial-streams) and number of numerologies O-RU supports.
|
||||
For example, if the number of spatial streams is 4 then the number of O-RU ports is 8 when PUSCH and PRACH are processed in the different endpoints.
|
||||
"Assuming all endpoints support time-managed traffic AND non-time-managed traffic AND static channel configuration (choice is as per configuration)
|
||||
- the upper bound of the number of O-RU ports for uplink which is derived from number of UL spatial streams or layers
|
||||
and associated numerology O-RU supports.
|
||||
Numerology capability per spatial stream or layer is based on eaxc id description in CUS specification section entitled
|
||||
'ecpriRtcid / ecpriPcid (real time control data / IQ data transfer message series identifier)'
|
||||
For example, if O-RU supports for each of 'N' spatial streams or layers 'M' numerologies (as it applies to PUSCH and PRACH), number of ports is N * M.
|
||||
In case there are specific endpoints that support non-time-managed traffic only
|
||||
- the number of O-RU ports calculated with above mentioned equation is extended by number of endpoints supporting only non-time-managed traffic.";
|
||||
- the number of O-RU ports calculated is extended by number of endpoints supporting only non-time-managed traffic.
|
||||
Additionally, if there are specific endpoints that support static channel configuration only(e.g. static PRACH)
|
||||
- the number of O-RU ports calculated above is further extended by number of endpoints supporting static channel configuration only.";
|
||||
}
|
||||
leaf number-of-ru-ports-dl {
|
||||
type uint8;
|
||||
description
|
||||
"Assuming all endpoints support time-managed traffic AND non-time-managed traffic (choice is as per configuration)
|
||||
- the number of O-RU ports for downlink is the product of number of spatial streams (leaf number-of-spatial-streams) and number of numerologies O-RU supports.
|
||||
For example, if the number of spatial streams is 4 then the number of O-RU ports is 8 when SSB and non-SSB are processed in the different endpoints.
|
||||
In case there are specific endpoints that support non-time-managed traffic only
|
||||
- the number of O-RU ports calculated with above mentioned equation is extended by number of endpoints supporting only non-time-managed traffic.";
|
||||
- the upper bound of the number of O-RU ports for downlink which is derived from number of DL spatial streams or layers
|
||||
and associated numerology O-RU supports.
|
||||
Numerology capability per spatial stream or layer is based on eaxc id description in CUS specification section entitled
|
||||
'ecpriRtcid / ecpriPcid (real time control data / IQ data transfer message series identifier)'
|
||||
For example, if O-RU supports for each of 'N' spatial streams or layers 'M' numerologies, number of ports is N * M.
|
||||
In case there are specific endpoints that support non-time-managed traffic only.
|
||||
- the number of O-RU ports calculated with above mentioned equation is extended by number of endpoints supporting only non-time-managed traffic";
|
||||
}
|
||||
|
||||
leaf number-of-spatial-streams {
|
||||
type uint8;
|
||||
description
|
||||
"This value indicates the number of spatial streams supported at O-RU for DL and UL.
|
||||
For DL, it is same as the number of antenna ports specified in 3GPP TS38.214, Section 5.2 and 3GPP TS36.213, Section 5.2.";
|
||||
"This value indicates the maximum accumulated number of spatial streams supported by O-RU for DL and UL.
|
||||
For definition of spatial stream, please refer to CUS plane specification clause 3.1 for details.";
|
||||
}
|
||||
|
||||
leaf number-of-spatial-streams-dl {
|
||||
type uint8;
|
||||
description
|
||||
"The maximum number of DL spatial streams that O-RU supports.
|
||||
For definition of spatial stream, please refer to CUS plane specification clause 3.1 for details.";
|
||||
}
|
||||
|
||||
leaf number-of-spatial-streams-ul {
|
||||
type uint8;
|
||||
description
|
||||
"The maximum number of UL spatial streams that O-RU supports.
|
||||
For definition of spatial stream, please refer to CUS plane specification clause 3.1 for details..";
|
||||
}
|
||||
|
||||
leaf max-num-bands {
|
||||
type uint16;
|
||||
description "maximum number of bands supported by the O-RU";
|
||||
}
|
||||
|
||||
leaf max-power-per-pa-antenna {
|
||||
type decimal64{
|
||||
fraction-digits 4;
|
||||
}
|
||||
status deprecated;
|
||||
description
|
||||
"This value indicates Maximum Power per PA per antenna. Value unit is dBm.";
|
||||
"This value indicates Maximum Power per PA per antenna. Value unit is dBm.
|
||||
|
||||
The parameter is deprecated. min-gain and max-gain define constraints related to
|
||||
TX power budget, as defined in CUS-Plane, clause 8.1.3.3.";
|
||||
}
|
||||
|
||||
leaf min-power-per-pa-antenna {
|
||||
type decimal64{
|
||||
fraction-digits 4;
|
||||
}
|
||||
status deprecated;
|
||||
description
|
||||
"This value indicates Minimum Power per PA per antenna. Value unit is dBm.";
|
||||
"This value indicates Minimum Power per PA per antenna. Value unit is dBm.
|
||||
|
||||
The parameter is deprecated. min-gain and max-gain define constraints related to
|
||||
TX power budget, as defined in CUS-Plane, clause 8.1.3.3.";
|
||||
}
|
||||
|
||||
leaf fronthaul-split-option {
|
||||
@@ -467,7 +732,7 @@ module o-ran-module-cap {
|
||||
key "scs-a scs-b";
|
||||
description
|
||||
"List of required number of guard resource blocks
|
||||
for the combination of subcarrier spacing values for downlink";
|
||||
for the combination of sub-carrier spacing values for downlink";
|
||||
|
||||
uses ul-mixed-num-required-guard-rbs;
|
||||
}
|
||||
@@ -475,7 +740,7 @@ module o-ran-module-cap {
|
||||
key "scs-a scs-b";
|
||||
description
|
||||
"List of required number of guard resource blocks
|
||||
for the combination of subcarrier spacing values for uplink";
|
||||
for the combination of sub-carrier spacing values for uplink";
|
||||
|
||||
uses dl-mixed-num-required-guard-rbs;
|
||||
}
|
||||
@@ -498,7 +763,7 @@ module o-ran-module-cap {
|
||||
leaf max-num-tx-eaxc-ids-per-group {
|
||||
type uint8;
|
||||
description
|
||||
"Maximum number of member-tx-eaxc-id in single tx-eaxc-id-group supported by O-RU.";
|
||||
"Maximum number of eAxC IDs per tx-eaxc-id-group supported by O-RU, where each group is a union of the 'member-tx-eaxc-id's and a 'representative-tx-eaxc-id'.";
|
||||
}
|
||||
leaf max-num-rx-eaxc-id-groups {
|
||||
type uint8;
|
||||
@@ -508,7 +773,7 @@ module o-ran-module-cap {
|
||||
leaf max-num-rx-eaxc-ids-per-group {
|
||||
type uint8;
|
||||
description
|
||||
"the maximum number of eAxC IDs per rx-eaxc-id-group.";
|
||||
"Maximum number of eAxC IDs per rx-eaxc-id-group supported by O-RU, where each group is a union of the 'member-rx-eaxc-id's and a 'representative-rx-eaxc-id'.";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -523,13 +788,13 @@ module o-ran-module-cap {
|
||||
type boolean;
|
||||
default false;
|
||||
description
|
||||
"Parameter informs if O-RU expects unique ecpri sequence id for eAxC_IDs serving
|
||||
for UL and DL for the same carrier component.
|
||||
"Parameter informs if O-RU expects unique eCPRI sequence id for eAxC_IDs serving
|
||||
for UL and DL for the same Component Carrier.
|
||||
|
||||
Note: If this is set to TRUE, the O-DU can decide to either use different eAxC_IDs for UL and
|
||||
DL or can generate unique sequence ID per eAxC_ID.
|
||||
|
||||
TAKE NOTE: This leaf is backwards compatible from an O-RU persepctive BUT an O-RU that
|
||||
TAKE NOTE: This leaf is backwards compatible from an O-RU perspective BUT an O-RU that
|
||||
sets this leaf to TRUE may result in incompatibilities when operating with an O-DU
|
||||
designed according to the O-RAN CUS-Plane Specification v02.00, e.g., if the O-DU is
|
||||
incapable of using different eAxC values between UL and DL";
|
||||
@@ -551,6 +816,13 @@ module o-ran-module-cap {
|
||||
"Coupling via Frequency and time with priorities; see methods of coupling of C-plane and U-plane in CUS-Plane specification.
|
||||
Note: If coupling-via-frequency-and-time-with-priorities is 'true' then coupling-via-frequency-and-time shall also be 'true'.";
|
||||
}
|
||||
|
||||
leaf coupling-via-frequency-and-time-with-priorities-optimized {
|
||||
type boolean;
|
||||
description
|
||||
"Coupling via Frequency and time with priorities optimised; see methods of coupling of C-plane and U-plane in CUS-Plane specification.
|
||||
Note: If coupling-via-frequency-and-time-with-priorities-optimized is 'true' then coupling-via-frequency-and-time shall also be 'true'.";
|
||||
}
|
||||
}
|
||||
|
||||
leaf ud-comp-len-supported {
|
||||
@@ -560,10 +832,109 @@ module o-ran-module-cap {
|
||||
Only in case this leaf is present and its value is TRUE, O-RU supports U-Plane messages
|
||||
containing udCompLen field in section header.";
|
||||
}
|
||||
|
||||
leaf ext-ant-delay-capability {
|
||||
if-feature "or-feat:EXT-ANT-DELAY-CONTROL";
|
||||
type enumeration {
|
||||
enum PER-ARRAY-CARRIER {
|
||||
description
|
||||
"Informs that the O-RU supports the configuration of different t-da-offset on different tx-array-carriers,
|
||||
and different t-au-offset on different rx-array-carriers";
|
||||
}
|
||||
|
||||
enum PER-ARRAY {
|
||||
description
|
||||
"Informs that the O-RU supports the configuration of different t-da-offset on different tx-array-carriers
|
||||
only when those tx-array-carriers belong to different tx-arrays,
|
||||
and the O-RU supports the configuration of different t-au-offset on different rx-array-carriers
|
||||
only when those rx-array-carriers belong to different rx-arrays";
|
||||
}
|
||||
|
||||
enum PER-O-RU {
|
||||
description
|
||||
"Informs that the O-RU only supports the configuration of a common t-da-offset across all tx-array-carriers,
|
||||
and a common t-au-offset across all rx-array-carriers";
|
||||
}
|
||||
}
|
||||
description
|
||||
"This property informs what kind of capability the O-RU supports to be configured with external antenna delay.";
|
||||
}
|
||||
|
||||
leaf nack-supported {
|
||||
type boolean;
|
||||
description
|
||||
"This value indicates if O-RU supports sending NACK feedback if a section extension for ACK/NACK request is received,
|
||||
If O-RU reports supporting section extension for ACK/NACK request (section extension 22) and ACK/NACK feedback (section type 8), ACK feedback shall always be supported,
|
||||
while NACK feedback is optionally supported according to 'nack-supported'";
|
||||
}
|
||||
|
||||
leaf st8-scs-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if O-RU supports the optional field scs in Section Type 8 messages.";
|
||||
}
|
||||
|
||||
container energy-saving-capability-common-info {
|
||||
if-feature "or-feat:TRX-CONTROL or or-feat:ADVANCED-SLEEP-MODE";
|
||||
description
|
||||
"A container with parameters for common energy saving capabilities supported by the O-RU";
|
||||
|
||||
|
||||
leaf st8-ready-message-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if the O-RU supports Section Type 8 Ready message.";
|
||||
}
|
||||
|
||||
leaf sleep-duration-extension-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if the O-RU supports extension of sleep duration.";
|
||||
}
|
||||
|
||||
leaf emergency-wake-up-command-supported {
|
||||
type boolean;
|
||||
description
|
||||
"Informs if the O-RU supports emergency wake-up M-Plane command.";
|
||||
}
|
||||
}
|
||||
|
||||
leaf bundle-offset-in-se11-supported {
|
||||
type boolean;
|
||||
default false;
|
||||
description
|
||||
"Informs if O-RU supports receiving non-zero values of bundleOffset in SE11.
|
||||
For details, see CUS-Plane Specification, clause 7.7.11.10.";
|
||||
}
|
||||
|
||||
leaf max-beamId-tables-supported {
|
||||
if-feature "or-feat:MULTIPLE-BEAMID-TABLES-SUPPORTED";
|
||||
type uint8;
|
||||
description
|
||||
"This parameter defines the maximum number of beamId tables supported by the O-RU.";
|
||||
}
|
||||
|
||||
leaf min-hibernate-time-duration {
|
||||
if-feature "or-feat:DEEP-HIBERNATE";
|
||||
type uint32;
|
||||
units minutes;
|
||||
description
|
||||
"Informs about the minimum hibernate-time duration that O-RU
|
||||
supports deep-hibernate sleep";
|
||||
}
|
||||
|
||||
leaf max-hibernate-time-duration {
|
||||
if-feature "or-feat:DEEP-HIBERNATE";
|
||||
type uint32;
|
||||
units minutes;
|
||||
mandatory true;
|
||||
description
|
||||
"Informs about the maximum hibernate-time duration that O-RU supports deep-hibernate sleep";
|
||||
}
|
||||
}
|
||||
|
||||
grouping sub-band-info {
|
||||
description "container for collection of leafs for LAA subband 46";
|
||||
description "container for collection of leafs for LAA sub-band 46";
|
||||
list sub-band-frequency-ranges {
|
||||
key sub-band;
|
||||
description "frequency information on a per sub-band basis";
|
||||
@@ -584,7 +955,7 @@ module o-ran-module-cap {
|
||||
description
|
||||
"Maximum O-RU buffer size in Kilobytes (KB) per CC. This parameter is
|
||||
needed at the O-DU to know how much data can be sent in advance
|
||||
and stored at the O-RU to address the LBT uncertainity.";
|
||||
and stored at the O-RU to address the LBT uncertainty.";
|
||||
}
|
||||
|
||||
leaf maximum-processing-time {
|
||||
@@ -593,7 +964,7 @@ module o-ran-module-cap {
|
||||
description
|
||||
"Maximum O-RU Processing time in microseconds at the O-RU to handle the
|
||||
received/transmitted packets from/to the O-DU. This parameter is
|
||||
needed at the O-DU to determine the time where it needs to send
|
||||
needed at the O-DU to determine the time when it needs to send
|
||||
the data to the O-RU.";
|
||||
}
|
||||
|
||||
@@ -603,6 +974,61 @@ module o-ran-module-cap {
|
||||
}
|
||||
}
|
||||
|
||||
grouping supported-filter-pass-bandwidths {
|
||||
description
|
||||
"Grouping of filter pass bandwidth capabilities";
|
||||
|
||||
list supported-filter-pass-bandwidths {
|
||||
key "id";
|
||||
config false;
|
||||
|
||||
leaf id {
|
||||
type uint32;
|
||||
description
|
||||
"Identification number for a supported filter pass bandwidth.";
|
||||
}
|
||||
|
||||
leaf type {
|
||||
type enumeration {
|
||||
enum LTE {
|
||||
description
|
||||
"LTE technology.";
|
||||
}
|
||||
enum NR {
|
||||
description
|
||||
"NR technology.";
|
||||
}
|
||||
enum DSS_LTE_NR {
|
||||
if-feature DSS_LTE_NR;
|
||||
description
|
||||
"DSS of LTE and NR technologies.";
|
||||
}
|
||||
}
|
||||
description
|
||||
"Supported carrier type for filter pass bandwidth value.";
|
||||
}
|
||||
|
||||
leaf carrier-bandwidth {
|
||||
type uint64;
|
||||
units Hz;
|
||||
|
||||
description
|
||||
"Bandwidth of a carrier for which filter pass bandwidth can be used.";
|
||||
}
|
||||
|
||||
leaf filter-pass-bandwidth {
|
||||
type uint64;
|
||||
units Hz;
|
||||
|
||||
description
|
||||
"Filter pass bandwidth of a carrier.";
|
||||
}
|
||||
|
||||
description
|
||||
"List of supported filter pass bandwidths by carriers.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping support-for-dl {
|
||||
description
|
||||
"Grouping for DL specific parameters";
|
||||
@@ -662,6 +1088,24 @@ module o-ran-module-cap {
|
||||
description
|
||||
"This list provides information regarding technologies supported in DL path";
|
||||
}
|
||||
|
||||
container supported-filter-pass-bandwidths-dl {
|
||||
description
|
||||
"Filter pass bandwidth capabilities for DL.";
|
||||
uses supported-filter-pass-bandwidths;
|
||||
}
|
||||
|
||||
leaf-list tx-array-beamId-table-indexes {
|
||||
if-feature "or-feat:MULTIPLE-BEAMID-TABLES-SUPPORTED";
|
||||
type uint8;
|
||||
min-elements 1;
|
||||
description
|
||||
"When O-RU advertises support for multiple beamId tables, this list shall specify the beamId table indexes
|
||||
associated with a given tx-array capabilities list entry. O-DU shall be restricted to choose
|
||||
one or multiple entries for a given configured tx-array-carrier from this list.
|
||||
Note: tx-array and rx-array may use the same beamId table indexes.";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
grouping support-for-ul {
|
||||
@@ -723,6 +1167,23 @@ module o-ran-module-cap {
|
||||
description
|
||||
"This list provides information regarding technologies supported in UL path";
|
||||
}
|
||||
|
||||
container supported-filter-pass-bandwidths-ul {
|
||||
description
|
||||
"Filter pass bandwidth capabilities for UL.";
|
||||
uses supported-filter-pass-bandwidths;
|
||||
}
|
||||
|
||||
leaf-list rx-array-beamId-table-indexes {
|
||||
if-feature "or-feat:MULTIPLE-BEAMID-TABLES-SUPPORTED";
|
||||
type uint8;
|
||||
min-elements 1;
|
||||
description
|
||||
"When O-RU advertises support for multiple beamId tables, this list shall specify the beamId table indexes
|
||||
associated with a given rx-array capabilities list entry. O-DU shall be restricted to choose
|
||||
one or multiple entries for a given configured rx-array-carrier from this list.
|
||||
Note: tx-array and rx-array may use the same beamId table indexes.";
|
||||
}
|
||||
}
|
||||
|
||||
grouping band-capabilities {
|
||||
@@ -738,7 +1199,7 @@ module o-ran-module-cap {
|
||||
container sub-band-info {
|
||||
when "../band-number = '46'";
|
||||
if-feature "o-ran-module-cap:LAA";
|
||||
description "container for collection of leafs for LAA subband 46";
|
||||
description "container for collection of leafs for LAA sub-band 46";
|
||||
uses sub-band-info;
|
||||
}
|
||||
|
||||
@@ -747,12 +1208,15 @@ module o-ran-module-cap {
|
||||
|
||||
leaf max-num-component-carriers {
|
||||
type uint8;
|
||||
description "maximum number of component carriers supported by the O-RU";
|
||||
description "maximum number of component carriers supported by the O-RU. This parameter is the
|
||||
cumulative value of 'max-num-carriers-dl' and 'max-num-carriers-ul'";
|
||||
}
|
||||
|
||||
leaf max-num-bands {
|
||||
type uint16;
|
||||
description "maximum number of bands supported by the O-RU";
|
||||
status deprecated;
|
||||
description "maximum number of bands supported by the O-RU.
|
||||
Parameter moved to ru-capabilities, hence deprecated";
|
||||
}
|
||||
|
||||
leaf max-num-sectors {
|
||||
@@ -764,34 +1228,48 @@ module o-ran-module-cap {
|
||||
type decimal64{
|
||||
fraction-digits 4;
|
||||
}
|
||||
status deprecated;
|
||||
description
|
||||
"This value indicates Maximum Power per band per antenna. Value unit is dBm.";
|
||||
"This value indicates Maximum Power per band per antenna. Value unit is dBm.
|
||||
|
||||
The parameter is deprecated. min-gain and max-gain define constraints related to
|
||||
TX power budget, as defined in CUS-Plane, clause 8.1.3.3.";
|
||||
}
|
||||
|
||||
leaf min-power-per-antenna {
|
||||
type decimal64{
|
||||
fraction-digits 4;
|
||||
}
|
||||
status deprecated;
|
||||
description
|
||||
"This value indicates Minimum Power per band per antenna. Value unit is dBm.";
|
||||
"This value indicates Minimum Power per band per antenna. Value unit is dBm.
|
||||
|
||||
The parameter is deprecated. min-gain and max-gain define constraints related to
|
||||
TX power budget, as defined in CUS-Plane, clause 8.1.3.3.";
|
||||
}
|
||||
|
||||
leaf codebook-configuration_ng {
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"This parameter informs the precoder codebook_ng that are used for precoding";
|
||||
"This parameter informs the precoder codebook_ng that are used for precoding.
|
||||
Parameter deprecated since antenna topology already specified in [tr]x-array";
|
||||
}
|
||||
|
||||
leaf codebook-configuration_n1 {
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"This parameter informs the precoder codebook_n1 that are used for precoding";
|
||||
"This parameter informs the precoder codebook_n1 that are used for precoding
|
||||
Parameter deprecated since antenna topology already specified in [tr]x-array";
|
||||
}
|
||||
|
||||
leaf codebook-configuration_n2 {
|
||||
type uint8;
|
||||
status deprecated;
|
||||
description
|
||||
"This parameter informs the precoder codebook_n2 that are used for precoding";
|
||||
"This parameter informs the precoder codebook_n2 that are used for precoding
|
||||
Parameter deprecated since antenna topology already specified in [tr]x-array";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -836,5 +1314,5 @@ module o-ran-module-cap {
|
||||
"This value indicates that the O-RU can manage the contention window locally.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -23,6 +23,14 @@ module o-ran-processing-element {
|
||||
prefix "o-ran-int";
|
||||
}
|
||||
|
||||
import o-ran-wg4-features {
|
||||
prefix "feat";
|
||||
}
|
||||
|
||||
import o-ran-usermgmt {
|
||||
prefix "or-user";
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
@@ -32,7 +40,7 @@ module o-ran-processing-element {
|
||||
"This module defines the YANG definitions for mapping of transport flows to
|
||||
processing elements. Three options are supported:
|
||||
i) virtual MAC based mapping
|
||||
ii) MAC addrress + VLAN-ID based mapping
|
||||
ii) MAC address + VLAN-ID based mapping
|
||||
iii) UDP/IP based mapping
|
||||
|
||||
Copyright 2020 the O-RAN Alliance.
|
||||
@@ -61,16 +69,37 @@ module o-ran-processing-element {
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2020-04-17" {
|
||||
description
|
||||
"version 3.0.0
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) added new enum SHARED-CELL-ETH-INTERFACE in
|
||||
transport-session-type and new containers north-eth-flow and
|
||||
south-eth-flow to enable Shared cell scenario.";
|
||||
1) introducing SHARED-ORU-MULTI-OPERATOR feature
|
||||
2) fixing constraints";
|
||||
|
||||
reference "ORAN-WG4.M.0-v03.00";
|
||||
}
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 8.0.0
|
||||
|
||||
1) typographical corrections in descriptions.
|
||||
2) Add support for multiple transport-session-type per O-RU";
|
||||
|
||||
reference "ORAN-WG4.M.0-v08.00";
|
||||
}
|
||||
|
||||
|
||||
revision "2020-04-17" {
|
||||
description
|
||||
"version 3.0.0
|
||||
|
||||
1) added new enum SHARED-CELL-ETH-INTERFACE in
|
||||
transport-session-type and new containers north-eth-flow and
|
||||
south-eth-flow to enable Shared cell scenario.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v03.00";
|
||||
}
|
||||
|
||||
revision "2019-07-03" {
|
||||
description
|
||||
@@ -78,7 +107,7 @@ module o-ran-processing-element {
|
||||
|
||||
1) added new leaf to enable O-RU to report the maximum number of
|
||||
transport flows it can support, e.g., due to restrictions on number
|
||||
of VLAN-IDs when ethernet type transport is used.";
|
||||
of VLAN-IDs when Ethernet type transport is used.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
@@ -99,16 +128,162 @@ module o-ran-processing-element {
|
||||
}
|
||||
// groupings
|
||||
|
||||
grouping pe-group {
|
||||
leaf maximum-number-of-transport-flows {
|
||||
type uint16 {
|
||||
range "1..4094";
|
||||
grouping non-shared-cell-flow-group {
|
||||
description "a grouping for non-shared cell O-RU flows";
|
||||
|
||||
container aliasmac-flow {
|
||||
when "../../../transport-session-type = 'ALIASMAC-INTERFACE'";
|
||||
if-feature o-ran-int:ALIASMAC-BASED-CU-PLANE;
|
||||
description "leafs for virtual mac type data flows";
|
||||
leaf ru-aliasmac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:alias-macs";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's alias MAC address used for alias MAC based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for alias MAC based flow";
|
||||
}
|
||||
leaf o-du-mac-address {
|
||||
type yang:mac-address;
|
||||
mandatory true;
|
||||
description
|
||||
"O-DU's MAC address used for alias MAC based flow";
|
||||
}
|
||||
config false;
|
||||
default 4094;
|
||||
description
|
||||
"The maximum number of transport flows that can be supported by an O-RU";
|
||||
}
|
||||
container eth-flow {
|
||||
when "../../../transport-session-type = 'ETH-INTERFACE'";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf o-du-mac-address {
|
||||
type yang:mac-address;
|
||||
mandatory true;
|
||||
description
|
||||
"O-DU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
}
|
||||
container udpip-flow {
|
||||
when "../../../transport-session-type = 'UDPIP-INTERFACE'";
|
||||
description "leafs for UDP/IP type data flows";
|
||||
choice address {
|
||||
leaf ru-ipv4-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv4/ip:address/ip:ip";
|
||||
}
|
||||
description "O-RU's IPv4 address";
|
||||
}
|
||||
leaf ru-ipv6-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv6/ip:address/ip:ip";
|
||||
}
|
||||
description "O-RU's IPv6 address";
|
||||
}
|
||||
mandatory true;
|
||||
description "choice of O-RU IPv4 or IPv6 address";
|
||||
}
|
||||
leaf o-du-ip-address {
|
||||
type inet:ip-address;
|
||||
mandatory true;
|
||||
description "O-DU's IP address";
|
||||
}
|
||||
leaf ru-ephemeral-udp-port {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description
|
||||
"ephemeral port used by O-RU";
|
||||
}
|
||||
leaf o-du-ephemeral-udp-port {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description
|
||||
"ephemeral port used by O-DU";
|
||||
}
|
||||
leaf ecpri-destination-udp {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description "the well-known UDP port number used by eCPRI";
|
||||
// fixme - add in a default when allocated by IANA
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouping shared-cell-flow-group {
|
||||
description "a grouping for shared cell O-RU flows";
|
||||
|
||||
container north-eth-flow {
|
||||
when "../../../transport-session-type = 'SHARED-CELL-ETH-INTERFACE'";
|
||||
if-feature "SHARED_CELL";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
}
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf north-node-mac-address {
|
||||
type yang:mac-address;
|
||||
description
|
||||
"North-node's MAC address used for Ethernet based flow";
|
||||
}
|
||||
}
|
||||
container south-eth-flow {
|
||||
when "../../../transport-session-type = 'SHARED-CELL-ETH-INTERFACE'";
|
||||
if-feature "SHARED_CELL";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
}
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf south-node-mac-address {
|
||||
type yang:mac-address;
|
||||
description
|
||||
"south-node's MAC address used for Ethernet based flow";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouping session-and-markings-group {
|
||||
description "a grouping with transport session type and enhanced uplane markings";
|
||||
|
||||
leaf transport-session-type {
|
||||
type enumeration {
|
||||
enum ETH-INTERFACE {
|
||||
@@ -158,7 +333,7 @@ module o-ran-processing-element {
|
||||
case ipv4 {
|
||||
when "(../../transport-session-type = 'UDPIP-INTERFACE')";
|
||||
leaf upv4-dscp-name {
|
||||
if-feature o-ran-int:UDPIP-BASED-CU-PLANE;
|
||||
if-feature o-ran-int:UDPIP-BASED-CU-PLANE;
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface/ip:ipv4/o-ran-int:diffserv-markings/o-ran-int:enhanced-uplane-markings/o-ran-int:up-marking-name";
|
||||
}
|
||||
@@ -168,7 +343,7 @@ module o-ran-processing-element {
|
||||
case ipv6 {
|
||||
when "(../../transport-session-type = 'UDPIP-INTERFACE')";
|
||||
leaf upv6-dscp-name {
|
||||
if-feature o-ran-int:UDPIP-BASED-CU-PLANE;
|
||||
if-feature o-ran-int:UDPIP-BASED-CU-PLANE;
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface/ip:ipv6/o-ran-int:diffserv-markings/o-ran-int:enhanced-uplane-markings/o-ran-int:up-marking-name";
|
||||
}
|
||||
@@ -178,6 +353,21 @@ module o-ran-processing-element {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouping pe-group {
|
||||
description "a grouping of processing elements";
|
||||
leaf maximum-number-of-transport-flows {
|
||||
type uint16 {
|
||||
range "1..4094";
|
||||
}
|
||||
default 4094;
|
||||
config false;
|
||||
description
|
||||
"The maximum number of transport flows that can be supported by an O-RU";
|
||||
}
|
||||
uses session-and-markings-group;
|
||||
|
||||
list ru-elements {
|
||||
key "name";
|
||||
description
|
||||
@@ -193,6 +383,17 @@ module o-ran-processing-element {
|
||||
This name may be used in fault management to refer to a fault source
|
||||
or affected object";
|
||||
}
|
||||
leaf sro-id {
|
||||
if-feature feat:SHARED-ORU-MULTI-OPERATOR;
|
||||
type leafref {
|
||||
path "/or-user:users/or-user:user/or-user:sro-id";
|
||||
}
|
||||
description
|
||||
"The identity of a shared resource operator. When present,
|
||||
indicates that the list entry corresponds to a processing element
|
||||
associated with a shared resource operator where the sro-id identifies
|
||||
the specific shared resource operator";
|
||||
}
|
||||
container transport-flow {
|
||||
description
|
||||
"container for the transport-flow used for CU plane";
|
||||
@@ -202,154 +403,66 @@ module o-ran-processing-element {
|
||||
}
|
||||
description "the interface name ";
|
||||
}
|
||||
container aliasmac-flow {
|
||||
when "../../../transport-session-type = 'ALIASMAC-INTERFACE'";
|
||||
if-feature o-ran-int:ALIASMAC-BASED-CU-PLANE;
|
||||
description "leafs for virtual mac type data flows";
|
||||
leaf ru-aliasmac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:alias-macs";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's alias MAC address used for alias MAC based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for alias MAC based flow";
|
||||
}
|
||||
leaf o-du-mac-address {
|
||||
type yang:mac-address;
|
||||
mandatory true;
|
||||
description
|
||||
"O-DU's MAC address used for alias MAC based flow";
|
||||
uses non-shared-cell-flow-group;
|
||||
uses shared-cell-flow-group;
|
||||
|
||||
}
|
||||
}
|
||||
list additional-transport-session-type-elements {
|
||||
if-feature "feat:MULTIPLE-TRANSPORT-SESSION-TYPE";
|
||||
key transport-session-type;
|
||||
|
||||
description
|
||||
"Added to support multiple transport-session-type per O-RU,
|
||||
it is always assumed that /processing-elements/ru-elements/ is configured with the first type of transport,
|
||||
and /processing-element/additional-transport-session-elements/ru-elements/ is configured with the other types of transport.
|
||||
If the O-RU is configured for shared-cell, this list will not be used. An O-RU shall reject any configuration
|
||||
with a list entry with transport-session-type set to SHARED-CELL-ETH-INTERFACE";
|
||||
|
||||
uses session-and-markings-group;
|
||||
|
||||
list ru-elements {
|
||||
key "name";
|
||||
description
|
||||
"the list of transport definitions for each processing element";
|
||||
leaf name {
|
||||
type string {
|
||||
length "1..255";
|
||||
}
|
||||
description
|
||||
"A name that is unique across the O-RU that identifies a processing
|
||||
element instance.
|
||||
|
||||
This name may be used in fault management to refer to a fault source
|
||||
or affected object";
|
||||
}
|
||||
container eth-flow {
|
||||
when "../../../transport-session-type = 'ETH-INTERFACE'";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf o-du-mac-address {
|
||||
type yang:mac-address;
|
||||
mandatory true;
|
||||
description
|
||||
"O-DU's MAC address used for Ethernet based flow";
|
||||
leaf sro-id {
|
||||
if-feature feat:SHARED-ORU-MULTI-OPERATOR;
|
||||
type leafref {
|
||||
path "/or-user:users/or-user:user/or-user:sro-id";
|
||||
}
|
||||
description
|
||||
"The identity of a shared resource operator. When present,
|
||||
indicates that the list entry corresponds to a processing element
|
||||
associated with a shared resource operator where the sro-id identifies
|
||||
the specific shared resource operator";
|
||||
}
|
||||
container udpip-flow {
|
||||
when "../../../transport-session-type = 'UDPIP-INTERFACE'";
|
||||
description "leafs for UDP/IP type data flows";
|
||||
choice address {
|
||||
leaf ru-ipv4-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv4/ip:address/ip:ip";
|
||||
}
|
||||
description "O-RU's IPv4 address";
|
||||
}
|
||||
leaf ru-ipv6-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv6/ip:address/ip:ip";
|
||||
}
|
||||
description "O-RU's IPv6 address";
|
||||
}
|
||||
mandatory true;
|
||||
description "choice of O-RU IPv4 or IPv6 address";
|
||||
}
|
||||
leaf o-du-ip-address {
|
||||
type inet:ip-address;
|
||||
mandatory true;
|
||||
description "O-DU's IPv address";
|
||||
}
|
||||
leaf ru-ephemeral-udp-port {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description
|
||||
"ephemeral port used by O-RU";
|
||||
}
|
||||
leaf o-du-ephemeral-udp-port {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description
|
||||
"ephemeral port used by O-DU";
|
||||
}
|
||||
leaf ecpri-destination-udp {
|
||||
type inet:port-number;
|
||||
mandatory true;
|
||||
description "the well known UDP port number used by eCPRI";
|
||||
// fixme - add in a default when allocated by IANA
|
||||
}
|
||||
}
|
||||
container north-eth-flow {
|
||||
when "../../../transport-session-type = 'SHARED-CELL-ETH-INTERFACE'";
|
||||
if-feature "SHARED_CELL";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
container transport-flow {
|
||||
description
|
||||
"container for the transport-flow used for CU plane";
|
||||
leaf interface-name {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
path "/if:interfaces/if:interface/if:name";
|
||||
}
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf north-node-mac-address {
|
||||
type yang:mac-address;
|
||||
description
|
||||
"North-node's MAC address used for Ethernet based flow";
|
||||
}
|
||||
}
|
||||
container south-eth-flow {
|
||||
when "../../../transport-session-type = 'SHARED-CELL-ETH-INTERFACE'";
|
||||
if-feature "SHARED_CELL";
|
||||
description "leafs for mac + vlan-id type data flows";
|
||||
leaf ru-mac-address {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:mac-address";
|
||||
}
|
||||
description
|
||||
"O-RU's MAC address used for Ethernet based flow";
|
||||
}
|
||||
leaf vlan-id {
|
||||
type leafref {
|
||||
path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/o-ran-int:vlan-id";
|
||||
}
|
||||
description
|
||||
"O-RU's VLAN-ID used for Ethernet based flow";
|
||||
}
|
||||
leaf south-node-mac-address {
|
||||
type yang:mac-address;
|
||||
description
|
||||
"south-node's MAC address used for Ethernet based flow";
|
||||
description "the interface name ";
|
||||
}
|
||||
uses non-shared-cell-flow-group;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// top level container
|
||||
// top-level container
|
||||
|
||||
container processing-elements {
|
||||
description
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,331 @@
|
||||
module o-ran-usermgmt {
|
||||
yang-version 1.1;
|
||||
namespace "urn:o-ran:user-mgmt:1.0";
|
||||
prefix "o-ran-usermgmt";
|
||||
|
||||
import ietf-netconf-acm {
|
||||
prefix nacm;
|
||||
reference
|
||||
"RFC 8341: Network Configuration Access Control Model";
|
||||
}
|
||||
|
||||
import o-ran-wg4-features {
|
||||
prefix "feat";
|
||||
}
|
||||
|
||||
import ietf-crypto-types {
|
||||
prefix ct;
|
||||
}
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module defines the user management model for the O-RAN Equipment.
|
||||
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the above disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the above disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the Members of the O-RAN Alliance nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 16.0.0
|
||||
|
||||
1) add SSH Public Key.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v16.00";
|
||||
}
|
||||
|
||||
revision "2023-12-11" {
|
||||
description
|
||||
"version 10.1.0
|
||||
|
||||
1) clarify handling of User-Names.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
|
||||
1) introduced SHARED-ORU-MULTI-OPERATOR feature.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 1.3.0
|
||||
|
||||
1) typographical corrections in descriptions";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2020-12-10" {
|
||||
description
|
||||
"version 1.2.0
|
||||
|
||||
1) updated description for enabled leaf";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2019-07-03" {
|
||||
description
|
||||
"version 1.1.0
|
||||
|
||||
1) change name leaf to type nacm:user-name-type
|
||||
2) added account-type to qualify when password is required ";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
revision "2019-02-04" {
|
||||
description
|
||||
"version 1.0.0
|
||||
|
||||
1) imported model from xRAN
|
||||
2) changed namespace and reference from xran to o-ran";
|
||||
|
||||
reference "ORAN-WG4.M.0-v01.00";
|
||||
}
|
||||
|
||||
typedef password-type {
|
||||
type string {
|
||||
length "8..128";
|
||||
pattern "[a-zA-Z0-9!$%\\^()\\[\\]_\\-~{}.+]*" {
|
||||
error-message "Password content does not meet the requirements";
|
||||
}
|
||||
}
|
||||
description
|
||||
"The password for this entry.
|
||||
The Password must contain at least 2 characters from
|
||||
each of the following groups:
|
||||
a) Lower case alphabetic (a-z)
|
||||
b) Upper case alphabetic (A-Z)
|
||||
c) Numeric 0-9
|
||||
d) Special characters Allowed !$%^()[]_-~{}.+
|
||||
Password must not contain Username.
|
||||
|
||||
When a password is received by a NETCONF server,
|
||||
it should be securely stored in the O-RU's configuration datastore.
|
||||
How to securely store the password in the datastore is implementation-specific
|
||||
and out of scope of WG4 M-Plane specification.";
|
||||
}
|
||||
|
||||
grouping user-list {
|
||||
description "a user list grouping";
|
||||
list user {
|
||||
key "name";
|
||||
description
|
||||
"The list of local users configured on this device.";
|
||||
leaf name {
|
||||
type nacm:user-name-type;
|
||||
description
|
||||
"The user name string identifying this entry.
|
||||
|
||||
NOTE: o-ran-usermgmt:user-profile/user/name is
|
||||
identical to nacm:nacm/groups/group/user-name
|
||||
but the current schema is preserved for backwards
|
||||
compatibility.";
|
||||
}
|
||||
leaf account-type {
|
||||
type enumeration {
|
||||
enum PASSWORD {
|
||||
description "the user-name is for password based authentication";
|
||||
}
|
||||
enum CERTIFICATE {
|
||||
description "the user-name is for certificate based authentication";
|
||||
}
|
||||
enum SSHPUBLICKEY {
|
||||
if-feature feat:CLIENT-AUTH-SSH-PUBLIC-KEY;
|
||||
description "the user-name is for public key based authentication";
|
||||
}
|
||||
}
|
||||
default "PASSWORD";
|
||||
description "the account type";
|
||||
}
|
||||
|
||||
leaf password {
|
||||
nacm:default-deny-all;
|
||||
type password-type;
|
||||
description
|
||||
"The password for this entry.
|
||||
|
||||
This field is only valid when account-type is PASSWORD,
|
||||
i.e., when account-type is NOT present or present and set to
|
||||
PASSWORD.";
|
||||
}
|
||||
|
||||
container ssh-public-key {
|
||||
nacm:default-deny-all;
|
||||
when "../account-type='SSHPUBLICKEY'";
|
||||
if-feature feat:CLIENT-AUTH-SSH-PUBLIC-KEY;
|
||||
uses ct:public-key-grouping;
|
||||
description
|
||||
"The SSH pubic key for this entry.
|
||||
|
||||
This field is valid only when account-type is SSHPUBLICKEY.";
|
||||
}
|
||||
|
||||
leaf enabled {
|
||||
type boolean;
|
||||
description
|
||||
"Indicates whether an account is enabled or disabled.
|
||||
|
||||
A NETCONF Server shall reject a configuration that attempts to
|
||||
enable a Password account for an account where the password leaf
|
||||
is not configured.
|
||||
|
||||
This validation statement is included in the YANG description and
|
||||
not in a MUST statement to preserve backwards compatibility.";
|
||||
}
|
||||
leaf-list sro-id {
|
||||
if-feature feat:SHARED-ORU-MULTI-OPERATOR;
|
||||
type string;
|
||||
description
|
||||
"An optional list if Shared Resource Operator identities associated with the
|
||||
user-account. Used to realize enhanced access privileges in a shared O-RU.
|
||||
When an sro-id is configured in the O-RU, the O-RU shall
|
||||
implement additional sro-id based NETCONF access control
|
||||
as specified in O-RAN.WG4.MP.0-v10.00.
|
||||
The O-RU does not further interpret the specific value of sro-id.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
container users {
|
||||
must "user/enabled='true'" {
|
||||
error-message "At least one account needs to be enabled.";
|
||||
}
|
||||
//TAKE NOTE - any configuration with zero enabled users is invalid.
|
||||
//This will typically be the case when using a simulated NETCONF Server
|
||||
//and so this constraint should be removed when operating in those scenarios
|
||||
|
||||
//The config data base of the O-RAN equipment should ensure that the user
|
||||
//default account is enabled on factory restart
|
||||
|
||||
description "list of user accounts";
|
||||
uses user-list;
|
||||
}
|
||||
|
||||
rpc chg-password {
|
||||
description "the RPC used to change a password";
|
||||
nacm:default-deny-all;
|
||||
input {
|
||||
leaf currentPassword {
|
||||
type password-type;
|
||||
mandatory true;
|
||||
description
|
||||
"provide the current password";
|
||||
}
|
||||
leaf newPassword {
|
||||
type password-type;
|
||||
mandatory true;
|
||||
description
|
||||
"provide a new password";
|
||||
}
|
||||
leaf newPasswordConfirm {
|
||||
type password-type;
|
||||
mandatory true;
|
||||
description
|
||||
"re-enter the new password ";
|
||||
}
|
||||
}
|
||||
output {
|
||||
leaf status {
|
||||
type enumeration {
|
||||
enum "Successful" {
|
||||
value 1;
|
||||
description "change password operation is successful";
|
||||
}
|
||||
enum "Failed" {
|
||||
value 2;
|
||||
description "change password operation failed";
|
||||
}
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"Successful or Failed";
|
||||
}
|
||||
leaf status-message {
|
||||
type string;
|
||||
description
|
||||
"Gives a more detailed reason for success / failure";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rpc chg-ssh-public-key {
|
||||
if-feature feat:CLIENT-AUTH-SSH-PUBLIC-KEY;
|
||||
description "the RPC used to change SSH public key";
|
||||
nacm:default-deny-all;
|
||||
input {
|
||||
container current-ssh-public-key {
|
||||
uses ct:public-key-grouping;
|
||||
description
|
||||
"provide the current SSH public algorithm and key";
|
||||
}
|
||||
container new-ssh-public-key {
|
||||
uses ct:public-key-grouping;
|
||||
description
|
||||
"provide a new SSH public algorithm and key";
|
||||
}
|
||||
container new-ssh-public-key-confirm {
|
||||
uses ct:public-key-grouping;
|
||||
description
|
||||
"re-enter the new SSH public algorithm and key";
|
||||
}
|
||||
}
|
||||
output {
|
||||
leaf status {
|
||||
type enumeration {
|
||||
enum "Successful" {
|
||||
value 1;
|
||||
description "change SSH public key operation is successful";
|
||||
}
|
||||
enum "Failed" {
|
||||
value 2;
|
||||
description "change SSH public key operation failed";
|
||||
}
|
||||
}
|
||||
mandatory true;
|
||||
description
|
||||
"Successful or Failed";
|
||||
}
|
||||
leaf status-message {
|
||||
type string;
|
||||
description
|
||||
"Gives a more detailed reason for success / failure";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,532 @@
|
||||
module o-ran-wg4-features {
|
||||
yang-version 1.1;
|
||||
namespace "urn:o-ran:wg4feat:1.0";
|
||||
prefix "o-ran-feat";
|
||||
|
||||
|
||||
organization "O-RAN Alliance";
|
||||
|
||||
contact
|
||||
"www.o-ran.org";
|
||||
|
||||
description
|
||||
"This module defines the set of re-usable type definitions for WG4 specific
|
||||
features.
|
||||
|
||||
Copyright 2024 the O-RAN Alliance.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the above disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the above disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the Members of the O-RAN Alliance nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.";
|
||||
|
||||
revision "2024-08-12" {
|
||||
description
|
||||
"version 16.0.0
|
||||
new features:
|
||||
|
||||
1) PRG-SIZE-SUPP-SE-21-WITH-ST6
|
||||
2) PRG-SIZE-SUPP-SE-21-WITH-ST5
|
||||
3) USER-GROUP-OPTIMIZATION
|
||||
4) BF-DELAY-PROFILE
|
||||
5) DMRS-BF-EQ
|
||||
6) DMRS-BF-NEQ
|
||||
7) RRM-MEAS-REPORTING
|
||||
8) USER-GROUP-SELF-ASSEMBLY
|
||||
9) UEID-PERSISTENCE
|
||||
10) CONTINUITY-BLOCK-SIZE
|
||||
11) SELECTED-BF-METHOD-CONFIGURATION
|
||||
12) DMRS-BF-NEQ-UNALTERED-FREQ-OFFSET
|
||||
13) DMRS-BF-NEQ-UNALTERED-TAE
|
||||
14) SE10-MEMBER-CANDIDATE-LIST
|
||||
15) MACSEC-BYPASS-POLICY
|
||||
16) SE27-ODU-CONTROLLED-DIMENSIONALITY-REDUCTION
|
||||
17) SE20-MULTI-SD-PUNC-PATTERN-SUPPORT
|
||||
18) CONFIGURABLE-VSWR-THRESHOLDS
|
||||
19) CLIENT-AUTH-SSH-PUBLIC-KEY
|
||||
20) POINT-A-OFFSET-TO-ABSOLUTE-FREQUENCY-CENTER";
|
||||
|
||||
reference "ORAN-WG4.M.0-v16.00";
|
||||
}
|
||||
|
||||
revision "2024-04-15" {
|
||||
description
|
||||
"version 15.0.0
|
||||
new features:
|
||||
|
||||
1) PRG-SIZE-SUPP-SE-21-WITH-ST6
|
||||
2) PRG-SIZE-SUPP-SE-21-WITH-ST5
|
||||
3) BF-DELAY-PROFILE
|
||||
4) USER-GROUP-OPTIMIZATION
|
||||
5) MULTIPLE-BEAMID-TABLES-SUPPORTED
|
||||
6) PER-PORT-PTP-CONFIG
|
||||
7) PER-PORT-SYNCE-CONFIG
|
||||
8) MPLANE-TRX-CONTROL
|
||||
9) PER-INT-TCP-MSS
|
||||
10) DEEP-HIBERNATE";
|
||||
|
||||
reference "ORAN-WG4.M.0-v15.00";
|
||||
}
|
||||
|
||||
revision "2023-12-11" {
|
||||
description
|
||||
"version 14.0.0
|
||||
new features:
|
||||
|
||||
1) SE23-PRB-BLOCK-MODE-SUPPORT
|
||||
2) MPLANE-DATA-LAYER-CONTROL
|
||||
3) SHARED-CELL-STATS";
|
||||
|
||||
reference "ORAN-WG4.M.0-v14.00";
|
||||
}
|
||||
|
||||
revision "2023-08-14" {
|
||||
description
|
||||
"version 13.0.0
|
||||
new features:
|
||||
|
||||
1) CALL-HOME-REACTIVATION-SUPPORTED
|
||||
2) SEQ-ID-CHECKING-CONFIGURABLE
|
||||
3) TRX-CONTROL
|
||||
4) ADVANCED-SLEEP-MODE";
|
||||
|
||||
reference "ORAN-WG4.M.0-v13.00";
|
||||
}
|
||||
|
||||
revision "2023-04-10" {
|
||||
description
|
||||
"version 12.0.0
|
||||
new features:
|
||||
|
||||
1) EXTENDED-PRACH-CONFIGURATION
|
||||
2) NON-SCHEDULED-UEID
|
||||
3) SE11-WITH-CONTINUITY-BIT-SUPPORT
|
||||
4) UPLANE-MESSAGE-PROCESSING-LIMITS";
|
||||
|
||||
reference "ORAN-WG4.M.0-v12.00";
|
||||
}
|
||||
|
||||
revision "2022-12-05" {
|
||||
description
|
||||
"version 11.0.0
|
||||
new features:
|
||||
|
||||
1) UPLANE-ONLY-DL-MODE
|
||||
2) SUPERVISION-WITH-SESSION-ID
|
||||
3) INTEGRITY-CHECK-AT-SW-DOWNLOAD
|
||||
4) ST4-SLOT-CONFIG-MSG-SUPPORT";
|
||||
|
||||
reference "ORAN-WG4.M.0-v11.00";
|
||||
}
|
||||
|
||||
|
||||
revision "2022-08-15" {
|
||||
description
|
||||
"version 10.0.0
|
||||
new features:
|
||||
1) SHARED-ORU-MULTI-ODU
|
||||
2) SHARED-ORU-MULTI-OPERATOR";
|
||||
reference "ORAN-WG4.M.0-v10.00";
|
||||
}
|
||||
|
||||
revision "2021-12-01" {
|
||||
description
|
||||
"version 8.0.0
|
||||
new features:
|
||||
1) Typographical corrections in descriptions
|
||||
2) Add new features:
|
||||
BEAM-UPDATE-CONTENTION-CONTROL
|
||||
MULTIPLE-SCS-IN-EAXC
|
||||
ENHANCED-T-COMBINE
|
||||
CHANNEL-INFORMATION-COMPRESSION
|
||||
CHANNEL-INFORMATION-PRB-GROUP
|
||||
MULTIPLE-TRANSPORT-SESSION-TYPE";
|
||||
reference "ORAN-WG4.M.0-v08.00";
|
||||
}
|
||||
|
||||
revision "2021-07-26" {
|
||||
description
|
||||
"version 7.0.0
|
||||
|
||||
new features:
|
||||
1) EXT-ANT-DELAY-CONTRO
|
||||
2) CPLANE-MESSAGE-PROCESSING-LIMITS";
|
||||
|
||||
reference "ORAN-WG4.M.0-v07.00";
|
||||
}
|
||||
|
||||
revision "2021-03-22" {
|
||||
description
|
||||
"version 6.0.0
|
||||
|
||||
1) Features added to handle updated transmission window control:
|
||||
STATIC-TRANSMISSION-WINDOW-CONTROL
|
||||
DYNAMIC-TRANSMISSION-WINDOW-CONTROL
|
||||
UNIFORMLY-DISTRIBUTED-TRANSMISSION
|
||||
ORDERED-TRANSMISSION
|
||||
INDEPENDENT-TRANSMISSION-WINDOW-CONTROL
|
||||
";
|
||||
|
||||
reference "ORAN-WG4.M.0-v06.00";
|
||||
}
|
||||
|
||||
revision "2020-12-10" {
|
||||
description
|
||||
"version 5.0.0
|
||||
|
||||
1) initial version.";
|
||||
|
||||
reference "ORAN-WG4.M.0-v05.00";
|
||||
}
|
||||
|
||||
feature NON-PERSISTENT-MPLANE {
|
||||
description
|
||||
"Indicates that the Radio Unit supports the optional
|
||||
capability to improve the operation with a SMO using a non-
|
||||
persistent NETCONF session.";
|
||||
}
|
||||
|
||||
feature STATIC-TRANSMISSION-WINDOW-CONTROL {
|
||||
description
|
||||
"O-RU supports U-plane transmission window control (scheduled transmission
|
||||
and optionally uniformly distributed transmission) configuration over M-plane";
|
||||
}
|
||||
|
||||
feature DYNAMIC-TRANSMISSION-WINDOW-CONTROL {
|
||||
description
|
||||
"O-RU supports U-plane transmission window control (scheduled transmission
|
||||
and optionally uniformly distributed transmission) configuration over C-plane";
|
||||
}
|
||||
|
||||
feature UNIFORMLY-DISTRIBUTED-TRANSMISSION {
|
||||
if-feature "STATIC-TRANSMISSION-WINDOW-CONTROL or DYNAMIC-TRANSMISSION-WINDOW-CONTROL";
|
||||
description
|
||||
"O-RU supports transmission of UL U-plane messages distributed uniformly over transmission window.";
|
||||
}
|
||||
|
||||
feature ORDERED-TRANSMISSION {
|
||||
description
|
||||
"O-RU supports ordered transmission";
|
||||
}
|
||||
|
||||
feature INDEPENDENT-TRANSMISSION-WINDOW-CONTROL {
|
||||
if-feature "STATIC-TRANSMISSION-WINDOW-CONTROL or DYNAMIC-TRANSMISSION-WINDOW-CONTROL";
|
||||
description
|
||||
"O-RU supports independent U-plane transmission window per endpoint.
|
||||
|
||||
If this feature is not supported then for all endpoints with transmission control enabled
|
||||
(see u-plane-transmission-control/transmission-window-control) must be configured for transmission
|
||||
window offsets and window sizes that coincide for each symbol.
|
||||
|
||||
If INDEPENDENT-TRANSMISSION-WINDOW-CONTROL feature is not supported then all endpoints with
|
||||
transmission control enabled that handle the same carrier type and SCS must be configured
|
||||
(via M-plane or C-plane) with parameter values resulting in transmission windows that coincide
|
||||
between the endpoints. That is, for every symbol N, the effective transmission window for symbol N
|
||||
must be shared (start at the same time and end at the same time) by all the endpoints handling
|
||||
same carrier type and SCS. This restriction applies only to endpoints that have transmission
|
||||
control enabled.
|
||||
|
||||
If INDEPENDENT-TRANSMISSION-WINDOW-CONTROL feature is supported then restriction described
|
||||
above does not apply and a different transmission window (window offset and window size)
|
||||
can be used for every endpoint capable of transmission window control.";
|
||||
}
|
||||
|
||||
feature EXT-ANT-DELAY-CONTROL {
|
||||
description
|
||||
"This feature indicates that the O-RU supports external antenna delay control";
|
||||
}
|
||||
|
||||
feature CPLANE-MESSAGE-PROCESSING-LIMITS {
|
||||
description
|
||||
"Feature to indicate O-RU limitation of C-Plane message processing. Refer CUS-Plane specification
|
||||
section 'O-RU C-Plane message limits' for more details on this feature.";
|
||||
}
|
||||
|
||||
feature CHANNEL-INFORMATION-COMPRESSION {
|
||||
description
|
||||
"This feature indicates that the O-RU supports channel information compression.";
|
||||
}
|
||||
|
||||
feature CHANNEL-INFORMATION-PRB-GROUP {
|
||||
description
|
||||
"Feature to indicate O-RU supports receiving and processing channel
|
||||
information (e.g., ST6) with PRB group size greater than one PRB";
|
||||
}
|
||||
|
||||
feature BEAM-UPDATE-CONTENTION-CONTROL {
|
||||
description
|
||||
"Feature to indicate O-RU requirements for beam weight update for a given beamId, to avoid beam update contentions.
|
||||
Refer CUS-Plane specification section 'Weight-based dynamic beamforming' for more details on this feature.";
|
||||
}
|
||||
|
||||
feature MULTIPLE-SCS-IN-EAXC {
|
||||
description
|
||||
"Presence of feature indicates that FHM supports combining for multiple SCS
|
||||
or multiple c-plane-types/frameStructure in a single eAxC-id in UL direction.";
|
||||
}
|
||||
|
||||
feature MULTIPLE-TRANSPORT-SESSION-TYPE {
|
||||
description
|
||||
"Feature to indicate O-RU supports to be configured with multiple transport-session-type
|
||||
(Ethernet, ALIASMAC, UDP/IP)";
|
||||
}
|
||||
|
||||
feature ENHANCED-T-COMBINE {
|
||||
description
|
||||
"Presence of feature indicates that FHM/Cascade O-RU can support t-combine-net and tx-duration";
|
||||
}
|
||||
|
||||
feature SHARED-ORU-MULTI-OPERATOR {
|
||||
description
|
||||
"Feature to indicate the O-RU supports shared operation with one or more shared
|
||||
resource operators (i.e., multiple MNOs) and implements enhanced NACM privileges per shared
|
||||
resource operator.
|
||||
|
||||
Note, there is no linkage or dependency between the SHARED-CELL feature and the SHARED-ORU feature.";
|
||||
}
|
||||
|
||||
feature SHARED-ORU-MULTI-ODU {
|
||||
description
|
||||
"Feature to indicate the O-RU supports independent supervision qualified based on odu-id, where
|
||||
loss of supervision triggers selective carrier deactivation of carriers associated with odu-id.";
|
||||
}
|
||||
|
||||
feature INTEGRITY-CHECK-AT-SW-DOWNLOAD {
|
||||
description "Feature indicates that radio unit support performing integrity check at software download";
|
||||
}
|
||||
|
||||
feature SUPERVISION-WITH-SESSION-ID {
|
||||
description
|
||||
"O-RUs supporting this feature reuse the session-id generated for each NETCONF
|
||||
session in supervision-notification. The session-id is defined in RFC 6241.
|
||||
For these O-RUs, the O-RU controller participating in the NETCONF supervision
|
||||
procedure can subscribe to supervision-notification notification events,
|
||||
filtering for the supervision-notification/session-id matching
|
||||
session-id in the Hello Message received from NETCONF Server earlier.";
|
||||
}
|
||||
|
||||
feature UPLANE-ONLY-DL-MODE {
|
||||
description
|
||||
"Presence of feature indicates that O-RU supports U-Plane-only DL mode.";
|
||||
}
|
||||
|
||||
feature ST4-SLOT-CONFIG-MSG-SUPPORT {
|
||||
description
|
||||
"Feature to indicate O-RU support for Section Type 4 slot configuration message";
|
||||
}
|
||||
feature NON-SCHEDULED-UEID {
|
||||
description
|
||||
"Feature to indicate that O-RU supports 'non-scheduled-ueid' to indicate the ports in the section which are not scheduled for a given eAxcid";
|
||||
}
|
||||
|
||||
feature EXTENDED-PRACH-CONFIGURATION {
|
||||
description
|
||||
"Presence of the feature indicates that O-RU supports extended number of PRACH patterns and occasions
|
||||
provided by means of static PRACH.";
|
||||
}
|
||||
|
||||
feature SE11-WITH-CONTINUITY-BIT-SUPPORT {
|
||||
description
|
||||
"Feature to indicate O-RU support for handling 'continuity' bit information in Section Extension 11";
|
||||
}
|
||||
|
||||
feature UPLANE-MESSAGE-PROCESSING-LIMITS {
|
||||
description
|
||||
"Feature to indicate O-RU limitation of U-Plane message processing. Refer M-Plane specification
|
||||
clause 15.10 for more details on this feature.";
|
||||
}
|
||||
|
||||
feature CALL-HOME-REACTIVATION-SUPPORTED {
|
||||
description
|
||||
"Presence of the feature indicates that O-RU supports re-activation of timed out call home flows.";
|
||||
}
|
||||
|
||||
feature SEQ-ID-CHECKING-CONFIGURABLE {
|
||||
description
|
||||
"Feature to indicate O-RU supports configuration of sequence number checking functionality.";
|
||||
}
|
||||
|
||||
feature TRX-CONTROL {
|
||||
description
|
||||
"Feature to indicate O-RU support for handling RF channel reconfiguration by TRX Control.";
|
||||
}
|
||||
|
||||
feature ADVANCED-SLEEP-MODE {
|
||||
description
|
||||
"Feature to indicate O-RU support for handling Advanced Sleep Modes.";
|
||||
}
|
||||
|
||||
feature SE23-PRB-BLOCK-MODE-SUPPORT {
|
||||
description
|
||||
"Presence of the feature indicates that O-RU supports PRB-BLOCK mode of SE-23 as defined in CUS-Plane
|
||||
specification Clause 7.7.23.1.";
|
||||
}
|
||||
|
||||
feature MPLANE-DATA-LAYER-CONTROL {
|
||||
description
|
||||
"Feature to indicate O-RU support for M-Plane based data layer control energy saving feature.";
|
||||
}
|
||||
|
||||
feature SHARED-CELL-STATS {
|
||||
description
|
||||
"Feature to indicate FHM/Cascade O-RU support for shared-cell-stats.";
|
||||
}
|
||||
|
||||
feature PER-PORT-PTP-CONFIG {
|
||||
description
|
||||
"This feature indicates that the equipment supports per-port PTP configuration functionality";
|
||||
}
|
||||
|
||||
feature PER-PORT-SYNCE-CONFIG {
|
||||
description
|
||||
"This feature indicates that the equipment supports per-port SYNCE configuration functionality";
|
||||
}
|
||||
|
||||
feature PER-INT-TCP-MSS {
|
||||
description
|
||||
"This feature indicates that the RU supports a per-interfacece MSS
|
||||
configuration for TCP.";
|
||||
}
|
||||
|
||||
feature MULTIPLE-BEAMID-TABLES-SUPPORTED {
|
||||
description
|
||||
"Feature to indicate O-RU support for multiple beamId tables.";
|
||||
}
|
||||
|
||||
feature MPLANE-TRX-CONTROL {
|
||||
description
|
||||
"Feature to indicate O-RU support for M-plane based TRX control for Network Energy Saving.";
|
||||
}
|
||||
|
||||
feature DEEP-HIBERNATE {
|
||||
description
|
||||
"Feature to indicate O-RU support for M-Plane based deep-hibernate energy saving feature.";
|
||||
}
|
||||
|
||||
feature PRG-SIZE-SUPP-SE-21-WITH-ST6 {
|
||||
description
|
||||
"Feature to indicate O-RU support for receiving prgSize information when Section Extension 21 is
|
||||
sent with Section Type 6.";
|
||||
}
|
||||
|
||||
feature PRG-SIZE-SUPP-SE-21-WITH-ST5 {
|
||||
description
|
||||
"Feature to indicate O-RU support for receiving prgSize information when Section Extension 21 is
|
||||
sent with Section Type 5.";
|
||||
}
|
||||
|
||||
feature USER-GROUP-OPTIMIZATION {
|
||||
description
|
||||
"Feature to indicate O-DU requirement to send all layers for a given user group i.e., UEs with same
|
||||
time-frequency allocation using single C-Plane section description.";
|
||||
}
|
||||
|
||||
feature BF-DELAY-PROFILE {
|
||||
description
|
||||
"Feature to indicate O-RU support for beamforming list and delay profiles(s) per endpoint.";
|
||||
}
|
||||
|
||||
feature DMRS-BF-EQ {
|
||||
description
|
||||
"DMRS beamforming with equalization supported. See CUS-plane clause 12.6";
|
||||
}
|
||||
|
||||
feature DMRS-BF-NEQ {
|
||||
description
|
||||
"DMRS beamforming without equalization supported. See CUS-plane clause 12.6";
|
||||
}
|
||||
|
||||
feature RRM-MEAS-REPORTING {
|
||||
description
|
||||
"Reporting of RRM measurmenets supported. See CUS-plane clause 12.6.1.6";
|
||||
}
|
||||
|
||||
feature USER-GROUP-SELF-ASSEMBLY {
|
||||
description
|
||||
"Feature to indicate user group self assembly. See CUS-Plane clause 7.7.24.7.";
|
||||
}
|
||||
|
||||
feature UEID-PERSISTENCE {
|
||||
description
|
||||
"Feature to indicate if ueId persistance over multiple slots is supported. See CUS-Plane clause 7.7.24.10.";
|
||||
}
|
||||
|
||||
feature CONTINUITY-BLOCK-SIZE {
|
||||
description
|
||||
"The O-RUs capability for reporting one or more values of continuity block sizes. See CUS-plane clause 12.6.1.2.1";
|
||||
}
|
||||
|
||||
feature SELECTED-BF-METHOD-CONFIGURATION {
|
||||
description
|
||||
"Feature to indicate O-RU support for configuration of a subset of beamforming methods from an
|
||||
endpoint-bf-profile-group that shall be used by a specific endpoint.";
|
||||
}
|
||||
|
||||
feature DMRS-BF-NEQ-UNALTERED-FREQ-OFFSET {
|
||||
description
|
||||
"Feature to indicate that DMRS-BF-NEQ beamforming performed by the O-RU does not change frequency offset,
|
||||
hence it can be measured by the O-DU.";
|
||||
}
|
||||
|
||||
feature DMRS-BF-NEQ-UNALTERED-TAE {
|
||||
description
|
||||
"Feature to indicate that DMRS-BF-NEQ beamforming performed by the O-RU does not change TAE,
|
||||
hence TAE can be measured by the O-DU. Refer CUS specification clause 9.2.2.1 for details.";
|
||||
}
|
||||
|
||||
feature SE10-MEMBER-CANDIDATE-LIST {
|
||||
description
|
||||
"Reporting of member-list of endpoints for SE-10 supporting endpoint. See CUS-plane clause 7.7.10.1";
|
||||
}
|
||||
|
||||
feature MACSEC-BYPASS-POLICY {
|
||||
description
|
||||
"O-RU supports MACsec bypass policy";
|
||||
}
|
||||
|
||||
feature SE27-ODU-CONTROLLED-DIMENSIONALITY-REDUCTION {
|
||||
description
|
||||
"Presence of the feature indicates that O-RU supports O-DU controlled dimensionality reduction using SE27 as defined in CUS-Plane
|
||||
specification Clause 7.7.27.";
|
||||
}
|
||||
|
||||
feature SE20-MULTI-SD-PUNC-PATTERN-SUPPORT {
|
||||
description
|
||||
"Feature to indicate O-RU support for handling multiple section description puncturing pattern in
|
||||
Section Extension 20 per endpoint.";
|
||||
}
|
||||
|
||||
feature CONFIGURABLE-VSWR-THRESHOLDS {
|
||||
description
|
||||
"Feature to indicate O-RU support for configurable VSWR thresholds.";
|
||||
}
|
||||
|
||||
feature CLIENT-AUTH-SSH-PUBLIC-KEY {
|
||||
description
|
||||
"O-RU supports an optional feature to authenticate SSH client via SSHPUBLICKEY method.";
|
||||
}
|
||||
|
||||
feature POINT-A-OFFSET-TO-ABSOLUTE-FREQUENCY-CENTER {
|
||||
description
|
||||
"Feature to indicate if leaf rx-array-carriers/point-a-offset-to-absolute-frequency-center is supported. See CUS-Plane clause 7.7.24.1.";
|
||||
}
|
||||
}
|
||||
@@ -172,14 +172,16 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
|
||||
struct xran_fh_init *fh_init = get_xran_fh_init();
|
||||
struct xran_fh_config *fh_cfg = get_xran_fh_config(0);
|
||||
int prach_sym = get_prach_conf_duration(0);
|
||||
nr_prach_info_t prach_info = get_prach_info(0);
|
||||
struct xran_ru_config *ru_conf = &fh_cfg->ru_conf;
|
||||
int slots_per_frame = 10 << fh_cfg->frame_conf.nNumerology;
|
||||
int slots_per_subframe = 1 << fh_cfg->frame_conf.nNumerology;
|
||||
|
||||
int tti = slots_per_frame * (frame) + (slot);
|
||||
uint32_t subframe = slot / slots_per_subframe;
|
||||
uint32_t is_prach_slot = xran_is_prach_slot(0, subframe, (slot % slots_per_subframe));
|
||||
// PRACH occasion in a frame if and only if SFN % x == y, TS 38.211 Table 6.3.3.2-2/3/4
|
||||
uint32_t is_prach_frame = (frame % prach_info.x == prach_info.y);
|
||||
uint32_t is_prach_slot = is_prach_frame && xran_is_prach_slot(0, subframe, (slot % slots_per_subframe));
|
||||
|
||||
int nb_rx_per_ru = ru->nb_rx / fh_init->xran_ports;
|
||||
/* If it is PRACH slot, copy prach IQ from XRAN PRACH buffer to OAI PRACH buffer */
|
||||
@@ -188,7 +190,7 @@ static int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
LOG_W(HW, "we get rach data from ru, but it is not scheduled %d.%d\n", frame, slot);
|
||||
return -1;
|
||||
}
|
||||
for (sym_idx = 0; sym_idx < prach_sym; sym_idx++) {
|
||||
for (sym_idx = 0; sym_idx < prach_info.N_dur; sym_idx++) {
|
||||
for (int aa = 0; aa < ru->nb_rx; aa++) {
|
||||
int16_t *dst, *src;
|
||||
int idx = 0;
|
||||
|
||||
@@ -30,9 +30,7 @@
|
||||
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common_lib.h"
|
||||
#include "openair2/LAYER2/NR_MAC_COMMON/nr_prach_config.h"
|
||||
|
||||
/* PRACH data samples are 32 bits wide (16bits for I/Q). Each packet contains
|
||||
* 840 samples for long sequence or 144 for short sequence. The payload length
|
||||
@@ -50,7 +48,7 @@ void *gxran_handle;
|
||||
|
||||
static struct xran_fh_init g_fh_init = {0};
|
||||
static struct xran_fh_config g_fh_config[XRAN_PORTS_NUM] = {0};
|
||||
static uint32_t g_prach_conf_duration[XRAN_PORTS_NUM] = {0};
|
||||
static nr_prach_info_t g_prach_info[XRAN_PORTS_NUM] = {0};
|
||||
|
||||
static uint32_t get_nSW_ToFpga_FTH_TxBufferLen(int mu, int sections)
|
||||
{
|
||||
@@ -470,11 +468,9 @@ int *oai_oran_initialize(struct xran_fh_init *xran_fh_init, struct xran_fh_confi
|
||||
// retrieve and store prach duration
|
||||
uint8_t idx = xran_fh_config[o_xu_id].prach_conf.nPrachConfIdx;
|
||||
const struct xran_frame_config *fc = &xran_fh_config[o_xu_id].frame_conf;
|
||||
g_prach_conf_duration[o_xu_id] =
|
||||
get_nr_prach_occasion_info_from_index(idx,
|
||||
fc->nNumerology > 2 ? FR2 : FR1,
|
||||
fc->nFrameDuplexType == XRAN_FDD ? duplex_mode_FDD : duplex_mode_TDD)
|
||||
.N_dur;
|
||||
g_prach_info[o_xu_id] = get_nr_prach_occasion_info_from_index(idx,
|
||||
fc->nNumerology > 2 ? FR2 : FR1,
|
||||
fc->nFrameDuplexType == XRAN_FDD ? duplex_mode_FDD : duplex_mode_TDD);
|
||||
}
|
||||
|
||||
// store config after xran initialization -- xran makes modifications to
|
||||
@@ -504,9 +500,9 @@ struct xran_fh_config *get_xran_fh_config(uint32_t port_id)
|
||||
return &g_fh_config[port_id];
|
||||
}
|
||||
|
||||
uint32_t get_prach_conf_duration(uint32_t port_id)
|
||||
nr_prach_info_t get_prach_info(uint32_t port_id)
|
||||
{
|
||||
struct xran_fh_init *fh_init = get_xran_fh_init();
|
||||
DevAssert(port_id < fh_init->xran_ports);
|
||||
return g_prach_conf_duration[port_id];
|
||||
return g_prach_info[port_id];
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#ifndef ORAN_INIT_H
|
||||
#define ORAN_INIT_H
|
||||
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "openair2/LAYER2/NR_MAC_COMMON/nr_prach_config.h"
|
||||
|
||||
typedef struct oran_bufs {
|
||||
struct xran_flat_buffer tx[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN][XRAN_NUM_OF_SYMBOL_PER_SLOT];
|
||||
struct xran_flat_buffer tx_prbmap[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
|
||||
@@ -62,6 +65,16 @@ int *oai_oran_initialize(struct xran_fh_init *fh_init, struct xran_fh_config *fh
|
||||
oran_buf_list_t *get_xran_buffers(uint32_t port_id);
|
||||
struct xran_fh_init *get_xran_fh_init(void);
|
||||
struct xran_fh_config *get_xran_fh_config(uint32_t port_id);
|
||||
uint32_t get_prach_conf_duration(uint32_t port_id);
|
||||
|
||||
/**
|
||||
* @brief queries PRACH information necessary for the FHI
|
||||
*
|
||||
* @arg port_id XRAN port id
|
||||
* @return PRACH information holding among other information:
|
||||
* - N_dur PRACH duration from TS 38.211 Table 6.3.3.2-2/3/4
|
||||
* - x from TS 38.211 Table 6.3.3.2-2/3/4
|
||||
* - y from TS 38.211 Table 6.3.3.2-2/3/4
|
||||
*/
|
||||
nr_prach_info_t get_prach_info(uint32_t port_id);
|
||||
|
||||
#endif /* ORAN_INIT_H */
|
||||
|
||||
+17
-15
@@ -86,6 +86,7 @@ int trx_oran_stop(openair0_device *device)
|
||||
#ifdef OAI_MPLANE
|
||||
printf("[MPLANE] Stopping M-plane.\n");
|
||||
disconnect_mplane(s->mplane_priv);
|
||||
free(s->mplane_priv);
|
||||
#endif
|
||||
return (0);
|
||||
}
|
||||
@@ -312,41 +313,42 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d
|
||||
|
||||
bool success = false;
|
||||
#ifdef OAI_MPLANE
|
||||
ru_session_list_t ru_session_list = {0};
|
||||
success = init_mplane(&ru_session_list);
|
||||
ru_session_list_t *ru_session_list = calloc(1, sizeof(*ru_session_list));
|
||||
assert(ru_session_list != NULL && "Memory exhausted");
|
||||
success = init_mplane(ru_session_list);
|
||||
AssertFatal(success, "[MPLANE] Cannot initialize M-plane.\n");
|
||||
|
||||
bool ru_configured[ru_session_list.num_rus];
|
||||
for (size_t i = 0; i < ru_session_list.num_rus; i++) {
|
||||
ru_session_t *ru_session = &ru_session_list.ru_session[i];
|
||||
bool ru_configured[ru_session_list->num_rus];
|
||||
for (size_t i = 0; i < ru_session_list->num_rus; i++) {
|
||||
ru_session_t *ru_session = &ru_session_list->ru_session[i];
|
||||
ru_configured[i] = connect_mplane(ru_session);
|
||||
if (!ru_configured[i]) {
|
||||
continue;
|
||||
}
|
||||
ru_configured[i] = manage_ru(ru_session, openair0_cfg, ru_session_list.num_rus);
|
||||
ru_configured[i] = manage_ru(ru_session, openair0_cfg, ru_session_list->num_rus);
|
||||
}
|
||||
|
||||
bool all_ok = true;
|
||||
bool ru_ready[ru_session_list.num_rus];
|
||||
for (size_t i = 0; i < ru_session_list.num_rus; i++) {
|
||||
bool ru_ready[ru_session_list->num_rus];
|
||||
for (size_t i = 0; i < ru_session_list->num_rus; i++) {
|
||||
if (!ru_configured[i]) {
|
||||
MP_LOG_I("RU with IP %s couldn't be configured.\n", ru_session_list.ru_session[i].ru_ip_add);
|
||||
MP_LOG_I("RU with IP %s couldn't be configured.\n", ru_session_list->ru_session[i].ru_ip_add);
|
||||
all_ok = false;
|
||||
}
|
||||
ru_ready[i] = false;
|
||||
}
|
||||
|
||||
if (!all_ok) {
|
||||
disconnect_mplane((void *)&ru_session_list);
|
||||
disconnect_mplane(ru_session_list);
|
||||
AssertFatal(false, "[MPLANE] Stopping M-plane.\n");
|
||||
}
|
||||
|
||||
while (true) {
|
||||
sleep(1);
|
||||
bool all_rus_ready = true;
|
||||
for (int i = 0; i < ru_session_list.num_rus; i++) {
|
||||
ru_session_t *ru_session = &ru_session_list.ru_session[i];
|
||||
if (!ru_ready[i] && ru_session->ru_notif.config_change && ru_session->ru_notif.rx_carrier_state && ru_session->ru_notif.tx_carrier_state) {
|
||||
for (int i = 0; i < ru_session_list->num_rus; i++) {
|
||||
ru_session_t *ru_session = &ru_session_list->ru_session[i];
|
||||
if (!ru_ready[i] && ru_session->ru_notif.config_change && !ru_session->ru_notif.rx_carrier_state && !ru_session->ru_notif.tx_carrier_state) {
|
||||
MP_LOG_I("RU \"%s\" is now ready.\n", ru_session->ru_ip_add);
|
||||
ru_ready[i] = true;
|
||||
if (!ru_session->pm_stats.start_up_timing) {
|
||||
@@ -364,9 +366,9 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d
|
||||
}
|
||||
}
|
||||
|
||||
eth->mplane_priv = (void *)&ru_session_list;
|
||||
eth->mplane_priv = ru_session_list;
|
||||
|
||||
success = get_xran_config((void *)&ru_session_list, openair0_cfg, &fh_init, fh_config);
|
||||
success = get_xran_config(ru_session_list, openair0_cfg, &fh_init, fh_config);
|
||||
AssertFatal(success, "[MPLANE] Cannot configure xran with M-plane info.\n");
|
||||
#else
|
||||
success = get_xran_config(NULL, openair0_cfg, &fh_init, fh_config);
|
||||
|
||||
Reference in New Issue
Block a user