(* ------------------------------------------------------------------------
  :Module.        SANA2.MOD
  :Contents.      Amiga Oberon interface module to SANA-II network drivers
  :Author.        Stefan Hellwig
  :Address.       Oberer Kirchweg 12, 3501 Schauenburg 1, Germany
  :EMail.         Z-Netz : STEFAN_HELLWIG@URANUS.ZER
  :EMail.         UseNet : stefan_hellwig@uranus.osgo.ks.he.schule.de
  :History.       V1.00 10-Mar-92
  :Copyright.     Written 1993 by Stefan Hellwig and freely distributable.
  :Language.      Oberon-2
  :Translator.    AMIGA OBERON v3.00d
  :Remark.        AmigaOS 2.04 and above only !
  ------------------------------------------------------------------------ *)

MODULE Sana2;

IMPORT
   BT:= BasicTypes,
   E := Exec,
   T := Timer,
   U := Utility;

(*
**      Filename: devices/sana2.h
**      Revision: 1.11
**      Date: 92/11/10 13:35:29
**
**      Structure definitions for SANA-II devices.
**
**      (C) Copyright 1991 Commodore-Amiga Inc.
**              All Rights Reserved
*)

CONST
   maxAddrBits  * = 128;
   maxAddrBytes * = (maxAddrBits+7) DIV 8;

TYPE
   Sana2ReqPtr * = UNTRACED POINTER TO Sana2Req;
   Sana2Req * = STRUCT (ioReq * : E.IORequest)
        wireError * : LONGINT;        (* wire TYPE specific error     *)
        packetType* : LONGINT;        (* packet TYPE                  *)
        srcAddr   * : ARRAY maxAddrBytes OF E.BYTE;    (* source addr *)
        dstAddr   * : ARRAY maxAddrBytes OF E.BYTE;    (* dest addr   *)
        dataLength* : LONGINT;        (* length of packet data        *)
        data      * : E.APTR;         (* packet data                  *)
        statData  * : E.APTR;         (* statistics data pointer      *)
        bufferManagement * : E.APTR;  (* see SANA-II OpenDevice adoc  *)
   END;

(*
** defines for the io_Flags field
*)

CONST
   rawB * = 7;                     (* raw packet IO requested      *)
   raw  * = SHORTSET{rawB};

   bCastB * = 6;                   (* broadcast packet (received)  *)
   bCast  * = SHORTSET{bCastB};

   mCastB * = 5;                   (* multicast packet (received)  *)
   mCast  * = SHORTSET{mCastB};

   quickB * = E.quick;             (* quick IO requested (0)       *)
   quick  * = SHORTSET{quickB};

(*
** defines for OpenDevice() flags
*)

   mineB * = 0;                    (* exclusive access requested   *)
   mine  * = LONGSET{mineB};

   promB * = 1;                    (* promiscuous mode requested   *)
   prom  * = LONGSET{promB};

(*
** defines for OpenDevice() tags
*)

   dummy = U.user + 0B0000H;

   copyToBuff   * = dummy + 1;
   copyFromBuff * = dummy + 2;

TYPE

   (*
    ** Copy procedure definition (Added by Implementor)
    ** Same for CopyFromBuff and CopyToBuff
    *)

   copyProc * = PROCEDURE(to{10}  :BT.ANY;
                          from{11}:BT.ANY;
                          n{0}    :LONGINT):BOOLEAN;

   (*
    ** Device query data structure
    *)

   DeviceQueryPtr * = UNTRACED POINTER TO DeviceQuery;
   DeviceQuery * = STRUCT
   (*
   ** Standard information
   *)
        sizeAvailable * : LONGINT;      (* bytes available              *)
        sizeSupplied  * : LONGINT;      (* bytes supplied               *)
        devQueryFormat* : LONGINT;      (* this is type 0               *)
        deviceLevel   * : LONGINT;      (* this document is level 0     *)
   (*
   ** Common information
   *)
        addrFieldSize * : INTEGER;      (* address size in bits         *)
        mtu           * : LONGINT;      (* maximum packet data size     *)
        bps           * : LONGINT;      (* line rate (bits/sec)         *)
        hardwareType  * : LONGINT;      (* what the wire is             *)
   (*
   ** Format specific information
   *)
   END;

CONST

(*
** defined Hardware types
**
**  If your hardware type isn't listed below contact CATS to get a new
**  type number added for your hardware.
*)
   ethernet   * = 1;
   ieee802    * = 6;
   arcnet     * = 7;
   localTalk  * = 11;
   dyLAN      * = 12;

   amokNet    * = 200;

   ppp        * = 253;
   slip       * = 254;
   cSlip      * = 255;

