summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fm/modules/common/ext-event-transport/fmevt.h
blob: c8074002c676970f00e19f14061266862650b6f5 (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
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _FMEVT_H
#define	_FMEVT_H

/*
 * ext-event-transport module - implementation detail.
 */

#ifdef __cplusplus
extern "C" {
#endif

#include <libnvpair.h>
#include <fm/fmd_api.h>
#include <fm/libfmevent.h>
#include <sys/fm/protocol.h>

#include "../../../../../lib/fm/libfmevent/common/fmev_channels.h"

extern fmd_hdl_t *fmevt_hdl;
extern const fmd_prop_t fmevt_props[];

extern void fmevt_init_outbound(fmd_hdl_t *);
extern void fmevt_fini_outbound(fmd_hdl_t *);

extern void fmevt_init_inbound(fmd_hdl_t *);
extern void fmevt_fini_inbound(fmd_hdl_t *);

extern void fmevt_recv(fmd_hdl_t *, fmd_event_t *, nvlist_t *, const char *);


/*
 * Post-processing
 */

/*
 * Structure passed to a post-processing functions with details of the
 * raw event.
 */
struct fmevt_ppargs {
	const char *pp_rawclass;	/* class from event publication */
	const char *pp_rawsubclass;	/* subclass from event publication */
	hrtime_t pp_hrt;		/* hrtime of event publication */
	int pp_user;			/* userland or kernel source? */
	int pp_priv;			/* privileged? */
	fmev_pri_t pp_pri;		/* published priority */
	char pp_uuidstr[36 + 1];	/* uuid we'll use for first event */
};

/*
 * The maximum length that a protocol event class name generated
 * in post-processing can be.
 */
#define	FMEVT_MAX_CLASS		64

/*
 * A post-processing function may derive up to this number of separate
 * protocol events for each raw event.
 */
#define	FMEVT_FANOUT_MAX	5

/*
 * Post-processing function type.  The function receives raw event
 * details in the struct fmevt_ppargs.  It must prepare up to
 * FMEVT_FANOUT_MAX protocol events (usually just one event)
 * based on the raw event, and return the number of events
 * to be posted.  The array of class pointers must have that
 * number of non-NULL entries.  You may return 0 to ditch an event;
 * in this case the caller will not perform an frees so you must
 * tidy up.
 *
 * The array of string pointers has the first member pointed to
 * some storage of size FMEV_MAX_CLASS into which the post-processing
 * function must render the protocol event classname.  If fanning
 * out into more than one event then the post-processing function
 * must allocate additional buffers (using fmd_hdl_alloc) and return
 * pointers to these in the array of string pointers (but do not change
 * the first element); buffers allocated and returned in this way will
 * be freed by the caller as it iterates over the protocol events to
 * post them.  Similarly the function must prepare an attributes
 * nvlist for each event; it can return the raw attributes or it
 * can fmd_nvl_alloc or fmd_nvl_dup and return those (to be freed
 * by the caller).
 *
 * Events will be generated based on the results as follows:
 *
 * event[i] =
 *
 *	timestamp = as supplied by incoming event and in pp_hrt
 *	class = class_array[i];  entry 0 is allocated, fmd_hdl_alloc others
 *	detector = generated detector as passed to function
 *	uuid = generated UUID, or that supplied by raw event
 *	attr = nvlist_array[i], can be absent; may return raw attributes
 *
 */
typedef uint_t fmevt_pp_func_t(
    char *[FMEVT_FANOUT_MAX],		/* event class(es) */
    nvlist_t *[FMEVT_FANOUT_MAX],	/* event attributes */
    const char *,			/* ruleset */
    const nvlist_t *,			/* detector */
    nvlist_t *,				/* raw attributes */
    const struct fmevt_ppargs *);	/* more raw event info */

extern fmevt_pp_func_t fmevt_pp_on_ereport;
extern fmevt_pp_func_t fmevt_pp_smf;
extern fmevt_pp_func_t fmevt_pp_on_sunos;
extern fmevt_pp_func_t fmevt_pp_on_private;
extern fmevt_pp_func_t fmevt_pp_unregistered;

#ifdef __cplusplus
}
#endif

#endif /* _FMEVT_H */