WRED Configuration

WRED requires very little configuration if you want to take the IOS defaults for the various tunable settings, such as per-precedence and per-DSCP thresholds. If you want to change the defaults, the configuration details can become quite large.

This section begins with a table of configuration commands (Table 6-6) and show commands (Table 6-7), followed by three separate examples.

Table 6-6 Command Reference for WRED

Command

Mode and Function

random-detect [dscp-based | prec-based]

Interface or class configuration mode; enables WRED, specifying whether to react to precedence or DSCP.

random-detect [attach group-name]

Interface configuration mode; enables per-VC* WRED on ATM interfaces by referring to a random-detect-group.

random-detect-group group-name [dscp-based | prec-based]

Global configuration mode; creates a grouping of WRED parameters, which can be enabled on individual ATM VCs using the random-detect attach command.

random-detect precedence precedence min-threshold max-threshold mark-prob-denominator

Interface, class, or random-detect-group configuration modes; overrides default settings for the specified precedence, for minimum and maximum WRED thresholds, and for percentage of packets discarded.

random-detect dscp dscpvalue min-threshold max-threshold [mark-probability-denominator]

Interface, class, or random-detect-group configuration modes; overrides default settings for the specified DSCP, for minimum and maximum WRED thresholds, and for the percentage of packets discarded.

random-detect exponential-weighting-constant exponent

Interface, class, or random-detect-group configuration modes; overrides default settings for exponential weighting constant. Lower numbers make WRED react quickly to changes in queue depth; higher numbers make WRED react less quickly.

VC = virtual circuit

VC = virtual circuit

Table 6-7 Exec Command Reference for WRED

Command

Function

show queue interface-name interface-number [vc [vpi/] vci]]

Lists information about the packets that are waiting in a queue on the interface

show queueing random-detect [interface atm-subinterface [vc [[vpi/] vci]]]

Lists configuration and statistical information about the queuing tool on an interface.

show interfaces

Mentions whether WRED has been enabled on the interface

show interface random-detect

Lists information about WRED when distributed WRED is running on a VIP* interface

show policy-map [interface interface-name interface-number]

Lists WRED information when it is enabled inside an MQC policy map

* VIP = Versatile Interface Processor

* VIP = Versatile Interface Processor

In the first example, R3 enables WRED on its S0/0 interface. WRED treats packets differently based on the IP precedence value, which has been marked with CB marking as the packets enter R3's E0/0 interface. The marking logic performed by CB marking is as follows:

• HTTP traffic for web pages with "important" in the URL—DSCP AF21

• HTTP traffic for web pages with "not-so" in the URL—DSCP AF23

To generate traffic in this network, two voice calls will be made between the analog phones attached to R1 and R4. Multiple web browsers will load the standard page (this is the same page we have used in other chapters in this book) with two TCP connections created by each browser—one to get a file with the word "important" in it, and the other getting a file with "not-so" in it. An FTP download of a large file will also be initiated from the Server to Client1.

Example 6-1 shows the basic configuration and show commands output. Only the required commands and parameters have been used, with defaults for all other settings. The example uses the familiar network diagram, as repeated in Figure 6-11.

Figure 6-11 Sample Network for All WRED Examples—Configuration on R3

Figure 6-11 Sample Network for All WRED Examples—Configuration on R3

Example 6-1 WRED Default Configuration, RS, SO/O

!

hostname R3 |

no ip domain-lookup ip host r4 192.168.3.254 ip host r2 192.168.23.252 ip host r1 192.168.1.251 !

ip cef !

class-map match-all voip-rtp match ip rtp 16384 16383 class-map match-all http-impo match protocol http url "*important*M class-map match-all http-not match protocol http url "*not-so*" class-map match-all class-default match any

! !

policy-map laundry-list class voip-rtp set ip dscp ef class http-impo set ip dscp af21 class http-not set ip dscp af23

Example 6-1 WRED Default Configuration, R3, S0/0 (Continued)

class class-default set ip dscp default

call rsvp-sync

interface Ethernet0/0 description connected to SW2, where Server1 is connected ip address 192.168.3.253 255.255.255.0 ip nbar protocol-discovery half-duplex service-policy input laundry-list

interface Serial0/0 description connected to FRS port S0. Single PVC to R1. no ip address encapsulation frame-relay load-interval 30 random-detect clockrate 128000

