Compare commits

...

1 Commits

Author SHA1 Message Date
Cedric Roux
ce9890a5e4 save commit 2023-03-10 16:04:45 +01:00
64 changed files with 1819 additions and 412 deletions

View File

@@ -503,7 +503,7 @@ function main() {
execlist=""
[[ "$eNB" == "1" ]] && execlist="$execlist lte-softmodem"
[[ "$gNB" == "1" ]] && execlist="$execlist nr-softmodem nr-cuup"
[[ "$gNB" == "1" ]] && execlist="$execlist nr-softmodem"
[[ "$RU" == "1" ]] && execlist="$execlist oairu"
[[ "$UE" == 1 ]] && execlist="$execlist lte-uesoftmodem"
[[ "$nrUE" == 1 ]] && execlist="$execlist nr-uesoftmodem"

View File

@@ -122,6 +122,7 @@ extern "C" {
}
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
//if (message->ittiMsgHeader.messageId == GTPV1U_ENB_TUNNEL_DATA_REQ) exit(1);
task_list_t *t=tasks[destination_task_id];
message->ittiMsgHeader.destinationTaskId = destination_task_id;
message->ittiMsgHeader.destinationInstance = destinationInstance;
@@ -144,6 +145,8 @@ extern "C" {
}
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
//if (message->ittiMsgHeader.messageId == GTPV1U_GNB_TUNNEL_DATA_REQ && GTPV1U_GNB_TUNNEL_DATA_REQ(message).assoc_id == 0) exit(1);
//if (message->ittiMsgHeader.messageId == GTPV1U_ENB_TUNNEL_DATA_REQ) exit(1);
task_list_t *t=tasks[destination_task_id];
pthread_mutex_lock (&t->queue_cond_lock);
int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message);

View File

@@ -0,0 +1,268 @@
Active_gNBs = ( "gNB-OAI");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_CU_ID = 0xe00;
# cell_type = "CELL_MACRO_GNB";
gNB_name = "gNB-OAI";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({
mcc = 505;
mnc = 01;
mnc_length = 2;
snssaiList = (
{
sst = 1;
sd = 0x010203; // 0 false, else true
},
{
sst = 1;
sd = 1; //0x112233; // 0 false, else true
}
);
});
nr_cellid = 12345678L
tr_s_preference = "f1"
local_s_if_name = "eth1";
remote_s_address = "192.168.12.47";
local_s_address = "192.168.12.196";
local_s_portc = 500;
remote_s_portc = 500;
local_s_portd = 2153; //CR 2153;
remote_s_portd = 2153; //CR 2153;
////////// Physical parameters:
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
min_rxtxtime = 6;
do_SRS = 1;
force_256qam_off = 1;
# ssb_SubcarrierOffset = 6;
# pdsch_AntennaPorts_N1 = 1;
# pusch_AntennaPorts = 1;
# do_CSIRS = 1;
pdcch_ConfigSIB1 = (
{
controlResourceSetZero = 11;
searchSpaceZero = 0;
}
);
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
#absoluteFrequencySSB = 620640;
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
// 620832; //621312; #627360; #621312;
absoluteFrequencySSB = 621312; //627360; //620640; //621312; #627360; #621312;
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
#absoluteFrequencySSB = 634080;
# this is 3600.48 MHz
#absoluteFrequencySSB = 640032;
#dl_frequencyBand = 78;
# this is 3301.68 MHz
#dl_absoluteFrequencyPointA = 620112;
# this is 3300.60 MHz
dl_absoluteFrequencyPointA = 620040; //626760; //620040; #626748; #620040;
# this is 3502.56 MHz
#dl_absoluteFrequencyPointA = 633552;
# this is 3600.48 MHz
#dl_absoluteFrequencyPointA = 640032;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106; //51;
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=106 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106; //51;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 98;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12; //15;
preambleReceivedTargetPower = -104;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 1;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
ra_ContentionResolutionTimer = 7;
rsrp_ThresholdSSB = 19;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
prach_RootSequenceIndex_PR = 2;
prach_RootSequenceIndex = 1;
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
#
msg1_SubcarrierSpacing = 1,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig = 0,
msg3_DeltaPreamble = 1;
p0_NominalWithGrant =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
ssb_PositionsInBurst_Bitmap = 1;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
ssb_periodicityServingCell = 2;
# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
dmrs_TypeA_Position = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
subcarrierSpacing = 1;
#tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing = 1;
# pattern1
# dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity = 6; //5;
nrofDownlinkSlots = 7; //2;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
////////// AMF parameters:
amf_ip_address = ( { ipv4 = "192.168.12.148";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.12.196/24";
GNB_INTERFACE_NAME_FOR_NGU = "em1";
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.12.196/24";
GNB_PORT_FOR_S1U = 2152; # Spec 2152
};
}
);
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" );
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms = ( "nia2", "nia0" );
# 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";
};
log_config :
{
global_log_level ="info";
hw_log_level ="info";
phy_log_level ="info";
mac_log_level ="info";
rlc_log_level ="info";
pdcp_log_level ="info";
rrc_log_level ="info";
f1ap_log_level ="debug";
ngap_log_level ="debug";
gtpu_log_level ="debug";
};

View File

@@ -0,0 +1,314 @@
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_CU_ID = 0xe00;
# cell_type = "CELL_MACRO_GNB";
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({
mcc = 505;
mnc = 01;
mnc_length = 2;
snssaiList = (
{
sst = 1;
sd = 0x010203; // 0 false, else true
},
{
sst = 1;
sd = 1; //0x112233; // 0 false, else true
}
);
});
nr_cellid = 12345678L
# tr_s_preference = "local_mac"
////////// Physical parameters:
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
min_rxtxtime = 6;
do_SRS = 1;
force_256qam_off = 1;
# ssb_SubcarrierOffset = 6;
pdsch_AntennaPorts_N1 = 1;
pusch_AntennaPorts = 1;
# do_CSIRS = 1;
pdcch_ConfigSIB1 = (
{
controlResourceSetZero = 11;
searchSpaceZero = 0;
}
);
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
#absoluteFrequencySSB = 620640;
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
// 620832; //621312; #627360; #621312;
absoluteFrequencySSB = 621312; //627360; //620640; //621312; #627360; #621312;
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
#absoluteFrequencySSB = 634080;
# this is 3600.48 MHz
#absoluteFrequencySSB = 640032;
#dl_frequencyBand = 78;
# this is 3301.68 MHz
#dl_absoluteFrequencyPointA = 620112;
# this is 3300.60 MHz
dl_absoluteFrequencyPointA = 620040; //626760; //620040; #626748; #620040;
# this is 3502.56 MHz
#dl_absoluteFrequencyPointA = 633552;
# this is 3600.48 MHz
#dl_absoluteFrequencyPointA = 640032;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106; //51;
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=106 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106; //51;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 98;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12; //15;
preambleReceivedTargetPower = -104;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 1;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
ra_ContentionResolutionTimer = 7;
rsrp_ThresholdSSB = 19;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
prach_RootSequenceIndex_PR = 2;
prach_RootSequenceIndex = 1;
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
#
msg1_SubcarrierSpacing = 1,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig = 0,
msg3_DeltaPreamble = 1;
p0_NominalWithGrant =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
ssb_PositionsInBurst_Bitmap = 1;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
ssb_periodicityServingCell = 2;
# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
dmrs_TypeA_Position = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
subcarrierSpacing = 1;
#tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing = 1;
# pattern1
# dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity = 6; //5;
nrofDownlinkSlots = 7; //2;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = 0; //-25;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "f1";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
ulsch_max_frame_inactivity = 1;
## ulsch_max_frame_inactivity = 1;
# ulsch_max_frame_inactivity=0;
# dl_max_mcs = 16;
# min_grant_prb = 20; #38;
# min_grant_mcs = 16;
# harq_round_max = 1;
local_n_if_name = "enp0s31f6";
local_n_address = "192.168.12.47";
remote_n_address = "192.168.12.196";
local_n_portc = 500;
remote_n_portc = 500;
local_n_portd = 2153;
remote_n_portd = 2153;
}
);
L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
prach_dtx_threshold = 120;
# pucch0_dtx_threshold = 150;
}
);
RUs = (
{
local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 10
att_rx = 0;
bands = [78];
num_tp_cores = 4;
// rxfh_core_id = 0;
// txfh_core_id = 2;
// tp_cores = [1,3,5,7];
sl_ahead = 4;
nr_flag = 1;
max_pdschReferenceSignalPower = -27;
max_rxgain = 115;
eNB_instances = [0];
##beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
##beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sf_extension = 0
# sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
clock_src = "internal";
}
);
THREAD_STRUCT = (
{
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
parallel_config = "PARALLEL_SINGLE_THREAD";
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
worker_config = "WORKER_ENABLE";
}
);
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" );
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms = ( "nia2", "nia0" );
# 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";
};
log_config :
{
global_log_level ="info";
hw_log_level ="info";
phy_log_level ="info";
mac_log_level ="info";
rlc_log_level ="info";
pdcp_log_level ="info";
rrc_log_level ="info";
f1ap_log_level ="debug";
gtpu_log_level ="debug";
};

View File

@@ -0,0 +1,314 @@
Active_gNBs = ( "gNB-OAI-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
gNBs =
(
{
////////// Identification parameters:
gNB_CU_ID = 0xe00;
# cell_type = "CELL_MACRO_GNB";
gNB_name = "gNB-OAI-DU";
// Tracking area code, 0x0000 and 0xfffe are reserved values
tracking_area_code = 1;
plmn_list = ({
mcc = 505;
mnc = 01;
mnc_length = 2;
snssaiList = (
{
sst = 1;
sd = 0x010203; // 0 false, else true
},
{
sst = 1;
sd = 1; //0x112233; // 0 false, else true
}
);
});
nr_cellid = 12345678L
# tr_s_preference = "local_mac"
////////// Physical parameters:
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
min_rxtxtime = 6;
do_SRS = 1;
force_256qam_off = 1;
# ssb_SubcarrierOffset = 6;
pdsch_AntennaPorts_N1 = 1;
pusch_AntennaPorts = 1;
# do_CSIRS = 1;
pdcch_ConfigSIB1 = (
{
controlResourceSetZero = 11;
searchSpaceZero = 0;
}
);
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
#absoluteFrequencySSB = 620640;
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
// 620832; //621312; #627360; #621312;
absoluteFrequencySSB = 621312; //627360; //620640; //621312; #627360; #621312;
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
#absoluteFrequencySSB = 634080;
# this is 3600.48 MHz
#absoluteFrequencySSB = 640032;
#dl_frequencyBand = 78;
# this is 3301.68 MHz
#dl_absoluteFrequencyPointA = 620112;
# this is 3300.60 MHz
dl_absoluteFrequencyPointA = 620040; //626760; //620040; #626748; #620040;
# this is 3502.56 MHz
#dl_absoluteFrequencyPointA = 633552;
# this is 3600.48 MHz
#dl_absoluteFrequencyPointA = 640032;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106; //51;
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=106 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106; //51;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875; //13750;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
#rach-ConfigCommon
#rach-ConfigGeneric
prach_ConfigurationIndex = 98;
#prach_msg1_FDM
#0 = one, 1=two, 2=four, 3=eight
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12; //15;
preambleReceivedTargetPower = -104;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep
# 0=dB0,1=dB2,2=dB4,3=dB6
powerRampingStep = 1;
#ra_ReponseWindow
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 4;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
#ra_ContentionResolutionTimer
#(0..7) 8,16,24,32,40,48,56,64
ra_ContentionResolutionTimer = 7;
rsrp_ThresholdSSB = 19;
#prach-RootSequenceIndex_PR
#1 = 839, 2 = 139
prach_RootSequenceIndex_PR = 2;
prach_RootSequenceIndex = 1;
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
#
msg1_SubcarrierSpacing = 1,
# restrictedSetConfig
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig = 0,
msg3_DeltaPreamble = 1;
p0_NominalWithGrant =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
ssb_PositionsInBurst_Bitmap = 1;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
ssb_periodicityServingCell = 2;
# dmrs_TypeA_position
# 0 = pos2, 1 = pos3
dmrs_TypeA_Position = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
subcarrierSpacing = 1;
#tdd-UL-DL-ConfigurationCommon
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
referenceSubcarrierSpacing = 1;
# pattern1
# dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity = 6; //5;
nrofDownlinkSlots = 7; //2;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = 0; //-25;
}
);
# ------- SCTP definitions
SCTP :
{
# Number of streams to use in input/output
SCTP_INSTREAMS = 2;
SCTP_OUTSTREAMS = 2;
};
}
);
MACRLCs = (
{
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "f1";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
ulsch_max_frame_inactivity = 1;
## ulsch_max_frame_inactivity = 1;
# ulsch_max_frame_inactivity=0;
# dl_max_mcs = 16;
# min_grant_prb = 20; #38;
# min_grant_mcs = 16;
# harq_round_max = 1;
local_n_if_name = "enp0s31f6";
local_n_address = "192.168.12.207";
remote_n_address = "192.168.12.196";
local_n_portc = 500;
remote_n_portc = 500;
local_n_portd = 2153;
remote_n_portd = 2153;
}
);
L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
prach_dtx_threshold = 120;
# pucch0_dtx_threshold = 150;
}
);
RUs = (
{
local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 10
att_rx = 0;
bands = [78];
num_tp_cores = 4;
// rxfh_core_id = 0;
// txfh_core_id = 2;
// tp_cores = [1,3,5,7];
sl_ahead = 4;
nr_flag = 1;
max_pdschReferenceSignalPower = -27;
max_rxgain = 115;
eNB_instances = [0];
##beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
##beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sf_extension = 0
# sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
clock_src = "internal";
}
);
THREAD_STRUCT = (
{
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
parallel_config = "PARALLEL_SINGLE_THREAD";
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
worker_config = "WORKER_ENABLE";
}
);
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" );
# preferred integrity algorithms
# the first one of the list that an UE supports in chosen
# valid values: nia0, nia1, nia2, nia3
integrity_algorithms = ( "nia2", "nia0" );
# 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";
};
log_config :
{
global_log_level ="info";
hw_log_level ="info";
phy_log_level ="info";
mac_log_level ="info";
rlc_log_level ="info";
pdcp_log_level ="info";
rrc_log_level ="info";
f1ap_log_level ="debug";
gtpu_log_level ="debug";
};

View File

