CMP Compatibility

Summary: This document explains iRules CMP compatibility for the various LTM versions (a work in progress…)


This document explains iRules CMP compatibility for the various LTM versions and offers guidelines for constructing CMP compatible iRules and converting existing iRules for CMP compatibility.
Virtual servers using a number of common iRule-accessible features are not CMP-compatible in some versions:
  • Persistence
  • Session Table
  • Global Variables
  • Class / Data Group List References
  • Rate Classes
  • Statistics Profiles

Note: CMP capability does not exist prior to 9.4
Virtual servers using non-CMP compatible features should be demoted from CMP processing and all connections for that vs will be handled by TMM0.
The CMP mode in which the virtual server is running can be shown by issuing one of the following commands: b virtual show all or b virtual cmp mode show
The following sections explain further (and hopefully soon will offer guidelines for constructing CMP compatible iRules, and refer to examples of converting existing iRules for CMP compatibility).


up to & including 9.4.2, no persistence methods were compatible with CMP
as of 9.4.3, cookie & hash persistence were compatible with CMP
as of 9.6.1, all persistence methods are fully compatible with CMP
in some cases the system may not appropriately demote VS w/ incompatible persistence, resulting inconsistent persistence between cores.

Session Table / session command

In v9.4.x, all session commands are incompatible with CMP.
In 9.6.1, the session table and related session commands were temporarily removed
In 10.0, CMP compatible versions of the session table / session commands were added back

Global Variables

9.4.x global variables not compatible with CMP Note - demoted only if caught by validator–“global” keyword was not caught by validator (:: reference)
10.0 Global vars not compatible, static:: vars added for CMP compatible shared static values Global keyword is caught by validator as of v10, and VS will be demoted
Replacement with a class lookup is one alternative:

Not CMP compatible:

set val "$::www_redir https://${host}:${port}[HTTP::uri]\r\n$::www_opts"

CMP compatible (v9.x):

set val "[findclass "www_redir" global_vars " "] https://${host}:${port}[HTTP::uri]\r\n[findclass "www_opts" global_vars " "]"

To support this lookup, you will need to add a new class w/ the appropriate values for each key:
class global_vars { “www_redir xxxxxx” “www_opts xxxxxx” } Note: In 9.4.4 and higher, when referencing the class with the findclass or matchclass commands you should not use :: or $:: prefix

Class / Data Group List References

9.4.0 - 9.4.3, class reference not compatible as of 9.4.4, “::” and “$::” prefixes are no longer required to reference classes using findclass or matchclass. Classes are static and are therefore CMP compatible. There is no need to treat them as global objects.
10.0, matchclass / findclass deprecated in favor of new class command

Rate Classes

9.x, rate class are not CMP compatible
(VS may not be demoted if called in an iRule… can anybody confirm?)
10.0, rate classes are CMP compatible. The rate is divided by the number of TMM instances, and the resulting fraction is enforced separately in each TMM.

Statistics Profiles

9.x, statistics profiles not CMP compatible
VS is not demoted if added to a virtual server.
10.0, statistics profiles are not fully CMP compatible. Each TMM instance uses a separate instance of the statistic profile. The cumulative counts are shown in the GUI and when polled via SNMP.


When used in RULE_INIT, every TMM gets its own key and thus requests cannot be decrypted successfully across TMM instances.