interface Serial0/0.1 point-to-point description point-point subint global DLCI 103, connected via PVC to DLCI 101 ( R1)

ip address 192.168.2.253 255.255.255.0 frame-relay interface-dlci 101

! Lines omitted for brevity.

R3#show queueing interface serial 0/0

Interface Serial0/0 queueing strategy: random early detection (WRED) Exp-weight-constant: 9 (1/512) Mean queue depth: 37

class

Random drop

Tail drop

Minimum

Maximum

Mark

pkts/bytes

pkts/bytes

thresh

thresh

prob

0

1776/315688

1012/179987

20

40

1/10

1

0/0

0/0

22

40

1/10

2

5/4725

16/17152

24

40

1/10

3

0/0

0/0

26

40

1/10

4

0/0

0/0

28

40

1/10

5

0/0

0/0

31

40

1/10

6

0/0

0/0

33

40

1/10

7

0/0

0/0

35

40

1/10

rsvp

0/0

0/0

37

40

1/10

R3#show queue s 0/0

Output queue for Serial0/0 is 57/0

Packet 1, linktype: ip, length: 64, flags: 0x88

source: 192.168.3.254, destination: 192.168.2.251, id: 0x053E, ttl: 253, TOS: 184 prot: 17, source port 18378, destination port 17260

Example 6-1 WRED Default Configuration, R3, S0/0 (Continued)

data: 0x47CA 0x436C 0x0028 0x0000 0x8012 0x3F73 0x4C7E

0x8D44 0x18D1 0X03FE 0xFC77 0XA2A7 0x35A2 0X54E7

Packet 2, linktype: ip, length: 64, flags: 0x88

source: 192.168.3.254, destination: 192.168.2.251, id: 0x0545, ttl: 253,

TOS: 184 prot: 17, source port 16640, destination port 17178

data: 0x4100 0x431A 0x0028 0x0000 0x8012 0x6330 0x21B4

0x82AF 0x05C9 0x03FE 0x1448 0x8706 0xAFD9 0xD364

! Output omitted for brevity.

R3#show interfaces s 0/0

Serial0/0 is up, line protocol is up Hardware is PowerQUICC Serial

Description: connected to FRS port S0. Single PVC to R1. MTU 1500 bytes, BW 1544 Kbit, DLY 20000 usec, reliability 255/255, txload 20/255, rxload 4/255 Encapsulation FRAME-RELAY, loopback not set Keepalive set (10 sec)

LMI enq sent 591, LMI stat recvd 591, LMI upd recvd 0, DTE LMI up LMI enq recvd 0, LMI stat sent 0, LMI upd sent 0 LMI DLCI 1023 LMI type is CISCO frame relay DTE FR SVC disabled, LAPF state down

Broadcast queue 0/64, broadcasts sent/dropped 2726/0, interface broadcasts 252

Last input 00:00:02, output 00:00:00, output hang never Last clearing of "show interface" counters 01:38:28

Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 4391 Queueing strategy: random early detection(RED) 30 second input rate 29000 bits/sec, 58 packets/sec 30 second output rate 122000 bits/sec, 91 packets/sec 23863 packets input, 1535433 bytes, 0 no buffer Received 0 broadcasts, 0 runts, 0 giants, 0 throttles 2 input errors, 0 CRC, 2 frame, 0 overrun, 0 ignored, 0 abort 36688 packets output, 5638653 bytes, 0 underruns 0 output errors, 0 collisions, 4 interface resets 0 output buffer failures, 0 output buffers swapped out 0 carrier transitions DCD=up DSR=up DTR=up RTS=up CTS=up

The WRED part of the configuration is quite short. The configuration shows the random-detect interface subcommand under serial 0/0. As you will see later, the command actually disables WFQ if configured. The rest of the highlighted configuration commands show the CB marking configuration, which implements the functions listed before the example. (For more information about CB marking, see Chapter 3, "Classification and Marking.")

