1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 *
21 */
22
23/*
24 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28/*
29 * HISTORY
30 * 5-28-96      Jerry Yeung     Three phase set protocol(ThreePhase)
31 */
32
33#ifndef _SESSION_H_
34#define _SESSION_H_
35
36#pragma ident	"%Z%%M%	%I%	%E% SMI"
37
38typedef enum _Phase { PHASE_1=1, PHASE_2, PHASE_3} Phase;
39
40
41/***** GLOBAL CONSTANTS *****/
42
43/* states of a request */
44#define REQUEST_STARTED		1
45#define REQUEST_COMPLETED	2
46
47
48/***** GLOBAL TYPES *****/
49
50typedef struct _Agent_List {
51	struct _Agent_List	*next;
52	struct _Agent		*agent;
53} Agent_List;
54
55
56typedef struct _Request {
57	struct _Request *next_request;
58
59	struct _Session *session;
60	struct _Subtree *subtree;	/* associated subtree */
61	Agent_List *visited_agent_list; /* list of the agents visited so far */
62
63	u_long		request_id;
64
65	SNMP_pdu	*pdu;		/* SNMP request */
66
67	u_long		flags;		/* cf below */
68
69	int		state;		/* STARTED or COMPLETED */
70	SNMP_pdu	*response;	/* response of the agent to the pdu */
71
72	struct timeval  time;		/* time when the pdu was sent */
73	struct timeval  expire;		/* time when the Request will timeout */
74} Request;
75
76
77typedef struct _Session {
78	struct _Session	*next_session;
79
80	u_long		session_id;
81
82	Address		address;	/* the address of the SNMP application */
83
84	SNMP_pdu	*pdu;		/* the "original" SNMP request */
85
86	int		n_variables;	/* number of variables in the	*/
87					/* "original" SNMP request	*/
88
89	u_long		o_flags;	/* cf below */
90	u_long		i_flags;	/* cf below */
91
92	struct _Request *first_request; /* the request list of the session */
93
94} Session;
95
96/* Three Phase */
97typedef struct _Three_Phase {
98        SNMP_pdu *origin_pdu;
99        SNMP_pdu *cur_pdu;
100	Phase	state;
101	SNMP_variable *variable;
102	Session* session;
103} Three_Phase;
104
105
106
107/* explanation for the flags:				*/
108/* --------------------------				*/
109/*							*/
110/* Each bit in a flags corresponds to a variable	*/
111/* in the "original" SNMP request.			*/
112/* For example, the o_flag 0x7 in the Session means	*/
113/* that the "original" SNMP request contains 3		*/
114/* variables, the flags 0x5 of the Request 0 means that */
115/* this Request handles the 1st and the 3rd		*/
116/* variable of the "original" SNMP request, the flags	*/
117/* 0x2 of the Request 1 means that this Request		*/
118/* handles the 2nd variable of the "original" SNMP	*/
119/* request. When a Request is completed, its flags	*/
120/* are ORed with the i_flags of its Session, so as soon */
121/* as o_flags == i_flags, we known that all the Requests*/
122/* are completed and we start to compute the response	*/
123/* of the "original" SNMP request.			*/
124
125
126/***** GLOBAL FUNCTIONS *****/
127
128extern void trace_sessions();
129
130/* session_list_delete() will delete the whole session list */
131extern void session_list_delete();
132
133extern void session_dispatch();
134extern void session_read();
135
136extern void session_select_info(struct timeval *tv);
137extern void session_timeout();
138
139extern int any_outstanding_session();
140
141extern void session_close(Session *session);
142extern void session_free(Session *session);
143extern void request_list_free(Request *request_list);
144extern void request_free(Request *request);
145
146#endif /* _SESSION_H_ */
147
148