@@ -156,6 +156,7 @@ typedef struct e1ap_bearer_setup_req_s {
uint32_t gNB_cu_cp_ue_id;
uint32_t gNB_cu_up_ue_id;
rnti_t rnti;
int assoc_id;
uint64_t cipheringAlgorithm;
uint64_t integrityProtectionAlgorithm;
char encryptionKey[128];

View File

@@ -286,6 +286,7 @@ typedef struct f1ap_dl_rrc_message_s {
uint32_t gNB_DU_ue_id;
uint32_t old_gNB_DU_ue_id;
uint16_t rnti;
int assoc_id;
uint8_t srb_id;
uint8_t execute_duplication;
uint8_t *rrc_container;
@@ -309,6 +310,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
uint64_t nr_cellid;
/// crnti
uint16_t crnti;
int assoc_id;
uint8_t *rrc_container;
int rrc_container_length;
uint8_t *du2cu_rrc_container;
@@ -317,6 +319,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
typedef struct f1ap_ul_rrc_message_s {
uint16_t rnti;
int assoc_id;
uint8_t srb_id;
uint8_t *rrc_container;
int rrc_container_length;
@@ -380,6 +383,7 @@ typedef struct f1ap_ue_context_setup_s {
uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti
uint32_t gNB_DU_ue_id;
uint16_t rnti;
int assoc_id;
// SpCell Info
uint16_t mcc;
uint16_t mnc;
@@ -419,6 +423,7 @@ typedef enum F1ap_Cause_e {
typedef struct f1ap_ue_context_release_s {
uint16_t rnti;
int assoc_id; /* only used in CU */
f1ap_Cause_t cause;
long cause_value;
uint8_t *rrc_container;

View File

@@ -112,6 +112,7 @@ typedef struct gtpv1u_tunnel_data_req_s {
uint32_t length;
uint32_t offset; ///< start of message offset in buffer
ue_id_t ue_id;
int assoc_id;
rb_id_t bearer_id;
} gtpv1u_tunnel_data_req_t;
@@ -169,6 +170,7 @@ typedef struct {
typedef struct gtpv1u_gnb_create_tunnel_req_s {
ue_id_t ue_id;
int assoc_id;
int num_tunnels;
//teid_t upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier
teid_t outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];
@@ -183,6 +185,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s {
typedef struct gtpv1u_gnb_create_tunnel_resp_s {
uint8_t status; ///< Status of S1U endpoint creation (Failed = 0xFF or Success = 0x0)
ue_id_t ue_id;
int assoc_id;
int num_tunnels;
teid_t gnb_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier
pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
@@ -190,17 +193,18 @@ typedef struct gtpv1u_gnb_create_tunnel_resp_s {
} gtpv1u_gnb_create_tunnel_resp_t;
typedef struct gtpv1u_gnb_delete_tunnel_req_s {
ue_id_t ue_id;
int assoc_id;
uint8_t num_pdusession;
pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
} gtpv1u_gnb_delete_tunnel_req_t;
typedef struct gtpv1u_gnb_delete_tunnel_resp_s {
ue_id_t ue_id;
int assoc_id;
uint8_t status; ///< Status of NGU endpoint deleteion (Failed = 0xFF or Success = 0x0)
teid_t gnb_NGu_teid; ///< local NGU Tunnel Endpoint Identifier to be deleted
} gtpv1u_gnb_delete_tunnel_resp_t;
typedef struct gtpv1u_DU_buffer_report_req_s {
uint32_t buffer_availability;
ue_id_t ue_id;

View File

@@ -84,6 +84,7 @@ typedef struct NRRrcDcchDataReq_s {
uint8_t *sdu_p;
uint8_t mode;
uint16_t rnti;
int assoc_id;
uint8_t module_id;
uint8_t gNB_index;
} NRRrcDcchDataReq;

View File

@@ -1583,6 +1583,13 @@ static void e1_task_handle_sctp_association_resp(E1_t type, instance_t instance,
void cuup_init_n3(instance_t instance)
{
#if 0
usleep(100*1000);
extern instance_t CUuniqInstance;
extern instance_t legacyInstanceMapping;
if (CUuniqInstance == 0) abort();
legacyInstanceMapping = getCxtE1(instance)->gtpInstN3 = CUuniqInstance;
#endif
if (getCxtE1(instance)->gtpInstN3 < 0) {
e1ap_setup_req_t *setup = &getCxtE1(instance)->setupReq;
openAddr_t tmp = {0};

View File

@@ -189,7 +189,7 @@ void CUUP_process_bearer_release_command(instance_t instance, e1ap_bearer_releas
{
e1ap_upcp_inst_t *inst = getCxtE1(instance);
AssertFatal(inst, "");
newGtpuDeleteAllTunnels(inst->gtpInstN3, cmd->gNB_cu_up_ue_id);
newGtpuDeleteAllTunnels(inst->gtpInstF1U, cmd->gNB_cu_up_ue_id);
newGtpuDeleteAllTunnels(inst->gtpInstN3, cmd->gNB_cu_up_ue_id, 0 /* assoc_id, e1 not working */);
newGtpuDeleteAllTunnels(inst->gtpInstF1U, cmd->gNB_cu_up_ue_id, 0 /* assoc_id, e1 not working */);
e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(inst, cmd);
}

View File

@@ -31,6 +31,7 @@
*/
#include "f1ap_common.h"
#include "f1ap_cu_task.h"
static f1ap_cudu_inst_t *f1_du_inst[NUMBER_OF_eNB_MAX]= {0};
static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_eNB_MAX]= {0};
@@ -51,11 +52,16 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP) {
AssertFatal ( t==-1 || t==tNew, "This is not thread safe\n");
t=tNew;
*/
if (isCU == CUtype) {
LOG_E(F1AP, "don't use getCxt() with the CU\n");
exit(1);
}
AssertFatal( instanceP < sizeofArray(f1_cu_inst), "");
return isCU == CUtype ? f1_cu_inst[ instanceP]: f1_du_inst[ instanceP];
}
void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) {
printf("createF1inst instanceP %ld\n", instanceP);
if (isCU == CUtype) {
AssertFatal(f1_cu_inst[instanceP] == NULL, "Double call to F1 CU init\n");
f1_cu_inst[instanceP]=( f1ap_cudu_inst_t *) calloc(1, sizeof( f1ap_cudu_inst_t));
@@ -69,11 +75,17 @@ void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) {
int f1ap_add_ue(F1_t isCu,
instance_t instanceP,
rnti_t rntiP) {
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP);
rnti_t rntiP,
int assoc_id) {
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
if (f1_inst->f1ap_ue[i].rnti == rntiP && f1_inst->f1ap_ue[i].assoc_id == assoc_id) {
f1_inst->f1ap_ue[i].f1ap_uid = i;
LOG_I(F1AP, "Updating the index of UE with RNTI %x and du_ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id);
return i;
@@ -84,9 +96,11 @@ int f1ap_add_ue(F1_t isCu,
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].rnti == 0 ) {
f1_inst->f1ap_ue[i].rnti = rntiP;
f1_inst->f1ap_ue[i].assoc_id = assoc_id;
f1_inst->f1ap_ue[i].f1ap_uid = i;
f1_inst->f1ap_ue[i].du_ue_f1ap_id = rntiP;
f1_inst->f1ap_ue[i].cu_ue_f1ap_id = rntiP;
AssertFatal(assoc_id <= 32767, "fatal, assoc_id too big\n");
f1_inst->f1ap_ue[i].cu_ue_f1ap_id = rntiP + assoc_id * 65536;
f1_inst->num_ues++;
LOG_I(F1AP, "Adding a new UE with RNTI %x and cu/du ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id);
return i;
@@ -113,11 +127,17 @@ int f1ap_remove_ue(F1_t isCu, instance_t instanceP,
}
int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP,
rnti_t rntiP) {
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP);
rnti_t rntiP, int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
if (f1_inst->f1ap_ue[i].rnti == rntiP && f1_inst->f1ap_ue[i].assoc_id == assoc_id) {
return f1_inst->f1ap_ue[i].du_ue_f1ap_id;
}
}
@@ -126,11 +146,17 @@ int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP,
}
int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP,
rnti_t rntiP) {
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP);
rnti_t rntiP, int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
if (f1_inst->f1ap_ue[i].rnti == rntiP && f1_inst->f1ap_ue[i].assoc_id == assoc_id) {
return f1_inst->f1ap_ue[i].cu_ue_f1ap_id;
}
}
@@ -139,8 +165,15 @@ int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP,
}
int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
instance_t du_ue_f1ap_id ) {
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP);
instance_t du_ue_f1ap_id,
int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
@@ -152,8 +185,15 @@ int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
}
int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP,
instance_t cu_ue_f1ap_id ) {
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP);
instance_t cu_ue_f1ap_id,
int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (f1_inst->f1ap_ue[i].cu_ue_f1ap_id == cu_ue_f1ap_id) {
@@ -187,5 +227,6 @@ int f1ap_du_add_cu_ue_id(instance_t instanceP,
int f1ap_assoc_id(F1_t isCu, instance_t instanceP) {
f1ap_setup_req_t *f1_inst=f1ap_req(isCu, instanceP);
printf("f1ap_assoc_id instanceP %ld will return f1_inst->assoc_id %d\n", instanceP, f1_inst->assoc_id);
return f1_inst->assoc_id;
}

View File

@@ -396,16 +396,17 @@
**/
typedef int (*f1ap_message_processing_t)(
instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *message_p
);
int f1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
int f1ap_handle_message(instance_t instance, int assoc_id, int32_t stream,
const uint8_t *const data, const uint32_t data_length);
typedef struct f1ap_cudu_ue_inst_s {
// used for eNB stats generation
rnti_t rnti;
int assoc_id;
instance_t f1ap_uid;
instance_t du_ue_f1ap_id;
instance_t cu_ue_f1ap_id;
@@ -436,24 +437,27 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP);
void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req);
int f1ap_add_ue(F1_t isCu,
instance_t instanceP,
rnti_t rntiP);
rnti_t rntiP,
int assoc_id);
int f1ap_remove_ue(F1_t isCu, instance_t instanceP,
rnti_t rntiP);
int f1ap_get_du_ue_f1ap_id (F1_t isCu, instance_t instanceP,
rnti_t rntiP);
rnti_t rntiP, int assoc_id);
int f1ap_get_cu_ue_f1ap_id (F1_t isCu, instance_t instanceP,
rnti_t rntiP);
rnti_t rntiP, int assoc_id);
int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
instance_t du_ue_f1ap_id );
instance_t du_ue_f1ap_id,
int assoc_id);
int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP,
instance_t cu_ue_f1ap_id );
instance_t cu_ue_f1ap_id,
int assoc_id);
int f1ap_du_add_cu_ue_id(instance_t instanceP,
instance_t du_ue_f1ap_id,

View File

@@ -35,20 +35,21 @@
#include "f1ap_decoder.h"
#include "f1ap_itti_messaging.h"
#include "f1ap_cu_interface_management.h"
#include "f1ap_cu_task.h"
int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) {
AssertFatal(1==0,"Not implemented yet\n");
}
int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int CU_handle_RESET(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -63,7 +64,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese
Error Indication
*/
int CU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -78,7 +79,7 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI
F1 Setup
*/
int CU_handle_F1_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_F1_SETUP_REQUEST\n");
@@ -96,7 +97,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
}
/* assoc_id */
f1ap_setup_req_t *req=&getCxt(true, instance)->setupReq;
f1ap_setup_req_t *req=&f1ap_cu_assoc_id_to_context(assoc_id)->setupReq;
req->assoc_id = assoc_id;
/* gNB_DU_id */
// this function exits if the ie is mandatory
@@ -143,7 +144,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
LOG_D(F1AP, "req->nr_pci[%d] %d \n", i, req->cell[i].nr_pci);
// LTS: FIXME cell_type is not a attribute of a cell in the data structure !!!!!!!!!!
f1ap_req(true, instance)->cell_type = CELL_MACRO_GNB;
req->cell_type=CELL_MACRO_GNB;
// FDD Cells
if (servedCellInformation->nR_Mode_Info.present==F1AP_NR_Mode_Info_PR_fDD) {
@@ -197,7 +198,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
}
struct F1AP_GNB_DU_System_Information * DUsi=served_cells_item->gNB_DU_System_Information;
LOG_I(F1AP, "Received Cell in %d context\n", f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB);
LOG_I(F1AP, "Received Cell in %d context\n", req->cell_type==CELL_MACRO_GNB);
// System Information
/* mib */
req->mib[i] = calloc(DUsi->mIB_message.size + 1, sizeof(char));
@@ -257,13 +258,13 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
memcpy(&F1AP_SETUP_REQ(message_p), req, sizeof(f1ap_setup_req_t) );
if (req->num_cells_available > 0) {
if (f1ap_req(true, instance)->cell_type == CELL_MACRO_GNB) {
if (req->cell_type == CELL_MACRO_GNB) {
itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p);
} else {
itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
}
} else {
CU_send_F1_SETUP_FAILURE(instance);
CU_send_F1_SETUP_FAILURE(instance, assoc_id);
itti_free(TASK_CU_F1,message_p);
return -1;
}
@@ -374,11 +375,12 @@ int CU_send_F1_SETUP_RESPONSE(instance_t instance,
}
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0, f1ap_setup_resp->assoc_id);
return 0;
}
int CU_send_F1_SETUP_FAILURE(instance_t instance) {
int CU_send_F1_SETUP_FAILURE(instance_t instance, int assoc_id)
{
LOG_D(F1AP, "CU_send_F1_SETUP_FAILURE\n");
instance_t enb_mod_idP=0;
instance_t cu_mod_idP=0;
@@ -444,7 +446,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) {
}
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0, assoc_id);
return 0;
}
@@ -453,7 +455,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) {
*/
int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -541,6 +543,15 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
AssertFatal(sIBtype < 6 || sIBtype == 9, "Illegal SI type %d\n",sIBtype);
asn1cSequenceAdd(gNB_CUSystemInformation->sibtypetobeupdatedlist.list, F1AP_SibtypetobeupdatedListItem_t, sib_item);
sib_item->sIBtype = sIBtype;
{
unsigned char *b = f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container[sIBtype];
int len = f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container_length[sIBtype];
printf("celle %d put sib(%d)[%d]", i, sIBtype, len);
int i;
for (i = 0; i < len; i++) printf(" %2.2x", b[i]);
printf("\n");
fflush(stdout);
}
OCTET_STRING_fromBuf(&sib_item->sIBmessage,
(const char *)f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container[sIBtype],
f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container_length[sIBtype]);
@@ -558,21 +569,30 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
return -1;
}
{
unsigned char *b = buffer;
printf("cu update [%d]", len);
int i;
for (i = 0; i < len; i++) printf(" %2.2x", b[i]);
printf("\n");
fflush(stdout);
}
LOG_DUMPMSG(F1AP, LOG_DUMP_CHAR, buffer, len, "F1AP gNB-CU CONFIGURATION UPDATE : ");
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0, f1ap_gnb_cu_configuration_update->assoc_id);
return 0;
}
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_I(F1AP,"Cell Configuration ok (assoc_id %d)\n",assoc_id);
@@ -581,7 +601,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(0, "Not implemented yet\n");

View File

@@ -38,11 +38,11 @@
*/
int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset);
int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_handle_RESET(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge);
@@ -51,7 +51,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese
* Error Indication
*/
int CU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorIndication);
@@ -60,19 +60,19 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI
* F1 Setup
*/
int CU_handle_F1_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_send_F1_SETUP_RESPONSE(instance_t instance, f1ap_setup_resp_t *f1ap_setup_resp);
int CU_send_F1_SETUP_FAILURE(instance_t instance);
int CU_send_F1_SETUP_FAILURE(instance_t instance, int assoc_id);
/*
* gNB-DU Configuration Update
*/
int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -87,12 +87,12 @@ int CU_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
*/
int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configuration_update_t *f1ap_gnb_cu_configuration_update);
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -100,7 +100,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
* gNB-DU Resource Coordination
*/
int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -115,6 +115,6 @@ int CU_send_Paging(instance_t instance, f1ap_paging_ind_t *paging) {
return -1;
}
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0, -1);
return 0;
}

View File

@@ -38,16 +38,17 @@
#include "common/ran_context.h"
#include "openair3/UTILS/conversions.h"
#include "pdcp.h"
#include "f1ap_cu_task.h"
/*
Initial UL RRC Message Transfer
*/
int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER\n");
LOG_D(F1AP, "CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER assoc_id %d\n", assoc_id);
// decode the F1 message
// get the rrc message from the contauiner
// call func rrc_eNB_decode_ccch: <-- needs some update here
@@ -89,7 +90,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, du2cu, container,
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false);
int f1ap_uid = f1ap_add_ue(CUtype, instance, rnti);
int f1ap_uid = f1ap_add_ue(CUtype, instance, rnti, assoc_id);
if (f1ap_uid < 0 ) {
LOG_E(F1AP, "Failed to add UE \n");
@@ -97,11 +98,13 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
}
// create an ITTI message and copy SDU
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
f1ap_setup_req_t *req = &f1ap_cu_assoc_id_to_context(assoc_id)->setupReq;
if (req->cell_type==CELL_MACRO_GNB) {
message_p = itti_alloc_new_message (TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p);
ul_rrc->nr_cellid = nr_cellid; // CU instance
ul_rrc->crnti = rnti;
ul_rrc->assoc_id = assoc_id;
ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size;
ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length);
memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length);
@@ -162,7 +165,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti);
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti, f1ap_dl_rrc->assoc_id);
LOG_I(F1AP, "Setting GNB_CU_UE_F1AP_ID %llu associated with UE RNTI %x (instance %ld)\n",
(unsigned long long int)ie1->value.choice.GNB_CU_UE_F1AP_ID, f1ap_dl_rrc->rnti, instance);
/* mandatory */
@@ -171,7 +174,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti, f1ap_dl_rrc->assoc_id);
LOG_I(F1AP, "GNB_DU_UE_F1AP_ID %llu associated with UE RNTI %x \n", (unsigned long long int)ie2->value.choice.GNB_DU_UE_F1AP_ID, f1ap_dl_rrc->rnti);
/* optional */
/* c3. oldgNB_DU_UE_F1AP_ID */
@@ -238,15 +241,25 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
return -1;
}
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/, f1ap_dl_rrc->assoc_id);
return 0;
}
bool nr_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const MBMS_flag_t MBMS_flagP,
const rb_id_t rb_id,
const sdu_size_t sdu_buffer_size,
mem_block_t *const sdu_buffer,
const uint32_t *const srcID,
const uint32_t *const dstID);
/*
UL RRC Message Transfer
*/
int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_UL_RRC_MESSAGE_TRANSFER \n");
@@ -269,13 +282,13 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
LOG_D(F1AP, "cu_ue_f1ap_id %lu associated with RNTI %x\n",
cu_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id));
cu_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id, assoc_id));
/* GNB_DU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with RNTI %x\n",
du_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, du_ue_f1ap_id));
du_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, du_ue_f1ap_id, assoc_id));
/* mandatory */
/* SRBID */
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
@@ -295,7 +308,7 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
protocol_ctxt_t ctxt={0};
ctxt.instance = instance;
ctxt.module_id = instance;
ctxt.rntiMaybeUEid = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id);
ctxt.rntiMaybeUEid = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id, assoc_id);
ctxt.enb_flag = 1;
ctxt.eNB_index = 0;
mem_block_t *mb = get_free_mem_block(ie->value.choice.RRCContainer.size,__func__);
@@ -305,11 +318,12 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
//for (int i = 0; i < ie->value.choice.RRCContainer.size; i++)
// printf("%02x ", mb->data[i]);
//printf("\n");
pdcp_data_ind (&ctxt,
1, // srb_flag
0, // embms_flag
srb_id,
ie->value.choice.RRCContainer.size,
mb, NULL, NULL);
nr_pdcp_data_ind(&ctxt,
assoc_id,
1, // srb_flag
0, // embms_flag
srb_id,
ie->value.choice.RRCContainer.size,
mb, NULL, NULL);
return 0;
}

View File

@@ -34,7 +34,7 @@
#define F1AP_CU_RRC_MESSAGE_TRANSFER_H_
int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -42,7 +42,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
f1ap_dl_rrc_message_t *f1ap_dl_rrc);
int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -37,6 +37,7 @@
#include "f1ap_cu_paging.h"
#include "f1ap_cu_task.h"
#include <openair3/ocp-gtpu/gtp_itf.h>
#include "assertions.h"
//Fixme: Uniq dirty DU instance, by global var, datamodel need better management
instance_t CUuniqInstance=0;
@@ -45,11 +46,16 @@ static instance_t cu_task_create_gtpu_instance(eth_params_t *IPaddrs) {
openAddr_t tmp= {0};
strncpy(tmp.originHost, IPaddrs->my_addr, sizeof(tmp.originHost)-1);
sprintf(tmp.originService, "%d", IPaddrs->my_portd);
printf("cu_task_create_gtpu_instance %s %d\n", IPaddrs->my_addr, IPaddrs->my_portd); fflush(stdout);
return gtpv1Init(tmp);
}
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind,
eth_params_t *IPaddrs) {
printf("cu_task_handle_sctp_association_ind instance %ld assoc_id %d\n", instance, sctp_new_association_ind->assoc_id);
f1ap_new_du(sctp_new_association_ind->assoc_id);
f1ap_cu_assoc_id_to_context(sctp_new_association_ind->assoc_id)->gtpInst = CUuniqInstance;
#if 0
createF1inst(true, instance, NULL);
// save the assoc id
f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance);
@@ -65,6 +71,7 @@ static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_as
// Fixme: fully inconsistent instances management
// dirty global var is a bad fix
CUuniqInstance=getCxt(CUtype, instance)->gtpInst;
#endif
}
static void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) {
@@ -127,6 +134,11 @@ void *F1AP_CU_task(void *arg) {
cu_task_send_sctp_init_req(0, IPaddrs->my_addr);
createF1inst(true, 0, NULL);
instance_t gtpu_id = cu_task_create_gtpu_instance(IPaddrs);
CUuniqInstance = gtpu_id;
//getCxt(CUtype, 0/*instance*/)->gtpInst=CUuniqInstance;
while (1) {
itti_receive_msg(TASK_CU_F1, &received_msg);
LOG_I(F1AP, "CU Task Received %s for instance %ld\n",
@@ -210,3 +222,41 @@ void *F1AP_CU_task(void *arg) {
return NULL;
}
typedef struct {
f1ap_du_t *du;
int du_size;
} du_manager_t;
static du_manager_t du;
f1ap_du_t *f1ap_new_du(int assoc_id)
{
int i;
/* must not be here already */
for (i = 0; i < du.du_size; i++)
if (du.du[i].assoc_id == assoc_id) {
LOG_E(F1AP, "fatal: assoc_id %d already there\n", assoc_id);
exit(1);
}
du.du_size++;
du.du = realloc(du.du, du.du_size * sizeof(f1ap_du_t));
AssertFatal(du.du != NULL, "out of memory\n");
du.du[du.du_size - 1].assoc_id = assoc_id;
memset(&du.du[du.du_size - 1].ctxt, 0, sizeof(f1ap_cudu_inst_t));
return &du.du[du.du_size - 1];
}
f1ap_cudu_inst_t *f1ap_cu_assoc_id_to_context(int assoc_id)
{
int i;
for (i = 0; i < du.du_size; i++)
if (du.du[i].assoc_id == assoc_id)
return &du.du[i].ctxt;
LOG_E(F1AP, "fatal: assoc_id %d not found\n", assoc_id);
exit(1);
}

View File

@@ -22,6 +22,16 @@
#ifndef F1AP_CU_TASK_H_
#define F1AP_CU_TASK_H_
#include "f1ap_common.h"
typedef struct {
int assoc_id;
f1ap_cudu_inst_t ctxt;
} f1ap_du_t;
f1ap_du_t *f1ap_new_du(int assoc_id);
f1ap_cudu_inst_t *f1ap_cu_assoc_id_to_context(int assoc_id);
void *F1AP_CU_task(void *arg);
#endif /* F1AP_CU_TASK_H_ */

View File

@@ -36,6 +36,7 @@
#include "f1ap_itti_messaging.h"
#include "f1ap_cu_ue_context_management.h"
#include <string.h>
#include "f1ap_cu_task.h"
#include "rrc_extern.h"
#include "rrc_eNB_UE_context.h"
@@ -86,7 +87,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti); //f1ap_ue_context_setup_req->gNB_CU_ue_id;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti, f1ap_ue_context_setup_req->assoc_id); //f1ap_ue_context_setup_req->gNB_CU_ue_id;
/* optional */
/* c2. GNB_DU_UE_F1AP_ID */
@@ -95,7 +96,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_ignore;
ie2->value.present = F1AP_UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti); //*f1ap_ue_context_setup_req->gNB_DU_ue_id;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti, f1ap_ue_context_setup_req->assoc_id); //*f1ap_ue_context_setup_req->gNB_DU_ue_id;
}
/* mandatory */
@@ -510,11 +511,15 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
/*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
/* Use a dummy address and teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU */
transport_layer_addr_t addr = { length: 32, buffer: { 0 } };
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
/* Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU */
transport_layer_addr_t addr;
int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
addr.length = sz*8;
extern instance_t CUuniqInstance;
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(CUuniqInstance,
f1ap_ue_context_setup_req->rnti,
f1ap_ue_context_setup_req->assoc_id,
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
0xFFFF, // We will set the right value from DU answer
@@ -632,12 +637,12 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
// return -1;
// }
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/, f1ap_ue_context_setup_req->assoc_id);
return 0;
}
int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
MessageDef *msg_p;
@@ -659,7 +664,8 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
f1ap_ue_context_setup_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_DU_ue_id);
f1ap_ue_context_setup_resp->rnti =
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id, assoc_id);
f1ap_ue_context_setup_resp->assoc_id = assoc_id;
// DUtoCURRCInformation
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, true);
@@ -698,8 +704,10 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
GtpuUpdateTunnelOutgoingAddressAndTeid(getCxt(CUtype, instance)->gtpInst,
extern instance_t CUuniqInstance;
GtpuUpdateTunnelOutgoingAddressAndTeid(CUuniqInstance,
f1ap_ue_context_setup_resp->rnti,
f1ap_ue_context_setup_resp->assoc_id,
(ebi_t)drbs_setup_item_p->dRBID,
drb_p->up_dl_tnl[0].tl_address,
drb_p->up_dl_tnl[0].teid);
@@ -773,14 +781,14 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
}
int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
F1AP_UEContextReleaseRequest_t *container;
@@ -791,12 +799,12 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
const rnti_t rnti = f1ap_get_rnti_by_cu_id(true, instance,
ie->value.choice.GNB_CU_UE_F1AP_ID);
ie->value.choice.GNB_CU_UE_F1AP_ID, assoc_id);
/* GNB_DU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(CUtype, instance,
ie->value.choice.GNB_DU_UE_F1AP_ID);
ie->value.choice.GNB_DU_UE_F1AP_ID, assoc_id);
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
rnti2, rnti);
/* Cause */
@@ -825,7 +833,8 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
*/
LOG_I(F1AP, "Received UE CONTEXT RELEASE REQUEST: Trigger RRC for RNTI %x\n", rnti);
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
f1ap_setup_req_t *req = &f1ap_cu_assoc_id_to_context(assoc_id)->setupReq;
if (req->cell_type==CELL_MACRO_GNB) {
AssertFatal(false,"must be devlopped\n");
} else {
struct rrc_eNB_ue_context_s *ue_context_pP;
@@ -861,14 +870,14 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, cmd->rnti);
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, cmd->rnti, cmd->assoc_id);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, cmd->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, cmd->rnti, cmd->assoc_id);
/* mandatory */
/* c3. Cause */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie3);
@@ -920,11 +929,11 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
return -1;
}
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0, cmd->assoc_id);
return 0;
}
int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
F1AP_UEContextReleaseComplete_t *container;
@@ -935,12 +944,12 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
const rnti_t rnti = f1ap_get_rnti_by_cu_id(CUtype, instance,
ie->value.choice.GNB_CU_UE_F1AP_ID);
ie->value.choice.GNB_CU_UE_F1AP_ID, assoc_id);
/* GNB_DU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(CUtype, instance,
ie->value.choice.GNB_DU_UE_F1AP_ID);
ie->value.choice.GNB_DU_UE_F1AP_ID, assoc_id);
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
rnti2, rnti);
/* Optional*/
@@ -959,7 +968,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
protocol_ctxt_t ctxt;
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti, assoc_id);
if (ue_context_p) {
MessageDef *msg = itti_alloc_new_message(TASK_CU_F1, 0, NGAP_UE_CONTEXT_RELEASE_COMPLETE);
@@ -998,14 +1007,14 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti, f1ap_ue_context_modification_req->assoc_id);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti, f1ap_ue_context_modification_req->assoc_id);
/* optional */
/* c3. NRCGI */
@@ -1582,12 +1591,12 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT_MODIFICATION REQUEST\n");
return -1;
}
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/, f1ap_ue_context_modification_req->assoc_id);
return 0;
}
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
@@ -1615,7 +1624,8 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
f1ap_ue_context_modification_resp->rnti =
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id, assoc_id);
f1ap_ue_context_modification_resp->assoc_id = assoc_id;
// DUtoCURRCInformation
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
@@ -1651,8 +1661,10 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
GtpuUpdateTunnelOutgoingAddressAndTeid(getCxt(CUtype, instance)->gtpInst,
extern instance_t CUuniqInstance;
GtpuUpdateTunnelOutgoingAddressAndTeid(CUuniqInstance,
f1ap_ue_context_modification_resp->rnti,
f1ap_ue_context_modification_resp->assoc_id,
(ebi_t)drbs_setupmod_item_p->dRBID,
drb_p->up_dl_tnl[0].tl_address,
drb_p->up_dl_tnl[0].teid);
@@ -1718,14 +1730,14 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
}
int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");

