%externalpredicatespec FS lookup(%string(31) what, %integername value)

%include "INet:Dump.Inc"

%constinteger ether trace slots = 127;  ! 2^n - 1
%constinteger ether trace bytes = 96
%recordformat ether trace fm(%integer inout, bytes,
                             %bytearray data(1 : ether trace bytes))
%recordformat ether trace buffer fm(%integer next,
                                    %record(ether trace fm)%array t(0 : ether trace slots))
%constinteger trace in = 0
%constinteger trace out = 1

%begin
   %record(ether trace buffer fm)%name etb
   %record(ether trace fm)%name e
   %string(127) file
   %integer i, n
      %if FS lookup("ETHER_TRACE_BUFFER", i) %start
         etb == record(i)
      %else
         printstring("No ether trace buffer");  newline
         %stop
      %finish
      file = CLI param
      file = ":T" %if file = ""
      open output(3, file);  select output(3)
      %for i = etb_next, 1, etb_next + ether trace slots + 1 %cycle
         e == etb_t(i & ether trace slots)
         %if e_bytes # 0 %start
            write(e_bytes, 0)
            %if e_inout = trace in %then printstring(" in") %c
                                   %else printstring(" out")
            newline
            n = e_bytes;  n = ether trace bytes %if n > ether trace bytes
            dump(e_data(1), n)
         %finish
      %repeat
      close output;  select output(0)
%end %of %program