After the configuration, the show queueing interface serial 0/0 command output lists the WRED settings, and the statistics for each precedence value. The defaults for the exponential weighting constant, and the per-precedence defaults of minimum threshold, maximum threshold, and MPD are all listed. In addition, the command lists statistics for bytes/packets dropped by WRED, per precedence value. For those of you who did not memorize the DSCP values, you may not be able to correlate the DSCP values set by CB marking, and the precedence values interpreted by WRED. WRED just looks at the first 3 bits of the IP ToS byte when performing precedence-based WRED. So, DSCP best effort (BE) equates to precedence 0, DSCP AF21 and AF23 both equate to precedence 2, and DSCP expedited forwarding (EF) equates to precedence 5.

The show queueing command also lists a column of statistics for tail drop as well as random drops. In this example, WRED has dropped several packets, and the queue has filled, causing tail drops, as shown with the nonzero counters for random drops and tail drops in the show queueing command output.

The show queue serial 0/0 command lists the same type of information seen in earlier chapters. However, this command lists one particularly interesting item relating to WRED in the first line of the command output. The actual queue depth for the single FIFO queue used with WRED is listed at 57 entries in this particular example. The earlier show queueing command lists an average queue depth of 37 just instants before. These two numbers just give us a small reminder that WRED decides to drop based on average queue depth, as opposed to actual queue depth.

Finally, the show interfaces command at the end of the example reminds us that WRED does not work with any other queuing method directly on the interface. The command uses the statement "Queueing strategy: random early detection (RED)" to remind us of that fact. WRED uses a single FIFO queue, and measures its average queue depth based on the queue depth of the FIFO queue.

The second WRED configuration example uses WRED on R3's S0/0 interface again, but this time with DSCP WRED, and a few changes to the defaults. In fact, Example 6-2 just shows the changed configuration, with most of the configuration staying the same. For instance, the same CB marking configuration is used to mark the traffic, so the details are not repeated in the example. The example uses the familiar network diagram that was also used in the preceding example.

Example 6-2 DSCP-Based WRED on R3 S0/0 R3#configure terminal

Enter configuration commands, one per line. End with CNTL/Z. R3(config)#interface serial 0/0 R3(config-if)#random-detect dscp-based R3(config-if)#random-detect dscp af21 50 60 R3(config-if)#random-detect dscp af23 20 30 R3(config-if)#random-detect ?

dscp parameters for each dscp value dscp-based Enable dscp based WRED on an interface exponential-weighting-constant weight for mean queue depth calculation flow enable flow based WRED

prec-based Enable prec based WRED on an interface

Example 6-2 DSCP-Based WRED on R3 S0/0 (Continued)

precedence parameters for each precedence

value

<cr>

R3(config

-if)#random-detect exponential-weighting-constant 5

R3(config

-if)#~Z

R3#show queue serial 0/0

Output queue for Serial0/0 is 37/0

Packet 1,

linktype: ip, length: 64, flags: 0x88

source:

192.168.3.254, destination:

192.168.2

251, id: 0x0545,

ttl: 253,

TOS: 184 prot: 17, source port 1664C

, destination port 17178

data:

0x4100 0x431A 0x0028 0x0000

0x8012 0xAB15 0x21E1

0x71CF 0x05C9 0x03FE 0x7AA3

0x770B 0x2408 0x8264

Packet 2,

linktype: ip, length: 64, flags: 0x88

source:

192.168.3.254, destination:

192.168.2

251, id: 0x053E,

ttl: 253,

TOS: 184 prot: 17, source port 18378

, destination port 17260

data:

0x47CA 0x436C 0x0028 0x0000

0x8012 0x8759 0x4CAB

0x7D04 0x18D1 0x03FE 0xDC15

0x3E4A 0x4E92 0x5447

R3#show queueing interface s 0/0

Interface

Serial0/0 queueing strategy:

random early detection (WRED)

Exp-weight-constant: 5 (1/32)

Mean

queue depth: 38

dscp

Random drop Tail drop

Minimum Maximum Mark

pkts/bytes pkts/bytes

thresh

thresh prob

af11

0/0 0/0

33

40 1/10

af12

0/0 0/0

28

40 1/10

af13

0/0 0/0

24

40 1/10

af21

8/9904 18/21288

50

60 1/10

af22

0/0 0/0

28

40 1/10

af23

13/18252 33/34083

20

30 1/10

af31

0/0 0/0

33

40 1/10

af32

0/0 0/0

28

40 1/10

af33

0/0 0/0

24

40 1/10

af41

0/0 0/0

33

40 1/10

af42

0/0 0/0

28

40 1/10

