Beam failure recovery is a critical mechanism in 5G networks designed to ensure seamless connectivity and reliability, even in challenging radio conditions. This procedure addresses situations where the signal strength of the connected beam drops below a predefined threshold, indicating beam failure. When such an event occurs, the UE initiates a recovery process by detecting beam failure using a specific reference signal and searching for a candidate beam with better signal quality. If a sufficient number of beam failures are detected, the UE triggers the beam failure recovery process by transmitting a request to the network using a PRACH preamble linked to the candidate beam. The network then responds with the necessary configuration, completing the recovery process and re-establishing a reliable connection. This process ensures that the UE can maintain continuous communication with the network, even in dynamic or high-mobility scenarios where beam quality may vary rapidly.
Followings are the topics I am going to look into in this note
- RRC Parameters for Beam Failure Detection
- RRC Parameters for Beam Failure Recovery Configuration
- Examples
- Example 01 : Hand blockage on a mmWave phone (the textbook case)
- Example 02 : Walking around a street corner (LoS lost, reflection found)
- Example 03 : A truck passes by (the case where BFR should NOT trigger)
- Example 04 : Rotating the device / raising the phone to the ear
- Example 05 : No candidate beam is found - BFR fails and RLF follows
- Example 06 : Beam failure on an SCell in Carrier Aggregation (Release 16)
- Example 07 : A fixed wireless access CPE and a tree in the wind
- Summary of the scenarios
Beam Failure detection and recovery procedure is specified in 38.321-5.17 and can be summarized as below.
|
Step |
Direction |
Process |
|
1 |
< UE > |
Detects Beam Failure (L1-RSRP for the connected beam goes below a certain limit). UE uses a specific Reference Signal to detect the beam failure. |
|
2 |
< UE > |
Search Another Canadidate Beam with good quality |
|
3 |
UE -> NW |
If a predefined number of Beam Failure is detected, Trigger Beam Failure Recovery Process with the candidate beam (PRACH). The predefined number of beamfailure to trigger this process is defined by beamFailureInstanceMaxCount in RRC. // UE send PRACH with the ID specified in BFR-SSB-Resource.ra-PreambleIndex |
|
4 |
UE <- NW |
Reply to Beam Failure Recovery Request (RACH Response). NW send DCI for msg2 via the search space specified by recoverySearchSpaceId |
This process is illustrated as below from this paper([3])

