/*
 * FreeBox USB
 * Interface IOCTL pour application "client"
 *
 * Copyright (C) 2004 Freebox http://www.freebox.fr/
 *
 * Mise à jour: 07/10/2004
 * Pondu par TJ
 */
#ifndef __FBXUSB_DEVICE_H
#define __FBXUSB_DEVICE_H


/* -----------------------------------------------------------------------
 * Note spéciale de l'auteur pour le reste du Monde
 * -----------------------------------------------------------------------
 * Sauf véto des génies-teur de la Box, cette interface existera toujours 
 * dans les futures versions du pilote USB.
 * Des nouvelles fonctions seront peut être ajoutées plus tard... mais
 * trés tard.
 * Les structures augmenteront peut être en taille, afin d'y ajouter de
 * nouvelles informations, mais ne dimueront jamais.
 * Quoiqu'il en soit, le pilote retourne des informations dans la
 * limite de la taille des structures passées en paramètre.
 *
 * Le but n'est pas de surcharger le pilote de traitements inutiles, mais
 * de permettre de suivre facilement son comportement dans certaines
 * situations.
 *
 * TJ 07/10/2004
 */


#define FBXUSB_DEVICE_NAME       "FreeBoxUSBNdisDevice"   // le nom


// aligner les structures sur 1 octet
#pragma pack(push,__FBXUSB_DEV_PACK,1)


// ========================================================================

// IOCTL_FBXUSB_GET_DRIVER_INFO
// ---------------------------------------------------
// Information générales sur le pilote et le modem

// "flags" DRIVER_INFO...
#define FBXUSB_IOCTL_DEVINFO_FLAG_32BITS    (0x00000001)    // version 32 bits
#define FBXUSB_IOCTL_DEVINFO_FLAG_64BITS    (0x00000002)    // version 64 bits (?)
#define FBXUSB_IOCTL_DEVINFO_FLAG_NOBLAST   (0x00000004)    // la protection anti-blaster est active
#define FBXUSB_IOCTL_DEVINFO_FLAG_DESCOK    (0x00000008)    // la description est passé avec succés
#define FBXUSB_IOCTL_DEVINFO_FLAG_V4SPEC    (0x00000010)    // support des spec de la V4
#define FBXUSB_IOCTL_DEVINFO_FLAG_BETA      (0x00000020)    // version BETA
#define FBXUSB_IOCTL_DEVINFO_FLAG_DEBUG     (0x00000040)    // version DEBUG

#define FBXUSB_IOCTL_DEVINFO_FLAG_INIT      (0x00010000)    // "init" complet achevé (généralement vrai)
#define FBXUSB_IOCTL_DEVINFO_FLAG_HALT      (0x00020000)    // procédure "halt" en cours.
#define FBXUSB_IOCTL_DEVINFO_FLAG_RESET     (0x00040000)    // MiniportReset
#define FBXUSB_IOCTL_DEVINFO_FLAG_SHUTDOWN  (0x00080000)    // MiniportShutdown


typedef struct
{
  unsigned __int32 version;       // version interne du pilote (4 bytes) [major][minor][subminor][subsubminor]
                                  // (peut etre different de la version "externe")
  unsigned __int32 flags;         // divers drapeaux
  unsigned __int32 fbx_version;   // version du modem FreeBox  (4 bytes) [major][minor][subminor][subsubminor]
                                  // 0 => version indeterminé.
  unsigned __int32 flags_RH1;     // flags interne => evolution trés probable => non documenté
  unsigned __int64 systime;       // SystemTime a l'init du pilote (permet d'identifier un rechargement de pilote)
} FBXUSB_IOCTL_DRIVER_INFO;


// ========================================================================

// IOCTL_FBXUSB_GET_INOUT_INFO
// ---------------------------------------------------
// Etat du pilote dans ses echanges avec le modem
typedef struct
{
  unsigned __int64 rcv_ok;        // nombre de paquets recus avec succès
  unsigned __int64 rcv_err;       // nombre de paquets recus en erreur
  unsigned __int64 rcv_bytes;     // nombre d'octets recus
  unsigned __int64 xmit_ok;       // nombre de paquets envoyés avec succès
  unsigned __int64 xmit_err;      // nombre de paquets envoyés en erreur
  unsigned __int64 xmit_bytes;    // nombre d'octets envoyés
  unsigned __int64 rcv_reset;     // nombre de fois 'reset' sur 'rcv_err'
  unsigned __int64 rcv_noblast;   // nombre de paquets RPC ("blaster") éliminé par le pilote
} FBXUSB_IOCTL_INOUT_INFO;


// ========================================================================

// IOCTL_FBXUSB_GET_IOPOOL_INFO
// ---------------------------------------------------
// Information d'echange du pilote sur lui-même en relation avec le divin
typedef struct
{
  unsigned __int16 xmit_pool_size;
  unsigned __int16 xmit_loop_max;
  unsigned __int16 rcv_pool_size;
  unsigned __int16 linkspeed;           // en Mb/s (10 => 10 Mb/s)
  unsigned char MAC_address[6];
  unsigned __int16 rcv_stack;           // en relation avec 'rcv_pool_size'
  unsigned __int16 rcv_lo_stack;        // idem: le plus bas atteind
  unsigned __int16 xmit_queue;          // queue d'attente d'emission
  unsigned __int16 xmit_hi_queue;       // idem: le plus haut atteind
  unsigned __int16 xmit_loop;           // en relation avec 'xmit_loop_max'
  unsigned __int16 xmit_hi_loop;        // idem: le plus haut atteind
  unsigned __int16 xmit_lcount;         // nombre de boucle d'envoi actuel
  unsigned __int16 xmit_hi_lcount;      // idem: le plus haut atteind
  unsigned __int16 dbg_RX[4];           // DEBUG ONLY
} FBXUSB_IOCTL_IOPOOL_INFO;


// ========================================================================

// les fonctions
// ---------------------------------------------------

#define FILE_DEVICE_FBXUSB        (0x87CB)    // Au hasard: un numéro de "Device Type"
#define FBXUSB_IOCTL_INDEX        (0x810)     // Au hasard: un départ de numéro de "Function Code"

#define IOCTL_FBXUSB_FUNCTION(x)        (CTL_CODE(FILE_DEVICE_FBXUSB,(FBXUSB_IOCTL_INDEX+x),METHOD_BUFFERED,FILE_ANY_ACCESS))

#define IOCTL_FBXUSB_NULL               IOCTL_FBXUSB_FUNCTION(0)  // ne fait rien et renvoi toujours ERREUR
#define IOCTL_FBXUSB_NOP                IOCTL_FBXUSB_FUNCTION(1)  // ne fait rien et renvoi toujours OK
#define IOCTL_FBXUSB_GET_DRIVER_INFO    IOCTL_FBXUSB_FUNCTION(2)
#define IOCTL_FBXUSB_GET_INOUT_INFO     IOCTL_FBXUSB_FUNCTION(3)
#define IOCTL_FBXUSB_GET_IOPOOL_INFO    IOCTL_FBXUSB_FUNCTION(4)


#pragma pack(pop,__FBXUSB_DEV_PACK)


#endif // __FBXUSB_DEVICE_H