View File

@@ -40,12 +40,12 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_t *f1ap_ue_context_setup_req);
int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -54,7 +54,7 @@ int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
* UE Context Release Request (gNB-DU initiated)
*/
int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -65,7 +65,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
f1ap_ue_context_release_cmd_t *cmd);
int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -75,11 +75,11 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
f1ap_ue_context_setup_t *f1ap_ue_context_modification_req);
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -87,7 +87,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
* UE Context Modification Required (gNB-DU initiated)
*/
int CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int CU_send_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,

View File

@@ -51,7 +51,7 @@ int to_NRNRB(int nrb) {
}
int DU_handle_RESET(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -66,7 +66,7 @@ int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) {
}
int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -82,7 +82,7 @@ int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p) {
}
int DU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -349,12 +349,12 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
}
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0, -1);
return 0;
}
int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "DU_handle_F1_SETUP_RESPONSE\n");
@@ -521,7 +521,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
// SETUP FAILURE
int DU_handle_F1_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_E(F1AP, "DU_handle_F1_SETUP_FAILURE\n");
@@ -782,14 +782,14 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
}
int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
@@ -797,7 +797,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "DU_handle_gNB_CU_CONFIGURATION_UPDATE\n");
@@ -986,7 +986,7 @@ int DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
}
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0, -1);
return 0;
}
@@ -997,7 +997,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
}
int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(0, "Not implemented yet\n");

View File

@@ -37,13 +37,13 @@
* Reset
*/
int DU_handle_RESET(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int DU_send_RESET_ACKKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge);
int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset);
int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -52,7 +52,7 @@ int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
*/
int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p);
int DU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -63,12 +63,12 @@ int DU_handle_ERROR_INDICATION(instance_t instance,
int DU_send_F1_SETUP_REQUEST(instance_t instance);
int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int DU_handle_F1_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -80,12 +80,12 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
f1ap_setup_req_t *f1ap_du_data);
int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -93,7 +93,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
* gNB-CU Configuration Update
*/
int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -112,7 +112,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
F1AP_GNBDUResourceCoordinationRequest_t *GNBDUResourceCoordinationRequest);
int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -36,7 +36,7 @@
#include "openair2/RRC/LTE/rrc_proto.h"
int DU_handle_Paging(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
F1AP_Paging_t *paging;

View File

@@ -34,7 +34,7 @@
#define F1AP_DU_PAGING_H_
int DU_handle_Paging(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -60,7 +60,7 @@
/* DL RRC Message Transfer */
int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
F1AP_DLRRCMessageTransfer_t *container;
@@ -83,7 +83,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n",
du_ue_f1ap_id,
f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer
f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0)); // this should be the one transmitted via initial ul rrc message transfer
if (f1ap_du_add_cu_ue_id(instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) {
LOG_E(F1AP, "Failed to find the F1AP UID \n");
@@ -142,7 +142,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
f1ap_dl_rrc_message_t dl_rrc = {
.rrc_container_length = ie->value.choice.RRCContainer.size,
.rrc_container = ie->value.choice.RRCContainer.buf,
.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id),
.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0 /* assoc_id 0 in du */),
.srb_id = srb_id
};
int rc = dl_rrc_message(instance, &dl_rrc);
@@ -153,7 +153,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
AssertFatal(srb_id<3,"illegal srb_id\n");
MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION);
NRDuDlReq_t *req=&NRDuDlReq(msg);
req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0 /* assoc_id 0 in du */);
req->srb_id=srb_id;
req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__);
memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
@@ -190,7 +190,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
ie->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie->criticality = F1AP_Criticality_reject;
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti);
ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti, 0);
asn1cSeqAdd(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
@@ -198,7 +198,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
ie->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie->criticality = F1AP_Criticality_reject;
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti);
ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti, 0);
asn1cSeqAdd(&out->protocolIEs.list, ie);
/* mandatory */
/* c3. SRBID */
@@ -329,7 +329,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
}
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id, -1);
return 0;
}
@@ -346,7 +346,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
F1AP_InitialULRRCMessageTransfer_t *out;
uint8_t *buffer=NULL;
uint32_t len=0;
int f1ap_uid = f1ap_add_ue (DUtype, instanceP, rntiP);
int f1ap_uid = f1ap_add_ue (DUtype, instanceP, rntiP, 0);
if (f1ap_uid < 0 ) {
LOG_E(F1AP, "Failed to add UE \n");
@@ -416,7 +416,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
return -1;
}
f1ap_itti_send_sctp_data_req(false, instanceP, buffer, len, getCxt(DUtype, instanceP)->default_sctp_stream_id);
f1ap_itti_send_sctp_data_req(false, instanceP, buffer, len, getCxt(DUtype, instanceP)->default_sctp_stream_id, -1);
return 0;
}
@@ -448,14 +448,14 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti);
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti, 0);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti, 0);
/* mandatory */
/* c3. SRBID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie3);
@@ -480,6 +480,6 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
return -1;
}
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id, -1);
return 0;
}

View File

@@ -37,7 +37,7 @@
#include "f1ap_common.h"
int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -64,7 +64,7 @@ bool lteDURecvCb(protocol_ctxt_t *ctxt_pP,
}
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
MessageDef *msg_p; // message to RRC
@@ -89,11 +89,11 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_req->gNB_DU_ue_id =
ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
f1ap_ue_context_setup_req->rnti =
f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_DU_ue_id);
f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_DU_ue_id, 0);
} else {
f1ap_ue_context_setup_req->gNB_DU_ue_id = -1;
f1ap_ue_context_setup_req->rnti =
f1ap_get_rnti_by_cu_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_CU_ue_id);
f1ap_get_rnti_by_cu_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_CU_ue_id, assoc_id);
}
if(f1ap_ue_context_setup_req->rnti<0)
@@ -256,7 +256,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti, resp->assoc_id);
/* mandatory */
/* c3. DUtoCURRCInformation */
@@ -568,7 +568,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
f1ap_itti_send_sctp_data_req(false, instance,
buffer,
len,
getCxt(false, instance)->default_sctp_stream_id);
getCxt(false, instance)->default_sctp_stream_id,
-1);
return 0;
}
@@ -595,14 +596,14 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, req->rnti);
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, req->rnti, req->assoc_id);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti, req->assoc_id);
/* mandatory */
/* c3. Cause */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie3);
@@ -646,12 +647,13 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
f1ap_itti_send_sctp_data_req(false, instance,
buffer,
len,
getCxt(false, instance)->default_sctp_stream_id);
getCxt(false, instance)->default_sctp_stream_id,
-1);
return 0;
}
int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
F1AP_UEContextReleaseCommand_t *container;
@@ -668,12 +670,12 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
// GNB_CU_UE_F1AP_ID
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID, assoc_id);
// GNB_DU_UE_F1AP_ID
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
ie->value.choice.GNB_DU_UE_F1AP_ID);
ie->value.choice.GNB_DU_UE_F1AP_ID, 0);
AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", rnti, f1ap_ue_context_release_cmd->rnti);
// We don't need the Cause
@@ -730,14 +732,14 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
ie1->criticality = F1AP_Criticality_reject;
ie1->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, cplt->rnti);
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, cplt->rnti, cplt->assoc_id);
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd(out->protocolIEs.list,F1AP_UEContextReleaseCompleteIEs_t, ie2);
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, cplt->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, cplt->rnti, cplt->assoc_id);
/* optional -> currently not used */
/* c3. CriticalityDiagnostics */
//if (0) {
@@ -798,7 +800,8 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
f1ap_itti_send_sctp_data_req(false, instance,
buffer,
len,
getCxt(false, instance)->default_sctp_stream_id);
getCxt(false, instance)->default_sctp_stream_id,
-1);
f1ap_remove_ue(DUtype, instance, cplt->rnti);
return 0;
}
@@ -814,7 +817,7 @@ static instance_t du_create_gtpu_instance_to_cu(char *CUaddr, uint16_t CUport, c
}
int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
@@ -839,7 +842,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id);
f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id, 0);
if(f1ap_ue_context_modification_req->rnti<0)
LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n");
@@ -1004,7 +1007,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
ie2->criticality = F1AP_Criticality_reject;
ie2->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti);
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti, resp->assoc_id);
/* optional */
/* c3. ResourceCoordinationTransferContainer */
@@ -1297,7 +1300,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex
return -1;
}
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id, -1);
return 0;
}
@@ -1308,7 +1311,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) {
AssertFatal(1==0,"Not implemented yet\n");
}
int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");

View File

@@ -39,7 +39,7 @@
int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req);
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance);
@@ -56,7 +56,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
* UE Context Release Command (gNB-CU initiated)
*/
int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
@@ -71,7 +71,7 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
* UE Context Modification (gNB-CU initiated)
*/
int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp);
@@ -83,7 +83,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance);
*/
int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance);
int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
uint32_t assoc_id,
int assoc_id,
uint32_t stream,
F1AP_F1AP_PDU_t *pdu);

View File

@@ -80,7 +80,7 @@ const char *f1ap_direction2String(int f1ap_dir) {
return(f1ap_direction_String[f1ap_dir]);
}
int f1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
int f1ap_handle_message(instance_t instance, int assoc_id, int32_t stream,
const uint8_t *const data, const uint32_t data_length) {
F1AP_F1AP_PDU_t pdu= {0};
int ret;

View File

@@ -23,12 +23,12 @@
#include "f1ap_itti_messaging.h"
void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffer,
uint32_t buffer_length, uint16_t stream) {
uint32_t buffer_length, uint16_t stream, int assoc_id) {
MessageDef *message_p;
sctp_data_req_t *sctp_data_req;
message_p = itti_alloc_new_message(isCu?TASK_CU_F1:TASK_DU_F1, 0, SCTP_DATA_REQ);
sctp_data_req = &message_p->ittiMsg.sctp_data_req;
sctp_data_req->assoc_id = f1ap_assoc_id(isCu,instance);
sctp_data_req->assoc_id = isCu ? assoc_id : f1ap_assoc_id(isCu,instance);
sctp_data_req->buffer = buffer;
sctp_data_req->buffer_length = buffer_length;
sctp_data_req->stream = stream;

View File

@@ -23,7 +23,7 @@
#define F1AP_ITTI_MESSAGING_H_
void f1ap_itti_send_sctp_data_req(bool isCu,instance_t instance, uint8_t *buffer,
uint32_t buffer_length, uint16_t stream);
uint32_t buffer_length, uint16_t stream, int assoc_id);
void f1ap_eNB_itti_send_sctp_close_association(bool isCu,instance_t instance);

View File

@@ -629,6 +629,9 @@ void nr_initiate_ra_proc(module_id_t module_idP,
do {
// 3GPP TS 38.321 version 15.13.0 Section 7.1 Table 7.1-1: RNTI values
ra->rnti = (taus() % 0xffef) + 1;
static int next_id = 0x1000;
ra->rnti = next_id;
next_id++;
loop++;
} while (loop != 100
&& !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)

View File

@@ -118,7 +118,7 @@ int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *
/* TODO: drop the RRC context */
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti, dl_rrc->assoc_id);
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
ue_p->SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList;
ue_p->masterCellGroup = cellGroup;

View File

@@ -254,6 +254,7 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const uint32_t * destinationL2Id);
bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,

View File

