Spectrum control, hop by hop
How a CBRS grant is issued by a SAS, carried by a Domain Proxy, turned into carrier configuration in the DU and CU, and written into an O-RAN radio over M-Plane. A runnable lifecycle lab: register, get granted, get authorized, and watch what an incumbent detection or a grant termination actually does to the radio.

Scope: CBRS is a US band, 3550 to 3700 MHz, 3GPP band 48 / n48. The chain below is the generic one for an open 5G stack driving a Split 7.2 O-RU. Open-source examples are named where they exist; the roles are the same with commercial components.
The grant lifecycle, live
Run the chain end to end, or step through it one message at a time. Trigger an incumbent detection to watch a suspend propagate through every hop, or terminate the grant outright and watch the radio go dark, then get re-granted on a different channel.
- REGISTERED
- GRANTED
- AUTHORIZED
- SUSPENDED
- TERMINATED
- CBSD state
- UNREGISTERED
- cbsdId
- …
- grantId
- …
- channel
- …
- maxEirp
- …
- heartbeat
- …
- RU carrier
- INACTIVE
- transmitting
- no
The bar is the CBRS band. The block is this radio's grant, coloured by its state.
An interactive lab. A chain of five nodes, SAS, Domain Proxy, DU and CU, M-Plane client and Radio, joined by a bus. Each message rides the bus one hop at a time, and the log line, the grant state chip above the radio and the radio's carrier pill change as it lands. Buttons run the full grant lifecycle, step one message at a time, suspend the grant for an incumbent, terminate it, or reset. A log lists every message with its payload, and a readout shows the CBSD state, identifiers, channel, EIRP, heartbeat interval, the RU carrier state and a bar of the 3550 to 3700 MHz band with this radio's grant drawn on it.
- request to the SAS, heartbeat
- response, carrier config, AUTHORIZED, transmitting
- GRANTED, not yet transmitting
- SUSPENDED, carrier muted
- TERMINATED, incumbent
- small dot: the radio's ok reply
Payloads are structurally faithful to the SAS-CBSD protocol; identifiers and timestamps are placeholders.
Why any of this exists
3550 to 3700 MHz was federal spectrum and still is. The US Navy runs shipborne radar in it, and fixed-satellite earth stations sit in it too. Rather than clear the band, the FCC opened it in 2015 under 47 CFR Part 96 as shared spectrum with three tiers of priority. Nobody in tiers 2 or 3 owns a channel. They borrow one, moment to moment, from a database that knows where the incumbents are and what every other radio is doing. That database is the SAS.
Federal radar, FSS earth stations, grandfathered wireless broadband in 3650 to 3700. Always protected. Radar presence is detected by an Environmental Sensing Capability (ESC), a coastal sensor network, and reported to the SAS.
Priority Access Licenses, auctioned per county in 10 MHz blocks within 3550 to 3650 MHz (up to seven per county). Protected from GAA, not from incumbents.
General Authorized Access. Anyone with a certified device and a SAS grant, anywhere in the band not currently used by the two tiers above. No licence, no auction. This is where most private 5G lives.
The consequence for a radio: it may not transmit until a SAS has told it where and how loud, and it must go quiet fast when told to. When an ESC sensor reports radar, the SAS has 300 seconds to move or suspend the affected radios, and each radio has 60 seconds to comply once told. Those two numbers set the timing budget for everything that follows.
What a SAS is
A Spectrum Access System is an FCC-certified, cloud-hosted coordinator for the band. It is not a radio and not a network element. Certified SAS administrators (Google, Federated Wireless and others) operate them; a network operator subscribes and pays per device. In the FCC's model the SAS is the enforcement point: the rules are written so that a radio cannot be compliant without one.
What it does, in the order a radio meets it:
- Registration. The radio identifies itself: FCC ID, serial number, category (A: up to 30 dBm/10 MHz EIRP, B: up to 47 dBm/10 MHz), location, antenna height and gain. For category B and outdoor category A devices those installation parameters must be attested by a Certified Professional Installer (CPI) and signed.
- Spectrum inquiry. Optional: "what is available here?" The SAS answers with channels and the EIRP it would allow on each.
- Grant. The radio asks for a frequency range and a maximum EIRP. The SAS checks incumbent protection, PAL protection areas and aggregate interference from every other CBSD it knows about, then issues a grant with an expiry time and a heartbeat interval.
- Heartbeat. The lease renewal. A grant alone does not authorize transmission; the first successful heartbeat does. Each response carries a
transmitExpireTime. Miss it and the radio must stop. - Suspend, terminate, relinquish. The SAS can pull a grant at any heartbeat:
501 SUSPENDED_GRANT(keep the grant, stop transmitting, keep heartbeating) or500 TERMINATED_GRANT(the grant is gone, ask again). The radio relinquishes when it is done. - SAS-to-SAS sync. Administrators exchange CBSD registrations and grants so that every SAS computes interference from the whole population, not just its own customers.
The wire protocol is the WInnForum SAS-CBSD interface (WINNF-TS-0016): JSON over HTTPS, mutually authenticated with certificates issued under the CBRS PKI. Requests are arrays, so one HTTP call can carry many radios.
Response codes worth knowing
| Code | Meaning | What the radio side must do |
|---|---|---|
0 | SUCCESS | Proceed; on a heartbeat, transmit until transmitExpireTime. |
103 | INVALID_VALUE | Fix the offending parameter and retry. |
200 | DEREGISTER | Stop everything and register again from scratch. |
202 | BLACKLISTED | The device is barred; stop and escalate to a human. |
400 | INTERFERENCE | Grant refused; try a different channel or a lower EIRP. |
500 | TERMINATED_GRANT | Stop transmitting, discard the grant, request a new one. |
501 | SUSPENDED_GRANT | Stop transmitting within 60 s, keep the grant, keep heartbeating. |
502 | UNSYNC_OP_PARAM | Operating parameters drifted from the grant; relinquish and re-request. |
For lab work, OpenSAS (an open-source SAS from the Virginia Tech CCI testbed) implements the same object model and response codes, serving https://host:1443/sas-api/{registration, spectrumInquiry, grant, heartbeat, relinquishment, deregistration}. It lets you exercise the full lifecycle without a commercial subscription, but it is not a certified SAS: it proves that your chain behaves correctly, not that your deployment is legal.
What a Domain Proxy is
The SAS speaks exactly one protocol and expects a certificate-holding, well-behaved client that sends batched JSON, tracks grant state per radio and heartbeats on time. A radio's own management interface is something else entirely: NETCONF/YANG for an O-RAN RU, TR-069 or TR-369 for a small cell, a vendor CLI for the rest. Something has to sit between the two and act as the SAS client on the radio's behalf. WInnForum calls that a Domain Proxy.
It owns five things:
- The CBRS PKI certificate and the TLS session to the SAS. One trusted endpoint instead of a certificate on every radio.
- Batching: N radios, one request array, one HTTPS call. This matters at scale, because a SAS rate-limits per call as well as per device.
- The WInnForum state machine per CBSD: unregistered, registered, granted, authorized, with the heartbeat timers, retries, back-off and the 60-second stop deadline.
- Translation of grant parameters into whatever the network side understands.
- Propagation of the SAS's decisions downward: suspend and terminate have to reach the transmitter, not stop at a log line.
Could the radio just carry the SAS client itself? It can, and some small cells do. But the moment you have more than a handful of radios, or radios from more than one vendor, or radios whose management plane is NETCONF rather than HTTP, the proxy is the only sane place for the certificate, the state and the batching to live. It also gives you a single log where an auditor can see every grant the network ever held.
Magma's dp/ directory is a complete open-source example: a configuration controller that talks to the SAS, a radio controller that talks to the radios, a database service holding grant state, and an active-mode controller that drives the lifecycle. Commercial small-cell vendors ship the equivalent inside their element management systems.
The rule that must not slip: a Domain Proxy is not a SAS. It never decides what spectrum is available. It relays the SAS's decision and makes sure the radio obeys it.
Where the DU and CU fit
In FCC terms the CBSD is the thing that radiates: the radio unit. The RU is the certified device; the DU is not. But an RU does not pick its own carrier. In a Split 7.2 system the DU decides band, ARFCN, bandwidth and power budget, and drives the RU over Open Fronthaul. So a grant has to become DU configuration before it can become RF.
The CU is untouched. RRC, PDCP and the NG interface to the core do not care which 10 MHz the cell is on. Spectrum control is a DU-and-below concern, which is also why it belongs outside the 3GPP stack proper: nothing in F1 or NG carries a grant.
The join is a small piece of glue, a grant adapter, that takes what the Domain Proxy hands it and maps grant state to carrier action:
maxEirp (dBm/MHz plus 10·log10 of the bandwidth in MHz). Then switch the RU carrier to ACTIVE.Two details trip people up here. First, a 10 MHz grant does not mean a 10 MHz cell can sit anywhere inside it: the NR channel raster and the SAS's 10 MHz channel boundaries must line up, so the adapter should derive the centre frequency from the SAS's channel rather than the other way round. Second, TDD. CBRS is TDD and the SAS's interference model assumes neighbours share a frame structure; a DU that picks an unusual UL/DL pattern will interfere in ways the SAS does not predict.
Now the gap that shapes most integrations. An open DU and CU's fronthaul library implements the C-, U- and S-planes of the 7.2x split: IQ samples, scheduling and timing. It typically has no southbound M-Plane client; its only NETCONF surface, if any, is O1, northbound to an SMO. Carrier frequency, bandwidth, gain and on/off on the RU are M-Plane parameters, so without an M-Plane client the DU can compute the right carrier and still have no way to write it into the radio. That is the job the next hop takes.
The last hop: M-Plane into the RU
O-RAN WG4 defines four fronthaul planes. Three of them (C, U, S) carry the live cell. The Management Plane is the one that configures the radio: NETCONF over SSH (or TLS), with YANG models the RU publishes. The carrier lives in o-ran-uplane-conf as a tx-array-carrier object with a centre frequency, a bandwidth, a gain and an active state of INACTIVE, SLEEP or ACTIVE.
The path from grant to RF:
<edit-config>. Open M-Plane (mplane_client) is the open-source reference; RU vendors and SMOs ship their own.libhalmplane), which is what the silicon vendor actually implements.What actually crosses the wire for an authorized grant:
<rpc message-id="7" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<edit-config>
<target><running/></target>
<config>
<user-plane-configuration xmlns="urn:o-ran:uplane-conf:1.0">
<tx-array-carriers>
<name>txarray0</name>
<center-of-channel-bandwidth>3595000000</center-of-channel-bandwidth>
<channel-bandwidth>10000000</channel-bandwidth>
<gain>30</gain>
<active>ACTIVE</active>
</tx-array-carriers>
</user-plane-configuration>
</config>
</edit-config>
</rpc>A suspend is the same message with active set to SLEEP (or gain to 0); a termination sets it INACTIVE. One edit-config completes in well under a second, which is why the 60-second Part 96 deadline is comfortable once the chain exists and impossible when it does not.
Two practical notes. M-Plane sessions are long-lived, so the client should hold the session open rather than reconnect per grant; SSH key exchange on an embedded RU can take longer than the edit itself. And the RU's supported YANG revision matters: o-ran-uplane-conf has changed across WG4 M-Plane releases, and a client written for one revision will fail validation on another. Fetch the RU's capabilities with a NETCONF <get> before assuming anything.
Why it is mandated, and who owns which duty
Transmitting in 3550 to 3700 MHz without a SAS grant is unlicensed operation in a band shared with federal radar. Part 96 is the set of conditions under which it becomes legal. The SAS is the FCC's enforcement point; the Domain Proxy, the DU adapter and the M-Plane hop are how a network obeys it. Each rule below lands on a specific hop.
| Part 96 requirement | Where it is satisfied in this chain |
|---|---|
| A CBSD must register with a SAS and hold a grant before it transmits. (§96.39) | Domain Proxy registration and grant. The adapter keeps the RU carrier INACTIVE until the state is AUTHORIZED. |
| Transmit only within the granted frequency range and at or below the granted EIRP; category power limits. (§96.39, §96.41) | Adapter maps the grant to the carrier; the M-Plane edit-config is the only path that sets the RU's frequency and gain. |
| Heartbeat with the SAS; stop transmitting within 60 s of a SAS instruction or of losing the heartbeat. (§96.39(c)) | Domain Proxy heartbeat timer; the 501/500 path through the adapter to an M-Plane SLEEP or INACTIVE. |
| Incumbent protection: on ESC detection the SAS must suspend or move affected CBSDs within 300 s. (§96.15) | SAS side. The chain's job is to honour the resulting 501/500 immediately. |
| Installation parameters for category B and outdoor category A must come from a Certified Professional Installer. (§96.39, §96.45) | Registration payload. The Domain Proxy carries the CPI-signed data; the operator owns getting it signed. |
| CBSD equipment must be FCC-authorized and certified for Part 96. | The radio vendor. Not something the software chain can supply. |
| The SAS must be an FCC-certified administrator. (Subpart F) | A commercial SAS in production. Open-source SAS implementations are for the lab. |
So the responsibility splits cleanly. The radio vendor owns device authorization. Whoever builds and operates the chain owns conformant spectrum-control behaviour: register before transmit, stay inside the grant, stop on time. Proving the second end to end in a lab, against an open SAS and a mock radio, is the cheap part. Certification against a commercial SAS, with CPI data, WInnForum conformance testing and a CBRS PKI certificate, is months of external lead time and a separate project from the engineering.
Section references are to 47 CFR Part 96 as commonly cited. Confirm wording against the current eCFR text before relying on it.
Sources and references
- 47 CFR Part 96, Citizens Broadband Radio Service (eCFR).
- WInnForum WINNF-TS-0016, SAS to CBSD Technical Specification (response codes, object model, heartbeat semantics).
- WInnForum WINNF-TS-0096, SAS Test and Certification Specification.
- O-RAN WG4 Management Plane Specification and the
o-ran-uplane-confYANG model. - Open-source examples named above: OpenSAS (CCI-NextG-Testbed), Magma Domain Proxy (
magma/dp), Open M-Plane, and srsRAN-derived DU and CU stacks.
Written by telecogeco, a ugeco brand. The lifecycle lab above walks a synthetic CBSD through the WInnForum message set on the client side only; it is not connected to a live SAS or a real radio.