summaryrefslogtreecommitdiff
path: root/agent/mibgroup/disman/ping/pingCtlTable.h
blob: ca69d137c6f3e6e5f757ba5f8443edd7b838a7ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
/*
 *Copyright(c)2004,Cisco URP imburses and Network Information Center in Beijing University of Posts and Telecommunications researches.
 *
 *All right reserved
 *
 *File Name:pingCtlTable.h
 *File Description:The head file of pingCtlTable.c
 *
 *Current Version:1.0
 *Author:ChenJing
 *Date:2004.8.20
 */


#ifndef PINGCTLTABLE_H
#define PINGCTLTABLE_H

#include	<sys/types.h>   /* basic system data types */
#include	<sys/socket.h>  /* basic socket definitions */
#include	<sys/time.h>    /* timeval{} for select() */
#include	<time.h>        /* timespec{} for pselect() */
#include	<netinet/in.h>  /* sockaddr_in{} and other Internet defns */
#include	<arpa/inet.h>   /* inet(3) functions */
#include	<errno.h>
#include	<fcntl.h>       /* for nonblocking */
#include	<netdb.h>
#include	<signal.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<sys/stat.h>    /* for S_xxx file mode constants */
#include	<sys/uio.h>     /* for iovec{} and readv/writev */
#include	<unistd.h>
#include	<sys/wait.h>
#include	<sys/un.h>      /* for Unix domain sockets */
#include <netdb.h>
#include <pthread.h>

#ifdef	HAVE_SYS_SELECT_H
# include	<sys/select.h>  /* for convenience */
#endif

#ifdef	HAVE_POLL_H
# include	<poll.h>        /* for convenience */
#endif

#ifdef	HAVE_STRINGS_H
# include	<strings.h>     /* for convenience */
#endif

/*
 * Three headers are normally needed for socket/file ioctl's:
 * * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
 */
#ifdef	HAVE_SYS_IOCTL_H
# include	<sys/ioctl.h>
#endif
#ifdef	HAVE_SYS_FILIO_H
# include	<sys/filio.h>
#endif
#ifdef	HAVE_SYS_SOCKIO_H
# include	<sys/sockio.h>
#endif

#ifdef	HAVE_PTHREAD_H
# include	<pthread.h>
#endif

#ifdef	HAVE_SOCKADDR_DL_STRUCT
# include	<net/if_dl.h>
#endif

#include	<netinet/in_systm.h>
#include	<netinet/ip.h>
#include	<netinet/ip_icmp.h>

#define	BUFSIZE		1500

/*
 * ipv6 include   
 */
#include <sys/param.h>
#include <linux/sockios.h>
#include <sys/file.h>
#include <sys/signal.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/poll.h>
#include <linux/types.h>
#include <ctype.h>
#include <linux/errqueue.h>

#include <sched.h>

#include <netinet/ip6.h>
#include <netinet/icmp6.h>


/*
 * ipv4 include 
 */

#include	<netinet/in_systm.h>
#include	<netinet/ip.h>

#include	<netinet/ip_icmp.h>
#include	<netinet/in.h>  /* sockaddr_in{} and other Internet defns */


config_require(header_complex);

struct pingCtlTable_data {
    char           *pingCtlOwnerIndex;  /* string */
    size_t          pingCtlOwnerIndexLen;

    char           *pingCtlTestName;    /* string */
    size_t          pingCtlTestNameLen;

    long            pingCtlTargetAddressType;   /* integer32 */

    char           *pingCtlTargetAddress;       /* string */
    size_t          pingCtlTargetAddressLen;

    unsigned long   pingCtlDataSize;
    unsigned long   pingCtlTimeOut;
    unsigned long   pingCtlProbeCount;
    long            pingCtlAdminStatus;
    char           *pingCtlDataFill;
    size_t          pingCtlDataFillLen;

    unsigned long   pingCtlFrequency;
    unsigned long   pingCtlMaxRows;
    long            pingCtlStorageType;

    char           *pingCtlTrapGeneration;
    size_t          pingCtlTrapGenerationLen;
    unsigned long   pingCtlTrapProbeFailureFilter;
    unsigned long   pingCtlTrapTestFailureFilter;
    oid            *pingCtlType;
    size_t          pingCtlTypeLen;