@@ -32,7 +32,7 @@ void e1_add_drb(int is_gnb,
unsigned char *ciphering_key,
unsigned char *integrity_key)
{
add_drb_am(is_gnb, ue_id, 0, s, ciphering_algorithm, integrity_algorithm,
add_drb_am(is_gnb, ue_id, 0 /* assoc_id */, 0, s, ciphering_algorithm, integrity_algorithm,
ciphering_key, integrity_key);
LOG_I(PDCP, "%s:%s:%d: added DRB for UE ID %ld\n", __FILE__, __FUNCTION__, __LINE__, ue_id);
}

View File

@@ -45,7 +45,7 @@ void nr_pdcp_e1_add_drbs(eNB_flag_t enb_flag,
uint8_t *const kUPenc,
uint8_t *const kUPint);
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s,
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, int assoc_id, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s,
int ciphering_algorithm,
int integrity_algorithm,
unsigned char *ciphering_key,

View File

@@ -217,6 +217,7 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
typedef struct {
protocol_ctxt_t ctxt_pP;
int assoc_id;
srb_flag_t srb_flagP;
MBMS_flag_t MBMS_flagP;
rb_id_t rb_id;
@@ -238,6 +239,7 @@ static pdcp_data_ind_queue pq;
static void do_pdcp_data_ind(
const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const MBMS_flag_t MBMS_flagP,
const rb_id_t rb_id,
@@ -261,7 +263,7 @@ static void do_pdcp_data_ind(
T(T_ENB_PDCP_UL, T_INT(ctxt_pP->module_id), T_INT(rntiMaybeUEid), T_INT(rb_id), T_INT(sdu_buffer_size));
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid, assoc_id);
if (srb_flagP == 1) {
if (rb_id < 1 || rb_id > 2)
@@ -300,6 +302,7 @@ static void *pdcp_data_ind_thread(void *_)
if (pthread_mutex_unlock(&pq.m) != 0) abort();
do_pdcp_data_ind(&pq.q[i].ctxt_pP,
pq.q[i].assoc_id,
pq.q[i].srb_flagP,
pq.q[i].MBMS_flagP,
pq.q[i].rb_id,
@@ -330,7 +333,8 @@ static void init_nr_pdcp_data_ind_queue(void)
}
static void enqueue_pdcp_data_ind(
const protocol_ctxt_t *const ctxt_pP,
const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const MBMS_flag_t MBMS_flagP,
const rb_id_t rb_id,
@@ -353,6 +357,7 @@ static void enqueue_pdcp_data_ind(
pq.length++;
pq.q[i].ctxt_pP = *ctxt_pP;
pq.q[i].assoc_id = assoc_id;
pq.q[i].srb_flagP = srb_flagP;
pq.q[i].MBMS_flagP = MBMS_flagP;
pq.q[i].rb_id = rb_id;
@@ -363,7 +368,8 @@ static void enqueue_pdcp_data_ind(
if (pthread_mutex_unlock(&pq.m) != 0) abort();
}
bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
bool nr_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const MBMS_flag_t MBMS_flagP,
const rb_id_t rb_id,
@@ -373,6 +379,7 @@ bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
const uint32_t *const dstID)
{
enqueue_pdcp_data_ind(ctxt_pP,
assoc_id,
srb_flagP,
MBMS_flagP,
rb_id,
@@ -411,6 +418,7 @@ static void *enb_tun_read_thread(void *_)
int len;
protocol_ctxt_t ctxt;
ue_id_t rntiMaybeUEid;
int assoc_id;
int rb_id = 1;
pthread_setname_np( pthread_self(),"enb_tun_read");
@@ -426,6 +434,7 @@ static void *enb_tun_read_thread(void *_)
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
const bool has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &rntiMaybeUEid);
assoc_id = nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager, rntiMaybeUEid);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
if (!has_ue) continue;
@@ -443,7 +452,7 @@ static void *enb_tun_read_thread(void *_)
bool rqi = 0;
int pdusession_id = 10;
sdap_data_req(&ctxt, rntiMaybeUEid, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, rqi, pdusession_id);
sdap_data_req(&ctxt, rntiMaybeUEid, assoc_id, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, rqi, pdusession_id);
}
return NULL;
@@ -456,6 +465,7 @@ static void *ue_tun_read_thread(void *_)
int len;
protocol_ctxt_t ctxt;
ue_id_t rntiMaybeUEid;
int assoc_id;
int has_ue;
int rb_id = 1;
@@ -471,6 +481,7 @@ static void *ue_tun_read_thread(void *_)
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
has_ue = nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager, &rntiMaybeUEid);
assoc_id = nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager, rntiMaybeUEid);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
if (!has_ue) continue;
@@ -488,7 +499,7 @@ static void *ue_tun_read_thread(void *_)
extern uint8_t nas_qfi;
extern uint8_t nas_pduid;
sdap_data_req(&ctxt, rntiMaybeUEid, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, nas_qfi, dc, nas_pduid);
sdap_data_req(&ctxt, rntiMaybeUEid, assoc_id, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, nas_qfi, dc, nas_pduid);
}
return NULL;
@@ -620,13 +631,14 @@ uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id)
static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
char *buf, int size)
{
printf("xxx pdcp deliver sdu drb size %d\n", size); fflush(stdout);
nr_pdcp_ue_t *ue = _ue;
int rb_id;
int i;
if (IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN) {
LOG_D(PDCP, "IP packet received with size %d, to be sent to SDAP interface, UE ID/RNTI: %ld\n", size, ue->rntiMaybeUEid);
sdap_data_ind(entity->rb_id, entity->is_gnb, entity->has_sdap_rx, entity->pdusession_id, ue->rntiMaybeUEid, buf, size);
sdap_data_ind(entity->rb_id, entity->is_gnb, entity->has_sdap_rx, entity->pdusession_id, ue->rntiMaybeUEid, ue->f1ap_assoc_id, buf, size);
}
else{
for (i = 0; i < MAX_DRBS_PER_UE; i++) {
@@ -642,7 +654,7 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
rb_found:
{
LOG_D(PDCP, "%s() (drb %d) sending message to SDAP size %d\n", __func__, rb_id, size);
sdap_data_ind(rb_id, ue->drb[rb_id - 1]->is_gnb, ue->drb[rb_id - 1]->has_sdap_rx, ue->drb[rb_id - 1]->pdusession_id, ue->rntiMaybeUEid, buf, size);
sdap_data_ind(rb_id, ue->drb[rb_id - 1]->is_gnb, ue->drb[rb_id - 1]->has_sdap_rx, ue->drb[rb_id - 1]->pdusession_id, ue->rntiMaybeUEid, ue->f1ap_assoc_id, buf, size);
}
}
}
@@ -691,10 +703,12 @@ rb_found:
req->length = size;
req->offset = GTPU_HEADER_OVERHEAD_MAX;
req->ue_id = ue->rntiMaybeUEid;
req->assoc_id = ue->f1ap_assoc_id;
req->bearer_id = rb_id;
LOG_I(PDCP, "%s() (drb %d) sending message to gtp size %d\n",
__func__, rb_id, size);
extern instance_t CUuniqInstance;
printf("xxx pdcp send pdu to cu CUuniqInstance %ld ue_id %ld assoc_id %d size %d sdu_id %d\n", CUuniqInstance, req->ue_id, req->assoc_id, size, sdu_id); fflush(stdout);
itti_send_msg_to_task(TASK_GTPV1_U, CUuniqInstance, message_p);
} else {
memblock = get_free_mem_block(size, __FUNCTION__);
@@ -729,6 +743,7 @@ srb_found:
AssertFatal(message_p != NULL, "OUT OF MEMORY\n");
f1ap_ul_rrc_message_t *ul_rrc = &F1AP_UL_RRC_MESSAGE(message_p);
ul_rrc->rnti = ue->rntiMaybeUEid;
ul_rrc->assoc_id = ue->f1ap_assoc_id;
ul_rrc->srb_id = srb_id;
ul_rrc->rrc_container = malloc(size);
AssertFatal(ul_rrc->rrc_container != NULL, "OUT OF MEMORY\n");
@@ -794,6 +809,7 @@ srb_found:
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
F1AP_DL_RRC_MESSAGE(message_p).rnti = ue->rntiMaybeUEid;
F1AP_DL_RRC_MESSAGE (message_p).assoc_id = ue->f1ap_assoc_id;
F1AP_DL_RRC_MESSAGE (message_p).srb_id = srb_id;
F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1;
F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
@@ -802,6 +818,18 @@ srb_found:
}
}
bool nr_pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode,
const uint32_t *const sourceL2Id,
const uint32_t *const destinationL2Id);
void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
{
MessageDef *msg_p;
@@ -814,29 +842,30 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
break;
}
switch (ITTI_MSG_ID(msg_p)) {
case RRC_DCCH_DATA_REQ:
LOG_D(PDCP, "Received RRC_DCCH_DATA_REQ type at PDCP task \n");
case NR_RRC_DCCH_DATA_REQ:
LOG_D(PDCP, "Received NR_RRC_DCCH_DATA_REQ type at PDCP task \n");
PROTOCOL_CTXT_SET_BY_MODULE_ID(
&ctxt,
RRC_DCCH_DATA_REQ(msg_p).module_id,
RRC_DCCH_DATA_REQ(msg_p).enb_flag,
RRC_DCCH_DATA_REQ(msg_p).rnti,
RRC_DCCH_DATA_REQ(msg_p).frame,
NR_RRC_DCCH_DATA_REQ(msg_p).module_id,
NR_RRC_DCCH_DATA_REQ(msg_p).gnb_flag,
NR_RRC_DCCH_DATA_REQ(msg_p).rnti,
NR_RRC_DCCH_DATA_REQ(msg_p).frame,
0,
RRC_DCCH_DATA_REQ(msg_p).eNB_index);
result = pdcp_data_req(&ctxt,
SRB_FLAG_YES,
RRC_DCCH_DATA_REQ(msg_p).rb_id,
RRC_DCCH_DATA_REQ(msg_p).muip,
RRC_DCCH_DATA_REQ(msg_p).confirmp,
RRC_DCCH_DATA_REQ(msg_p).sdu_size,
RRC_DCCH_DATA_REQ(msg_p).sdu_p,
RRC_DCCH_DATA_REQ(msg_p).mode,
NULL, NULL);
NR_RRC_DCCH_DATA_REQ(msg_p).gNB_index);
result = nr_pdcp_data_req(&ctxt,
NR_RRC_DCCH_DATA_REQ(msg_p).assoc_id,
SRB_FLAG_YES,
NR_RRC_DCCH_DATA_REQ(msg_p).rb_id,
NR_RRC_DCCH_DATA_REQ(msg_p).muip,
NR_RRC_DCCH_DATA_REQ(msg_p).confirmp,
NR_RRC_DCCH_DATA_REQ(msg_p).sdu_size,
NR_RRC_DCCH_DATA_REQ(msg_p).sdu_p,
NR_RRC_DCCH_DATA_REQ(msg_p).mode,
NULL, NULL);
if (result != true)
LOG_E(PDCP, "PDCP data request failed!\n");
result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ(msg_p).sdu_p);
result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), NR_RRC_DCCH_DATA_REQ(msg_p).sdu_p);
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
break;
default:
@@ -846,7 +875,7 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP)
}
}
static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, int assoc_id, struct NR_SRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
{
nr_pdcp_entity_t *pdcp_srb;
nr_pdcp_ue_t *ue;
@@ -858,7 +887,7 @@ static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s
else t_Reordering = decode_t_reordering(*s->pdcp_Config->t_Reordering);
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid, assoc_id);
if (ue->srb[srb_id-1] != NULL) {
LOG_D(PDCP, "%s:%d:%s: warning SRB %d already exist for UE ID/RNTI %ld, do nothing\n", __FILE__, __LINE__, __FUNCTION__, srb_id, rntiMaybeUEid);
} else {
@@ -877,7 +906,7 @@ static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
}
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, int assoc_id, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
{
nr_pdcp_entity_t *pdcp_drb;
nr_pdcp_ue_t *ue;
@@ -948,7 +977,7 @@ void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, st
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid, assoc_id);
if (ue->drb[drb_id-1] != NULL) {
LOG_W(PDCP, "%s:%d:%s: warning DRB %d already exist for UE ID/RNTI %ld, do nothing\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rntiMaybeUEid);
} else {
@@ -963,7 +992,9 @@ void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, st
nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
if (reestablish_ue_id > 0) {
nr_pdcp_ue_t *reestablish_ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, reestablish_ue_id);
LOG_E(PDCP, "TODO: handle reestablish_ue_id\n");
abort();
nr_pdcp_ue_t *reestablish_ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, reestablish_ue_id, assoc_id);
if (reestablish_ue != NULL) {
pdcp_drb->tx_next = reestablish_ue->drb[drb_id - 1]->tx_next;
LOG_I(PDCP, "Applying tx_next %d in DRB %d from old UEid %lx to new UEid %lx\n", reestablish_ue->drb[drb_id - 1]->tx_next, drb_id, reestablish_ue_id, rntiMaybeUEid);
@@ -972,13 +1003,14 @@ void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, st
LOG_D(PDCP, "%s:%d:%s: added drb %d to UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rntiMaybeUEid);
new_nr_sdap_entity(is_gnb, has_sdap_rx, has_sdap_tx, rntiMaybeUEid, pdusession_id, is_sdap_DefaultDRB, drb_id, mappedQFIs2Add, mappedQFIs2AddCount);
new_nr_sdap_entity(is_gnb, has_sdap_rx, has_sdap_tx, rntiMaybeUEid, assoc_id, pdusession_id, is_sdap_DefaultDRB, drb_id, mappedQFIs2Add, mappedQFIs2AddCount);
}
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
}
static void add_drb(int is_gnb,
ue_id_t rntiMaybeUEid,
int assoc_id,
ue_id_t reestablish_ue_id,
struct NR_DRB_ToAddMod *s,
NR_RLC_Config_t *rlc_Config,
@@ -989,12 +1021,12 @@ static void add_drb(int is_gnb,
{
switch (rlc_Config->present) {
case NR_RLC_Config_PR_am:
add_drb_am(is_gnb, rntiMaybeUEid, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
add_drb_am(is_gnb, rntiMaybeUEid, assoc_id, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
break;
case NR_RLC_Config_PR_um_Bi_Directional:
// add_drb_um(rntiMaybeUEid, s);
/* hack */
add_drb_am(is_gnb, rntiMaybeUEid, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
add_drb_am(is_gnb, rntiMaybeUEid, assoc_id, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
break;
default:
LOG_E(PDCP, "%s:%d:%s: fatal: unhandled DRB type\n",
@@ -1004,11 +1036,11 @@ static void add_drb(int is_gnb,
LOG_I(PDCP, "%s:%s:%d: added DRB for UE ID/RNTI %ld\n", __FILE__, __FUNCTION__, __LINE__, rntiMaybeUEid);
}
void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kRRCint)
void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, int assoc_id, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kRRCint)
{
if (srb2add_list != NULL) {
for (int i = 0; i < srb2add_list->list.count; i++) {
add_srb(enb_flag, rntiMaybeUEid, srb2add_list->list.array[i], security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kRRCenc, kRRCint);
add_srb(enb_flag, rntiMaybeUEid, assoc_id, srb2add_list->list.array[i], security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kRRCenc, kRRCint);
}
} else
LOG_W(PDCP, "nr_pdcp_add_srbs() with void list\n");
@@ -1020,6 +1052,7 @@ void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddMo
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
ue_id_t rntiMaybeUEid,
int assoc_id,
ue_id_t reestablish_ue_id,
NR_DRB_ToAddModList_t *const drb2add_list,
const uint8_t security_modeP,
@@ -1029,7 +1062,7 @@ void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
{
if (drb2add_list != NULL) {
for (int i = 0; i < drb2add_list->list.count; i++) {
add_drb(enb_flag, rntiMaybeUEid, reestablish_ue_id, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config, security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kUPenc, kUPint);
add_drb(enb_flag, rntiMaybeUEid, assoc_id, reestablish_ue_id, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config, security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kUPenc, kUPint);
}
} else
LOG_W(PDCP, "nr_pdcp_add_drbs() with void list\n");
@@ -1119,7 +1152,7 @@ void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid)
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, crntiMaybeUEid, 0, 0, 0);
}
nr_pdcp_add_drbs(ctxt.enb_flag, ctxt.rntiMaybeUEid, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, Rlc_Bearer_ToAdd_list);
nr_pdcp_add_drbs(ctxt.enb_flag, ctxt.rntiMaybeUEid, 0 /* assoc_id */, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, Rlc_Bearer_ToAdd_list);
nr_rrc_rlc_config_asn1_req(&ctxt, (NR_SRB_ToAddModList_t *)NULL, rbconfig->drb_ToAddModList, rbconfig->drb_ToReleaseList, Rlc_Bearer_ToAdd_list);
@@ -1133,17 +1166,46 @@ uint64_t get_pdcp_optmask(void)
bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP)
{
#if 0
ue_id_t rntiMaybeUEid = ctxt_pP->rntiMaybeUEid;
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
rrturn 1;
#endif
AssertFatal(0, "unused in NR\n");
}
bool nr_pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP, int assoc_id)
{
int rntiMaybeUEid = ctxt_pP->rntiMaybeUEid;
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager, rntiMaybeUEid, assoc_id);
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
return 1;
}
void pdcp_config_set_security(
const protocol_ctxt_t* const ctxt_pP,
const int assoc_id,
pdcp_t *const pdcp_pP,
const rb_id_t rb_id,
const uint16_t lc_idP,
const uint8_t security_modeP,
uint8_t *const kRRCenc_pP,
uint8_t *const kRRCint_pP,
uint8_t *const kUPenc_pP)
{
AssertFatal(0, "not to be used in NR\n");
}
void nr_pdcp_config_set_security(
const protocol_ctxt_t* const ctxt_pP,
const int assoc_id,
pdcp_t *const pdcp_pP,
const rb_id_t rb_id,
const uint16_t lc_idP,
@@ -1160,7 +1222,7 @@ void pdcp_config_set_security(
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id, assoc_id);
/* TODO: proper handling of DRBs, for the moment only SRBs are handled */
@@ -1187,6 +1249,7 @@ void pdcp_config_set_security(
}
static bool pdcp_data_req_srb(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
@@ -1210,7 +1273,7 @@ static bool pdcp_data_req_srb(protocol_ctxt_t *ctxt_pP,
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id, assoc_id);
if (rb_id < 1 || rb_id > 2)
rb = NULL;
@@ -1232,6 +1295,7 @@ static bool pdcp_data_req_srb(protocol_ctxt_t *ctxt_pP,
static bool pdcp_data_req_drb(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
@@ -1255,7 +1319,7 @@ static bool pdcp_data_req_drb(protocol_ctxt_t *ctxt_pP,
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id, assoc_id);
if (rb_id < 1 || rb_id > MAX_DRBS_PER_UE)
rb = NULL;
@@ -1276,6 +1340,7 @@ static bool pdcp_data_req_drb(protocol_ctxt_t *ctxt_pP,
}
bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
@@ -1293,9 +1358,9 @@ bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP,
exit(1);
}
memcpy(memblock->data,sdu_buffer, sdu_buffer_size);
int ret=pdcp_data_ind(ctxt_pP,srb_flagP, false, rb_id, sdu_buffer_size, memblock, NULL, NULL);
int ret = nr_pdcp_data_ind(ctxt_pP, assoc_id, srb_flagP, false, rb_id, sdu_buffer_size, memblock, NULL, NULL);
if (!ret) {
LOG_E(RLC, "%s:%d:%s: ERROR: pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__);
LOG_E(RLC, "%s:%d:%s: ERROR: nr_pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__);
/* what to do in case of failure? for the moment: nothing */
}
return ret;
@@ -1311,12 +1376,27 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const pdcp_transmission_mode_t mode,
const uint32_t *const sourceL2Id,
const uint32_t *const destinationL2Id)
{
AssertFatal(0, "not to be used in NR\n");
}
bool nr_pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode,
const uint32_t *const sourceL2Id,
const uint32_t *const destinationL2Id)
{
if (srb_flagP) {
return pdcp_data_req_srb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer);
return pdcp_data_req_srb(ctxt_pP, assoc_id, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer);
}
else{
return pdcp_data_req_drb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer);
return pdcp_data_req_drb(ctxt_pP, assoc_id, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer);
}
}
@@ -1355,14 +1435,14 @@ nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager() {
}
/* returns false in case of error, true if everything ok */
const bool nr_pdcp_get_statistics(ue_id_t ue_id, int srb_flag, int rb_id, nr_pdcp_statistics_t *out)
const bool nr_pdcp_get_statistics(ue_id_t ue_id, int assoc_id, int srb_flag, int rb_id, nr_pdcp_statistics_t *out)
{
nr_pdcp_ue_t *ue;
nr_pdcp_entity_t *rb;
bool ret;
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id, assoc_id);
if (srb_flag == 1) {
if (rb_id < 1 || rb_id > 2)

View File

@@ -76,17 +76,18 @@ void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *_m)
}
/* must be called with lock acquired */
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id)
{
/* TODO: optimze */
nr_pdcp_ue_manager_internal_t *m = _m;
int i;
for (i = 0; i < m->ue_count; i++)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid
&& m->ue_list[i]->f1ap_assoc_id == f1ap_assoc_id)
return m->ue_list[i];
LOG_D(PDCP, "%s:%d:%s: new UE ID/RNTI 0x%" PRIx64 "\n", __FILE__, __LINE__, __FUNCTION__, rntiMaybeUEid);
LOG_D(PDCP, "new UE ID/RNTI 0x%" PRIx64 " assoc_id %d\n", rntiMaybeUEid, f1ap_assoc_id);
m->ue_count++;
m->ue_list = realloc(m->ue_list, sizeof(nr_pdcp_ue_t *) * m->ue_count);
@@ -101,12 +102,13 @@ nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybe
}
m->ue_list[m->ue_count - 1]->rntiMaybeUEid = rntiMaybeUEid;
m->ue_list[m->ue_count-1]->f1ap_assoc_id = f1ap_assoc_id;
return m->ue_list[m->ue_count-1];
}
/* must be called with lock acquired */
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id)
{
nr_pdcp_ue_manager_internal_t *m = _m;
nr_pdcp_ue_t *ue;
@@ -114,7 +116,8 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
int j;
for (i = 0; i < m->ue_count; i++)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid
&& m->ue_list[i]->f1ap_assoc_id == f1ap_assoc_id)
break;
if (i == m->ue_count) {
@@ -210,3 +213,12 @@ bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *_m, ue_id_t *ret)
*ret = m->ue_list[0]->rntiMaybeUEid;
return true;
}
int nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager_t *_m, int rnti)
{
nr_pdcp_ue_manager_internal_t *m = _m;
if (m->ue_count == 0)
return -1;
AssertFatal(m->ue_list[0]->rntiMaybeUEid == rnti, "bad rnti\n");
return m->ue_list[0]->f1ap_assoc_id;
}

View File

@@ -30,6 +30,7 @@ typedef void nr_pdcp_ue_manager_t;
typedef struct nr_pdcp_ue_t {
ue_id_t rntiMaybeUEid;
int f1ap_assoc_id;
nr_pdcp_entity_t *srb[3];
nr_pdcp_entity_t *drb[MAX_DRBS_PER_UE];
} nr_pdcp_ue_t;
@@ -45,8 +46,8 @@ int nr_pdcp_manager_get_enb_flag(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_lock(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *m);
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid);
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid);
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id);
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id);
nr_pdcp_ue_t **nr_pdcp_manager_get_ue_list(nr_pdcp_ue_manager_t *_m);
int nr_pdcp_manager_get_ue_count(nr_pdcp_ue_manager_t *_m);
@@ -67,4 +68,7 @@ void nr_pdcp_ue_add_drb_pdcp_entity(nr_pdcp_ue_t *ue, int drb_id,
/* returns 0 if no UE, 1 otherwise */
bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *m, ue_id_t *ret);
/* returns -1 if no UE */
int nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager_t *m, int rnti);
#endif /* _NR_PDCP_UE_MANAGER_H_ */

View File

