Blogs

Scripting How-To: Trace a path through the network

By Erdem posted 08-10-2015 10:17

  

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


  1. Copy the script itr.slax to the /var/db/scripts/op directory on the router.
  2. 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
  3. Set up the ssh-agent:
    1. Use the traceroute command to determine all of the hops that can be used to reach the remote target.
    2. 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.
    3. Ensure each router has that user account:

      1	user@host# show system login user <username>
      2	uid 2000;
      3	class super-user;
  4. 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.)
  5. 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 */
  6. Run ssh-agent on the computer where you will log in to the router to execute the script:
    1. Run the ssh agent command from the bash shell:

      1	>eval `ssh-agent -s
    2. 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
  7. 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.
  8. Enable ssh forwarding on your desktop by adding the following lines to ~/.ssh/config:

    1	Host *
    2	ForwardAgent yes
    3	ForwardX11 yes
  9. 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


  1. 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.
  2. Go to the CLI operational mode and run the script as follows, using the desired target’s IP address:
  3. 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> 

Example Output

 

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 &colon;= {
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	 * 

#IntelligentTraceRoute
#ScriptingHow-To
#How-To
#Slax
#opscript