    char           *pingCtlDescr;
    size_t          pingCtlDescrLen;
    long            pingCtlSourceAddressType;
    char           *pingCtlSourceAddress;
    size_t          pingCtlSourceAddressLen;
    long            pingCtlIfIndex;
    long            pingCtlByPassRouteTable;
    unsigned long   pingCtlDSField;
    long            pingCtlRowStatus;

    int             storageType;
    u_long          timer_id;
    unsigned long   pingProbeHistoryMaxIndex;

    struct pingResultsTable_data *pingResults;
    struct pingProbeHistoryTable_data *pingProbeHis;

};

struct pingResultsTable_data {
    char           *pingCtlOwnerIndex;  /* string */
    size_t          pingCtlOwnerIndexLen;
    char           *pingCtlTestName;    /* string */
    size_t          pingCtlTestNameLen;

    long            pingResultsOperStatus;
    long            pingResultsIpTargetAddressType;
    char           *pingResultsIpTargetAddress;
    size_t          pingResultsIpTargetAddressLen;
    unsigned long   pingResultsMinRtt;
    unsigned long   pingResultsMaxRtt;
    unsigned long   pingResultsAverageRtt;
    unsigned long   pingResultsProbeResponses;
    unsigned long   pingResultsSendProbes;
    unsigned long   pingResultsRttSumOfSquares;
    u_char         *pingResultsLastGoodProbe;
    size_t          pingResultsLastGoodProbeLen;
    time_t          pingResultsLastGoodProbe_time;

    int             storageType;

};

struct pingProbeHistoryTable_data {
    struct pingProbeHistoryTable_data *next;
    char           *pingCtlOwnerIndex;  /* string */
    size_t          pingCtlOwnerIndexLen;
    char           *pingCtlTestName;    /* string */
    size_t          pingCtlTestNameLen;

    unsigned long   pingProbeHistoryIndex;
    unsigned long   pingProbeHistoryResponse;
    long            pingProbeHistoryStatus;
    long            pingProbeHistoryLastRC;
    u_char         *pingProbeHistoryTime;
    size_t          pingProbeHistoryTimeLen;
    time_t          pingProbeHistoryTime_time;

    int             storageType;

};


/*
 * function declarations 
 */
void            init_pingCtlTable(void);
void            shutdown_pingCtlTable(void);
FindVarMethod   var_pingCtlTable;
void            parse_pingCtlTable(const char *, char *);
SNMPCallback    store_pingCtlTable;


WriteMethod     write_pingCtlTargetAddressType;
WriteMethod     write_pingCtlTargetAddress;
WriteMethod     write_pingCtlDataSize;
WriteMethod     write_pingCtlTimeOut;
WriteMethod     write_pingCtlProbeCount;
WriteMethod     write_pingCtlAdminStatus;
WriteMethod     write_pingCtlDataFill;
WriteMethod     write_pingCtlFrequency;
WriteMethod     write_pingCtlMaxRows;
WriteMethod     write_pingCtlStorageType;
WriteMethod     write_pingCtlTrapGeneration;
WriteMethod     write_pingCtlTrapProbeFailureFilter;
WriteMethod     write_pingCtlTrapTestFailureFilter;
WriteMethod     write_pingCtlType;
WriteMethod     write_pingCtlDescr;
WriteMethod     write_pingCtlSourceAddressType;
WriteMethod     write_pingCtlSourceAddress;
WriteMethod     write_pingCtlIfIndex;
WriteMethod     write_pingCtlByPassRouteTable;
WriteMethod     write_pingCtlDSField;

WriteMethod     write_pingCtlRowStatus;



#define PINGTRAPGENERATION_PROBEFAILED                 	0x80
#define PINGTRAPGENERATION_TESTFAILED                  	0x40
#define PINGTRAPGENERATION_TESTCOMPLETED          	0x20
#define PINGTRAPGENERATION_NULL					0x00

/*
 * column number definitions for table pingCtlTable 
 */
