Network Security

CoPP vs CPPr: Which Control-Plane Defense to Deploy

CoPP is one aggregate policer; CPPr subdivides the control plane and adds port-filtering. A decision guide backed by a real CoPP police capture.
CoPP versus CPPr control-plane defense comparison
In: Network Security, CCIE, Labs

You have decided the control plane needs protecting - good. The next question is which tool: Control Plane Policing (CoPP) or Control Plane Protection (CPPr)? They are related, they are often confused, and the honest answer for most networks is "CoPP, and it is enough." This decision guide lays out exactly what each one does, backs the "CoPP is enough" case with a real police capture from our lab, and tells you the specific conditions under which reaching for CPPr actually pays off. It is part of the infrastructure security cluster.

The one-sentence version

CoPP is a single aggregate QoS policy on the entire control plane. CPPr splits the control plane into three subinterfaces and adds port-filtering and per-protocol queue-thresholding. CoPP is simpler and universal; CPPr is finer-grained and platform-dependent. If you remember nothing else, remember that CPPr is not a replacement for CoPP - it is a superset you layer on where the platform supports it.

Side by side

CoPP
ScopeOne aggregate policy on the whole control plane
GranularityPer class-map, but all classes share one control-plane
Port-filterNo
Queue-thresholdNo
Platform supportNear universal
ComplexityLow
CPPr
ScopeHost / transit / cef-exception subinterfaces
GranularityIndependent policer per subinterface
Port-filterYes - drops closed-port traffic
Queue-thresholdYes - per protocol
Platform supportPlatform-dependent
ComplexityHigher

The case for CoPP: it works, and here is the proof

The strongest argument for "CoPP is enough for most" is that it demonstrably stops the attack it is meant to stop. In our CML lab we put a single, deliberately tight aggregate policy on EDGE1 - police ICMP to the control plane at 8 kbps, drop the excess:

access-list 150 permit icmp any any
class-map match-all PLZ-ICMP-CLASS
 match access-group 150
policy-map PLZ-COPP
 class PLZ-ICMP-CLASS
  police 8000 conform-action transmit exceed-action drop
control-plane
 service-policy input PLZ-COPP

Then the Debian attacker flooded the router:

j@llmbits$ sudo ping -f -c 800 -i 0.002 192.168.99.1
--- 192.168.99.1 ping statistics ---
800 packets transmitted, 91 received, 88.625% packet loss, time 7446ms
EDGE1#show policy-map control-plane
 Control Plane
  Service-policy input: PLZ-COPP
    Class-map: PLZ-ICMP-CLASS (match-all)
      police:
          cir 8000 bps, bc 1500 bytes
        conformed 91 packets, 8918 bytes; actions:
          transmit
        exceeded 709 packets, 69482 bytes; actions:
          drop

91 conformed plus 709 dropped equals the 800 sent, and 91 is exactly what the flood got back. One aggregate policy, one command applied to control-plane, and the CPU never saw 709 of the 800 attack packets. That is the whole job. For the full build and tuning guidance, read our dedicated Control Plane Policing (CoPP) walkthrough.

The configuration difference, concretely

Both features use the same MQC building blocks - class-maps and policy-maps - so at first glance the configs look almost identical. The difference is entirely in where the policy attaches. CoPP binds one service-policy to the aggregate control-plane:

control-plane
 service-policy input PLZ-COPP

CPPr binds policies to named subinterfaces, and adds a policy type that has no CoPP equivalent - the port-filter that matches closed ports:

control-plane host
 service-policy type port-filter input PLZ-PF-POLICY
 service-policy input PLZ-CPPR-HOST
control-plane cef-exception
 service-policy input PLZ-CEF-POLICY

That is the whole structural story. If your muscle memory already knows CoPP, CPPr is not a new language - it is the same MQC syntax pointed at three targets instead of one, plus type port-filter. The operational cost of CPPr is not learning new commands; it is having three or four policies to reason about and keep from dropping your own traffic, instead of one.

When CPPr earns its extra complexity

CoPP's limitation is that everything punted to the CPU shares one policer's fate. That is usually fine. It stops being fine in three specific situations, and those are exactly when CPPr is worth the effort:

You need class isolation

A flood of un-switchable (cef-exception) traffic should not be allowed to starve your SSH management path. CPPr gives each subinterface its own budget.

