1/*
2 * Copyright (c) 2008 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2007 The Regents of the University of California.
4 * Copyright (c) 2009 HNR Consulting. All rights reserved.
5 *
6 * This software is available to you under a choice of one of two
7 * licenses.  You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 *     Redistribution and use in source and binary forms, with or
13 *     without modification, are permitted provided that the following
14 *     conditions are met:
15 *
16 *      - Redistributions of source code must retain the above
17 *        copyright notice, this list of conditions and the following
18 *        disclaimer.
19 *
20 *      - Redistributions in binary form must reproduce the above
21 *        copyright notice, this list of conditions and the following
22 *        disclaimer in the documentation and/or other materials
23 *        provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 *
34 */
35
36#ifndef _PERFMGR_EVENT_DB_H_
37#define _PERFMGR_EVENT_DB_H_
38
39#ifdef ENABLE_OSM_PERF_MGR
40
41#include <stdio.h>
42#include <time.h>
43#include <iba/ib_types.h>
44#include <complib/cl_qmap.h>
45#include <complib/cl_passivelock.h>
46
47#ifdef __cplusplus
48#  define BEGIN_C_DECLS extern "C" {
49#  define END_C_DECLS   }
50#else				/* !__cplusplus */
51#  define BEGIN_C_DECLS
52#  define END_C_DECLS
53#endif				/* __cplusplus */
54
55BEGIN_C_DECLS
56
57struct osm_perfmgr;
58/****h* OpenSM/PerfMgr Event Database
59* DESCRIPTION
60*       Database interface to record subnet events
61*
62*       Implementations of this object _MUST_ be thread safe.
63*
64* AUTHOR
65*	Ira Weiny, LLNL
66*
67*********/
68typedef enum {
69	PERFMGR_EVENT_DB_SUCCESS = 0,
70	PERFMGR_EVENT_DB_FAIL,
71	PERFMGR_EVENT_DB_NOMEM,
72	PERFMGR_EVENT_DB_GUIDNOTFOUND,
73	PERFMGR_EVENT_DB_PORTNOTFOUND,
74	PERFMGR_EVENT_DB_NOT_IMPL
75} perfmgr_db_err_t;
76
77/** =========================================================================
78 * Port error reading
79 */
80typedef struct {
81	uint64_t symbol_err_cnt;
82	uint64_t link_err_recover;
83	uint64_t link_downed;
84	uint64_t rcv_err;
85	uint64_t rcv_rem_phys_err;
86	uint64_t rcv_switch_relay_err;
87	uint64_t xmit_discards;
88	uint64_t xmit_constraint_err;
89	uint64_t rcv_constraint_err;
90	uint64_t link_integrity;
91	uint64_t buffer_overrun;
92	uint64_t vl15_dropped;
93	uint64_t xmit_wait;
94	time_t time;
95} perfmgr_db_err_reading_t;
96
97/** =========================================================================
98 * Port data count reading
99 */
100typedef struct {
101	uint64_t xmit_data;	/* can be used for std or extended */
102	uint64_t rcv_data;	/* can be used for std or extended */
103	uint64_t xmit_pkts;	/* can be used for std or extended */
104	uint64_t rcv_pkts;	/* can be used for std or extended */
105	uint64_t unicast_xmit_pkts;
106	uint64_t unicast_rcv_pkts;
107	uint64_t multicast_xmit_pkts;
108	uint64_t multicast_rcv_pkts;
109	time_t time;
110} perfmgr_db_data_cnt_reading_t;
111
112/** =========================================================================
113 * Dump output options
114 */
115typedef enum {
116	PERFMGR_EVENT_DB_DUMP_HR = 0,	/* Human readable */
117	PERFMGR_EVENT_DB_DUMP_MR	/* Machine readable */
118} perfmgr_db_dump_t;
119
120/** =========================================================================
121 * Port counter object.
122 * Store all the port counters for a single port.
123 */
124typedef struct db_port {
125	perfmgr_db_err_reading_t err_total;
126	perfmgr_db_err_reading_t err_previous;
127	perfmgr_db_data_cnt_reading_t dc_total;
128	perfmgr_db_data_cnt_reading_t dc_previous;
129	time_t last_reset;
130	boolean_t valid;
131} db_port_t;
132
133/** =========================================================================
134 * group port counters for ports into the nodes
135 */
136#define NODE_NAME_SIZE (IB_NODE_DESCRIPTION_SIZE + 1)
137typedef struct db_node {
138	cl_map_item_t map_item;	/* must be first */
139	uint64_t node_guid;
140	boolean_t active;       /* activly being monitored */
141	boolean_t esp0;
142	db_port_t *ports;
143	uint8_t num_ports;
144	char node_name[NODE_NAME_SIZE];
145} db_node_t;
146
147/** =========================================================================
148 * all nodes in the subnet.
149 */
150typedef struct perfmgr_db {
151	cl_qmap_t pc_data;	/* stores type (db_node_t *) */
152	cl_plock_t lock;
153	struct osm_perfmgr *perfmgr;
154} perfmgr_db_t;
155
156/**
157 * functions
158 */
159perfmgr_db_t *perfmgr_db_construct(struct osm_perfmgr *perfmgr);
160void perfmgr_db_destroy(perfmgr_db_t * db);
161
162perfmgr_db_err_t perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid,
163					 boolean_t esp0, uint8_t num_ports,
164					 char *node_name);
165perfmgr_db_err_t perfmgr_db_delete_entry(perfmgr_db_t * db, uint64_t guid);
166perfmgr_db_err_t perfmgr_db_delete_inactive(perfmgr_db_t * db, unsigned *cnt);
167
168perfmgr_db_err_t perfmgr_db_update_name(perfmgr_db_t * db, uint64_t node_guid,
169					char *name);
170
171perfmgr_db_err_t perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid,
172					    uint8_t port,
173					    perfmgr_db_err_reading_t * reading);
174perfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid,
175					 uint8_t port,
176					 perfmgr_db_err_reading_t * reading);
177perfmgr_db_err_t perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid,
178					   uint8_t port);
179
180perfmgr_db_err_t perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid,
181					   uint8_t port,
182					   perfmgr_db_data_cnt_reading_t *
183					   reading,
184					   int ietf_sup);
185perfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid,
186					uint8_t port,
187					perfmgr_db_data_cnt_reading_t *
188					reading);
189perfmgr_db_err_t perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid,
190					  uint8_t port);
191
192perfmgr_db_err_t perfmgr_db_mark_active(perfmgr_db_t *db, uint64_t guid,
193					boolean_t active);
194
195void perfmgr_db_clear_counters(perfmgr_db_t * db);
196perfmgr_db_err_t perfmgr_db_dump(perfmgr_db_t * db, char *file,
197				 perfmgr_db_dump_t dump_type);
198void perfmgr_db_print_all(perfmgr_db_t * db, FILE *fp, int err_only);
199void perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp,
200			      char *port, int err_only);
201void perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t guid, FILE *fp,
202			      char *port, int err_only);
203
204/** =========================================================================
205 * helper functions to fill in the various db objects from wire objects
206 */
207
208void perfmgr_db_fill_err_read(ib_port_counters_t * wire_read,
209			      perfmgr_db_err_reading_t * reading,
210			      boolean_t xmit_wait_sup);
211void perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read,
212				      perfmgr_db_data_cnt_reading_t * reading);
213void perfmgr_db_fill_data_cnt_read_pce(ib_port_counters_ext_t * wire_read,
214				       perfmgr_db_data_cnt_reading_t * reading,
215				       int ietf_sup);
216
217END_C_DECLS
218
219#endif				/* ENABLE_OSM_PERF_MGR */
220
221#endif				/* _PERFMGR_PM_DB_H_ */
222