#define COLUMN_PINGCTLOWNERINDEX		1
#define COLUMN_PINGCTLTESTNAME		2
#define COLUMN_PINGCTLTARGETADDRESSTYPE		3
#define COLUMN_PINGCTLTARGETADDRESS		4
#define COLUMN_PINGCTLDATASIZE		5
#define COLUMN_PINGCTLTIMEOUT		6
#define COLUMN_PINGCTLPROBECOUNT		7
#define COLUMN_PINGCTLADMINSTATUS		8
#define COLUMN_PINGCTLDATAFILL		9
#define COLUMN_PINGCTLFREQUENCY		10
#define COLUMN_PINGCTLMAXROWS		11
#define COLUMN_PINGCTLSTORAGETYPE		12
#define COLUMN_PINGCTLTRAPGENERATION		13
#define COLUMN_PINGCTLTRAPPROBEFAILUREFILTER		14
#define COLUMN_PINGCTLTRAPTESTFAILUREFILTER		15
#define COLUMN_PINGCTLTYPE		16
#define COLUMN_PINGCTLDESCR		17
#define COLUMN_PINGCTLSOURCEADDRESSTYPE		18
#define COLUMN_PINGCTLSOURCEADDRESS		19
#define COLUMN_PINGCTLIFINDEX		20
#define COLUMN_PINGCTLBYPASSROUTETABLE		21
#define COLUMN_PINGCTLDSFIELD		22
#define COLUMN_PINGCTLROWSTATUS		23


/*
 * ipv4 function  
 */
int             proc_v4(char *, ssize_t, struct timeval *, time_t,
                        struct pingCtlTable_data *, struct addrinfo *, int,
                        unsigned long *, unsigned long *, unsigned long *,
                        unsigned long *, unsigned long, int, int, int,
                        struct pingProbeHistoryTable_data *, pid_t);
void            send_v4(int, pid_t, int, int, char *);
void            readloop(struct pingCtlTable_data *, struct addrinfo *,
                         int, unsigned long *, unsigned long *,
                         unsigned long *, pid_t);
void            sig_alrm(int);
void            tv_sub(struct timeval *, struct timeval *);
unsigned long   round_double(double);
struct proto {
    int             (*fproc) (char *, ssize_t, struct timeval *, time_t,
                              struct pingCtlTable_data *,
                              struct addrinfo *, int, unsigned long *,
                              unsigned long *, unsigned long *,
                              unsigned long *, unsigned long, int, int,
                              int, struct pingProbeHistoryTable_data *,
                              pid_t);
    void            (*fsend) (int, pid_t, int, int, char *);
    struct sockaddr *sasend;    /* sockaddr{} for send, from getaddrinfo */
    struct sockaddr *sarecv;    /* sockaddr{} for receiving */
    socklen_t       salen;      /* length of sockaddr{}s */
    int             icmpproto;  /* IPPROTO_xxx value for ICMP */
}              *pr;


/*
 * ipv6 function 
 */

#define BIT_CLEAR(nr, addr) do { ((__u32 *)(addr))[(nr) >> 5] &= ~(1U << ((nr) & 31)); } while(0)
#define BIT_SET(nr, addr) do { ((__u32 *)(addr))[(nr) >> 5] |= (1U << ((nr) & 31)); } while(0)
#define BIT_TEST(nr, addr) do { (__u32 *)(addr))[(nr) >> 5] & (1U << ((nr) & 31)); } while(0)

#define ICMPV6_FILTER_WILLPASS(type, filterp) \
	(BIT_TEST((type), filterp) == 0)

#define ICMPV6_FILTER_WILLBLOCK(type, filterp) \
	BIT_TEST((type), filterp)

#define ICMPV6_FILTER_SETPASS(type, filterp) \
	BIT_CLEAR((type), filterp)

#define ICMPV6_FILTER_SETBLOCK(type, filterp) \
	BIT_SET((type), filterp)

#define ICMPV6_FILTER_SETPASSALL(filterp) \
	memset(filterp, 0, sizeof(struct icmp6_filter));

#define ICMPV6_FILTER_SETBLOCKALL(filterp) \
	memset(filterp, 0xFF, sizeof(struct icmp6_filter));


#define	MAX_PACKET	128000  /* max packet size */

#ifdef SO_TIMESTAMP
#define HAVE_SIN6_SCOPEID 1
#endif



