blob: ca69d137c6f3e6e5f757ba5f8443edd7b838a7ae [file] [log] [blame]
/*
*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
*/