ltm rule command MQTT qosΒΆ

iRule(1)						BIG-IP TMSH Manual						  iRule(1)

MQTT::qos
       Get or set qos of MQTT PUBLISH message

SYNOPSIS
       MQTT::qos ('0' | '1' | '2')?

DESCRIPTION
       This command can be used to get or set qos field of MQTT message.  This command is valid only for following MQTT message
       types:

	   PUBLISH

       Syntax

       MQTT::qos [ 0 | 1 | 2 ]

       MQTT::qos
	   * Get the qos field of MQTT PUBLISH message

       MQTT::qos 0
	   * Set the qos of MQTT PUBLISH message to at most once delivery.
	     When QoS is changed to 0 from 1 or 2, the packet-id field
	     of the PUBLISH message will be removed. Call MQTT::packet_id before
	     calling MQTT::qos 0 to save original packet-id if needed.

       MQTT::qos 1
	   * Set the qos of MQTT PUBLISH message to at least once delivery.
	     When changing from 0, this call must be followed by
	     MQTT::packet_id  to maintain MQTT protocol correctness.
	     This is because packet-id is not present in PUBLISH messages at QoS 0,
	     while it is required at levels 1 and 2.

       MQTT::qos 2
	   * Set the qos field of MQTT PUBLISH message to exactly once delivery
	     When changing from 0, this call must be followed by
	     MQTT::packet_id  to maintain MQTT protocol correctness.
	     This is because packet-id is not present in PUBLISH messages at QoS 0,
	     while it is required at levels 1 and 2.

RETURN VALUE
       When called without an argument, this command returns the qos of MQTT message

VALID DURING
       MQTT_CLIENT_INGRESS MQTT_SERVER_INGRESS MQTT_CLIENT_DATA MQTT_SERVER_DATA MQTT_CLIENT_EGRESS MQTT_SERVER_EGRESS

EXAMPLES
	#Downgrading QoS to 0:

	when MQTT_CLIENT_INGRESS {
	    set type [MQTT::type]
	    switch $type {
		"PUBLISH" {
		    set in_qos [MQTT::qos]
		    if { $in_qos > 0 } {
			set pktid [MQTT::packet_id]
		    }
		    MQTT::dup 0
		    MQTT::qos 0
		    if { $in_qos == 1 } {
			MQTT::respond type PUBACK packet_id $pktid
		    } elseif { $in_qos == 2 } {
			MQTT::respond type PUBREC packet_id $pktid
		    }
		}
		"PUBREL" {
		    set pktid [MQTT::packet_id]
		    MQTT::drop
		    MQTT::respond type PUBCOMP packet_id $pktid
		}
	    }
	}

	#Changing QoS to 1:

	when CLIENT_ACCEPTED {
	   set self_pktid 1
	}
	when MQTT_CLIENT_INGRESS {
	    set type [MQTT::type]
	    switch $type {
		"PUBLISH" {
		    set in_qos [MQTT::qos]
		    MQTT::qos 1
		    if { $in_qos == 0 } {
			MQTT::packet_id $self_pktid
			set self_pktid [$self_pktid + 1]
		    }
		}
		"PUBREL" {
		    set pktid [MQTT::packet_id]
		    MQTT::drop
		    MQTT::respond type PUBCOMP packet_id $pktid
		}
	    }
	}

	when MQTT_SERVER_INGRESS {
	    set type [MQTT::type]
	    switch $type {
		"PUBACK" {
		   if {$in_qos == 0} {
		       MQTT::drop
		   } elseif {$in_qos == 2} {
		       set pktid [MQTT::packet_id]
		       MQTT::replace type PUBREC packet_id $pktid
		   }
		}
	    }
	}

HINTS
SEE ALSO
CHANGE LOG
       @BIGIP-13.0.0 --First introduced the command.

BIG-IP							    2022-04-12							  iRule(1)