af43

0/0 0/0

24

40 1/10

cs1

0/0 0/0

22

40 1/10

cs2

0/0 0/0

24

40 1/10

cs3

0/0 0/0

26

40 1/10

cs4

0/0 0/0

28

40 1/10

cs5

0/0 0/0

31

40 1/10

cs6

0/0 0/0

33

40 1/10

cs7

0/0 0/0

35

40 1/10

ef

0/0 0/0

37

40 1/10

rsvp

0/0 0/0

37

40 1/10

default

16/16254 20/23216

20

40 1/10

The configuration begins with a change from precedence-based WRED to DSCP-based WRED using the random-detect dscp-based interface subcommand. The random-detect dscp af21 50 60 changes the default minimum and maximum thresholds for AF21 to 50 and 60, respectively, with the random-detect dscp af23 20 30 changing these same values for AF23. In addition, although Cisco does not recommend changing the exponential weighting constant, the configuration does offer an example of the syntax with the random-detect exponential-weighting-constant 5 command. By setting it to a smaller number than the default (9), WRED will more quickly change the average queue depth calculation, more quickly reacting to changes in the queue depth.

The command output from the various show commands do not differ much compared to when DSCP-based WRED is enabled. The format now includes DSCP values rather than precedence values, as you may notice with the counters that point out drops for both AF21 and AF23, which were previously both treated as precedence 2.

WRED suffers from the lack of concurrent queuing tool support on an interface. However, WRED can be enabled inside a CBWFQ class, operating on the queue for the class, effectively enabling WRED concurrently with CBWFQ. The final WRED example shows a configuration for WRED using LLQ.

The last WRED configuration example repeats base configuration similar to one of the CBWFQ examples from Chapter 4. Voice, HTTP, and FTP traffic compete for the same bandwidth, with WRED applied per-class for the two HTTP classes and one FTP class. Note that because voice traffic is drop sensitive, WRED is not enabled for the low-latency queue. Because WRED can be enabled per class in conjunction with CBWFQ, WRED calculates average queue depth based on the per-class queue.

The criteria for each type of traffic is as follows:

• VoIP payload is marked with DSCP EF using CB marking on ingress to R3 E0/0. On egress of R3's S0/0 interface, DSCP EF traffic is placed in its own queue, without WRED. This class gets 58 kbps.

• Any HTTP traffic whose URL contains the string "important" anywhere in the URL is marked with AF21 using CB marking on ingress to R3 E0/0. On egress of R3's S0/0 interface, DSCP AF21 traffic is placed in its own queue, with WRED. This class gets 20 kbps.

• Any HTTP traffic whose URL contains the string "not-so" anywhere in the URL is marked with AF23 using CB marking on ingress to R3 E0/0. On egress of R3's S0/0 interface, DSCP AF23 traffic is placed in its own queue, with WRED. This class gets 8 kbps.

• All other traffic is marked with DSCP BE using CB marking on ingress to R3 E0/0. On egress of R3's S0/0 interface, DSCP BE traffic is placed in its own queue, with WRED. This class gets 20 kbps.

Example 6-3 lists the configuration and show commands used when WRED is enabled in LLQ classes dscp-af21, dscp-af23, and class-default.

Example 6-3 WRED Used in LLQ Classes dscp-af21, dscp-af23, and class-default

R3#show running-config

Building configuration...

!Portions omitted for brevity ip cef

! The following classes are used in the LLQ configuration applied to S0/0

class-map match-all dscp-ef match ip dscp ef class-map match-all dscp-af21

match ip dscp af21 class-map match-all dscp-af23 match ip dscp af23

! The following classes are used on ingress for CB marking class-map match-all http-impo match protocol http url "*important*" class-map match-all http-not match protocol http url "*not-so*" class-map match-all class-default match any class-map match-all voip-rtp match ip rtp 16384 16383

! Policy-map laundry-list creates CB marking configuration, used on ! ingress on E0/0

policy-map laundry-list class voip-rtp set ip dscp ef class http-impo set ip dscp af21 class http-not set ip dscp af23 class class-default set ip dscp default

Policy-map queue-on-dscp creates LLQ configuration, with WRED inside three classes

Example 6-3 WRED Used in LLQ Classes dscp-af21, dscp-af23, and class-default (Continued)

policy-map queue-on-dscp