TYPE

   PacketTypeStatsPtr * = UNTRACED POINTER TO PacketTypeStats;
   PacketTypeStats * = STRUCT
        packetsSent    * : LONGINT;     (* transmitted count            *)
        packetsReceived* : LONGINT;     (* received count               *)
        bytesSent      * : LONGINT;     (* bytes transmitted count      *)
        bytesReceived  * : LONGINT;     (* bytes received count         *)
        packetsDropped * : LONGINT;     (* packets dropped count        *)
   END;

   SpecialStatRecordPtr * = UNTRACED POINTER TO SpecialStatRecord;
   SpecialStatRecord * = STRUCT
        type * : LONGINT;               (* statistic identifier         *)
        count *: LONGINT;               (* the statistic                *)
        string*: UNTRACED POINTER TO ARRAY OF CHAR; (* statistic name   *)
   END;


   SpecialStatHeaderPtr * = UNTRACED POINTER TO SpecialStatHeader;
   SpecialStatHeader * = STRUCT
        recordCountMax      * :LONGINT; (* room available               *)
        recordCountSupplied * :LONGINT; (* number supplied              *)
        (* struct Sana2SpecialStatRecord[RecordCountMax]; *)
   END;

   DeviceStatsPtr * = UNTRACED POINTER TO DeviceStats;
   DeviceStats * = STRUCT
        packetsReceived * : LONGINT;    (* received count               *)
        packetsSent     * : LONGINT;    (* transmitted count            *)
        badData         * : LONGINT;    (* bad packets received         *)
        overruns        * : LONGINT;    (* hardware miss count          *)
        unused          * : LONGINT;    (* Unused field                 *)
        unknownTypesReceived * : LONGINT; (* orphan count               *)
        reconfigurations* : LONGINT;    (* network reconfigurations     *)
        lastStart       * : T.TimeVal;  (* time of last online          *)
   END;

(*
** Device Commands
*)

CONST

   start              * = E.nonStd;

   query              * = start + 0;
   getStationAddress  * = start + 1;
   configInterface    * = start + 2;
   addMulticastAddress* = start + 5;
   delMulticastAddress* = start + 6;
   multicast          * = start + 7;
   broadcast          * = start + 8;
   trackType          * = start + 9;
   untrackType        * = start +10;
   getTypeStats       * = start +11;
   getSpecialStats    * = start +12;
   getGlobalStats     * = start +13;
   onEvent            * = start +14;
   readOrphan         * = start +15;
   online             * = start +16;
   offline            * = start +17;

   end                * = start +18;

(*
** defined errors for io_Error  (see also <exec/errors.h>)
*)

   errNoError         * = 0;            (* peachy-keen                  *)
   errNoResources     * = 1;            (* resource allocation failure  *)
   errBadArgument     * = 3;            (* garbage somewhere            *)
   errbadState        * = 4;            (* inappropriate state          *)
   errBadAddress      * = 5;            (* who?                         *)
   errMTUExeeded      * = 6;            (* too much to chew             *)
   errNotSupported    * = 8;            (* hardware can't support cmd   *)
   errSoftware        * = 9;            (* software error detected      *)
   errOutOfService    * = 10;           (* driver is OFFLINE            *)

(*
** From <exec/errors.h>
**
**      IOERR_OPENFAIL   (-1) * device/unit failed to open *
**      IOERR_ABORTED    (-2) * request terminated early [after AbortIO()] *
**      IOERR_NOCMD      (-3) * command not supported by device *
**      IOERR_BADLENGTH  (-4) * not a valid length (usually IO_LENGTH) *
**      IOERR_BADADDRESS (-5) * invalid address (misaligned or bad range) *
**      IOERR_UNITBUSY   (-6) * device opens ok, but requested unit is busy *
**      IOERR_SELFTEST   (-7) * hardware failed self-test *
*)

(*
** defined errors for ios2_WireError
*)

   wErrGenericError   * = 0;            (* no specific info available   *)
   wErrNotConfigured  * = 1;            (* unit not configured          *)
   wErrUnitOnline     * = 2;            (* unit is currently online     *)
   wErrUnitOffline    * = 3;            (* unit is currently offline    *)
   wErrAlreadyTracked * = 4;            (* protocol already tracked     *)
   wErrNotTracked     * = 5;            (* protocol not tracked         *)
   wErrBuffError      * = 6;            (* buff mgt func returned error *)
   wErrSrcAddress     * = 7;            (* source address problem       *)
   wErrDstAddress     * = 8;            (* destination address problem  *)
   wErrBadBroadcast   * = 9;            (* broadcast address problem    *)
   wErrBadMulticast   * = 10;           (* multicast address problem    *)
   wErrMulticastFull  * = 11;           (* multicast address list full  *)
   wErrBadEvent       * = 12;           (* unsupported event class      *)
   wErrBadStatData    * = 13;           (* statdata failed sanity check *)
   wErrIsConfigured   * = 15;           (* attempt to config twice      *)
   wErrNullPointer    * = 16;           (* null pointer detected        *)


(*
** defined events
*)

   eventError         * = LONGSET{0};   (* error catch all              *)
   eventTX            * = LONGSET{1};   (* transmitter error catch all  *)
   eventRX            * = LONGSET{2};   (* receiver error catch all     *)
   eventOnline        * = LONGSET{3};   (* unit is in service           *)
   eventOffline       * = LONGSET{4};   (* unit is not in service       *)
   eventBuff          * = LONGSET{5};   (* buff mgt function error      *)
   eventHardware      * = LONGSET{6};   (* hardware error catch all     *)
   eventSoftware      * = LONGSET{7};   (* software error catch all     *)

END Sana2.
