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
|
/*
* 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 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* This file include definition of message passed from hook provider
* to hook consumer. If necessary, each hook provider can add its
* own message definition here.
*/
#ifndef _SYS_HOOK_EVENT_H
#define _SYS_HOOK_EVENT_H
#include <sys/neti.h>
#include <sys/hook.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* The hook_pkt_event_t structure is supplied with packet events on
* associated network interfaces.
*
* The members of this structure are defined as follows:
* hpe_protocol - protocol identifier that indicates which protocol the
* header data is associated with.
* hpe_ifp - "in" interface for packets coming into the system or forwarded
* hpe_ofp - "out" interface for packets being transmitted or forwarded
* hpe_hdr - pointer to protocol header within the packet
* hpe_mp - pointer to the mblk pointer starting the chain for this packet
* hpe_mb - pointer to the mblk that contains hpe_hdr
*/
typedef struct hook_pkt_event {
net_handle_t hpe_protocol;
phy_if_t hpe_ifp;
phy_if_t hpe_ofp;
void *hpe_hdr;
mblk_t **hpe_mp;
mblk_t *hpe_mb;
int hpe_flags;
void *hpe_reserved[2];
} hook_pkt_event_t;
#define HPE_MULTICAST 0x01
#define HPE_BROADCAST 0x02
/*
* NIC events hook provider
*/
typedef enum nic_event {
NE_PLUMB = 1,
NE_UNPLUMB,
NE_UP,
NE_DOWN,
NE_ADDRESS_CHANGE,
NE_LIF_UP,
NE_LIF_DOWN,
NE_IFINDEX_CHANGE
} nic_event_t;
typedef void *nic_event_data_t;
/*
* The hook_nic_event data structure is provided with all network interface
* events.
*
* hne_protocol- network protocol for events, returned from net_lookup
* hne_nic - physical interface associated with event
* hne_lif - logical interface (if any) associated with event
* hne_event - type of event occuring
* hne_data - pointer to extra data about event or NULL if none
* hne_datalen - size of data pointed to by hne_data (can be 0)
*/
typedef struct hook_nic_event {
net_handle_t hne_protocol;
phy_if_t hne_nic;
lif_if_t hne_lif;
nic_event_t hne_event;
nic_event_data_t hne_data;
size_t hne_datalen;
} hook_nic_event_t;
/*
* This structure is used internally by ip to queue events.
*/
struct hook_nic_event_int {
netstackid_t hnei_stackid;
hook_nic_event_t hnei_event;
};
typedef struct hook_nic_event_int hook_nic_event_int_t;
/*
* This structure holds the data passed back from the ip module to
* observability consumers.
*
* Externally exposed fields, that must match the order and size of
* dl_ipnetinfo_t in <sys/dlpi.h> are:
* hpo_version Version number for this header
* hpo_family Address family of the attached packet
* hpo_htype IPobs hook type
* hpo_pktlen Length of the attached packet
* hpo_ifindex Interface index that the packet was received/sent over.
* For local packets, this is the index of the interface
* associated with the local destination address.
* hpo_grifindex IPMP group interface index (zero unless ihd_ifindex
* is an IPMP underlying interface).
* hpo_zsrc Source zoneid; set to ALL_ZONES when unknown.
* hpo_zdst Destination zoneid; set to ALL_ZONES when unknown.
*
* Fields used internally are:
* hpo_pkt Pointer to the mblk_t containig this structure with
* the real packet found at b_cont
*/
typedef struct hook_pkt_observe_s {
uint8_t hpo_version;
uint8_t hpo_family;
uint16_t hpo_htype;
uint32_t hpo_pktlen;
uint32_t hpo_ifindex;
uint32_t hpo_grifindex;
uint32_t hpo_zsrc;
uint32_t hpo_zdst;
/*
* Fields used internally are below.
*/
mblk_t *hpo_pkt;
void *hpo_ctx;
} hook_pkt_observe_t;
/*
* ipobs_hooktype_t describes the hook types supported
* by the ip module. IPOBS_HOOK_LOCAL refers to packets
* which are looped back internally within the ip module.
*/
typedef enum ipobs_hook_type {
IPOBS_HOOK_INBOUND = 0,
IPOBS_HOOK_OUTBOUND = 1,
IPOBS_HOOK_LOCAL = 2
} ipobs_hook_type_t;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_HOOK_EVENT_H */
|