class dscp-ef

priority 58

class dscp-af21

bandwidth 20

random-detect dscp

based

class dscp-af23

bandwidth 8

random-detect dscp

based

class class-default

fair-queue

random-detect dscp

based

interface Ethernet0/0 description connected to SW2, where Server1 is connected ip address 192.168.3.253 255.255.255.0 ip nbar protocol-discovery half-duplex service-policy input laundry-list

interface Serial0/0 description connected to FRS port S0. Single PVC to R1. bandwidth 128 no ip address encapsulation frame-relay load-interval 30 max-reserved-bandwidth 85 service-policy output queue-on-dscp clockrate 128000

interface Serial0/0.1 point-to-point description point-point subint global DLCI 103, connected via PVC to DLCI 101 ( R1)

ip address 192.168.2.253 255.255.255.0 frame-relay interface-dlci 101

R3#show policy-map interface serial 0/0

Serial0/0

Service-policy output: queue-on-dscp

Class-map: dscp-ef (match-all) 46437 packets, 2971968 bytes 30 second offered rate 0 bps, drop rate 0 bps Match: ip dscp ef Weighted Fair Queueing Strict Priority

Output Queue: Conversation 264 Bandwidth 58 (kbps) Burst 1450 (Bytes)

Example 6-3 WRED Used in LLQ Classes dscp-af21, dscp-af23, and class-default (Continued)

(pkts matched/bytes matched) 42805/2739520 (total drops/bytes drops) 0/0

Class-map: dscp-af21 (match-all) 2878 packets, 3478830 bytes

30 second offered rate 76000 bps, drop rate 0 bps Match: ip dscp af21 Weighted Fair Queueing

Output Queue: Conversation 266 Bandwidth 20 (kbps)

(pkts matched/bytes matched) 2889/3494718 (depth/total drops/no-buffer drops) 11/26/0 exponential weight: 9 mean queue depth: 5

dscp

Transmitted

Random drop

Tail drop

Minimum

Maximum

Mark

pkts

bytes

pkts/bytes

pkts/bytes

thresh

thresh

prob

af11

0

0

0/0

0/0

32

40

1/10

af12

0

0

0/0

0/0

28

40

1/10

af13

0

0

0/0

0/0

24

40

1/10

af21

2889

3494718

8/9904

18/21288

32

40

1/10

af22

0

0

0/0

0/0

28

40

1/10

af23

0

0

0/0

0/0

24

40

1/10

af31

0

0

0/0

0/0

32

40

1/10

af32

0

0

0/0

0/0

28

40

1/10

af33

0

0

0/0

0/0

24

40

1/10

af41

0

0

0/0

0/0

32

40

1/10

af42

0

0

0/0

0/0

28

40

1/10

af43

0

0

0/0

0/0

24

40

1/10

cs1

0

0

0/0

0/0

22

40

1/10

cs2

0

0

0/0

0/0

24

40

1/10

cs3

0

0

0/0

0/0

26

40

1/10

cs4

0

0

0/0

0/0

28

40

1/10

cs5

0

0

0/0

0/0

30

40

1/10

cs6

0

0

0/0

0/0

32

40

1/10

cs7

0

0

0/0

0/0

34

40

1/10

ef

0

0

0/0

0/0

36

40

1/10

rsvp

0

0

0/0

0/0

36

40

1/10

default

0

0

0/0

0/0

20

40

1/10

Class-map: dscp-af23 (match-all) 1034 packets, 1250984 bytes

30 second offered rate 32000 bps, drop rate 0 bps Match: ip dscp af23 Weighted Fair Queueing

Output Queue: Conversation 267 Bandwidth 8 (kbps)

(pkts matched/bytes matched) 1047/1266140

Example 6-3 WRED Used in LLQ Classes dscp-af21, dscp-af23, and class-default (Continued)

(depth/total drops/no-buffer drops) 11/46/0 exponential weight: 9 mean queue depth: 5

dscp

Transmitted

Random drop

Tail drop

Minimum

Maximum

Mark

pkts/bytes

pkts/bytes

pkts/bytes

thresh

thresh

prob

af11

0/0

0/0

0/0

32

40

1/10

af12

0/0

0/0

0/0

28

40

1/10

af13

0/0

0/0

0/0

24

40

1/10

af21