@@ -546,6 +546,7 @@ rb_found:
req->length=size;
req->offset=0;
req->ue_id=ue->rnti;
req->assoc_id = 0;
req->bearer_id=rb_id;
LOG_D(RLC, "Received uplink user-plane traffic at RLC-DU to be sent to the CU, size %d \n", size);
extern instance_t DUuniqInstance;
@@ -562,8 +563,9 @@ rb_found:
}
memcpy(memblock->data, buf, size);
LOG_D(PDCP, "Calling PDCP layer from RLC in %s\n", __FUNCTION__);
if (!pdcp_data_ind(&ctx, is_srb, 0, rb_id, size, memblock, NULL, NULL)) {
LOG_E(RLC, "%s:%d:%s: ERROR: pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__);
AssertFatal(!(NODE_IS_CU(RC.nrrrc[0]->node_type)), "CU should not call this\n");
if (!nr_pdcp_data_ind(&ctx, 0, is_srb, 0, rb_id, size, memblock, NULL, NULL)) {
LOG_E(RLC, "%s:%d:%s: ERROR: nr_pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__);
/* what to do in case of failure? for the moment: nothing */
}
}

View File

@@ -59,6 +59,7 @@ nr_rrc_mac_remove_ue(module_id_t mod_idP,
uint8_t
nr_rrc_data_req(
const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const rb_id_t rb_idP,
const mui_t muiP,
const confirm_t confirmP,
@@ -77,24 +78,25 @@ nr_rrc_data_req(
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
sdu_sizeP);
memcpy (message_buffer, buffer_pP, sdu_sizeP);
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_UE, 0, RRC_DCCH_DATA_REQ);
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
RRC_DCCH_DATA_REQ (message_p).muip = muiP;
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
//memcpy (NR_RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
RRC_DCCH_DATA_REQ (message_p).mode = modeP;
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
RRC_DCCH_DATA_REQ(message_p).rnti = ctxt_pP->rntiMaybeUEid;
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_UE, 0, NR_RRC_DCCH_DATA_REQ);
NR_RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
NR_RRC_DCCH_DATA_REQ (message_p).gnb_flag = ctxt_pP->enb_flag;
NR_RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
NR_RRC_DCCH_DATA_REQ (message_p).muip = muiP;
NR_RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
NR_RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
NR_RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
//memcpy (NR_NR_RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
NR_RRC_DCCH_DATA_REQ (message_p).mode = modeP;
NR_RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
NR_RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rntiMaybeUEid;
NR_RRC_DCCH_DATA_REQ (message_p).assoc_id = assoc_id;
NR_RRC_DCCH_DATA_REQ (message_p).gNB_index = ctxt_pP->eNB_index;
itti_send_msg_to_task (
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
ctxt_pP->instance,
message_p);
LOG_I(NR_RRC,"send RRC_DCCH_DATA_REQ to PDCP\n");
LOG_I(NR_RRC,"send NR_RRC_DCCH_DATA_REQ to PDCP\n");
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
* Ideally, PDCP would not neet to be triggered like this but react to ITTI
@@ -163,7 +165,7 @@ int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
const int dl_bwp_id,
const int ul_bwp_id) {
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP, 0 /* no assoc_id in mac, let's use 0 */);
protocol_ctxt_t ctxt;
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0);
@@ -180,7 +182,7 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context(
RC.nrrrc[Mod_instP],
rntiP);
rntiP, 0 /* no assoc_id in mac, let's use 0 */);
if (ue_context_p != NULL) {
LOG_D(RRC,"Frame %d, Subframe %d: UE %x UL failure, activating timer\n",frameP,subframeP,rntiP);
@@ -196,7 +198,7 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP,
const sub_frame_t subframeP,
const rnti_t rntiP) {
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_instP], rntiP);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_instP], rntiP, 0 /* no assoc_id in mac, let's use 0 */);
if (ue_context_p != NULL) {
LOG_W(RRC,"Frame %d, Subframe %d: UE %x UL failure reset, deactivating timer\n",frameP,subframeP,rntiP);
ue_context_p->ue_context.ul_failure_timer=0;

View File

@@ -593,7 +593,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
gNB_RrcConfigurationReq *configuration) {
asn_enc_rval_t enc_rval;
SystemInformation_IEs__sib_TypeAndInfo__Member *sib2 = NULL;
SystemInformation_IEs__sib_TypeAndInfo__Member *sib3 = NULL;
//SystemInformation_IEs__sib_TypeAndInfo__Member *sib3 = NULL;
NR_BCCH_DL_SCH_Message_t *sib_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t));
sib_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1;
@@ -610,7 +610,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
sib2->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2;
sib2->choice.sib2 = CALLOC(1, sizeof(struct NR_SIB2));
sib2->choice.sib2->cellReselectionInfoCommon.q_Hyst = NR_SIB2__cellReselectionInfoCommon__q_Hyst_dB1;
sib2->choice.sib2->cellReselectionServingFreqInfo.threshServingLowP = 2; // INTEGER (0..31)
sib2->choice.sib2->cellReselectionServingFreqInfo.threshServingLowP = 31; //2; // INTEGER (0..31)
sib2->choice.sib2->cellReselectionServingFreqInfo.cellReselectionPriority = 2; // INTEGER (0..7)
sib2->choice.sib2->intraFreqCellReselectionInfo.q_RxLevMin = -50; // INTEGER (-70..-22)
sib2->choice.sib2->intraFreqCellReselectionInfo.s_IntraSearchP = 2; // INTEGER (0..31)
@@ -618,10 +618,12 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
sib2->choice.sib2->intraFreqCellReselectionInfo.deriveSSB_IndexFromCell = true;
asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib2);
#if 0
sib3 = CALLOC(1, sizeof(SystemInformation_IEs__sib_TypeAndInfo__Member));
sib3->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3;
sib3->choice.sib3 = CALLOC(1, sizeof(struct NR_SIB3));
asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib3);
#endif
//encode SIB to data
// carrier->SIB23 = (uint8_t *) malloc16(128);
@@ -632,6 +634,15 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
100);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
{
int i;
printf("do_SIB23_NR[%d]", (int)(enc_rval.encoded+7)/8);
for (i = 0; i < (enc_rval.encoded+7)/8; i++) printf(" %2.2x", (unsigned char)carrier->SIB23[i]);
printf("\n");
fflush(stdout);
}
return((enc_rval.encoded+7)/8);
}

View File

@@ -38,6 +38,7 @@
#include "common/ran_context.h"
#include "openair2/F1AP/f1ap_common.h"
#include "openair2/E1AP/e1ap_common.h"
#include "openair2/F1AP/f1ap_cu_task.h"
extern RAN_CONTEXT_t RC;
void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp,
@@ -60,6 +61,7 @@ void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp,
drbSetup->UpParamList[0].tlAddress = my_addr;
drbSetup->UpParamList[0].teId = newGtpuCreateTunnel(gtpInst,
(ue_id & 0xFFFF),
req->assoc_id,
drb2Setup->id,
drb2Setup->id,
0xFFFF, // We will set the right value from DU answer
@@ -91,6 +93,7 @@ void CU_update_UP_DL_tunnel(e1ap_bearer_setup_req_t *const req, instance_t insta
GtpuUpdateTunnelOutgoingAddressAndTeid(instance,
(ue_id & 0xFFFF),
req->assoc_id,
(ebi_t)drb_p->id,
*(in_addr_t*)&newRemoteAddr.buffer,
drb_p->DlUpParamList[0].teId);
@@ -119,6 +122,7 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
create_tunnel_req.num_tunnels = 1;
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
create_tunnel_req.assoc_id = req->assoc_id;
int ret = gtpv1u_create_ngu_tunnel(getCxtE1(instance)->gtpInstN3, &create_tunnel_req, &create_tunnel_resp);
if (ret != 0) {
@@ -153,14 +157,14 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
LOG_D(NR_RRC,"Configuring PDCP DRBs/SRBs for UE %x\n",ue_context_p->ue_context.rnti);
nr_pdcp_add_srbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid,
nr_pdcp_add_srbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, req->assoc_id,
SRB_configList,
(ue_context_p->ue_context.integrity_algorithm << 4)
| ue_context_p->ue_context.ciphering_algorithm,
kRRCenc,
kRRCint);
nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, 0,
nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, req->assoc_id, 0,
DRB_configList,
(ue_context_p->ue_context.integrity_algorithm << 4)
| ue_context_p->ue_context.ciphering_algorithm,
@@ -187,7 +191,7 @@ static NR_SRB_ToAddModList_t **generateSRB2_confList(gNB_RRC_UE_t *ue, NR_SRB_To
return SRB_configList2;
}
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti);
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti, req->assoc_id);
protocol_ctxt_t ctxt = {0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
@@ -206,7 +210,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
e1ap_bearer_setup_resp_t resp; // Used to store teids
int remote_port = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
in_addr_t my_addr = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
instance_t gtpInst = f1ap_cu_assoc_id_to_context(req->assoc_id)->gtpInst;
// GTP tunnel for DL
fill_e1ap_bearer_setup_resp(&resp, req, gtpInst, ue_context_p->ue_context.rnti, remote_port, my_addr);
@@ -215,7 +219,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
}
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
instance_t gtpInst = f1ap_cu_assoc_id_to_context(req->assoc_id)->gtpInst;
CU_update_UP_DL_tunnel(req, gtpInst, req->rnti);
}

View File

@@ -36,7 +36,7 @@
extern RAN_CONTEXT_t RC;
static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance) {
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti);
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti, 0 /* assoc_id */);
protocol_ctxt_t ctxt = {0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);

View File

@@ -24,6 +24,7 @@
static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
{
printf("XX dl_rrc_message_transfer_f1ap assoc_id %d\n", dl_rrc->assoc_id); fflush(stdout);
/* TODO call F1AP function directly? no real-time constraint here */
MessageDef *message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);

View File

@@ -398,6 +398,10 @@ typedef struct gNB_RRC_UE_s {
uint8_t nas_pdu_flag;
ngap_nas_pdu_t nas_pdu;
/* F1AP assoc_id to know to which DU the UE is attached to
* (only valid in a cu/du scenario)
*/
int f1ap_assoc_id;
} gNB_RRC_UE_t;
typedef struct rrc_gNB_ue_context_s {

View File

@@ -139,6 +139,7 @@ void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMc
uint8_t
nr_rrc_data_req(
const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const rb_id_t rb_idP,
const mui_t muiP,
const confirm_t confirmP,
@@ -164,6 +165,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
const int ul_bwp_id);
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
int assoc_id,
const uint8_t *buffer,
int buffer_length,
const uint8_t *du_to_cu_rrc_container,
@@ -206,10 +208,11 @@ void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP,
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
e1ap_bearer_setup_resp_t *e1ap_resp);
void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kUPint);
void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, int assoc_id, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kUPint);
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
ue_id_t rntiMaybeUEid,
int assoc_id,
ue_id_t reestablish_ue_id,
NR_DRB_ToAddModList_t *const drb2add_list,
const uint8_t security_modeP,

View File

