Overview
Intelligent Trace Route - trace a path through the network. This applies to SLAX version 1.0 and higher.
Description
ITR logs into each node along the path and report the incoming and outgoing interface information, along with route information. If the $sleep parameter is non-zero, it will sleep for that number of seconds and compare the error counts before and after the sleep.
The ITR provides more information than a standard trace route utility. The ITR script logs into each router node along the path and reports name, software version, serial number, incoming and outgoing interface name, the location where routes were learned, latency values, and error counters. If the $sleep parameter is non-zero, ITR will sleep for that number of seconds and compare error counts before and after the sleep interval.
Set Up
- Copy the script itr.slax to the /var/db/scripts/op directory on the router.
- Enable the script by adding the file statement and script filename to the [edit system scripts op] hierarchy level in the configuration. Only superusers can enable scripts in the configuration:
1 [edit]
2 user@host# set system scripts op file itr.slax
3
4 [edit]
5 user@host# commit
- Set up the ssh-agent:
- Use the traceroute command to determine all of the hops that can be used to reach the remote target.
- Create a user account on each of the router hops by which the remote target can be reached, including the router from which the script will be launched.
- Ensure each router has that user account:
1 user@host# show system login user <username>
2 uid 2000;
3 class super-user;
- Generate the SSH public/private key pair on the machine used to log in to the router, by issuing the ssh-keygen command in the standard command shell. Keep a record of the public/private key pair information that is generated.
(For more information, see the manual page for the ssh-keygen command.)
- Associate the public key with the JUNOS Software login account by including the load-key-file statement at the [edit system login user account-name authentication] hierarchy level on each of the router hops, as shown below. Replace the URL (see EDIT HERE) with the address of the file for the public key that was generated previously. The JUNOS Software copies the contents of the specified file onto the routing platform. This allows the user to access the routing device via ssh without being prompted for a password.
1 [edit system login user account-name authentication]
2 user@host# set load-key-file URL /* Edit Here */
- Run ssh-agent on the computer where you will log in to the router to execute the script:
- Run the ssh agent command from the bash shell:
- Make sure ssh-agent is running:
1 >ps -auwwx | grep ssh-agent
2 user 99086 0.0 0.1 3164 2000 ?? Is 3:23PM 0:00.00
3 ssh-agent -s
- Add identities to ssh-agent:
1 > ssh-add <file_path of the private key generated previously>
NOTE: When asked for a password, use the password given during the key generation.
- Enable ssh forwarding on your desktop by adding the following lines to ~/.ssh/config:
1 Host *
2 ForwardAgent yes
3 ForwardX11 yes
- Log in to the router on which the itr.slax script is enabled, using ssh and the user account created for this setup. The router uses the associated public key to authenticate the user and does not prompt for a password.
How to Run
- Log in to the router on which the itr.slax script is enabled, using ssh and the user account created for the setup. If a password is requested, use the password generated for the public/private key.
- Go to the CLI operational mode and run the script as follows, using the desired target’s IP address:
- The output will be similar to this:
01 user@cli> op itr target 10.4.9.1
02 Intelligent Traceroute for target 10.4.9.1
03
04 (0) dent is a m7i running 9.5I20090421_0255_phil (S/N A9673)
05 Interfaces:
06 out: fe-0/3/0.0 / 10.5.14.1 -> 10.5.14.2 (BGP route 10.4.9.0/24)
07 Latency (ms):
08 out: 1.639 +/- 1.188 (1.076 4.268 0.958 1.455 1.161 0.920 )
09 [dent: sleeping for 5 seconds to get interface statistics for fe-0/3/0.0 ]
10 Errors (deltas over 5 seconds):
11 out: none
12
13 (1) iad is a m7i running 9.5I20090330_0030_danai-20 (S/N 39180)
14 Interfaces:
15 in: fe-0/0/3.0 / 10.5.14.2 -> 10.5.14.1 (Direct route 10.5.14.0/24)
16 out: fe-0/0/2.0 / 10.5.16.1 -> 10.5.16.2 (OSPF route 10.4.9.0/24)
17 Latency (ms):
18 in: 1.341 +/- 0.338 (1.004 1.220 1.753 0.990 1.236 1.847 )
19 out: 1.091 +/- 0.152 (0.977 1.264 1.175 0.963 1.277 0.895 )
20 [iad: sleeping for 5 seconds to get interface statistics for fe-0/0/3.0 fe-0/0/2.0 ]
21 Errors (deltas over 5 seconds):
22 in: none
23 out: none
24
25 (2) rdu is a m7i running 9.5I20090330_0030_danai-20 (S/N A9687)
26 Interfaces:
27 in: fe-0/2/0.0 / 10.5.16.2 -> 10.5.16.1 (Direct route 10.5.16.0/24)
28 out: fe-0/2/2.0 / 10.5.20.1 -> 10.5.20.2 (OSPF route 10.4.9.0/24)
29 Latency (ms):
30 in: 0.925 +/- 0.123 (0.952 0.991 0.795 0.990 1.094 0.733 )
31 out: 1.043 +/- 0.125 (1.054 1.143 1.219 0.957 1.057 0.828 )
32 [rdu: sleeping for 5 seconds to get interface statistics for fe-0/2/0.0 fe-0/2/2.0 ]
33 Errors (deltas over 5 seconds):
34 in: none
35 out: none
36
37 (3) mia is a m20 running 9.5I20090330_0030_danai-20 (S/N 20388)
38 Interfaces:
39 in: fe-2/0/0.0 / 10.5.20.2 -> 10.5.20.1 (Direct route 10.5.20.0/24)
40 out: / -> (Local route 10.4.9.1/32)
41 Latency (ms):
42 in: 1.020 +/- 0.061 (1.100 1.088 0.971 0.984 1.043 0.934 )
43 [mia: sleeping for 5 seconds to get interface statistics for fe-2/0/0.0 ]
44 Errors (deltas over 5 seconds):
45 in: none
46
47 user@cli>
01 user@cli> op itr target 10.4.9.1
02 Intelligent Traceroute for target 10.4.9.1
03
04 (0) dent is a m7i running 9.5I20090421_0255_phil (S/N A9673)
05 Interfaces:
06 out: fe-0/3/0.0 / 10.5.14.1 -> 10.5.14.2 (BGP route 10.4.9.0/24)
07 Latency (ms):
08 out: 1.639 +/- 1.188 (1.076 4.268 0.958 1.455 1.161 0.920 )
09 [dent: sleeping for 5 seconds to get interface statistics for fe-0/3/0.0 ]
10 Errors (deltas over 5 seconds):
11 out: none
12
13 (1) iad is a m7i running 9.5I20090330_0030_danai-20 (S/N 39180)
14 Interfaces:
15 in: fe-0/0/3.0 / 10.5.14.2 -> 10.5.14.1 (Direct route 10.5.14.0/24)
16 out: fe-0/0/2.0 / 10.5.16.1 -> 10.5.16.2 (OSPF route 10.4.9.0/24)
17 Latency (ms):
18 in: 1.341 +/- 0.338 (1.004 1.220 1.753 0.990 1.236 1.847 )
19 out: 1.091 +/- 0.152 (0.977 1.264 1.175 0.963 1.277 0.895 )
20 [iad: sleeping for 5 seconds to get interface statistics for fe-0/0/3.0 fe-0/0/2.0 ]
21 Errors (deltas over 5 seconds):
22 in: none
23 out: none
24
25 (2) rdu is a m7i running 9.5I20090330_0030_danai-20 (S/N A9687)
26 Interfaces:
27 in: fe-0/2/0.0 / 10.5.16.2 -> 10.5.16.1 (Direct route 10.5.16.0/24)
28 out: fe-0/2/2.0 / 10.5.20.1 -> 10.5.20.2 (OSPF route 10.4.9.0/24)
29 Latency (ms):
30 in: 0.925 +/- 0.123 (0.952 0.991 0.795 0.990 1.094 0.733 )
31 out: 1.043 +/- 0.125 (1.054 1.143 1.219 0.957 1.057 0.828 )
32 [rdu: sleeping for 5 seconds to get interface statistics for fe-0/2/0.0 fe-0/2/2.0 ]
33 Errors (deltas over 5 seconds):
34 in: none
35 out: none
36
37 (3) mia is a m20 running 9.5I20090330_0030_danai-20 (S/N 20388)
38 Interfaces:
39 in: fe-2/0/0.0 / 10.5.20.2 -> 10.5.20.1 (Direct route 10.5.20.0/24)
40 out: / -> (Local route 10.4.9.1/32)
41 Latency (ms):
42 in: 1.020 +/- 0.061 (1.100 1.088 0.971 0.984 1.043 0.934 )
43 [mia: sleeping for 5 seconds to get interface statistics for fe-2/0/0.0 ]
44 Errors (deltas over 5 seconds):
45 in: none
46
47 user@cli>
SLAX Script Contents
001 version 1.0;
002
003 ns junos = "http://xml.juniper.net/junos/*/junos";
004 ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
005 ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
006 ns ext = "http://xmlsoft.org/XSLT/namespace";
007 ns exsl = "http://exslt.org/math";
008
009 import "../import/junos.xsl";
010
011 var $arguments = {
012 <argument> {
013 <name> "target";
014 <description> "Target of this traceroute (JUNOS box)";
015 }
016 }
017
018 param $target;
019
020 /*
021 * These options are not available for the command line user.
022 */
023 param $slave; /* In slave mode, we are the remote target */
024 param $previous-address; /* Remote address of the previous hop */
025 param $sleep = 5; /* Time to sleep while gathering errors */
026 param $debug = 0; /* Enable debug output (verbose) */
027 param $delta-limit = 10; /* Change limit to report for error counters */
028 param $table = "inet.0"; /* Routing table name */
029 param $follow = "route"; /* Follow routing information to source */
030 param $name = $hostname; /* Name of the box running the script */
031 param $debug = 0; /* Debug level */
032
033 match / {
034 <op-script-results> {
035 <out> {
036 call main;
037 }
038 }
039 }
040
041 template main
042 {
043 if ($slave) {
044 /*
045 * If we are in "slave" mode, some other device is running
046 * the show. We only want to report our local values and
047 * let them do the real work of following the route.
048 */
049 call slave-mode;
050 } else {
051
052 /*
053 * We are hop number zero, so show some local information
054 * about ourselves.
055 */
056 var $lc = jcs:open();
057
058 var $boxo := { call get-box-info($conn = $lc, $name = $hostname); }
059 var $box = $boxo/node();
060 var $local = $box/next-hop;
061
062 expr jcs:output("Intelligent Traceroute for target ", $target);
063 call handle-box($conn = $lc, $box);
064
065 expr jcs:close($lc);
066
067 if (not($local)) {
068 expr jcs:output("no route to host: ", $target);
069 } else {
070
071 if ($follow == "traceroute") {
072 expr jcs:output("running basic traceroute");
073 var $rpc = <traceroute> {
074 <host> $target;
075 }
076 var $out = jcs:invoke($rpc);
077
078 expr jcs:output("target: ", $out/target-ip);
079 for-each ($out/hop) {
080 var $hop = following-sibling::hop[1];
081 var $next-hop = { call best-address($hop); }
082 call traceroute-test-hop($next-hop,
083 $previous-address = $local/address);
084 }
085 } else {
086 call follow($path = $local, $first-mtu = $local/mtu);
087 }
088 }
089 }
090 }
091
092 template best-address ($hop)
093 {
094 var $first = $hop/probe-result[1];
095 var $target = $first/ip-address;
096 expr $target;
097
098 var $only = {
099 if (count($hop/probe-result) == 1) {
100 expr " (only)";
101 }
102 }
103 expr jcs:progress("Best address is ", $target, $only);
104 }
105
106 template follow ($path, $hop-count = 1, $first-mtu)
107 {
108 var $peer = $path/remote-address;
109 if ($debug > 10) {
110 expr jcs:output("connecting to ", $peer);
111 }
112
113 var $conn = jcs:open($peer);
114 if ($debug > 10) {
115 expr jcs:output("connected to ", $peer, " :: ", $conn);
116 }
117
118 if ($conn) {
119 var $info := {
120 call get-remote-info($conn, $name = $path/remote-address,
121 $hop-count,
122 $previous-address = $path/local-address);
123 }
124 var $box = $info/node();
125
126 if ($debug > 100) {
127 call dump($name = "hop " _ $hop-count, $out = $box);
128 }
129
130 call handle-box($conn, $hop-count, $box, $first-mtu);
131
132 expr jcs:close($conn);
133 if ($debug > 10) {
134 expr jcs:output("connected to ", $peer, " has been closed");
135 }
136
137 var $nh = $box/next-hop;
138 if ($nh/remote-address && $nh/routing-protocol != "Local") {
139 call follow($path = $nh, $first-mtu,
140 $hop-count = $hop-count + 1);
141 }
142
143 } else {
144 expr jcs:output("connection failed for ", $target);
145 }
146 }
147
148 template handle-box ($conn, $hop-count = 0, $box, $first-mtu)
149 {
150 call display-box-info($hop-count, $box);
151
152 if ($box/previous-hop/mtu < $first-mtu
153 || $box/next-hop/mtu < $first-mtu) {
154
155 expr jcs:output(" MTU:");
156 if ($box/previous-hop/mtu < $first-mtu) {
157 expr jcs:output(" in: MTU is too low (",
158 $box/previous-hop/mtu, " .vs. ", $first-mtu, ")");
159 }
160 if ($box/next-hop/mtu < $first-mtu) {
161 expr jcs:output(" out: MTU is too low (",
162 $box/next-hop/mtu, " .vs. ", $first-mtu, ")");
163 }
164 }
165
166 call traceroute($conn, $box);
167 if ($sleep > 0) {
168 call sleep-test($conn, $box, $sleep);
169 }
170 }
171
172 template traceroute-test-hop ($next-hop, $previous-address)
173 {
174 expr jcs:output("hop ", ttl-value);
175 for-each (probe-result[ip-address]) {
176 expr jcs:output(" #", probe-index, ": ", ip-address);
177 }
178
179 var $first = probe-result[1];
180 var $peer = { call best-address($hop = .); }
181
182 if (count(probe-result) != count(probe-result[ip-address == $peer])) {
183 expr jcs:output(" Inconsistent path; using ", $peer,
184 " (", count(probe-result[ip-address != $peer]), " other)");
185 }
186
187 expr jcs:output("connecting to ", $peer);
188 var $conn = jcs:open($peer);
189 expr jcs:output("connected to ", $peer, " :: ", $conn);
190
191 if ($conn) {
192 var $info := {
193 call get-remote-info($conn, $name = $peer, $previous-address);
194 }
195
196 var $out = jcs:printf(" %s %s(S/N %s) %s [%s] via %s: drop: %s",
197 $peer, $info/model, $info/serial-number,
198 $next-hop, $info/routing-protocol,
199 $info/interface, $info/drops);
200 expr jcs:output($out);
201
202 expr jcs:close($conn);
203
204 } else {
205 expr jcs:output("connection failed for ", $peer);
206 }
207 }
208
209 /*@@
210 * Try to invoke this op script on the remote side; if it works, great.
211 * Otherwise, do it the slow way.
212 */
213 template get-remote-info ($conn, $name, $next-hop,
214 $previous-address)
215 {
216 var $rpc = <op-script> {
217 <script> "itr";
218 <slave> "yes";
219 <target> $target;
220 <name> $name;
221 if ($next-hop) {
222 <next-hop> $next-hop;
223 }
224 if ($previous-address) {
225 <previous-address> $previous-address;
226 }
227 }
228 var $out = jcs:execute($conn, $rpc);
229
230 if (name($out) == "op-script-results") {
231 copy-of $out/ *;
232 } else {
233 call get-box-info($conn, $name, $next-hop,
234 $previous-address);
235 }
236 }
237
238 template slave-mode
239 {
240 var $conn = jcs:open(); /* no args means localhost */
241
242 call get-box-info($conn, $name, $previous-address);
243 }
244
245 template get-box-info ($conn, $name, $previous-address, $sleep = $sleep)
246 {
247 var $swrpc = <get-software-information>;
248 var $swout = jcs:execute($conn, $swrpc);
249 var $host-name = jcs:first-of($swout/host-name, $name);
250
251 var $chrpc = <get-chassis-inventory>;
252 var $chout = jcs:execute($conn, $chrpc);
253
254 /*
255 * Retrieve per-hop information, including model and serial number.
256 */
257 <box-info> {
258 <name> $host-name;
259 <version> {
260 call get-sw-version($swout);
261 }
262 <model> $swout/product-model;
263 <serial-number> $chout/chassis[1]/serial-number;
264
265 var $data := {
266 call get-both-hops($conn, $target, $previous-address);
267 }
268
269 copy-of $data;
270 }
271 }
272
273 /*
274 * We use jroute's version info, since that's the one that's
275 * likely to matter the most.
276 */
277 template get-sw-version ($swout)
278 {
279 var $jroute = $swout/package-information[name == "jroute"]/comment;
280 var $s1 = substring-after($jroute, "[");
281 var $s2 = substring-before($s1, "]");
282 expr jcs:first-of($s2, $jroute, "unknown");
283 }
284
285 template sleep-test ($conn, $box, $sleep)
286 {
287 var $before := { call get-both-counters($conn, $box); }
288 var $devnames = {
289 for-each ($box/ * /interface) {
290 expr . _ " ";
291 }
292 }
293 if ($debug > 100) {
294 call dump($name = "sleep-test", $out = $before);
295 }
296
297 expr jcs:output(" [", $box/name, ": sleeping for ",
298 $sleep, " seconds ",
299 "to get interface statistics for ",
300 $devnames, "]");
301 expr jcs:sleep($sleep);
302
303 var $after := { call get-both-counters($conn, $box); }
304
305 if ($box/previous-hop || $box/next-hop) {
306 expr jcs:output(" Errors (deltas over ", $sleep, " seconds):");
307 }
308
309 if ($box/previous-hop) {
310 call display-sleep($conn, $box, $before, $after,
311 $name = "previous-hop", $tag = "in");
312 }
313 if ($box/next-hop/routing-protocol != "Local") {
314 call display-sleep($conn, $box, $before, $after,
315 $name = "next-hop", $tag = "out");
316 }
317 }
318
319 template display-sleep ($conn, $box, $name, $before, $after, $tag)
320 {
321 var $bef = $before/node();
322 var $aft = $after/node();
323
324 if ($bef) {
325 var $bd := {
326 call get-delta($before = $bef, $after = $aft);
327 }
328 if ($debug > 100 ) { call dump($name = "bd", $out = $bd); }
329
330 if ($bd/node()) {
331 var $errors = {
332 for-each ($bd/node()/node()) {
333 expr name() _ ": " _ . _ ", ";
334 }
335 }
336 expr jcs:output(" ", $tag, ": ",
337 substring($errors, 1, string-length($errors) - 2));
338 } else {
339 expr jcs:output(" ", $tag, ": none");
340 }
341 }
342 }
343
344 template get-both-hops ($conn, $previous-address, $target = $target)
345 {
346 if ($previous-address) {
347 <previous-hop> {
348 call get-one-hop($conn, $hop = $previous-address);
349 }
350 }
351
352 <next-hop> {
353 call get-one-hop($conn, $hop = $target);
354 }
355 }
356
357 template get-one-hop ($conn, $hop)
358 {
359 <hop> $hop;
360
361 var $route-rpc = <get-route-information> {
362 <destination> $hop;
363 <table> $table;
364 }
365 var $route = jcs:execute($conn, $route-rpc);
366
367 if ($debug > 100) {
368 call dump($name = "get-one-hop: " _ $hop, $out = $route);
369 }
370
371 var $rt = $route/route-table/rt/rt-entry[active-tag == "*"];
372 var $nh = $rt/nh[selected-next-hop];
373 var $ifname = {
374 if ($nh/via) {
375 expr $nh/via;
376 } else if ($nh/nh-local-interface) {
377 expr $nh/nh-local-interface;
378 }
379 }
380
381 <routing-protocol> $rt/protocol-name;
382
383 <route> $rt/../rt-destination;
384 <remote-address> {
385 if ($nh/to) {
386 expr $nh/to;
387 } else if ($rt/protocol-name == "Direct") {
388 expr $hop;
389 }
390 }
391
392 <interface> $ifname;
393
394 var $devname = substring-before($ifname, ".");
395
396 var $if-rpc = <get-interface-information> {
397 <interface-name> $devname;
398 <extensive>;
399 }
400 var $ifo = jcs:execute($conn, $if-rpc);
401
402 var $counters = $ifo/physical-interface/queue-counters;
403 <drops> sum($counters/queue/queue-counters-red-packets);
404
405 if ($ifname) {
406 if ($debug > 20) {
407 expr jcs:output("Outgoing interface name for ", $hop,
408 " is ", $ifname);
409 }
410
411 var $irpc = <get-interface-information> {
412 <interface-name> $ifname;
413 }
414 var $if = jcs:execute($conn, $irpc);
415
416 var $li = $if/logical-interface;
417
418 var $af = $li/address-family[address-family-name == "inet"];
419 var $addr = $af/interface-address[ifa-flags/ifaf-current-primary];
420
421 <mtu> $af/mtu;
422
423 if ($debug > 20) {
424 expr jcs:output("Outgoing address for ", $ifname,
425 " is ", $addr/ifa-local);
426 if ($debug > 100) {
427 call dump($name = "if", $out = $if);
428 }
429 }
430
431 <local-address> $addr/ifa-local;
432 }
433 }
434
435 template get-both-counters ($conn, $box)
436 {
437 if ($box/previous-hop) {
438 <previous-hop> {
439 call get-hop-counters($conn,
440 $interface = $box/previous-hop/interface);
441 }
442 }
443 if ($box/next-hop/routing-protocol != "Local") {
444 <next-hop> {
445 call get-hop-counters($conn,
446 $interface = $box/next-hop/interface);
447 }
448 }
449 }
450
451 template get-hop-counters ($conn, $interface)
452 {
453 <interface> $interface;
454
455 var $devname = substring-before($interface, ".");
456
457 var $if-rpc = <get-interface-information> {
458 <interface-name> $devname;
459 <extensive>;
460 }
461 var $if = jcs:execute($conn, $if-rpc);
462
463 copy-of $if/node();
464 }
465
466 template get-delta ($before, $after)
467 {
468 /* Get the deltas for error counts */
469 var $result := { call get-deltas($if = $before, $if2 = $after); }
470
471 if ($debug > 100) {
472 call dump($name = "get-delta", $out = $result);
473 }
474
475 if ($result/node()) {
476 <error-deltas> { copy-of $result; }
477 }
478 }
479
480 template get-deltas ($if, $if2)
481 {
482 var $ife = $if/physical-interface;
483 var $ife2 = $if2/physical-interface;
484
485 call delta($name = "input-errors",
486 $prev = $ife/input-error-list/input-errors,
487 $cur = $ife2/input-error-list/input-errors);
488 call delta($name = "input-drops",
489 $prev = $ife/input-error-list/input-drops,
490 $cur = $ife2/input-error-list/input-drops);
491 call delta($name = "framing-errors",
492 $prev = $ife/input-error-list/framing-errors,
493 $cur = $ife2/input-error-list/framing-errors);
494 call delta($name = "input-runts",
495 $prev = $ife/input-error-list/input-runts,
496 $cur = $ife2/input-error-list/input-runts);
497 call delta($name = "input-discards",
498 $prev = $ife/input-error-list/input-discards,
499 $cur = $ife2/input-error-list/input-discards);
500 call delta($name = "input-l3-incompletes",
501 $prev = $ife/input-error-list/input-l3-incompletes,
502 $cur = $ife2/input-error-list/input-l3-incompletes);
503 call delta($name = "input-l2-channel-errors",
504 $prev = $ife/input-error-list/input-l2-channel-errors,
505 $cur = $ife2/input-error-list/input-l2-channel-errors);
506 call delta($name = "input-l2-mismatch-timeouts",
507 $prev = $ife/input-error-list/input-l2-mismatch-timeouts,
508 $cur = $ife2/input-error-list/input-l2-mismatch-timeouts);
509 call delta($name = "input-fifo-errors",
510 $prev = $ife/input-error-list/input-fifo-errors,
511 $cur = $ife2/input-error-list/input-fifo-errors);
512 call delta($name = "input-resource-errors",
513 $prev = $ife/input-error-list/input-resource-errors,
514 $cur = $ife2/input-error-list/input-resource-errors);
515
516 call delta($name = "carrier-transitions",
517 $prev = $ife/output-error-list/carrier-transitions,
518 $cur = $ife2/output-error-list/carrier-transitions);
519 call delta($name = "output-errors",
520 $prev = $ife/output-error-list/output-errors,
521 $cur = $ife2/output-error-list/output-errors);
522 call delta($name = "output-collisions",
523 $prev = $ife/output-error-list/output-collisions,
524 $cur = $ife2/output-error-list/output-collisions);
525 call delta($name = "output-drops",
526 $prev = $ife/output-error-list/output-drops,
527 $cur = $ife2/output-error-list/output-drops);
528 call delta($name = "aged-packets",
529 $prev = $ife/output-error-list/aged-packets,
530 $cur = $ife2/output-error-list/aged-packets);
531 call delta($name = "mtu-errors",
532 $prev = $ife/output-error-list/mtu-errors,
533 $cur = $ife2/output-error-list/mtu-errors);
534 call delta($name = "hs-link-crc-errors",
535 $prev = $ife/output-error-list/hs-link-crc-errors,
536 $cur = $ife2/output-error-list/hs-link-crc-errors);
537 call delta($name = "output-fifo-errors",
538 $prev = $ife/output-error-list/output-fifo-errors,
539 $cur = $ife2/output-error-list/output-fifo-errors);
540 call delta($name = "output-resource-errors",
541 $prev = $ife/output-error-list/output-resource-errors,
542 $cur = $ife2/output-error-list/output-resource-errors);
543
544 call delta($name = "mac-input-crc-errors",
545 $prev = $ife/ethernet-mac-statistics/input-crc-errors,
546 $cur = $ife2/ethernet-mac-statistics/input-crc-errors);
547 call delta($name = "mac-output-crc-errors",
548 $prev = $ife/ethernet-mac-statistics/output-crc-errors,
549 $cur = $ife2/ethernet-mac-statistics/output-crc-errors);
550 call delta($name = "mac-input-fifo-errors",
551 $prev = $ife/ethernet-mac-statistics/input-fifo-errors,
552 $cur = $ife2/ethernet-mac-statistics/input-fifo-errors);
553 call delta($name = "mac-output-fifo-errors",
554 $prev = $ife/ethernet-mac-statistics/output-fifo-errors,
555 $cur = $ife2/ethernet-mac-statistics/output-fifo-errors);
556 call delta($name = "mac-input-code-violations",
557 $prev = $ife/ethernet-mac-statistics/input-code-violations,
558 $cur = $ife2/ethernet-mac-statistics/input-code-violations);
559 }
560
561 /*@@
562 * Short name because of the endless invocations
563 *