0/0

0/0

0/0

32

40

1/10

af22

0/0

0/0

0/0

28

40

1/10

af23

1047/1266140

13/18252

33/34083

24

40

1/10

af31

0/0

0/0

0/0

32

40

1/10

af32

0/0

0/0

0/0

28

40

1/10

af33

0/0

0/0

0/0

24

40

1/10

af41

0/0

0/0

0/0

32

40

1/10

af42

0/0

0/0

0/0

28

40

1/10

af43

0/0

0/0

0/0

24

40

1/10

cs1

0/0

0/0

0/0

22

40

1/10

cs2

0/0

0/0

0/0

24

40

1/10

cs3

0/0

0/0

0/0

26

40

1/10

cs4

0/0

0/0

0/0

28

40

1/10

cs5

0/0

0/0

0/0

30

40

1/10

cs6

0/0

0/0

0/0

32

40

1/10

cs7

0/0

0/0

0/0

34

40

1/10

ef

0/0

0/0

0/0

36

40

1/10

rsvp

0/0

0/0

0/0

36

40

1/10

default

0/0

0/0

0/0

20

40

1/10

Class-map: class-default (match-any) 847 packets, 348716 bytes

30 second offered rate 2000 bps, drop rate 0 bps Match: any

Weighted Fair Queueing Flow Based Fair Queueing Maximum Number of Hashed Queues 256 (total queued/total drops/no-buffer drops) 0/0/0 exponential weight: 9

dscp

Transmitted

Random drop

Tail drop

Minimum

Maximum

Mark

pkts/bytes

pkts/bytes

pkts/bytes

thresh

thresh

prob

af11

0/0

0/0

0/0

32

40

1/10

af12

0/0

0/0

0/0

28

40

1/10

af13

0/0

0/0

0/0

24

40

1/10

af21

0/0

0/0

0/0

32

40

1/10

af22

0/0

0/0

0/0

28

40

1/10

af23

0/0

0/0

0/0

24

40

1/10

af31

0/0

0/0

0/0

32

40

1/10

af32

0/0

0/0

0/0

28

40

1/10

af33

0/0

0/0

0/0

24

40

1/10

Example 6-3 WRED Used in LLQ Classes dscp-af21, dscp-af23, and class-default (Continued)

af41

0/0

0/0

0/0

32

40

/10

af42

0/0

0/0

0/0

28

40

/10

af43

0/0

0/0

0/0

24

40

/10

cs1

0/0

0/0

0/0

22

40

/10

cs2

0/0

0/0

0/0

24

40

/10

cs3

0/0

0/0

0/0

26

40

/10

cs4

0/0

0/0

0/0

28

40

/10

cs5

0/0

0/0

0/0

30

40

/10

cs6

0/0

0/0

0/0

32

40

/10

cs7

0/0

0/0

0/0

34

40

/10

ef

0/0

0/0

0/0

36

40

/10

rsvp

0/0

0/0

0/0

36

40

/10

default

59/767

0/0

0/0

20

40

/10

The example lists a large configuration, but only a small amount pertains to WRED. Two sets of class maps have been configured—one set is used by the CB marking policy called laundry-list, and the other set is used by the LLQ policy map called queue-on-dscp. In policy-map queue-on-dscp, inside classes dscp-af21, dscp-af23, and class-default, the random-detect dscp-based command enables WRED. These three random-detect commands are highlighted in the show running-config output in the example.

Also note that WRED is not enabled on interface serial 0/0 in this configuration, because WRED applies to the output queues used by each class. Because WRED is not enabled on the main interface, to see statistics for WRED, you must use the show policy-map interface command. This command in the example lists WRED statistics inside each class in which WRED has been enabled. For the classes in which WRED is not enabled, such as the dscp-ef class, no additional WRED statistical information is listed. The default values for exponential weighting constant, and the per-DSCP defaults for minimum threshold, maximum threshold, and MPD are all listed in the command output.

Advance SEO Techniques

Advance SEO Techniques

Turbocharge Your Traffic And Profits On Auto-Pilot. Would you like to watch visitors flood into your websites by the 1,000s, without expensive advertising or promotions? The fact is, there ARE people with websites doing exactly that right now. How is that possible, you ask? The answer is Advanced SEO Techniques.

Get My Free Ebook


Post a comment