#define	MAX_DUP_CHK	0x10000
char            rcvd_tbl[MAX_DUP_CHK / 8];

volatile int    exiting;
volatile int    status_snapshot;

#ifndef MSG_CONFIRM
#define MSG_CONFIRM 0
#endif

#define	DEFDATALEN	(64 - 8)        /* default data length */

#define	MAXWAIT		10      /* max seconds to wait for response */
#define MININTERVAL	10      /* Minimal interpacket gap */
#define MINUSERINTERVAL	200     /* Minimal allowed interval for non-root */

#define SCHINT(a)	(((a) <= MININTERVAL) ? MININTERVAL : (a))

#define	A(bit)		rcvd_tbl[(bit)>>3]      /* identify byte in array */
#define	B(bit)		(1 << ((bit) & 0x07))   /* identify bit in byte */
#define	SET(bit)	(A(bit) |= B(bit))
#define	CLR(bit)	(A(bit) &= (~B(bit)))
#define	TST(bit)	(A(bit) & B(bit))

/*
 * various options 
 */
#define	F_FLOOD		0x001
#define	F_INTERVAL	0x002
#define	F_NUMERIC	0x004
#define	F_PINGFILLED	0x008
#define	F_QUIET		0x010
#define	F_RROUTE	0x020
#define	F_SO_DEBUG	0x040
#define	F_SO_DONTROUTE	0x080
#define	F_VERBOSE	0x100
#define	F_TIMESTAMP	0x200
#define	F_FLOWINFO	0x200
#define	F_SOURCEROUTE	0x400
#define	F_TCLASS	0x400
#define	F_FLOOD_POLL	0x800
#define	F_LATENCY	0x1000
#define	F_AUDIBLE	0x2000
#define	F_ADAPTIVE	0x4000

/*
 * multicast options 
 */
#define MULTICAST_NOLOOP	0x001
#define MULTICAST_TTL		0x002
#define MULTICAST_IF		0x004

int             __schedule_exit(int, long *, long *);
int             pinger(int, int, int, char *, struct sockaddr_in6 *, int *,
                       int, int, int, int, int, char *, int *, int *,
                       int *, int *, __u16 *, long *, long *, long *,
                       long *, int *, int *, int *, struct timeval *);
void            sock_setbufs(int, int, int);
void            setup(int, int, int, int, int, int, int, char *, int *,
                      struct timeval *, int *, int *);
void            main_loop(struct pingCtlTable_data *, int, int, __u8 *,
                          int, int, char *, struct sockaddr_in6 *, int,
                          int, char *, int, int, int, int, char *, int *,
                          struct timeval *, int *, int *);
int             gather_statistics(int *, struct pingCtlTable_data *,
                                  __u8 *, int, __u16, int, int,
                                  struct timeval *, time_t, int *, int,
                                  int, char *, int, int, int, char *,
                                  int *, __u16 *, long *, long *, long *,
                                  long *, long *, long *, long long *,
                                  long long *, int *, int *, int *,
                                  struct pingProbeHistoryTable_data *);
void            finish(int, char *, int, int, int *, struct timeval *,
                       int *, long *, long *, long *, long *, long *,
                       long *, long *, long *, long long *, long long *,
                       int *, struct timeval *);
void            status(int, int *, long *, long *, long *, long *, long *,
                       long long *, long long *);
size_t          inet6_srcrt_space(int, int);
struct cmsghdr *inet6_srcrt_init(void *, int);
int             inet6_srcrt_add(struct cmsghdr *, const struct in6_addr *);
int             receive_error_msg(int, struct sockaddr_in6 *, int, int *,
                                  long *);
int             send_v6(int, int, char *, struct sockaddr_in6 *, int, int,
                        char *, int *, long *, int *);
int             parse_reply(int *, struct pingCtlTable_data *,
                            struct msghdr *, int, void *, struct timeval *,
                            time_t, int, struct sockaddr_in6 *, int *, int,
                            int, int, int, int, char *, int *, int *,
                            __u16 *, long *, long *, long *, long *,
                            long *, long *, long *, long long *,
                            long long *, int *, int *, int *,
                            struct pingProbeHistoryTable_data *);
void            install_filter(int, int *);

#endif
/*
 * PINGCTLTABLE_H 
 */