/* wscontrol.h
 *
 * This header file includes #defines, structure and type definitions,
 * and function declarations that support the implementation of the
 * (undocumented) Winsock 1 call WsControl.
 *
 * The functionality of WsControl was created by observing its behaviour
 * in Windows 98, so there are likely to be bugs with the assumptions
 * that were made.
 *
 * Copyright 2000 James Hatheway
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef WSCONTROL_H_INCLUDED
#define WSCONTROL_H_INCLUDED

typedef unsigned char uchar; /* This doesn't seem to be in any standard headers */

#define WSCTL_SUCCESS        0
#define PROCFS_NETDEV_FILE   "/proc/net/dev" /* Points to the file in the /proc fs
                                                that lists the network devices.
                                                Do we need an #ifdef LINUX for this? */
#define PROCFS_ROUTE_FILE    "/proc/net/route" /* Points to the file in the /proc fs
						  that contains the routing table */
#define WSCNTL_COUNT_INTERFACES	1
#define WSCNTL_COUNT_ROUTES	2

/* struct contains a routing table entry */
typedef struct wscntl_routeentry
{
    unsigned long wre_intf;
    unsigned long wre_dest;
    unsigned long wre_gw;
    unsigned long wre_mask;
    unsigned long wre_metric;
} wscntl_routeentry;

/* WsControl Helper Functions */
int WSCNTL_GetEntryCount(const int); /* Obtains the number of network interfaces/routes */
int WSCNTL_GetInterfaceName(int, char *); /* Obtains the name of an interface */
int WSCNTL_GetTransRecvStat(int intNumber, unsigned long *transBytes,
       	unsigned long *recvBytes); /* Obtains bytes recv'd/trans by interface */
int WSCNTL_GetRouteTable(int numRoutes, wscntl_routeentry *routeTable); /* get the routing for the interface intf */

/*
 *      TCP/IP action codes.
 */
#define WSCNTL_TCPIP_QUERY_INFO             0x00000000
#define WSCNTL_TCPIP_SET_INFO               0x00000001
#define WSCNTL_TCPIP_ICMP_ECHO              0x00000002
#define WSCNTL_TCPIP_TEST                   0x00000003


/* Structure of an entity ID */
typedef struct TDIEntityID
{
   unsigned long tei_entity;
   unsigned long tei_instance;
} TDIEntityID;

/* Structure of an object ID */
typedef struct TDIObjectID
{
   TDIEntityID   toi_entity;
   unsigned long toi_class;
   unsigned long toi_type;
   unsigned long toi_id;
} TDIObjectID;

typedef struct IPSNMPInfo
{
   unsigned long  ipsi_forwarding;
   unsigned long  ipsi_defaultttl;
   unsigned long  ipsi_inreceives;
   unsigned long  ipsi_inhdrerrors;
   unsigned long  ipsi_inaddrerrors;
   unsigned long  ipsi_forwdatagrams;
   unsigned long  ipsi_inunknownprotos;
   unsigned long  ipsi_indiscards;
   unsigned long  ipsi_indelivers;
   unsigned long  ipsi_outrequests;
   unsigned long  ipsi_routingdiscards;
   unsigned long  ipsi_outdiscards;
   unsigned long  ipsi_outnoroutes;
   unsigned long  ipsi_reasmtimeout;
   unsigned long  ipsi_reasmreqds;
   unsigned long  ipsi_reasmoks;
   unsigned long  ipsi_reasmfails;
   unsigned long  ipsi_fragoks;
   unsigned long  ipsi_fragfails;
   unsigned long  ipsi_fragcreates;
   unsigned long  ipsi_numif;
   unsigned long  ipsi_numaddr;
   unsigned long  ipsi_numroutes;
} IPSNMPInfo;

typedef struct IPAddrEntry
{
   unsigned long  iae_addr;
   unsigned long  iae_index;
   unsigned long  iae_mask;
   unsigned long  iae_bcastaddr;
   unsigned long  iae_reasmsize;
   ushort         iae_context;
   ushort         iae_pad;
} IPAddrEntry;

#ifdef __NetBSD__
#undef if_type
#undef if_mtu
#undef if_lastchange
#endif

#define	MAX_PHYSADDR_SIZE    8
#define	MAX_IFDESCR_LEN      256
typedef struct IFEntry
{
   unsigned long if_index;
   unsigned long if_type;
   unsigned long if_mtu;
   unsigned long if_speed;
   unsigned long if_physaddrlen;
   uchar         if_physaddr[MAX_PHYSADDR_SIZE];
   unsigned long if_adminstatus;
   unsigned long if_operstatus;
   unsigned long if_lastchange;
   unsigned long if_inoctets;
   unsigned long if_inucastpkts;
   unsigned long if_innucastpkts;
   unsigned long if_indiscards;
   unsigned long if_inerrors;
   unsigned long if_inunknownprotos;
   unsigned long if_outoctets;
   unsigned long if_outucastpkts;
   unsigned long if_outnucastpkts;
   unsigned long if_outdiscards;
   unsigned long if_outerrors;
   unsigned long if_outqlen;
   unsigned long if_descrlen;
   uchar         if_descr[1];
} IFEntry;


/* FIXME: real name and definition of this struct that contains
 * an IP route table entry is unknown */
typedef struct IPRouteEntry {
   unsigned long ire_addr;
   unsigned long ire_index;  /*matches if_index in IFEntry and iae_index in IPAddrEntry */
   unsigned long ire_metric;
   unsigned long ire_option4;
   unsigned long ire_option5;
   unsigned long ire_option6;
   unsigned long ire_gw;
   unsigned long ire_option8;
   unsigned long ire_option9;
   unsigned long ire_option10;
   unsigned long ire_mask;
   unsigned long ire_option12;
} IPRouteEntry;


/* Not sure what EXACTLY most of this stuff does.
   WsControl was implemented mainly by observing
   its behaviour in Win98 ************************/
#define	INFO_CLASS_GENERIC         0x100
#define	INFO_CLASS_PROTOCOL        0x200
#define	INFO_TYPE_PROVIDER         0x100
#define	ENTITY_LIST_ID             0
#define	CL_NL_ENTITY               0x301
#define	IF_ENTITY                  0x200
#define	ENTITY_TYPE_ID             1
#define	IP_MIB_ADDRTABLE_ENTRY_ID  0x102
#define	IP_MIB_ROUTETABLE_ENTRY_ID 0x101	/* FIXME: not real name */
/************************************************/

/* Valid values to get back from entity type ID query */
#define	CO_TL_NBF   0x400    /* Entity implements NBF prot. */
#define	CO_TL_SPX   0x402    /* Entity implements SPX prot. */
#define	CO_TL_TCP   0x404    /* Entity implements TCP prot. */
#define	CO_TL_SPP   0x406    /* Entity implements SPP prot. */
#define	CL_TL_NBF   0x401    /* CL NBF protocol */
#define	CL_TL_UDP   0x403    /* Entity implements UDP */
#define	ER_ICMP     0x380    /* The ICMP protocol */
#define	CL_NL_IPX   0x301    /* Entity implements IPX */
#define	CL_NL_IP    0x303    /* Entity implements IP */
#define	AT_ARP      0x280    /* Entity implements ARP */
#define	AT_NULL     0x282    /* Entity does no address */
#define	IF_GENERIC  0x200    /* Generic interface */
#define	IF_MIB      0x202    /* Supports MIB-2 interface */


#endif /* WSCONTROL_H_INCLUDED */
