Imported Debian patch 5.1-8
[debian/gcpegg] / global.h
1 /* PROGRAM:     eggsh
2  * FILE:        $Header: /home/egg/src/RCS/global.h,v 1.5 1999/02/28 20:10:29 ghn Exp $
3  * PURPOSE:     Declare global types, constants, and variables
4  * AUTHOR:      Greg Nelson
5  * DATE:        98-04-12
6  *
7  * REVISED:
8  * $Log: global.h,v $
9  * Revision 1.5  1999/02/28 20:10:29  ghn
10  * Version 5.1: Added netmask field for egg.
11  *
12  * Revision 1.4  1998/12/31 22:11:05  ghn
13  *  Rev 5 code: includes multi-reg support, HTML, etc.
14  *
15  * Revision 1.3  1998/08/01 18:51:25  ghn
16  * Added John's byte-order-independence changes.
17  *
18  * Revision 1.2  1998/08/01 17:08:20  ghn
19  * Added upcmd and dncmd for DND.
20  *
21  * Revision 1.1  1998/07/21 11:37:56  ghn
22  * Initial revision
23  *
24  * Copyright 1998 - Greg Nelson
25  * Redistributable under the terms of the GNU Public Licence (GPL)
26  */
27
28 #ifndef _GLOBAL_H
29
30 #include <netinet/in.h>
31
32 #include "byteorder.h"          /* Build byte-order independent version */
33
34 /* Good for i386, but be careful... */
35 #ifdef linux
36 #include <sys/types.h>
37 typedef __u8  byte;
38 typedef __u8  uint8;
39 typedef __u16 uint16;
40 typedef __u32 uint32;
41 typedef __s8  int8;
42 typedef __s16 int16;
43 typedef __s32 int32;
44 #else
45 typedef unsigned char byte;
46 typedef unsigned char uint8;
47 typedef unsigned short uint16;
48 typedef unsigned long uint32;
49 typedef char int8;
50 typedef short int16;
51 typedef long int32;
52 #endif  /* linux */
53
54 /* Some fixed assumptions:
55    Trial type is always bitsum.
56    Bit spacing method does not need to be communicated, since we'll
57      choose something at compile time. 
58    Record size ranges from one to MAXSAMP_REC trials, which are assumed to
59      be evenly spaced starting at timestamp.
60    Records always begin on round seconds divisible by sec_rec, which
61      can range from one to MAXSEC_REC.
62 */
63
64 /* Some adjustable assumptions: */
65
66 #define MINBITS         32      /* Minimum bits per trial */
67 #define MAXBITS         253     /* Maximum bits per trial */
68 #define MAXSAMP_REC     10      /* Maximum samples/record */
69 #define MAXSEC_REC      3000    /* Maximum seconds/record */    
70
71 #define SEC_PKT         60      /* Desired number of seconds per packet */
72 #define MAXREC_PKT      60      /* Maximum number of records per packet
73                                    For 1-second records (typ) this is 1 min */
74
75 #define EGG_MISSING_DATA 254    /* Value used to represent missing data in trials array. */
76
77 #if MAXBITS < 256
78 typedef uint8 trial;
79 #else
80 #error "Can't represent MAXBITS in a byte value."
81 #endif
82
83 #if MAXBITS >= EGG_MISSING_DATA
84 #error "MAXBITS is >= EGG_MISSING_DATA: ambiguous trial data possible."
85 #endif
86
87 typedef struct eggrec {
88   uint32 timestamp;     /* Seconds since the epoch (19700101000000Z) */
89   trial trials[MAXSAMP_REC]; /* Trial values */
90 } EggRec;               /* Normally 16 bytes total */
91
92 /* Make sure type field of packet is non-zero so that CRC works. */
93
94 typedef struct genpacket {
95   uint16 type;
96   uint16 pktsize;
97 } GenPacket;
98
99 #define DATA_PACKET     0x0101
100 typedef struct eggheader {
101   uint16 type;          /* type */
102   uint16 pktsize;       /* Number of bytes in packet */
103   uint16 eggid;         /* Identifying number for device */
104   uint16 samp_rec;      /* Number of samples per record */
105   uint16 sec_rec;       /* Number of seconds per record */
106   uint16 rec_pkt;       /* Number of records per packet */
107   trial trialsz;        /* Number of bits per trial */
108   uint16 numrec;        /* Number of valid records */
109 } EggHeader;
110
111 #define REQ_PACKET      0x0202
112 typedef struct reqpacket {
113   uint16 type;          /* type */
114   uint16 pktsize;       /* Number of bytes in packet */
115   uint16 eggid;         /* Identifying number for device */
116   uint32 starttm;       /* Time for first record to send */
117   uint16 cksum;         /* No data, checksum goes inside */
118 } ReqPacket;
119
120 #define AWAKE_PACKET    0x0303
121 typedef struct awakepacket {
122   uint16 type;          /* type */
123   uint16 pktsize;       /* Number of bytes in packet */
124   uint16 eggid;         /* Identifying number for device */
125   uint32 nowtm;         /* Egg's identification of "now" (zulu) */
126   uint16 cksum;         /* No data, checksum goes inside */
127 } AwakePacket;
128
129 #define SETTINGS_PACKET 0x0404
130 typedef struct setpacket {
131   uint16 type;          /* type */
132   uint16 pktsize;       /* Number of bytes in packet */
133   uint16 eggid;         /* Identifying number for device */
134   uint32 nowtm;         /* Egg's identification of "now" (zulu) */
135   uint16 samp_rec;      /* Number of samples per record */
136   uint16 sec_rec;       /* Number of seconds per record */
137   uint16 rec_pkt;       /* Number of records per packet */
138   trial trialsz;        /* Number of bits per trial */
139   uint16 cksum;         /* No data, checksum goes inside */
140 } SettingsPacket;
141
142 /*  An EggCarton is the in-memory representation of a data
143     packet.  Fields in it are thus in host byte order,
144     being translated, as appropriate, when transferred
145     to and from a DATA_PACKET by Packetize() and
146     Unpacketize().  */
147
148 typedef struct eggpkt {
149   EggHeader hdr;        /* Header (type = DATA_PACKET) */
150   EggRec records[MAXREC_PKT];
151 } EggCarton;
152
153 typedef struct collect {
154   EggHeader opts;
155   EggRec data;
156   uint16 sampct;                /* Count of completed samples in rec */
157   int32 dd;                     /* Device handle */
158 } CollectRecord;
159
160 #define CONN_PERM       0
161 #define CONN_DND        1
162
163 typedef struct eggentry {
164   char *name;
165   int16 id;
166   struct sockaddr_in ipaddr;
167   int16 netmask;        /* Number of significant bits, default 32. */
168   char *primbasket;
169   int16 conntype;
170   int16 connival;       /* Connect interval in minutes */
171   int32 lastupd;        /* Zulutime of last update received */
172   int16 setup;          /* Does setup match config file? */
173   char *upcmd;          /* Command to bring net up (req if conntype == DND) */
174   char *dncmd;          /* Command to bring net down */
175   char *url;            /* URL describing basket or NULL */
176 } EggEntry;
177
178 typedef struct basketentry {
179   char *name;
180   struct sockaddr_in ipaddr;
181 } BasketEntry;
182
183 #define MAX_EGGS        100
184 #define MAX_BASKETS     5
185
186 extern EggEntry eggtable[MAX_EGGS];
187 extern BasketEntry baskettable[MAX_BASKETS];
188 extern short numeggs, numbaskets;
189 extern EggHeader protocol;
190
191 extern char *pgmname;   /* For error messages to announce program name */
192
193 #define TRUE    -1
194 #define FALSE   0
195
196 #define _GLOBAL_H
197 #endif /* _GLOBAL_H */