Example: Assigning a Classifier

In Junos OS class of service (CoS), classifiers allow you to associate incoming packets with a forwarding class and loss priority and, based on the associated forwarding class, assign packets to output queues. After you configure a classifier, you must assign it to an input interface.

For each interface configured with the IPv4 protocol family, this script automatically assigns a specified classifier called fc-q3.

XSLT Syntax

<?xml version="1.0" standalone="yes"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:junos="http://xml.juniper.net/junos/*/junos"
    xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"
    xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0">
    <xsl:import href="../import/junos.xsl"/>
 
    <xsl:template match="configuration">
        <xsl:variable name="cos-all" select="class-of-service"/>
        <xsl:for-each
                    select="interfaces/interface[contains(name, '/')]/unit[family/inet]">
            <xsl:variable name="ifname" select="../name"/>
            <xsl:variable name="unit" select="name"/>
            <xsl:variable name="cos"
                    select="$cos-all/interfaces[name = $ifname]"/>
            <xsl:if test="not($cos/unit[name = $unit])">
                <xsl:call-template name="jcs:emit-change">
                    <xsl:with-param name="message">
                        <xsl:text>Adding CoS forwarding class for </xsl:text>
                        <xsl:value-of select="concat($ifname, '.', $unit)"/>
                    </xsl:with-param>
                    <xsl:with-param name="dot" select="$cos-all"/>
                    <xsl:with-param name="content">
                        <interfaces>
                            <name><xsl:value-of select="$ifname"/></name>
                            <unit>
                                <name><xsl:value-of select="$unit"/></name>
                                <forwarding-class>fc-q3</forwarding-class>
                            </unit>
                        </interfaces>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

SLAX Syntax

version 1.0;
ns junos = "http://xml.juniper.net/junos/*/junos";
ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
import "../import/junos.xsl";
 
match configuration {
    var $cos-all = class-of-service;
    for-each (interfaces/interface[contains(name, '/')]/unit[family/inet]) {
        var $ifname = ../name;
        var $unit = name;
        var $cos = $cos-all/interfaces[name = $ifname];
        if (not($cos/unit[name = $unit])) {
            call jcs:emit-change($dot = $cos-all) {
                with $message = {
                    expr "Adding CoS forwarding class for ";
                    expr $ifname _ '.' _ $unit;
                }
                with $content = {
                    <interfaces> {
                        <name> $ifname;
                        <unit> {
                            <name> $unit;
                            <forwarding-class> "fc-q3";
                        }
                    }
                }
            }
        }
    }
}

Testing the ex-classifier Script

To test the ex-classifier script, perform the following steps:

  1. Copy the XSLT or SLAX script from Example: Assigning a Classifier into a text file, name the file ex-classifier.xsl or ex-classifier.slax as appropriate, and copy it to the /var/db/scripts/commit directory on the device.
  2. Select the following configuration stanzas, and press Ctrl+c to copy them to the clipboard. If you are using the SLAX version of the script, change the filename at the [edit system scripts commit file] hierarchy level to ex-classifier.slax.

    system {scripts {commit {file ex-classifier.xsl;}}}interfaces {fe-0/0/0 {unit 0 {family inet {address 10.168.16.2/24;}}}}class-of-service {forwarding-classes {queue 3 fc-q3;}classifiers {inet-precedence fc-q3 {forwarding-class fc-q3 {loss-priority low code-points 010;}}}}
  3. In configuration mode, issue the load merge terminal command to merge the stanzas into your device configuration:

    [edit]user@host# load merge terminal[Type ^D at a new line to end input]... Paste the contents of the clipboard here ...
    1. At the prompt, paste the contents of the clipboard using the mouse and the paste icon.
    2. Press Enter.
    3. Press Ctrl+d.
  4. Issue the commit command. The following output appears:

    [edit]
    user@host# commit
    [edit interfaces interface fe-0/0/0 unit 0]
    warning: Adding CoS forwarding class for fe-0/0/0.0
    commit complete

The output from the show class-of-service configuration mode command now shows that the fe-0/0/0.0 interface has been assigned the fc-q3 classifier:

[edit]user@host# show class-of-serviceclassifiers {inet-precedence fc-q3 {forwarding-class fc-q3 {loss-priority low code-points 010;}}}forwarding-classes {queue 3 fc-q3;}interfaces {fe-0/0/0 {unit 0 {forwarding-class fc-q3;  # Added by commit script}}}