@@ -125,6 +125,7 @@ uint8_t first_rrcreconfiguration = 0;
///---------------------------------------------------------------------------------------------------------------///
bool DURecvCb(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_idP,
const mui_t muiP,
@@ -169,6 +170,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
rrc->carrier.SIB23 = (uint8_t *) malloc16(100);
AssertFatal(rrc->carrier.SIB23 != NULL, "cannot allocate memory for SIB");
rrc->carrier.sizeof_SIB23 = do_SIB23_NR(&rrc->carrier, configuration);
{ int i; printf("sib3[%d] =", rrc->carrier.sizeof_SIB23); for (i = 0; i < rrc->carrier.sizeof_SIB23; i++) printf(" %2.2x", (unsigned char)rrc->carrier.SIB23[i]); printf("\n"); fflush(stdout); }
LOG_I(NR_RRC,"do_SIB23_NR, size %d \n ", rrc->carrier.sizeof_SIB23);
AssertFatal(rrc->carrier.sizeof_SIB23 != 255,"FATAL, RC.nrrrc[mod].carrier[CC_id].sizeof_SIB23 == 255");
}
@@ -382,20 +384,22 @@ static void rrc_gNB_generate_RRCSetup(const protocol_ctxt_t *const ctxt_pP,
ue_context_pP->ue_context.ue_release_timer_thres = 1000;
/* TODO: this should go through the E1 interface */
nr_pdcp_add_srbs(ctxt_pP->enb_flag, ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.SRB_configList, 0, NULL, NULL);
nr_pdcp_add_srbs(ctxt_pP->enb_flag, ctxt_pP->rntiMaybeUEid, ue_p->f1ap_assoc_id, ue_context_pP->ue_context.SRB_configList, 0, NULL, NULL);
f1ap_dl_rrc_message_t dl_rrc = {
.old_gNB_DU_ue_id = 0xFFFFFF,
.rrc_container = buf,
.rrc_container_length = size,
.rnti = ue_p->rnti,
.assoc_id = ue_p->f1ap_assoc_id,
.srb_id = CCCH
};
printf("XX rrc_gNB_generate_RRCSetup assoc_id %d\n", ue_p->f1ap_assoc_id); fflush(stdout);
rrc->mac_rrc.dl_rrc_message_transfer(ctxt_pP->module_id, &dl_rrc);
}
//-----------------------------------------------------------------------------
static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(const protocol_ctxt_t *const ctxt_pP, const int CC_id)
static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(const protocol_ctxt_t *const ctxt_pP, int assoc_id, const int CC_id)
//-----------------------------------------------------------------------------
{
LOG_I(NR_RRC, "generate RRCSetup for RRCReestablishmentRequest \n");
@@ -404,7 +408,7 @@ static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(const protoc
const NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon;
const NR_ServingCellConfig_t *sccd = rrc_instance_p->configuration.scd;
ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, rrc_instance_p, 0);
ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, assoc_id, rrc_instance_p, 0);
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
unsigned char buf[1024];
@@ -463,6 +467,7 @@ static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(const protoc
.rrc_container = buf,
.rrc_container_length = size,
.rnti = ue_p->rnti,
.assoc_id = ue_p->f1ap_assoc_id,
.srb_id = CCCH
};
rrc_instance_p->mac_rrc.dl_rrc_message_transfer(ctxt_pP->module_id, &dl_rrc);
@@ -496,6 +501,7 @@ static void rrc_gNB_generate_RRCReject(const protocol_ctxt_t *const ctxt_pP, rrc
.rrc_container = buf,
.rrc_container_length = size,
.rnti = ue_p->rnti,
.assoc_id = ue_p->f1ap_assoc_id,
.srb_id = CCCH,
.execute_duplication = 1,
.RAT_frequency_priority_information.en_dc = 0
@@ -618,6 +624,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
case ngran_gNB_CUCP:
case ngran_gNB:
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -901,6 +908,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
nr_rrc_data_req(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -1087,6 +1095,7 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
nr_rrc_data_req(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -1176,6 +1185,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
nr_rrc_data_req(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -1256,10 +1266,11 @@ rrc_gNB_process_RRCReconfigurationComplete(
}
}
nr_pdcp_add_srbs(ctxt_pP->enb_flag, ctxt_pP->rntiMaybeUEid, SRB_configList, (ue_context_pP->ue_context.integrity_algorithm << 4) | ue_context_pP->ue_context.ciphering_algorithm, kRRCenc, kRRCint);
nr_pdcp_add_srbs(ctxt_pP->enb_flag, ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.f1ap_assoc_id, SRB_configList, (ue_context_pP->ue_context.integrity_algorithm << 4) | ue_context_pP->ue_context.ciphering_algorithm, kRRCenc, kRRCint);
nr_pdcp_add_drbs(ctxt_pP->enb_flag,
ctxt_pP->rntiMaybeUEid,
ue_context_pP->ue_context.f1ap_assoc_id,
reestablish_ue_id,
DRB_configList,
(ue_context_pP->ue_context.integrity_algorithm << 4) | ue_context_pP->ue_context.ciphering_algorithm,
@@ -1442,6 +1453,7 @@ void rrc_gNB_generate_RRCReestablishment(const protocol_ctxt_t *ctxt_pP,
if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) {
nr_pdcp_add_srbs(ctxt_pP->enb_flag,
ctxt_pP->rntiMaybeUEid,
ue_context_pP->ue_context.f1ap_assoc_id,
*SRB_configList,
0,
NULL,
@@ -1452,8 +1464,19 @@ void rrc_gNB_generate_RRCReestablishment(const protocol_ctxt_t *ctxt_pP,
} // if (*SRB_configList != NULL)
LOG_I(NR_RRC, "Set PDCP security RNTI %04lx nca %ld nia %d in RRCReestablishment\n", ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.ciphering_algorithm, ue_context_pP->ue_context.integrity_algorithm);
pdcp_config_set_security(
void nr_pdcp_config_set_security(
const protocol_ctxt_t* const ctxt_pP,
const int assoc_id,
pdcp_t *const pdcp_pP,
const rb_id_t rb_id,
const uint16_t lc_idP,
const uint8_t security_modeP,
uint8_t *const kRRCenc_pP,
uint8_t *const kRRCint_pP,
uint8_t *const kUPenc_pP);
nr_pdcp_config_set_security(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
NULL, /* pdcp_pP not used anymore in NR */
DCCH,
DCCH + 2,
@@ -1466,7 +1489,7 @@ void rrc_gNB_generate_RRCReestablishment(const protocol_ctxt_t *ctxt_pP,
apply_macrlc_config_reest(rrc, ue_context_pP, ctxt_pP, ctxt_pP->rntiMaybeUEid);
}
nr_rrc_data_req(ctxt_pP, DCCH, rrc_gNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL);
nr_rrc_data_req(ctxt_pP, ue_context_pP->ue_context.f1ap_assoc_id, DCCH, rrc_gNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL);
}
//-----------------------------------------------------------------------------
@@ -1578,6 +1601,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
if (h_rc == HASH_TABLE_OK) {
rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid;
rrc_ue_ngap_ids_p->assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
}
}
@@ -1600,11 +1624,13 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
}
create_tunnel_req.ue_id = ctxt_pP->rntiMaybeUEid; // warning put zero above
create_tunnel_req.assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
create_tunnel_req.num_tunnels = j;
ret = gtpv1u_update_ngu_tunnel(
ctxt_pP->instance,
&create_tunnel_req,
reestablish_rnti);
reestablish_rnti,
ue_context_pP->ue_context.f1ap_assoc_id /* not sure */);
if ( ret != 0 ) {
LOG_E(NR_RRC,"gtpv1u_update_ngu_tunnel failed,start to release UE %x\n",reestablish_rnti);
@@ -1614,7 +1640,8 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
h_rc = hashtable_get(rrc_instance_p->ngap_id2_ngap_ids, (hash_key_t)gNB_ue_ngap_id, (void **)&rrc_ue_ngap_ids_p);
if (h_rc == HASH_TABLE_OK ) {
rrc_ue_ngap_ids_p->ue_rnti = reestablish_rnti;
rrc_ue_ngap_ids_p->ue_rnti = reestablish_rnti;
rrc_ue_ngap_ids_p->assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
}
}
@@ -1739,7 +1766,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
ue_context_pP->ue_context.rnti,
cellGroupConfig);
nr_rrc_data_req(ctxt_pP, DCCH, rrc_gNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL);
nr_rrc_data_req(ctxt_pP, ue_context_pP->ue_context.f1ap_assoc_id, DCCH, rrc_gNB_mui++, SDU_CONFIRM_NO, size, buffer, PDCP_TRANSMISSION_MODE_CONTROL);
}
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
@@ -1805,6 +1832,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
masterCellGroup);
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -1830,6 +1858,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
/*------------------------------------------------------------------------------*/
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
int assoc_id,
const uint8_t *buffer,
int buffer_length,
const uint8_t *du_to_cu_rrc_container,
@@ -1865,7 +1894,8 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
case NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest:
LOG_D(NR_RRC, "Received RRCSetupRequest on UL-CCCH-Message (UE rnti %lx)\n", ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid, assoc_id);
LOG_I(NR_RRC, "Received RRCSetupRequest on UL-CCCH-Message (UE rnti %lx assoc_id %d ue_context %p (should be NULL))\n", ctxt_pP->rntiMaybeUEid, assoc_id, ue_context_p);
if (ue_context_p != NULL) {
rrc_gNB_free_mem_UE_context(ctxt_pP, ue_context_p);
} else {
@@ -1894,7 +1924,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
ue_context_p->ue_context.ul_failure_timer = 20000;
}
ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], random_value);
ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, assoc_id, RC.nrrrc[ctxt_pP->module_id], random_value);
} else if (NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1 == rrcSetupRequest->ue_Identity.present) {
/* TODO */
/* <5G-S-TMSI> = <AMF Set ID><AMF Pointer><5G-TMSI> 48-bit */
@@ -1935,7 +1965,8 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
LOG_I(NR_RRC, " 5G-S-TMSI-Part1 doesn't exist, setting ng_5G_S_TMSI_Part1 to %p => %ld\n",
ue_context_p, s_tmsi_part1);
ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], s_tmsi_part1);
ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, assoc_id, RC.nrrrc[ctxt_pP->module_id], s_tmsi_part1);
ue_context_p->ue_context.f1ap_assoc_id = assoc_id;
if (ue_context_p == NULL) {
LOG_E(RRC, "%s:%d:%s: rrc_gNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__);
@@ -1952,18 +1983,18 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
rrcSetupRequest->ue_Identity.choice.randomValue.buf,
rrcSetupRequest->ue_Identity.choice.randomValue.size);
rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], random_value);
rrc_gNB_get_next_free_ue_context(ctxt_pP, assoc_id, RC.nrrrc[ctxt_pP->module_id], random_value);
LOG_E(NR_RRC,
PROTOCOL_NR_RRC_CTXT_UE_FMT" RRCSetupRequest without random UE identity or S-TMSI not supported, let's reject the UE\n",
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
rrc_gNB_generate_RRCReject(ctxt_pP, rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid));
rrc_gNB_generate_RRCReject(ctxt_pP, rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid, assoc_id));
break;
}
ue_context_p->ue_context.establishment_cause = rrcSetupRequest->establishmentCause;
rrc_gNB_generate_RRCSetup(
ctxt_pP, rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid), du_to_cu_rrc_container, du_to_cu_rrc_container_len, gnb_rrc_inst->carrier.servingcellconfigcommon);
ctxt_pP, rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid, assoc_id), du_to_cu_rrc_container, du_to_cu_rrc_container_len, gnb_rrc_inst->carrier.servingcellconfigcommon);
}
break;
@@ -1991,7 +2022,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
rrcReestablishmentRequest.ue_Identity.physCellId,
RC.nrrrc[ctxt_pP->module_id]->carrier.physCellId);
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, assoc_id, 0);
break;
}
@@ -2005,16 +2036,16 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
if (rrcReestablishmentRequest.ue_Identity.c_RNTI < 0x1 || rrcReestablishmentRequest.ue_Identity.c_RNTI > 0xffef) {
/* c_RNTI range error should not happen */
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest c_RNTI range error, fallback to RRC establishment\n");
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, assoc_id, 0);
break;
}
rnti_t c_rnti = rrcReestablishmentRequest.ue_Identity.c_RNTI;
LOG_I(NR_RRC, "c_RNTI: %04x\n", c_rnti);
ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, c_rnti);
ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, c_rnti, assoc_id);
if (ue_context_p == NULL) {
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest without UE context, fallback to RRC establishment\n");
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, assoc_id, 0);
break;
}
@@ -2176,6 +2207,7 @@ static void rrc_gNB_process_MeasurementReport(rrc_gNB_ue_context_t *ue_context,
int
rrc_gNB_decode_dcch(
const protocol_ctxt_t *const ctxt_pP,
int assoc_id,
const rb_id_t Srb_id,
const uint8_t *const Rx_sdu,
const sdu_size_t sdu_sizeP
@@ -2233,7 +2265,7 @@ rrc_gNB_decode_dcch(
return -1;
}
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, assoc_id);
if (ul_dcch_msg->message.present == NR_UL_DCCH_MessageType_PR_c1) {
switch (ul_dcch_msg->message.choice.c1->present) {
@@ -2274,6 +2306,8 @@ rrc_gNB_decode_dcch(
ue_context_p->ue_context.pdu_session_release_command_flag = 0;
//gtp tunnel delete
gtpv1u_gnb_delete_tunnel_req_t req={0};
req.ue_id = ue_context_p->ue_context.rnti;
req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
for(i = 0; i < NB_RB_MAX; i++) {
if(xid == ue_context_p->ue_context.pduSession[i].xid) {
req.pdusession_id[req.num_pdusession++] =
@@ -2581,6 +2615,7 @@ rrc_gNB_decode_dcch(
req->gNB_CU_ue_id = 0;
req->gNB_DU_ue_id = 0;
req->rnti = ue_context_p->ue_context.rnti;
req->assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
req->mcc = RC.nrrrc[ctxt_pP->module_id]->configuration.mcc[0];
req->mnc = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc[0];
req->mnc_digit_length = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc_digit_length[0];
@@ -2654,7 +2689,7 @@ rrc_gNB_decode_dcch(
if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
LOG_I(NR_RRC, "Removing nr_reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n", i, nr_reestablish_rnti_map->ue_id, nr_reestablish_rnti_map->c_rnti);
reestablish_rnti = nr_reestablish_rnti_map->c_rnti;
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], reestablish_rnti);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], reestablish_rnti, assoc_id);
break;
}
}
@@ -2704,15 +2739,18 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
F1AP_SETUP_RESP (msg_p).num_cells_to_activate = 0;
MessageDef *msg_p2=itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_GNB_CU_CONFIGURATION_UPDATE);
for (int i = 0; i < f1_setup_req->num_cells_available; i++) {
for (int j=0; j<RC.nb_nr_inst; j++) {
gNB_RRC_INST *rrc = RC.nrrrc[j];
gNB_RRC_INST *rrc = RC.nrrrc[0];
if (rrc->configuration.mcc[0] == f1_setup_req->cell[i].mcc &&
rrc->configuration.mnc[0] == f1_setup_req->cell[i].mnc &&
for (int i = 0; i < f1_setup_req->num_cells_available; i++) {
printf("RC.nb_nr_inst %d\n", RC.nb_nr_inst); fflush(stdout);
for (int j=0; j<rrc->configuration.num_plmn; j++) {
if (rrc->configuration.mcc[j] == f1_setup_req->cell[i].mcc &&
rrc->configuration.mnc[j] == f1_setup_req->cell[i].mnc &&
rrc->nr_cellid == f1_setup_req->cell[i].nr_cellid) {
//fixme: multi instance is not consistent here
F1AP_SETUP_RESP (msg_p).gNB_CU_name = rrc->node_name;
F1AP_SETUP_RESP (msg_p).assoc_id = f1_setup_req->assoc_id;
// check that CU rrc instance corresponds to mcc/mnc/cgi (normally cgi should be enough, but just in case)
rrc->carrier.MIB = malloc(f1_setup_req->mib_length[i]);
rrc->carrier.sizeof_MIB = f1_setup_req->mib_length[i];
@@ -2755,13 +2793,15 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name = rrc->node_name;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mcc = rrc->configuration.mcc[0];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc = rrc->configuration.mnc[0];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc_digit_length = rrc->configuration.mnc_digit_length[0];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).assoc_id = f1_setup_req->assoc_id;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mcc = rrc->configuration.mcc[j];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc = rrc->configuration.mnc[j];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc_digit_length = rrc->configuration.mnc_digit_length[j];
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nr_cellid = rrc->nr_cellid;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nrpci = f1_setup_req->cell[i].nr_pci;
int num_SI= 0;
printf("sib23 %p\n", rrc->carrier.SIB23); fflush(stdout); //exit(1);
if (rrc->carrier.SIB23) {
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container[2] = rrc->carrier.SIB23;
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container_length[2] = rrc->carrier.sizeof_SIB23;
@@ -2775,8 +2815,8 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
break;
} else {// setup_req mcc/mnc match rrc internal list element
LOG_W(NR_RRC,"[Inst %d] No matching MCC/MNC: rrc->mcc/f1_setup_req->mcc %d/%d rrc->mnc/f1_setup_req->mnc %d/%d rrc->nr_cellid/f1_setup_req->nr_cellid %ld/%ld \n",
j, rrc->configuration.mcc[0], f1_setup_req->cell[i].mcc,
rrc->configuration.mnc[0], f1_setup_req->cell[i].mnc,
j, rrc->configuration.mcc[j], f1_setup_req->cell[i].mcc,
rrc->configuration.mnc[j], f1_setup_req->cell[i].mnc,
rrc->nr_cellid, f1_setup_req->cell[i].nr_cellid);
}
}// for (int j=0;j<RC.nb_inst;j++)
@@ -2816,6 +2856,7 @@ void rrc_gNB_process_initial_ul_rrc_message(const f1ap_initial_ul_rrc_message_t
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, i, GNB_FLAG_YES, ul_rrc->crnti, 0, 0);
nr_rrc_gNB_decode_ccch(&ctxt,
ul_rrc->assoc_id,
ul_rrc->rrc_container,
ul_rrc->rrc_container_length,
ul_rrc->du2cu_rrc_container,
@@ -2843,7 +2884,7 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
NRDuDlReq_t * req=&NRDuDlReq(msg_p);
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid, 0 /* assoc_id is 0 in the DU */);
if (req->srb_id == 0) {
AssertFatal(0 == 1, "should pass through dl_rrc_message()\n");
@@ -3034,7 +3075,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid, 0 /* assoc_id is 0 in the DU */);
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(message_p);
@@ -3172,6 +3213,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
extern instance_t DUuniqInstance;
incoming_teid = newGtpuCreateTunnel(DUuniqInstance,
req->rnti,
0, /* assoc_id is 0 in the DU */
drb_p.drb_id,
drb_p.drb_id,
drb_p.up_ul_tnl[0].teid,
@@ -3263,7 +3305,7 @@ static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, co
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid, 0 /* assoc_id is 0 in the DU */);
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_MODIFICATION_RESP(message_p);
@@ -3312,6 +3354,7 @@ static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, co
if (!drb_id_to_setup_start) drb_id_to_setup_start = drb_p.drb_id;
incoming_teid = newGtpuCreateTunnel(DUuniqInstance,
req->rnti,
0, /* assoc_id is 0 in the DU */
drb_p.drb_id,
drb_p.drb_id,
drb_p.up_ul_tnl[0].teid,
@@ -3412,7 +3455,7 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid, resp->assoc_id);
NR_CellGroupConfig_t *cellGroupConfig = NULL;
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
@@ -3468,12 +3511,13 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, c
f1ap_ue_context_setup_t *resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid, resp->assoc_id);
e1ap_bearer_setup_req_t req = {0};
req.numPDUSessionsMod = ue_context_p->ue_context.nb_of_pdusessions;
req.gNB_cu_cp_ue_id = ue_context_p->ue_context.gNB_ue_ngap_id;
req.rnti = ue_context_p->ue_context.rnti;
req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
for (int i=0; i < req.numPDUSessionsMod; i++) {
req.pduSessionMod[i].numDRB2Modify = resp->drbs_to_be_setup_length;
for (int j=0; j < resp->drbs_to_be_setup_length; j++) {
@@ -3694,6 +3738,8 @@ static int get_dl_mimo_layers(const gNB_RRC_INST *rrc, const NR_UE_NR_Capability
return(1);
}
bool nr_pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP, int assoc_id);
void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
MessageDef *msg;
@@ -3722,10 +3768,10 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->instance]->node_type)){
mac_remove_nr_ue(nrmac, ctxt_pP->rntiMaybeUEid);
rrc_rlc_remove_ue(ctxt_pP);
pdcp_remove_UE(ctxt_pP);
nr_pdcp_remove_UE(ctxt_pP, ue_context_p->ue_context.f1ap_assoc_id);
/* remove RRC UE Context */
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, 0 /* not in CU, so assoc_id is 0 */);
if (ue_context_p) {
rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
LOG_I(NR_RRC, "remove UE %lx \n", ctxt_pP->rntiMaybeUEid);
@@ -3737,6 +3783,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p);
rel_cmd->rnti = ctxt_pP->rntiMaybeUEid;
rel_cmd->assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p);
@@ -3756,11 +3803,11 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
ue_context_p->ue_context.ue_release_timer_rrc = 0;
mac_remove_nr_ue(nrmac, ctxt_pP->rntiMaybeUEid);
rrc_rlc_remove_ue(ctxt_pP);
pdcp_remove_UE(ctxt_pP);
newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rntiMaybeUEid);
nr_pdcp_remove_UE(ctxt_pP, ue_context_p->ue_context.f1ap_assoc_id);
newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rntiMaybeUEid, ue_context_p->ue_context.f1ap_assoc_id);
/* remove RRC UE Context */
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, ue_context_p->ue_context.f1ap_assoc_id);
if (ue_context_p) {
rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p);
LOG_I(NR_RRC, "remove UE %lx \n", ctxt_pP->rntiMaybeUEid);
@@ -3814,6 +3861,7 @@ void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_contex
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ);
f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(message_p);
req->rnti = ue_context_p->ue_context.rnti;
req->assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
req->mcc = RC.nrrrc[ctxt.module_id]->configuration.mcc[0];
req->mnc = RC.nrrrc[ctxt.module_id]->configuration.mnc[0];
req->mnc_digit_length = RC.nrrrc[ctxt.module_id]->configuration.mnc_digit_length[0];
@@ -3993,6 +4041,7 @@ void *rrc_gnb_task(void *args_p) {
&ctxt,
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
rrc_gNB_decode_dcch(&ctxt,
F1AP_UL_RRC_MESSAGE(msg_p).assoc_id,
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container,
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
@@ -4143,6 +4192,7 @@ rrc_gNB_generate_SecurityModeCommand(
LOG_I(NR_RRC,"calling rrc_data_req :securityModeCommand\n");
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -4165,6 +4215,7 @@ rrc_gNB_generate_SecurityModeCommand(
DCCH);
LOG_D(NR_RRC,"calling rrc_data_req :securityModeCommand\n");
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -4202,6 +4253,7 @@ rrc_gNB_generate_UECapabilityEnquiry(
case ngran_gNB_CUCP:
nr_rrc_data_req(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -4224,6 +4276,7 @@ rrc_gNB_generate_UECapabilityEnquiry(
rrc_gNB_mui,
DCCH);
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
@@ -4271,6 +4324,7 @@ rrc_gNB_generate_RRCRelease(
memcpy (message_buffer, buffer, size);
MessageDef *m = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rntiMaybeUEid;
F1AP_UE_CONTEXT_RELEASE_CMD(m).assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK;
F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = message_buffer;
@@ -4278,6 +4332,7 @@ rrc_gNB_generate_RRCRelease(
itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m);
} else {
nr_rrc_data_req(ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,

View File

@@ -57,7 +57,7 @@ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
create_tunnel_resp_pP->num_tunnels);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, 0 /* assoc_id, not defined here, use 0 */);
for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i];
@@ -88,7 +88,7 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct
LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n",
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
create_tunnel_resp_pP->num_tunnels);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, create_tunnel_resp_pP->assoc_id);
for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
ue_context_p->ue_context.gnb_gtp_teid[i + offset] = create_tunnel_resp_pP->gnb_NGu_teid[i];

View File

@@ -213,16 +213,17 @@ rrc_gNB_NGAP_get_ue_ids(
result = rrc_gNB_NGAP_get_ue_ids(rrc_instance_pP, ue_desc_p->ue_initial_id, gNB_ue_ngap_idP);
if (result != NULL) {
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], result->ue_rnti);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], result->ue_rnti, result->assoc_id);
if ((ue_context_p != NULL) && (ue_context_p->ue_context.gNB_ue_ngap_id == 0)) {
ue_context_p->ue_context.gNB_ue_ngap_id = gNB_ue_ngap_idP;
} else {
LOG_E(NR_RRC, "[gNB %ld] Incoherence between RRC context and NGAP context (%d != %d) for UE RNTI %d or UE RRC context doesn't exist\n",
LOG_E(NR_RRC, "[gNB %ld] Incoherence between RRC context and NGAP context (%d != %d) for UE RNTI %d (assoc_id %d) or UE RRC context doesn't exist\n",
rrc_instance_pP - RC.nrrrc[0],
(ue_context_p==NULL)?99999:ue_context_p->ue_context.gNB_ue_ngap_id,
gNB_ue_ngap_idP,
result->ue_rnti);
result->ue_rnti,
result->assoc_id);
}
}
} else {
@@ -255,7 +256,7 @@ rrc_gNB_get_ue_context_from_ngap_ids(
temp = rrc_gNB_NGAP_get_ue_ids(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], ue_initial_idP, gNB_ue_ngap_idP);
if (temp != NULL) {
return rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti);
return rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti, temp->assoc_id);
}
return NULL;
@@ -290,6 +291,17 @@ void process_gNB_security_key (
LOG_I(NR_RRC, "[gNB %d][UE %x] Saved security key %s\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ascii_buffer);
}
void nr_pdcp_config_set_security(
const protocol_ctxt_t* const ctxt_pP,
const int assoc_id,
pdcp_t *const pdcp_pP,
const rb_id_t rb_id,
const uint16_t lc_idP,
const uint8_t security_modeP,
uint8_t *const kRRCenc_pP,
uint8_t *const kRRCint_pP,
uint8_t *const kUPenc_pP);
//------------------------------------------------------------------------------
void
nr_rrc_pdcp_config_security(
@@ -334,8 +346,9 @@ nr_rrc_pdcp_config_security(
}
}
pdcp_config_set_security(
nr_pdcp_config_set_security(
ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
NULL, /* pdcp_pP not used anymore in NR */
DCCH,
DCCH+2,
@@ -374,6 +387,7 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
rrc_ue_ngap_ids_p->ue_initial_id = ue_context_pP->ue_context.ue_initial_id;
rrc_ue_ngap_ids_p->gNB_ue_ngap_id = UE_INITIAL_ID_INVALID;
rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid;
rrc_ue_ngap_ids_p->assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
h_rc = hashtable_insert(RC.nrrrc[ctxt_pP->module_id]->initial_id2_ngap_ids,
(hash_key_t)ue_context_pP->ue_context.ue_initial_id,
@@ -419,19 +433,21 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
if ((r_amf->plmn_Identity->mcc != NULL) && (r_amf->plmn_Identity->mcc->list.count > 0)) {
/* Use first indicated PLMN MCC if it is defined */
NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mcc = *r_amf->plmn_Identity->mcc->list.array[selected_plmn_identity];
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x\n",
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mcc,
ue_context_pP->ue_context.rnti);
ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
}
if (r_amf->plmn_Identity->mnc.list.count > 0) {
/* Use first indicated PLMN MNC if it is defined */
NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc = *r_amf->plmn_Identity->mnc.list.array[selected_plmn_identity];
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x\n",
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mnc,
ue_context_pP->ue_context.rnti);
ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
}
} else {
/* TODO */
@@ -450,11 +466,12 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
ue_context_pP->ue_context.ue_guami.amf_set_id = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_set_id;
ue_context_pP->ue_context.ue_guami.amf_pointer = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_pointer;
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x\n",
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_set_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_region_id,
ue_context_pP->ue_context.rnti);
ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
}
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, message_p);
@@ -530,7 +547,8 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
}
ue_context_p->ue_context.nb_of_pdusessions = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
create_tunnel_req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
create_tunnel_req.num_tunnels = pdu_sessions_done;
ret = gtpv1u_create_ngu_tunnel(
@@ -806,6 +824,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */
nr_rrc_data_req (
&ctxt,
ue_context_p->ue_context.f1ap_assoc_id,
ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++,
SDU_CONFIRM_NO,
@@ -825,6 +844,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */
nr_rrc_data_req (
&ctxt,
ue_context_p->ue_context.f1ap_assoc_id,
ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++,
SDU_CONFIRM_NO,
@@ -993,6 +1013,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
bearer_req.gNB_cu_cp_ue_id = gNB_ue_ngap_id;
bearer_req.rnti = ue_context_p->ue_context.rnti;
bearer_req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
bearer_req.cipheringAlgorithm = ue_context_p->ue_context.ciphering_algorithm;
memcpy(bearer_req.encryptionKey, ue_context_p->ue_context.kgnb, sizeof(ue_context_p->ue_context.kgnb));
bearer_req.integrityProtectionAlgorithm = ue_context_p->ue_context.integrity_algorithm;
@@ -1681,6 +1702,7 @@ rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(
LOG_I(NR_RRC, "gtp tunnel delete \n");
gtpv1u_gnb_delete_tunnel_req_t req={0};
req.ue_id = ue_context_p->ue_context.rnti;
req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
for(i = 0; i < NB_RB_MAX; i++) {
if(xid == ue_context_p->ue_context.pduSession[i].xid) {

View File

@@ -50,6 +50,7 @@ typedef struct rrc_ue_ngap_ids_s {
// value
rnti_t ue_rnti;
int assoc_id;
} rrc_ue_ngap_ids_t;
void

View File

@@ -50,6 +50,14 @@ int rrc_gNB_compare_ue_rnti_id(
return -1;
}
if (c1_pP->ue_context.f1ap_assoc_id > c2_pP->ue_context.f1ap_assoc_id) {
return 1;
}
if (c1_pP->ue_context.f1ap_assoc_id < c2_pP->ue_context.f1ap_assoc_id) {
return -1;
}
return 0;
}
@@ -66,6 +74,7 @@ rrc_gNB_allocate_new_UE_context(
)
//------------------------------------------------------------------------------
{
printf("rrc_gNB_allocate_new_UE_context called\n"); fflush(stdout);
struct rrc_gNB_ue_context_s *new_p;
new_p = (struct rrc_gNB_ue_context_s * )malloc(sizeof(struct rrc_gNB_ue_context_s));
@@ -92,9 +101,12 @@ rrc_gNB_allocate_new_UE_context(
struct rrc_gNB_ue_context_s *
rrc_gNB_get_ue_context(
gNB_RRC_INST *rrc_instance_pP,
rnti_t rntiP)
rnti_t rntiP,
int assoc_id)
//------------------------------------------------------------------------------
{
printf("rrc_gNB_get_ue_context rnti %x assoc_id %d\n", rntiP, assoc_id); fflush(stdout);
#if 0
rrc_gNB_ue_context_t temp;
memset(&temp, 0, sizeof(struct rrc_gNB_ue_context_s));
/* gNB ue rrc id = 24 bits wide */
@@ -112,6 +124,15 @@ rrc_gNB_get_ue_context(
}
return NULL;
}
#endif
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(rrc_instance_pP->rrc_ue_head)) {
printf(" in list rnti %x assoc_id %d\n", ue_context_p->ue_context.rnti, ue_context_p->ue_context.f1ap_assoc_id);
if (ue_context_p->ue_context.rnti == rntiP && ue_context_p->ue_context.f1ap_assoc_id == assoc_id) {
return ue_context_p;
}
}
return NULL;
}
void rrc_gNB_free_mem_UE_context(
@@ -204,13 +225,15 @@ rrc_gNB_ue_context_5g_s_tmsi_exist(
struct rrc_gNB_ue_context_s *
rrc_gNB_get_next_free_ue_context(
const protocol_ctxt_t *const ctxt_pP,
int assoc_id,
gNB_RRC_INST *rrc_instance_pP,
const uint64_t ue_identityP
)
//-----------------------------------------------------------------------------
{
printf("rrc_gNB_get_next_free_ue_context rnti %lx assoc_id %d\n", ctxt_pP->rntiMaybeUEid, assoc_id); fflush(stdout);
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, ctxt_pP->rntiMaybeUEid);
ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, ctxt_pP->rntiMaybeUEid, assoc_id);
if (ue_context_p == NULL) {
ue_context_p = rrc_gNB_allocate_new_UE_context(rrc_instance_pP);
@@ -224,6 +247,7 @@ rrc_gNB_get_next_free_ue_context(
ue_context_p->ue_id_rnti = ctxt_pP->rntiMaybeUEid; // here ue_id_rnti is just a key, may be something else
ue_context_p->ue_context.rnti = ctxt_pP->rntiMaybeUEid; // yes duplicate, 1 may be removed
ue_context_p->ue_context.f1ap_assoc_id = assoc_id;
ue_context_p->ue_context.random_ue_identity = ue_identityP;
RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
LOG_D(NR_RRC,

View File

@@ -49,7 +49,8 @@ rrc_gNB_allocate_new_UE_context(
struct rrc_gNB_ue_context_s*
rrc_gNB_get_ue_context(
gNB_RRC_INST* rrc_instance_pP,
rnti_t rntiP
rnti_t rntiP,
int assoc_id
);
void rrc_gNB_free_mem_UE_context(
@@ -78,6 +79,7 @@ rrc_gNB_ue_context_5g_s_tmsi_exist(
struct rrc_gNB_ue_context_s *
rrc_gNB_get_next_free_ue_context(
const protocol_ctxt_t *const ctxt_pP,
int assoc_id,
gNB_RRC_INST *rrc_instance_pP,
const uint64_t ue_identityP
);

View File

@@ -387,6 +387,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
nr_pdcp_add_drbs(ctxt.enb_flag,
ctxt.rntiMaybeUEid,
0, /* assoc_id set to 0, NSA not functional in CU/DU split */
0,
ue_context_p->ue_context.rb_config->drb_ToAddModList,
(ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm,
@@ -403,6 +404,8 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
LOG_D(RRC, "%s:%d: done RRC PDCP/RLC ASN1 request for UE rnti %lx\n", __FUNCTION__, __LINE__, ctxt.rntiMaybeUEid);
}
bool nr_pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP, int assoc_id);
void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
protocol_ctxt_t ctxt;
rrc_gNB_ue_context_t *ue_context;
@@ -411,13 +414,13 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
LOG_D(RRC, "calling rrc_remove_nsa_user rnti %d\n", rnti);
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id);
ue_context = rrc_gNB_get_ue_context(rrc, rnti);
ue_context = rrc_gNB_get_ue_context(rrc, rnti, 0 /* assoc_id set to 0, NSA not functional in CU/DU split */);
if (ue_context == NULL) {
LOG_W(RRC, "rrc_remove_nsa_user: rnti %d not found\n", rnti);
return;
}
pdcp_remove_UE(&ctxt);
nr_pdcp_remove_UE(&ctxt, ue_context->ue_context.f1ap_assoc_id);
rrc_rlc_remove_ue(&ctxt);

View File

@@ -166,18 +166,19 @@ rrc_data_req_nr_ue(
message_buffer = itti_malloc (TASK_RRC_UE, TASK_PDCP_UE, sdu_sizeP);
LOG_D(RRC,"Sending RRC message for SRB %ld, sdu_size %d\n",rb_idP, sdu_sizeP);
memcpy (message_buffer, buffer_pP, sdu_sizeP);
message_p = itti_alloc_new_message ( TASK_RRC_UE, 0, RRC_DCCH_DATA_REQ);
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
RRC_DCCH_DATA_REQ (message_p).muip = muiP;
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
RRC_DCCH_DATA_REQ (message_p).mode = modeP;
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
RRC_DCCH_DATA_REQ(message_p).rnti = ctxt_pP->rntiMaybeUEid;
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
message_p = itti_alloc_new_message ( TASK_RRC_UE, 0, NR_RRC_DCCH_DATA_REQ);
NR_RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
NR_RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
NR_RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
NR_RRC_DCCH_DATA_REQ (message_p).muip = muiP;
NR_RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
NR_RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
NR_RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
NR_RRC_DCCH_DATA_REQ (message_p).mode = modeP;
NR_RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
NR_RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rntiMaybeUEid;
NR_RRC_DCCH_DATA_REQ (message_p).assoc_id = 0; /* assoc_id is 0 for nrUE */
NR_RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
itti_send_msg_to_task (
TASK_PDCP_UE,
ctxt_pP->instance,

View File

@@ -26,6 +26,7 @@ uint8_t nas_pduid;
bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flag,
const rb_id_t rb_id,
const mui_t mui,
@@ -39,7 +40,8 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const bool rqi,
const int pdusession_id) {
nr_sdap_entity_t *sdap_entity;
sdap_entity = nr_sdap_get_entity(ue_id, pdusession_id);
printf("sdap_data_req assoc_id %d\n", assoc_id); fflush(stdout);
sdap_entity = nr_sdap_get_entity(ue_id, assoc_id, pdusession_id);
if(sdap_entity == NULL) {
LOG_E(SDAP, "%s:%d:%s: Entity not found with ue: 0x%"PRIx64" and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id);
@@ -48,6 +50,7 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p,
bool ret = sdap_entity->tx_entity(sdap_entity,
ctxt_p,
assoc_id,
srb_flag,
rb_id,
mui,
@@ -67,10 +70,12 @@ void sdap_data_ind(rb_id_t pdcp_entity,
bool has_sdap_rx,
int pdusession_id,
ue_id_t ue_id,
int assoc_id,
char *buf,
int size) {
nr_sdap_entity_t *sdap_entity;
sdap_entity = nr_sdap_get_entity(ue_id, pdusession_id);
printf("assoc_id %d\n", assoc_id); fflush(stdout);
sdap_entity = nr_sdap_get_entity(ue_id, assoc_id, pdusession_id);
if (sdap_entity == NULL) {
LOG_E(SDAP, "%s:%d:%s: Entity not found for ue rnti/ue_id: %lx and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id);
@@ -83,6 +88,7 @@ void sdap_data_ind(rb_id_t pdcp_entity,
has_sdap_rx,
pdusession_id,
ue_id,
assoc_id,
buf,
size);
}

View File

@@ -34,6 +34,7 @@
*/
bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flag,
const rb_id_t rb_id,
const mui_t mui,
@@ -58,6 +59,7 @@ void sdap_data_ind(rb_id_t pdcp_entity,
bool has_sdap_rx,
int pdusession_id,
ue_id_t ue_id,
int assoc_id,
char *buf,
int size);

View File

@@ -39,12 +39,12 @@ instance_t *N3GTPUInst = NULL;
nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager(void);
void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu)
void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu)
{
nr_pdcp_ue_t *ue;
nr_pdcp_ue_manager_t *nr_pdcp_ue_manager;
nr_pdcp_ue_manager = nr_pdcp_sdap_get_ue_manager();
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id, assoc_id);
ue->drb[sdap_ctrl_pdu_drb-1]->recv_sdu(ue->drb[sdap_ctrl_pdu_drb-1], (char*)&ctrl_pdu, SDAP_HDR_LENGTH, RLC_MUI_UNDEFINED);
LOG_D(SDAP, "Control PDU - Submitting Control PDU to DRB ID: %ld\n", sdap_ctrl_pdu_drb);
LOG_D(SDAP, "QFI: %u\n R: %u\n D/C: %u\n", ctrl_pdu.QFI, ctrl_pdu.R, ctrl_pdu.DC);
@@ -53,6 +53,7 @@ void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_s
static bool nr_sdap_tx_entity(nr_sdap_entity_t *entity,
protocol_ctxt_t *ctxt_p,
const int assoc_id,
const srb_flag_t srb_flag,
const rb_id_t rb_id,
const mui_t mui,
@@ -87,16 +88,17 @@ static bool nr_sdap_tx_entity(nr_sdap_entity_t *entity,
if(!pdcp_ent_has_sdap){
LOG_D(SDAP, "TX - DRB ID: %ld does not have SDAP\n", entity->qfi2drb_table[qfi].drb_id);
ret = pdcp_data_req(ctxt_p,
srb_flag,
sdap_drb_id,
mui,
confirm,
sdu_buffer_size,
sdu_buffer,
pt_mode,
sourceL2Id,
destinationL2Id);
ret = nr_pdcp_data_req(ctxt_p,
assoc_id,
srb_flag,
sdap_drb_id,
mui,
confirm,
sdu_buffer_size,
sdu_buffer,
pt_mode,
sourceL2Id,
destinationL2Id);
if(!ret)
LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
@@ -155,16 +157,17 @@ static bool nr_sdap_tx_entity(nr_sdap_entity_t *entity,
*
* Downlink gNB side
*/
ret = pdcp_data_req(ctxt_p,
srb_flag,
sdap_drb_id,
mui,
confirm,
sdu_buffer_size+offset,
sdap_buf,
pt_mode,
sourceL2Id,
destinationL2Id);
ret = nr_pdcp_data_req(ctxt_p,
assoc_id,
srb_flag,
sdap_drb_id,
mui,
confirm,
sdu_buffer_size+offset,
sdap_buf,
pt_mode,
sourceL2Id,
destinationL2Id);
if(!ret)
LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
@@ -178,6 +181,7 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
bool has_sdap_rx,
int pdusession_id,
ue_id_t ue_id,
int assoc_id,
char *buf,
int size) {
/* The offset of the SDAP header, it might be 0 if has_sdap_rx is not true in the pdcp entity. */
@@ -216,8 +220,10 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
req->length = size - offset;
req->offset = GTPU_HEADER_OVERHEAD_MAX;
req->ue_id = ue_id;
req->assoc_id = assoc_id;
req->bearer_id = pdusession_id;
LOG_D(SDAP, "%s() sending message to gtp size %d\n", __func__, size-offset);
printf("sdap sends GTPV1U_GNB_TUNNEL_DATA_REQ rnti %lx assoc_id %d\n", ue_id, assoc_id); fflush(stdout);
// very very dirty hack gloabl var N3GTPUInst
itti_send_msg_to_task(TASK_GTPV1_U, *N3GTPUInst, message_p);
} else { //nrUE
@@ -253,7 +259,7 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
if(!entity->qfi2drb_table[sdap_hdr->QFI].drb_id && entity->default_drb){
nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI);
rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, sdap_hdr->QFI);
entity->sdap_submit_ctrl_pdu(ue_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
entity->sdap_submit_ctrl_pdu(ue_id, assoc_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
}
/*
@@ -268,7 +274,7 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
if (pdcp_entity != entity->qfi2drb_table[sdap_hdr->QFI].drb_id) {
nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI);
rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, sdap_hdr->QFI);
entity->sdap_submit_ctrl_pdu(ue_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
entity->sdap_submit_ctrl_pdu(ue_id, assoc_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
}
/*
@@ -369,15 +375,15 @@ rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int
return drb_of_endmarker;
}
void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu)
void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu)
{
if(sdap_ctrl_pdu_drb){
nr_pdcp_submit_sdap_ctrl_pdu(ue_id, sdap_ctrl_pdu_drb, ctrl_pdu);
nr_pdcp_submit_sdap_ctrl_pdu(ue_id, assoc_id, sdap_ctrl_pdu_drb, ctrl_pdu);
LOG_D(SDAP, "Sent Control PDU to PDCP Layer.\n");
}
}
void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx)
void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, int assoc_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx)
{
LOG_D(SDAP, "RRC Configuring SDAP Entity\n");
uint8_t qfi = 0;
@@ -387,26 +393,26 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t p
if (existing_sdap_entity->default_drb && existing_sdap_entity->qfi2drb_table[qfi].drb_id == SDAP_NO_MAPPING_RULE) {
nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi);
rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, qfi);
existing_sdap_entity->sdap_submit_ctrl_pdu(ue_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
existing_sdap_entity->sdap_submit_ctrl_pdu(ue_id, assoc_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
}
if (existing_sdap_entity->qfi2drb_table[qfi].drb_id != drb_identity && existing_sdap_entity->qfi2drb_table[qfi].has_sdap_tx) {
nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi);
rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, qfi);
existing_sdap_entity->sdap_submit_ctrl_pdu(ue_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
existing_sdap_entity->sdap_submit_ctrl_pdu(ue_id, assoc_id, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
}
LOG_D(SDAP, "Storing the configured QoS flow to DRB mapping rule\n");
existing_sdap_entity->qfi2drb_map_update(existing_sdap_entity, qfi, drb_identity, has_sdap_rx, has_sdap_tx);
}
}
nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int pdusession_id, bool is_defaultDRB, uint8_t drb_identity, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount)
nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int assoc_id, int pdusession_id, bool is_defaultDRB, uint8_t drb_identity, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount)
{
if (nr_sdap_get_entity(ue_id, pdusession_id)) {
LOG_E(SDAP, "SDAP Entity for UE already exists with RNTI/UE ID: %lu and PDU SESSION ID: %d\n", ue_id, pdusession_id);
nr_sdap_entity_t *existing_sdap_entity = nr_sdap_get_entity(ue_id, pdusession_id);
if (nr_sdap_get_entity(ue_id, assoc_id, pdusession_id)) {
LOG_E(SDAP, "SDAP Entity for UE already exists with RNTI/UE ID: %lu assoc_id: %d and PDU SESSION ID: %d\n", ue_id, assoc_id, pdusession_id);
nr_sdap_entity_t *existing_sdap_entity = nr_sdap_get_entity(ue_id, assoc_id, pdusession_id);
rb_id_t pdcp_entity = existing_sdap_entity->default_drb;
if(!is_gnb)
nr_sdap_ue_qfi2drb_config(existing_sdap_entity, pdcp_entity, ue_id, mapped_qfi_2_add, mappedQFIs2AddCount, drb_identity, has_sdap_rx, has_sdap_tx);
nr_sdap_ue_qfi2drb_config(existing_sdap_entity, pdcp_entity, ue_id, assoc_id, mapped_qfi_2_add, mappedQFIs2AddCount, drb_identity, has_sdap_rx, has_sdap_tx);
return existing_sdap_entity;
}
@@ -419,6 +425,7 @@ nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap
}
sdap_entity->ue_id = ue_id;
sdap_entity->assoc_id = assoc_id;
sdap_entity->pdusession_id = pdusession_id;
sdap_entity->tx_entity = nr_sdap_tx_entity;
@@ -450,7 +457,7 @@ nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap
return sdap_entity;
}
nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id)
nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int assoc_id, int pdusession_id)
{
nr_sdap_entity_t *sdap_entity;
sdap_entity = sdap_info.sdap_entity_llist;
@@ -458,31 +465,33 @@ nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id)
if(sdap_entity == NULL)
return NULL;
while ((sdap_entity->ue_id != ue_id || sdap_entity->pdusession_id != pdusession_id) && sdap_entity->next_entity != NULL) {
while ((sdap_entity->ue_id != ue_id || sdap_entity->assoc_id != assoc_id
|| sdap_entity->pdusession_id != pdusession_id) && sdap_entity->next_entity != NULL) {
sdap_entity = sdap_entity->next_entity;
}
if (sdap_entity->ue_id == ue_id && sdap_entity->pdusession_id == pdusession_id)
if (sdap_entity->ue_id == ue_id && sdap_entity->assoc_id == assoc_id
&& sdap_entity->pdusession_id == pdusession_id)
return sdap_entity;
return NULL;
}
void delete_nr_sdap_entity(ue_id_t ue_id)
void delete_nr_sdap_entity(ue_id_t ue_id, int assoc_id)
{
nr_sdap_entity_t *entityPtr, *entityPrev = NULL;
entityPtr = sdap_info.sdap_entity_llist;
if (entityPtr->ue_id == ue_id) {
if (entityPtr->ue_id == ue_id && entityPtr->assoc_id == assoc_id) {
sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity;
free(entityPtr);
} else {
while (entityPtr->ue_id != ue_id && entityPtr->next_entity != NULL) {
while ((entityPtr->ue_id != ue_id || entityPtr->assoc_id != assoc_id) && entityPtr->next_entity != NULL) {
entityPrev = entityPtr;
entityPtr = entityPtr->next_entity;
}
if (entityPtr->ue_id != ue_id) {
if (entityPtr->ue_id == ue_id && entityPtr->assoc_id == assoc_id) {
entityPrev->next_entity = entityPtr->next_entity;
free(entityPtr);
}

View File

@@ -72,10 +72,11 @@ typedef struct qfi2drb_s {
bool has_sdap_tx;
} qfi2drb_t;
void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
typedef struct nr_sdap_entity_s {
ue_id_t ue_id;
int assoc_id;
rb_id_t default_drb;
int pdusession_id;
qfi2drb_t qfi2drb_table[SDAP_MAX_QFI];
@@ -86,10 +87,11 @@ typedef struct nr_sdap_entity_s {
nr_sdap_ul_hdr_t (*sdap_construct_ctrl_pdu)(uint8_t qfi);
rb_id_t (*sdap_map_ctrl_pdu)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi);
void (*sdap_submit_ctrl_pdu)(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
void (*sdap_submit_ctrl_pdu)(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
bool (*tx_entity)(struct nr_sdap_entity_s *entity,
protocol_ctxt_t *ctxt_p,
const int assoc_id,
const srb_flag_t srb_flag,
const rb_id_t rb_id,
const mui_t mui,
@@ -108,6 +110,7 @@ typedef struct nr_sdap_entity_s {
bool has_sdap_rx,
int pdusession_id,
ue_id_t ue_id,
int assoc_id,
char *buf,
int size);
@@ -150,24 +153,24 @@ rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int
* TS 37.324 5.3 QoS flow to DRB Mapping
* Submit the end-marker control PDU to the lower layer.
*/
void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
/*
* TS 37.324 5.3 QoS flow to DRB Mapping
* 5.3.1 Configuration Procedures
*/
void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx);
void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, int assoc_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx);
/*
* TS 37.324 4.4 5.1.1 SDAP entity establishment
* Establish an SDAP entity.
*/
nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int pdusession_id, bool is_defaultDRB, uint8_t default_DRB, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount);
nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int assoc_id, int pdusession_id, bool is_defaultDRB, uint8_t default_DRB, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount);
/* Entity Handling Related Functions */
nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id);
nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int assoc_id, int pdusession_id);
/* Entity Handling Related Functions */
void delete_nr_sdap_entity(ue_id_t ue_id);
void delete_nr_sdap_entity(ue_id_t ue_id, int assoc_id);
#endif

View File

@@ -865,11 +865,18 @@ sctp_eNB_accept_associations(
if ((client_sd = accept(sctp_cnx->sd, (struct sockaddr*)&saddr, &saddr_size)) < 0) {
SCTP_ERROR("[%d] accept failed: %s:%d\n", sctp_cnx->sd, strerror(errno), errno);
} else {
printf("addr size %d in6 size %ld\n", saddr_size, sizeof(struct sockaddr_in6)); fflush(stdout);
{
int i;
for (i = 0; i < saddr_size; i++) printf(" %2.2x", ((unsigned char*)&saddr)[i]);
printf("\n"); fflush(stdout);
}
struct sctp_cnx_list_elm_s *new_cnx;
uint16_t port;
/* This is an ipv6 socket */
port = saddr.sin6_port;
printf("port %d %d\n", port, ntohs(port)); fflush(stdout);
/* Contrary to BSD, client socket does not inherit O_NONBLOCK option */
if (fcntl(client_sd, F_SETFL, O_NONBLOCK) < 0) {

View File

@@ -113,6 +113,7 @@ typedef struct {
typedef struct {
ue_id_t ue_id;
int assoc_id;
ebi_t incoming_rb_id;
gtpCallback callBack;
teid_t outgoing_teid;
@@ -120,13 +121,26 @@ typedef struct {
int pdusession_id;
} ueidData_t;
typedef struct {
ue_id_t ue_id;
int assoc_id;
} rnti_id_t;
/* inspired from https://cplusplus.com/reference/map/map/map/ */
struct ue_compare {
bool operator() (const rnti_id_t& a, const rnti_id_t& b) const {
return (a.ue_id < b.ue_id)
|| (a.ue_id == b.ue_id && a.assoc_id < b.assoc_id);
}
};
class gtpEndPoint {
public:
openAddr_t addr;
uint8_t foundAddr[20];
int foundAddrLen;
int ipVersion;
map<uint64_t, teidData_t> ue2te_mapping;
map<rnti_id_t, teidData_t, ue_compare> ue2te_mapping;
// we use the same port number for source and destination address
// this allow using non standard gtp port number (different from 2152)
// and so, for example tu run 4G and 5G cores on one system
@@ -167,7 +181,8 @@ static teid_t gtpv1uNewTeid(void) {
}
instance_t legacyInstanceMapping=0;
#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT ? legacyInstanceMapping:a)
//#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT ? legacyInstanceMapping:a)
#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT ? (abort(),0):a)
#define getInstRetVoid(insT) \
auto instChk=globGtp.instances.find(compatInst(insT)); \
@@ -188,20 +203,23 @@ instance_t legacyInstanceMapping=0;
gtpEndPoint * inst=&instChk->second;
#define getUeRetVoid(insT, Ue) \
auto ptrUe=insT->ue2te_mapping.find(Ue); \
\
if ( ptrUe==insT->ue2te_mapping.end() ) { \
LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue id %ld in hashtable ue_mapping\n", instance, ue_id); \
#define getUeRetVoid(insT, Ue, assoc_id) \
printf("searching for %ld %d\n", Ue, assoc_id); fflush(stdout); \
auto ptrUe=insT->ue2te_mapping.find(rnti_id_t{Ue, assoc_id}); \
\
if ( ptrUe==insT->ue2te_mapping.end() ) { \
LOG_E(GTPU, "[%ld] %s failed: while getting ue id %ld assoc_id %d in hashtable ue_mapping\n", instance, __FUNCTION__, ue_id, assoc_id); \
exit(1); \
pthread_mutex_unlock(&globGtp.gtp_lock); \
return; \
}
#define getUeRetInt(insT, Ue) \
auto ptrUe=insT->ue2te_mapping.find(Ue); \
\
if ( ptrUe==insT->ue2te_mapping.end() ) { \
LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue id %ld in hashtable ue_mapping\n", instance, ue_id); \
#define getUeRetInt(insT, Ue, assoc_id) \
auto ptrUe=insT->ue2te_mapping.find(rnti_id_t{Ue, assoc_id}); \
\
if ( ptrUe==insT->ue2te_mapping.end() ) { \
LOG_E(GTPU, "[%ld] %s failed: while getting ue id %ld assoc_id %d in hashtable ue_mapping\n", instance, __FUNCTION__, ue_id, assoc_id); \
exit(1); \
pthread_mutex_unlock(&globGtp.gtp_lock); \
return GTPNOK; \
}
@@ -221,6 +239,7 @@ static int gtpv1uCreateAndSendMsg(int h,
int extHdrType,
uint8_t *extensionHeader_buffer,
uint8_t extensionHeader_length) {
printf("gtpv1uCreateAndSendMsg to %8.8x port %d teid %d\n", peerIp, peerPort, teid); fflush(stdout);
LOG_D(GTPU, "Peer IP:%u peer port:%u outgoing teid:%u \n", peerIp, peerPort, teid);
uint8_t buffer[msgLen+HDR_MAX];
@@ -286,13 +305,14 @@ static int gtpv1uCreateAndSendMsg(int h,
}
static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) {
printf("gtpv1uSend ue id %lx assoc_id %d\n", req->ue_id, req->assoc_id); fflush(stdout);
uint8_t *buffer=req->buffer+req->offset;
size_t length=req->length;
ue_id_t ue_id=req->ue_id;
int bearer_id=req->bearer_id;
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetVoid(compatInst(instance));
getUeRetVoid(inst, ue_id);
getUeRetVoid(inst, ue_id, req->assoc_id);
auto ptr2=ptrUe->second.bearers.find(bearer_id);
@@ -315,6 +335,7 @@ static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool
gtpv1u_bearer_t tmp=ptr2->second;
pthread_mutex_unlock(&globGtp.gtp_lock);
printf("xxx gtp send message to instance %ld ip %x port %d length %ld\n", instance, tmp.outgoing_ip_addr, tmp.outgoing_port, length); fflush(stdout);
if (tmp.outgoing_qfi != -1) {
Gtpv1uExtHeaderT ext = { 0 };
ext.ExtHeaderLen = 1; // in quad bytes EXT_HDR_LNTH_OCTET_UNITS
@@ -379,7 +400,7 @@ static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_rep
int bearer_id=req->pdusession_id;
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetVoid(compatInst(instance));
getUeRetVoid(inst, ue_id);
getUeRetVoid(inst, ue_id, 0);
auto ptr2=ptrUe->second.bearers.find(bearer_id);
@@ -407,7 +428,7 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_tunnel_data_req_t *req)
int bearer_id=req->bearer_id;
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetVoid(compatInst(instance));
getUeRetVoid(inst, ue_id);
getUeRetVoid(inst, ue_id, 0);
auto ptr2=ptrUe->second.bearers.find(bearer_id);
@@ -550,10 +571,11 @@ instance_t gtpv1Init(openAddr_t context) {
return id;
}
void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance, ue_id_t ue_id, ebi_t bearer_id, in_addr_t newOutgoingAddr, teid_t newOutgoingTeid) {
void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance, ue_id_t ue_id, int assoc_id, ebi_t bearer_id, in_addr_t newOutgoingAddr, teid_t newOutgoingTeid) {
printf("GtpuUpdateTunnelOutgoingTeid instance %ld ue id %ld bearer_id %d newOutgoingTeid %d\n", instance, ue_id, bearer_id, newOutgoingTeid); fflush(stdout);
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetVoid(compatInst(instance));
getUeRetVoid(inst, ue_id);
getUeRetVoid(inst, ue_id, assoc_id);
auto ptr2=ptrUe->second.bearers.find(bearer_id);
@@ -572,6 +594,7 @@ void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance, ue_id_t ue_id,
teid_t newGtpuCreateTunnel(instance_t instance,
ue_id_t ue_id,
int assoc_id,
int incoming_bearer_id,
int outgoing_bearer_id,
teid_t outgoing_teid,
@@ -580,9 +603,16 @@ teid_t newGtpuCreateTunnel(instance_t instance,
int port,
gtpCallback callBack,
gtpCallbackSDAP callBackSDAP) {
printf("newGtpuCreateTunnel rnti %ld assoc_id %d incoming bearer %d outgoing bearer %d outgoing teid %d remoteAddr", ue_id, assoc_id, incoming_bearer_id, outgoing_bearer_id, outgoing_teid);
{
int i;
for (i = 0; i < remoteAddr.length / 8; i++) printf(" %2.2x", (unsigned char)remoteAddr.buffer[i]);
}
printf(" port %d instance %d\n", port, (int)instance);
fflush(stdout);
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetInt(compatInst(instance));
auto it=inst->ue2te_mapping.find(ue_id);
auto it=inst->ue2te_mapping.find(rnti_id_t{ue_id, assoc_id});
if ( it != inst->ue2te_mapping.end() && it->second.bearers.find(outgoing_bearer_id) != it->second.bearers.end()) {
LOG_W(GTPU,"[%ld] Create a config for a already existing GTP tunnel (ue id %lu)\n", instance, ue_id);
@@ -597,13 +627,14 @@ teid_t newGtpuCreateTunnel(instance_t instance,
};
globGtp.te2ue_mapping[incoming_teid].ue_id = ue_id;
globGtp.te2ue_mapping[incoming_teid].assoc_id = assoc_id;
globGtp.te2ue_mapping[incoming_teid].incoming_rb_id = incoming_bearer_id;
globGtp.te2ue_mapping[incoming_teid].outgoing_teid = outgoing_teid;
globGtp.te2ue_mapping[incoming_teid].callBack = callBack;
globGtp.te2ue_mapping[incoming_teid].callBackSDAP = callBackSDAP;
globGtp.te2ue_mapping[incoming_teid].pdusession_id = (uint8_t)outgoing_bearer_id;
gtpv1u_bearer_t *tmp=&inst->ue2te_mapping[ue_id].bearers[outgoing_bearer_id];
gtpv1u_bearer_t *tmp=&inst->ue2te_mapping[rnti_id_t{ue_id, assoc_id}].bearers[outgoing_bearer_id];
int addrs_length_in_bytes = remoteAddr.length / 8;
@@ -645,6 +676,23 @@ teid_t newGtpuCreateTunnel(instance_t instance,
return incoming_teid;
}
/* needed because of assoc_id that does not exist for pdcp_data_req */
static bool pdcp_data_req_wrapper(
protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode,
const uint32_t *const sourceL2Id,
const uint32_t *const destinationL2Id)
{
return pdcp_data_req(ctxt_pP, srb_flagP, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer, mode, sourceL2Id, destinationL2Id);
}
int gtpv1u_create_s1u_tunnel(instance_t instance,
const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req,
gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp) {
@@ -668,13 +716,14 @@ int gtpv1u_create_s1u_tunnel(instance_t instance,
int incoming_rb_id=create_tunnel_req->eps_bearer_id[i]-4;
teid_t teid = newGtpuCreateTunnel(compatInst(instance),
create_tunnel_req->rnti,
-1, /* no assoc_id for enb/s1 */
incoming_rb_id,
create_tunnel_req->eps_bearer_id[i],
create_tunnel_req->sgw_S1u_teid[i],
-1, // no pdu session in 4G
create_tunnel_req->sgw_addr[i],
dstport,
pdcp_data_req,
pdcp_data_req_wrapper,
NULL);
create_tunnel_resp->status=0;
create_tunnel_resp->rnti=create_tunnel_req->rnti;
@@ -703,12 +752,12 @@ int gtpv1u_update_s1u_tunnel(
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetInt(compatInst(instance));
if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) == inst->ue2te_mapping.end() ) {
if ( inst->ue2te_mapping.find(rnti_id_t{create_tunnel_req->rnti, 0}) == inst->ue2te_mapping.end() ) {
LOG_E(GTPU,"[%ld] Update not already existing tunnel (new rnti %x, old rnti %x)\n",
instance, create_tunnel_req->rnti, prior_rnti);
}
auto it=inst->ue2te_mapping.find(prior_rnti);
auto it=inst->ue2te_mapping.find(rnti_id_t{prior_rnti, 0});
if ( it != inst->ue2te_mapping.end() ) {
LOG_W(GTPU,"[%ld] Update a not existing tunnel, start create the new one (new ue id %u, old ue id %u)\n", instance, create_tunnel_req->rnti, prior_rnti);
@@ -718,12 +767,24 @@ int gtpv1u_update_s1u_tunnel(
return 0;
}
inst->ue2te_mapping[create_tunnel_req->rnti]=it->second;
inst->ue2te_mapping[rnti_id_t{create_tunnel_req->rnti, 0}]=it->second;
inst->ue2te_mapping.erase(it);
pthread_mutex_unlock(&globGtp.gtp_lock);
return 0;
}
bool nr_pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_id,
const mui_t muiP,
const confirm_t confirmP,
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode,
const uint32_t *const sourceL2Id,
const uint32_t *const destinationL2Id);
int gtpv1u_create_ngu_tunnel( const instance_t instance,
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req,
gtpv1u_gnb_create_tunnel_resp_t *const create_tunnel_resp) {
@@ -740,18 +801,21 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance,
memcpy(addr, inst->foundAddr, inst->foundAddrLen);
pthread_mutex_unlock(&globGtp.gtp_lock);
for (int i = 0; i < create_tunnel_req->num_tunnels; i++) {
printf("gtpv1u_create_ngu_tunnel rnti %lx assoc_id %d\n", create_tunnel_req->ue_id, create_tunnel_req->assoc_id);
teid_t teid = newGtpuCreateTunnel(instance,
create_tunnel_req->ue_id,
create_tunnel_req->assoc_id,
create_tunnel_req->incoming_rb_id[i],
create_tunnel_req->pdusession_id[i],
create_tunnel_req->outgoing_teid[i],
create_tunnel_req->outgoing_qfi[i],
create_tunnel_req->dst_addr[i],
dstport,
pdcp_data_req,
nr_pdcp_data_req,
sdap_data_req);
create_tunnel_resp->status=0;
create_tunnel_resp->ue_id=create_tunnel_req->ue_id;
create_tunnel_resp->assoc_id=create_tunnel_req->assoc_id;
create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels;
create_tunnel_resp->gnb_NGu_teid[i]=teid;
memcpy(create_tunnel_resp->gnb_addr.buffer,addr,sizeof(addr));
@@ -761,14 +825,14 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance,
return !GTPNOK;
}
int gtpv1u_update_ngu_tunnel(const instance_t instanceP, const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP, const ue_id_t prior_ue_id)
int gtpv1u_update_ngu_tunnel(const instance_t instanceP, const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP, const ue_id_t prior_ue_id, const int assoc_id)
{
LOG_D(GTPU, "[%ld] Update tunnels from UEid %lx to UEid %lx\n", instanceP, prior_ue_id, create_tunnel_req_pP->ue_id);
pthread_mutex_lock(&globGtp.gtp_lock);
auto inst = &globGtp.instances[compatInst(instanceP)];
auto it = inst->ue2te_mapping.find(prior_ue_id);
auto it = inst->ue2te_mapping.find(rnti_id_t{prior_ue_id, assoc_id});
if (it == inst->ue2te_mapping.end()) {
LOG_W(GTPU, "[%ld] Delete GTP tunnels for UEid: %lx, but no tunnel exits\n", instanceP, prior_ue_id);
pthread_mutex_unlock(&globGtp.gtp_lock);
@@ -776,13 +840,13 @@ int gtpv1u_update_ngu_tunnel(const instance_t instanceP, const gtpv1u_gnb_create
}
for (int i = 0; i < create_tunnel_req_pP->num_tunnels; i++) {
teid_t incoming_teid = inst->ue2te_mapping[prior_ue_id].bearers[create_tunnel_req_pP->pdusession_id[i]].teid_incoming;
teid_t incoming_teid = inst->ue2te_mapping[rnti_id_t{prior_ue_id, assoc_id}].bearers[create_tunnel_req_pP->pdusession_id[i]].teid_incoming;
if (globGtp.te2ue_mapping[incoming_teid].ue_id == prior_ue_id) {
globGtp.te2ue_mapping[incoming_teid].ue_id = create_tunnel_req_pP->ue_id;
}
}
inst->ue2te_mapping[create_tunnel_req_pP->ue_id] = it->second;
inst->ue2te_mapping[rnti_id_t{create_tunnel_req_pP->ue_id,create_tunnel_req_pP->assoc_id}] = it->second;
inst->ue2te_mapping.erase(it);
pthread_mutex_unlock(&globGtp.gtp_lock);
@@ -796,12 +860,12 @@ int gtpv1u_create_x2u_tunnel(
AssertFatal( false, "to be developped\n");
}
int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id) {
int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id, int assoc_id) {
LOG_D(GTPU, "[%ld] Start delete tunnels for ue id %lu\n",
instance, ue_id);
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetInt(compatInst(instance));
getUeRetInt(inst, ue_id);
getUeRetInt(inst, ue_id, assoc_id);
int nb=0;
@@ -822,15 +886,15 @@ int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id) {
// so the list of bearer provided is only a design bug
int gtpv1u_delete_s1u_tunnel( const instance_t instance,
const gtpv1u_enb_delete_tunnel_req_t *const req_pP) {
return newGtpuDeleteAllTunnels(instance, req_pP->rnti);
return newGtpuDeleteAllTunnels(instance, req_pP->rnti, 0);
}
int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int nbTunnels, pdusessionid_t *pdusession_id) {
int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int assoc_id, int nbTunnels, pdusessionid_t *pdusession_id) {
LOG_D(GTPU, "[%ld] Start delete tunnels for ue id %lu\n",
instance, ue_id);
pthread_mutex_lock(&globGtp.gtp_lock);
getInstRetInt(compatInst(instance));
getUeRetInt(inst, ue_id);
getUeRetInt(inst, ue_id, assoc_id);
int nb=0;
for (int i=0; i<nbTunnels; i++) {
@@ -861,7 +925,7 @@ int gtpv1u_delete_x2u_tunnel( const instance_t instanceP,
int gtpv1u_delete_ngu_tunnel( const instance_t instance,
gtpv1u_gnb_delete_tunnel_req_t *req) {
return newGtpuDeleteTunnels(instance, req->ue_id, req->num_pdusession, req->pdusession_id);
return newGtpuDeleteTunnels(instance, req->ue_id, req->assoc_id, req->num_pdusession, req->pdusession_id);
}
static int Gtpv1uHandleEchoReq(int h,
@@ -956,6 +1020,7 @@ static int Gtpv1uHandleEndMarker(int h,
pthread_mutex_unlock(&globGtp.gtp_lock);
if ( !tunnel->second.callBack(&ctxt,
tunnel->second.assoc_id,
srb_flag,
rb_id,
mui,
@@ -1093,6 +1158,7 @@ static int Gtpv1uHandleGpdu(int h,
if (qfi != -1 && tunnel->second.callBackSDAP) {
if ( !tunnel->second.callBackSDAP(&ctxt,
tunnel->second.ue_id,
tunnel->second.assoc_id,
srb_flag,
rb_id,
mui,
@@ -1108,6 +1174,7 @@ static int Gtpv1uHandleGpdu(int h,
LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
} else {
if ( !tunnel->second.callBack(&ctxt,
tunnel->second.assoc_id,
srb_flag,
rb_id,
mui,
@@ -1233,6 +1300,7 @@ void *gtpv1uTask(void *args) {
if (message_p != NULL ) {
openAddr_t addr= {0};
printf("gtp gets message %d (GTPV1U_TUNNEL_DATA_REQ %d)\n", ITTI_MSG_ID(message_p), GTPV1U_TUNNEL_DATA_REQ); fflush(stdout);
const instance_t myInstance = ITTI_MSG_DESTINATION_INSTANCE(message_p);
const int msgType = ITTI_MSG_ID(message_p);
LOG_D(GTPU, "GTP-U received %s for instance %ld\n", messages_info[msgType].name, myInstance);
@@ -1270,6 +1338,7 @@ void *gtpv1uTask(void *args) {
case GTPV1U_REQ:
// to be dev: should be removed, to use API
//abort();
strcpy(addr.originHost, GTPV1U_REQ(message_p).localAddrStr);
strcpy(addr.originService, GTPV1U_REQ(message_p).localPortStr);
strcpy(addr.destinationService,addr.originService);

View File

@@ -9,6 +9,7 @@ extern "C" {
#endif
typedef bool (*gtpCallback)(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_idP,
const mui_t muiP,
@@ -21,6 +22,7 @@ extern "C" {
typedef bool (*gtpCallbackSDAP)(protocol_ctxt_t *ctxt_pP,
const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flagP,
const rb_id_t rb_idP,
const mui_t muiP,
@@ -77,12 +79,14 @@ extern "C" {
int gtpv1u_update_ngu_tunnel( const instance_t instanceP,
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP,
const ue_id_t prior_rnti
const ue_id_t prior_rnti,
const int assoc_id
);
// New API
teid_t newGtpuCreateTunnel(instance_t instance,
ue_id_t ue_id,
int assoc_id,
int incoming_bearer_id,
int outgoing_rb_id,
teid_t teid,
@@ -94,12 +98,13 @@ extern "C" {
void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance,
ue_id_t ue_id,
int assoc_id,
ebi_t bearer_id,
in_addr_t newOutgoingAddr,
teid_t newOutgoingTeid);
int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id);
int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int nbTunnels, pdusessionid_t *pdusession_id);
int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id, int assoc_id);
int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int assoc_id, int nbTunnels, pdusessionid_t *pdusession_id);
instance_t gtpv1Init(openAddr_t context);
void *gtpv1uTask(void *args);