Following is breakdown of the illustration :
-
Beam Failure Detection : The process starts with the UE detecting a beam failure. This occurs when the signal strength of the connected beam, typically measured using L1-RSRP or a reference signal, falls below a predefined threshold. -
Candidate Beam Identification : After detecting the beam failure, the UE searches for a new candidate beam with better signal quality. This involves scanning the available beams in the network and selecting one that meets the required quality criteria. -
Beam Failure Recovery Request : -
The UE sends a Beam Failure Recovery Request to the network using the Physical Random Access Channel (PRACH).
-
In Release 15, PRACH is used for recovery requests in the primary cell.
-
In Release 16, uplink control channels are also supported for recovery requests in secondary cells during carrier aggregation.
-
The use of non-contention-based PRACH ensures faster and more reliable message delivery for critical beam recovery scenarios.
-
Network Response : The network (via the Transmission Reception Point, TRP) monitors and responds to the recovery request. This response includes acknowledgment or configuration details to establish communication using the newly identified beam. -
Post-Recovery Communication : After the recovery process, the UE and TRP switch to the newly identified beam(s) for ongoing communication. This ensures that the connection remains robust and uninterrupted.
To accelerate the procedure of beam recovery and ensure the robustness of this message delivery, non-contention based channel based on physical random access channel (PRACH) (instead of contention-based) can be used for carrying beam failure recovery request for primary cell in Release 15. In Release 16, uplink control channel is additionally supported for carrying beam failure recovery request for secondary cells in the case of carrier aggregation. After this beam failure recovery process, the TRP and UE can use the newly identified beam(s) for subsequent communication
- The non-contention-based PRACH mechanism significantly accelerates the beam recovery process and ensures reliable delivery of recovery requests, especially in challenging environments.
- The enhancements in Release 16, including support for secondary cells in carrier aggregation, make beam recovery more versatile in advanced network configurations.
- This process is critical in scenarios involving high mobility, interference, or complex beamforming setups, enabling seamless communication and improving user experience.
RRC Parameters for Beam Failure Detection
The RRC Parameters for Beam Failure Detection define the configuration used by the UE to monitor and detect beam failures in 5G networks. These parameters are part of the RRC signaling protocol and specify how the UE should identify and handle beam failure scenarios.
Followings are key concepts of this RRC parameter :
Dynamic Configuration : The configuration allows the network to dynamically add, modify, or release monitoring resources to adapt to changing conditions in the network.Beam Failure Detection : The UE monitors the signal quality of reference signals (SSB or CSI-RS) and compares it to predefined thresholds. If the quality drops below the threshold for a specific duration (defined by beamFailureDetectionTimer), a beam failure is detected.Flexible Monitoring : The configuration supports different use cases, including monitoring for beam failures (beamFailure), radio link failures (rlf), or both simultaneously.Network Control : These parameters are provided by the network to ensure efficient and precise monitoring, minimizing false alarms and optimizing recovery procedures
RadioLinkMonitoringConfig ::= SEQUENCE {
failureDetectionResourcesToAddModList SEQUENCE (SIZE(1..maxNrofFailureDetectionResources))
OF RadioLinkMonitoringRS
failureDetectionResourcesToReleaseList SEQUENCE (SIZE(1..maxNrofFailureDetectionResources))
OF RadioLinkMonitoringRS-Id
beamFailureInstanceMaxCount ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10}
beamFailureDetectionTimer ENUMERATED {pbfd1, pbfd2, pbfd3, pbfd4, pbfd5,
pbfd6, pbfd8, pbfd10}
...
}
RadioLinkMonitoringRS ::= SEQUENCE {
radioLinkMonitoringRS-Id RadioLinkMonitoringRS-Id,
purpose ENUMERATED {beamFailure, rlf, both},
detectionResource CHOICE {
ssb-Index SSB-Index,
csi-RS-Index NZP-CSI-RS-ResourceId
},
...
}
- A sequence that defines the list of resources to add or modify for beam failure detection.
- Each entry in this list corresponds to a RadioLinkMonitoringRS, which contains the details of a specific reference signal used for monitoring beam failure.
- A sequence that defines the list of resources to be released, corresponding to previously configured monitoring resources.
- This allows the network to dynamically update the monitoring configuration by removing obsolete resources.
- An enumerated parameter that specifies the maximum number of beam failures that the UE can tolerate before triggering the recovery procedure.
- Possible values include predefined counts such as n1, n2, n3, n4, n5, n6, n8, n10.
- An enumerated timer that defines the maximum time duration for monitoring and detecting beam failures.
- The timer values include pbfd1, pbfd2, pbfd3, pbfd4, pbfd5, pbfd6, pbfd8, pbfd10, where "pbfd" refers to "Physical Beam Failure Detection."
RRC Parameters for Beam Failure Recovery Configuration
The RRC Parameters for Beam Failure Recovery Configuration specify the configuration for managing beam failure recovery in 5G networks. These parameters define how the UE (User Equipment) interacts with the network to re-establish communication when a beam failure occurs.
BeamFailureRecoveryConfig ::= SEQUENCE {
rootSequenceIndex-BFR INTEGER (0..137) OPTIONAL, -- Need M
rach-ConfigBFR RACH-ConfigGeneric OPTIONAL, -- Need M
rsrp-ThresholdSSB RSRP-Range OPTIONAL, -- Need M
candidateBeamRSList SEQUENCE (SIZE(1..maxNrofCandidateBeams))
OF PRACH-ResourceDedicatedBFR OPTIONAL, -- Need M
ssb-perRACH-Occasion ENUMERATED {oneEighth, oneFourth, oneHalf, one, two,
four, eight, sixteen} OPTIONAL, -- Need M
ra-ssb-OccasionMaskIndex INTEGER (0..15) OPTIONAL, -- Need M
recoverySearchSpaceId SearchSpaceId OPTIONAL, -- Need R
ra-Prioritization RA-Prioritization OPTIONAL, -- Need R
beamFailureRecoveryTimer ENUMERATED {ms10, ms20, ms40, ms60, ms80,
ms100, ms150, ms200} OPTIONAL, -- Need M
...,
[[
msg1-SubcarrierSpacing-v1530 SubcarrierSpacing OPTIONAL -- Need M
]]
}
PRACH-ResourceDedicatedBFR ::= CHOICE {
ssb BFR-SSB-Resource,
csi-RS BFR-CSIRS-Resource
}
BFR-SSB-Resource ::= SEQUENCE {
ssb SSB-Index,
ra-PreambleIndex INTEGER (0..63),
...
}
BFR-CSIRS-Resource ::= SEQUENCE {
csi-RS NZP-CSI-RS-ResourceId,
ra-OccasionList SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS))
OF INTEGER (0..maxRA-Occasions-1) OPTIONAL, -- Need R
ra-PreambleIndex INTEGER (0..63) OPTIONAL, -- Need R
...
}
- Refers to an SSB resource used for beam failure recovery, including:
- SSB-Index: Identifies the SSB associated with the recovery.
- ra-PreambleIndex: Specifies the preamble index for the PRACH resource.
- Refers to a CSI-RS resource used for beam failure recovery, including:
- NZP-CSI-RS-ResourceId: Identifies the CSI-RS resource.
- ra-OccasionList: Lists the RA occasions for the CSI-RS.
- ra-PreambleIndex: Specifies the preamble index for the PRACH resource.
RACH-ConfigGeneric ::= SEQUENCE {
prach-ConfigurationIndex INTEGER (0..255),
msg1-FDM ENUMERATED {one, two, four, eight},
msg1-FrequencyStart INTEGER (0..maxNrofPhysicalResourceBlocks-1),
zeroCorrelationZoneConfig INTEGER(0..15),
preambleReceivedTargetPower INTEGER (-202..-60),
preambleTransMax ENUMERATED {n3,n4,n5,n6,n7,n8,n10,n20,n50,n100,n200},
powerRampingStep ENUMERATED {dB0, dB2, dB4, dB6},
ra-ResponseWindow ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80},
...
}
RA-Prioritization ::= SEQUENCE {
powerRampingStepHighPriority ENUMERATED {dB0, dB2, dB4, dB6},
scalingFactorBI ENUMERATED {zero, dot25, dot5, dot75} OPTIONAL, -- Need R
...
}
Examples
All the parameters described above look very abstract when you read them one by one in the ASN.1 structure. So in this section, let me put them into situations that actually happen in the real world. In every scenario I will follow the same story :
Before going into the individual cases, it is worth being clear about one thing that confuses many people. Beam failure is
|
|
Beam Failure Recovery |
Radio Link Failure |
Handover |
|
What changes |
The beam, inside the same cell |
The whole connection is dropped and re-established |
The cell |
|
Who decides |
UE (MAC / PHY), on its own |
UE (RRC) |
Network (RRC), based on UE measurement report |
|
Typical time |
a few tens of ms |
hundreds of ms to seconds |
tens to hundreds of ms |
|
User notices ? |
Usually not. Maybe a short throughput dip. |
Yes. Call drop, session stall. |
Usually not. |
The scenarios below are ordered roughly from the most common to the least common.
Example 01 : Hand blockage on a mmWave phone (the textbook case)
You are downloading a file on a mmWave (FR2) connection and you shift your grip on the phone. Your hand now covers the antenna module that was pointing at the gNB.
t (ms) what happens ------ --------------------------------------------------------------------------------- 0 the hand covers the antenna module ; L1-RSRP of the serving beam drops ~25 dB 10 BFD-RS #1 : quality worse than Qout,LR -> BFI_COUNTER = 1 (BFD timer starts) 20 BFD-RS #2 : still bad -> BFI_COUNTER = 2 30 BFD-RS #3 : still bad -> BFI_COUNTER = 3 = beamFailureInstanceMaxCount ->BEAM FAILURE IS DECLARED 32 UE scans candidateBeamRSList, finds SSB#5 above rsrp-ThresholdSSB 36 UE sends the dedicated preamble (ra-PreambleIndex of SSB#5) on a PRACH occasion -> beamFailureRecoveryTimer starts 44 UE finds a PDCCH for its C-RNTI in recoverySearchSpaceId ->recovery complete
So the whole repair took about 45 ms, and the user saw nothing except a small dip in the throughput graph. This is exactly what the mechanism is designed for.
beamFailureInstanceMaxCount and theBFD-RS period together decide the detection speed. 3 instances at 10 ms means about 30 ms. If you set n10 instead, the same blockage would take about 100 ms to be detected, and the user would probably notice the stall.candidateBeamRSList decides whether there is anywhere to escape to. If the network only put one SSB in this list, the UE has no alternative and this scenario turns into Example 05.rsrp-ThresholdSSB decides how good the escape beam must be. Setting it too high means the UE finds no candidate ; setting it too low means the UE jumps to a beam that is almost as bad as the failed one and fails again a moment later (a "ping-pong" of BFR attempts).
Example 02 : Walking around a street corner (LoS lost, reflection found)
You are walking along a street with a good line of sight to a mmWave small cell on a lamp post, and you turn the corner into a side street. The building at the corner now stands between you and the gNB.
This is a good example of why the candidate beam list has to be built from real measurements and not from geometry. A planning tool would say "there is a building in the way, no service here", but the reflected beam works perfectly well.
Example 03 : A truck passes by (the case where BFR should NOT trigger)
You are standing at a bus stop with a good beam, and a bus drives between you and the gNB. The blockage lasts about 200 ms and then everything is fine again.
This scenario is included because it shows the
- The PRACH transmission costs uplink power and takes a dedicated preamble resource.
- The network has to reconfigure the beam, then reconfigure it back a moment later.
- During the switching, scheduling is interrupted anyway, so an unnecessary recovery can hurt the throughput more than the blockage itself.
The two parameters that protect against this are worth understanding together, because they work as a pair.
beamFailureInstanceMaxCount is the "how many bad measurements in a row" counter. Raising it makes the UE more patient.beamFailureDetectionTimer is the "forget about it" timer. Every time a bad instance is reported, the timer is restarted. If the timer expires without a new bad instance, the counter is reset to zero. Note that its values (pbfd1, pbfd2 ...) are counted inperiods of the BFD reference signal , not in milliseconds.
So the real question that the UE is asking is not "is the beam bad ?" but
In practice, an operator tunes this against the mobility profile of the cell. A cell covering a busy road with a lot of passing vehicles is usually configured to be more patient than a cell covering a fixed installation.
Example 04 : Rotating the device / raising the phone to the ear
You are in a video call holding the phone in front of you, and you raise it to your ear to talk. The phone rotates by roughly 90 degrees in about half a second.
This is invisible in the signalling, because the specification never talks about UE panels in Release 15. The UE simply says "I want SSB#7" by sending the preamble mapped to SSB#7, and how it internally receives SSB#7 is entirely up to the implementation. This is one of the reasons why two phones with the same chipset but different antenna placement can behave very differently in the same spot.
Example 05 : No candidate beam is found - BFR fails and RLF follows
You walk into an elevator, or into a basement corridor, while connected on mmWave. The serving beam dies, and so does every other beam of that cell.
This is the negative case, and it is important to understand because it shows the boundary of what BFR can do. Beam failure recovery repairs a
What happens step by step :
- The BFI counter reaches beamFailureInstanceMaxCount as usual, and beam failure is declared.
- The UE goes through candidateBeamRSList and finds that
no entry has an L1-RSRP above rsrp-ThresholdSSB. - Because there is no candidate with a dedicated preamble, the UE falls back to an ordinary contention based random access on the best SSB it can find, if any.
- Each preamble attempt is repeated with power ramping (powerRampingStep) up to preambleTransMax attempts. Meanwhile beamFailureRecoveryTimer is running.
- When the attempts are exhausted, the MAC layer reports a random access problem to RRC. Together with the radio link monitoring result, this leads the UE to declare
radio link failure and start RRC re-establishment - typically on the LTE anchor or on an FR1 NR cell, which is where the service actually continues.
Example 06 : Beam failure on an SCell in Carrier Aggregation (Release 16)
A UE is aggregating an FR1 PCell with an FR2 SCell. The FR2 beam is blocked, but the FR1 connection is perfectly healthy.
Everything described so far assumed that the failed beam is the only way to reach the network. In carrier aggregation that assumption is wrong, and Release 16 takes advantage of it.
- In
Release 15 , the BFR request is carried by PRACH. This makes sense for the primary cell, because if the PCell beam is broken there is no other way to talk to the network. But sending a PRACH on the SCell to report an SCell problem is slow and clumsy when a perfectly good uplink already exists on the PCell. - In
Release 16 , the UE instead sends a scheduling request on the PCell and then reports the failure with aBFR MAC CE , which carries the index of the failed SCell and the index of the new candidate beam. No PRACH is involved on the failing carrier at all.
This is a good example of a general principle in the design of 5G : the recovery mechanism is chosen according to
From a testing point of view, this also means that an SCell beam failure and a PCell beam failure look completely different in a log even though the physical cause may be identical. If you are looking for PRACH and you do not find it, check the MAC CEs on the PCell before concluding that nothing happened.
Example 07 : A fixed wireless access CPE and a tree in the wind
An FWA (Fixed Wireless Access) modem is mounted on the outside wall of a house, aimed at a mmWave site 200 m away. There is a tree between them. Everything works perfectly in winter, and the customer complains in spring.
This scenario is interesting because it is the opposite of everything above : the device never moves, and yet beam failure happens repeatedly.
Foliage : leaves attenuate mmWave heavily. A path that has 5 dB of margin through bare branches can lose 15 dB or more once the tree is in leaf, which is why the problem appears seasonally.Wind : this is what turns a static loss into a beam failure. The branches move, so the attenuation fluctuates by several dB on a time scale of a second or so. Every gust can push the quality below Qout,LR for a few measurement periods.Rain : adds its own attenuation, and wet leaves are considerably worse than dry ones.
What you see in the network statistics is a cell with a normal average RSRP but an abnormally high BFR count, concentrated on one or two UEs, and correlated with the weather rather than with the traffic. This pattern -
The fix is usually physical (move or re-aim the CPE so that it uses a different, cleaner path, which may well be a reflected one) rather than a parameter change. But on the parameter side, this is the classic case for making the UE
Summary of the scenarios
Putting all of them side by side makes the pattern easy to see.
|
Scenario |
How long the blockage lasts |
Is a candidate beam available ? |
Result |
Parameter that matters most |
|
01 - Hand blockage |
a second or less |
Yes, usually |
Fast recovery, user sees nothing |
beamFailureInstanceMaxCount |
|
02 - Street corner |
permanent |
Yes, a reflected one |
Recovery, then TCI update to the new beam |
candidateBeamRSList |
|
03 - Passing vehicle |
a few hundred ms |
Not needed |
Ideally no recovery at all |
beamFailureDetectionTimer |
|
04 - Device rotation |
until the movement ends |
Yes, via another UE panel |
Recovery, often on the same SSB |
UE implementation, not RRC |
|
05 - Elevator / basement |
permanent |
No |
BFR fails, RLF and fallback to FR1/LTE |
beamFailureRecoveryTimer, preambleTransMax |
|
06 - SCell in CA (Rel-16) |
any |
Yes, and the PCell still works |
Recovery by MAC CE, no PRACH |
Release 16 SCell BFR configuration |
|
07 - FWA and a tree |
repeating, ~1 s each |
Often the same beam |
Repeated recoveries, high BFR counter |
beamFailureInstanceMaxCount (be patient) |
If you read the table from left to right, you will notice that only two questions really decide everything :
Reference
- 3GPP TS 38.214 - 5G;NR; Physical layer procedures for data
- 3GPP TS 38.331 - 5G;NR;Radio Resource Control (RRC); Protocol specification
- Beam Management in Millimeter-Wave Communications for 5G and Beyond