You are scanned constantly

On an exposed edge, port scans to closed ports waste CPU. Only CPPr's port-filter drops closed-port traffic before it is queued.

One protocol goes noisy

Queue-thresholding caps each protocol's slice of the punt queue, so one chatty protocol cannot block the rest even below the aggregate rate.

If none of those describe your environment - and for a great many enterprise and campus devices, none do - then CoPP alone is the right answer, and adding CPPr is complexity without a matching risk reduction.

Honest note: our platform only exposed CoPP

We proved CoPP with real counters above. We could not capture live CPPr output, because the Cisco IOL-XE (17.18) image our CML lab runs on does not implement the control-plane subinterfaces - control-plane host and show control-plane host open-ports both return % Invalid input. CPPr is a hardware and platform feature (common on ISR and ASR), so verify it on your own gear. We describe the CPPr model from Cisco's documentation and refuse to fabricate show output for it. The full CPPr model, including the port-filter config, is in our companion article on Control Plane Protection (CPPr).

The decision, in one flow

Start with CoPP on every device - it is universal, low-risk, and proven. Then ask: is this box directly exposed to untrusted networks, scanned frequently, or does it need hard isolation between control-plane traffic classes? If yes, and the platform supports it, layer CPPr on top for the port-filter and per-subinterface policing. If no, stop at CoPP. You are not choosing between them so much as deciding how far up the ladder your particular device needs to climb.

A common misconception

Engineers sometimes treat CPPr as "the new CoPP" and assume enabling it replaces the aggregate policy. It does not. If you configure CPPr subinterface policies but never build a sensible baseline of protection, you can end up with less coverage than a good single CoPP policy would give you, because traffic that does not match any of your subinterface classes may pass unpoliced. The correct mental model is additive: a solid CoPP-style baseline of classification and policing first, then the CPPr-specific wins (isolation, port-filter, queue-threshold) layered on. Do not tear out working CoPP to "upgrade" to CPPr - extend it.

The other frequent mistake is policing management traffic into the ground. In both models, the failure you must avoid is dropping SSH from your own NOC or starving a routing protocol. Whichever tool you deploy, explicitly permit and generously rate the traffic that keeps the box reachable and converged, and baseline the real punt rate before you set any conform value.

Frequently asked

Does CPPr improve on CoPP for a typical enterprise core?

Usually not enough to justify the complexity. A well-tuned CoPP policy on a core device that is not directly exposed to untrusted hosts already stops the volumetric attacks that matter. CPPr's port-filter shines on an exposed edge that gets scanned; on a protected core it solves a problem you may not have.

If my platform does not support CPPr, am I exposed?

No. CoPP alone is a legitimate, complete control-plane defense - it is what our lab used to absorb the flood. CPPr adds isolation and closed-port filtering, but the absence of CPPr is not a gap you have to panic about as long as CoPP is in place and tuned.

Can I run both at once?

On platforms that support CPPr, yes, and that is the intended design. Keep a baseline of classification and policing, and use the CPPr subinterfaces for the extra granularity. They are complementary layers, not an either/or.

Key Takeaways

  • CoPP is one aggregate policy; CPPr subdivides the control plane into host, transit, and cef-exception subinterfaces plus port-filtering and queue-thresholding.
  • CoPP is enough for most networks and it is proven - our 8 kbps policer dropped 709 of 800 flood packets (88.6% loss) with a single command on control-plane.
  • Reach for CPPr only when you need class isolation, you face constant port scanning (the port-filter), or one protocol can flood the punt queue (queue-thresholding).
  • They stack, they do not compete. Deploy CoPP everywhere; add CPPr where the platform and the threat model justify it.
  • Platform reality: our IOL lab exposed CoPP but not CPPr's subinterfaces, so we proved CoPP live and describe CPPr from documentation.

This is one decision inside a larger hardening story. Work through the rest of the infrastructure security cluster to pair control-plane defense with anti-spoofing, management-plane lockdown, and authenticated NTP.

Written by
More from Ping Labz
Private VLAN association with isolated and community secondaries
VLAN

Private VLANs: Isolating Hosts That Share a Subnet

Private VLANs isolate hosts that share a subnet, at Layer 2, without a subnet per host. Primary, isolated, and community secondary VLANs on Cisco IOS XE, with the classic DMZ use case and real show output.
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.