1219820Sjeff/*
2219820Sjeff * Copyright (c) 2008 Voltaire, Inc. All rights reserved.
3219820Sjeff * Copyright (c) 2007 The Regents of the University of California.
4219820Sjeff *
5219820Sjeff * This software is available to you under a choice of one of two
6219820Sjeff * licenses.  You may choose to be licensed under the terms of the GNU
7219820Sjeff * General Public License (GPL) Version 2, available from the file
8219820Sjeff * COPYING in the main directory of this source tree, or the
9219820Sjeff * OpenIB.org BSD license below:
10219820Sjeff *
11219820Sjeff *     Redistribution and use in source and binary forms, with or
12219820Sjeff *     without modification, are permitted provided that the following
13219820Sjeff *     conditions are met:
14219820Sjeff *
15219820Sjeff *      - Redistributions of source code must retain the above
16219820Sjeff *        copyright notice, this list of conditions and the following
17219820Sjeff *        disclaimer.
18219820Sjeff *
19219820Sjeff *      - Redistributions in binary form must reproduce the above
20219820Sjeff *        copyright notice, this list of conditions and the following
21219820Sjeff *        disclaimer in the documentation and/or other materials
22219820Sjeff *        provided with the distribution.
23219820Sjeff *
24219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31219820Sjeff * SOFTWARE.
32219820Sjeff *
33219820Sjeff */
34219820Sjeff
35219820Sjeff#ifndef _PERFMGR_EVENT_DB_H_
36219820Sjeff#define _PERFMGR_EVENT_DB_H_
37219820Sjeff
38219820Sjeff#ifdef ENABLE_OSM_PERF_MGR
39219820Sjeff
40219820Sjeff#include <stdio.h>
41219820Sjeff#include <time.h>
42219820Sjeff#include <iba/ib_types.h>
43219820Sjeff#include <complib/cl_qmap.h>
44219820Sjeff#include <complib/cl_passivelock.h>
45219820Sjeff
46219820Sjeff#ifdef __cplusplus
47219820Sjeff#  define BEGIN_C_DECLS extern "C" {
48219820Sjeff#  define END_C_DECLS   }
49219820Sjeff#else				/* !__cplusplus */
50219820Sjeff#  define BEGIN_C_DECLS
51219820Sjeff#  define END_C_DECLS
52219820Sjeff#endif				/* __cplusplus */
53219820Sjeff
54219820SjeffBEGIN_C_DECLS
55219820Sjeff
56219820Sjeffstruct osm_perfmgr;
57219820Sjeff/****h* OpenSM/PerfMgr Event Database
58219820Sjeff* DESCRIPTION
59219820Sjeff*       Database interface to record subnet events
60219820Sjeff*
61219820Sjeff*       Implementations of this object _MUST_ be thread safe.
62219820Sjeff*
63219820Sjeff* AUTHOR
64219820Sjeff*	Ira Weiny, LLNL
65219820Sjeff*
66219820Sjeff*********/
67219820Sjefftypedef enum {
68219820Sjeff	PERFMGR_EVENT_DB_SUCCESS = 0,
69219820Sjeff	PERFMGR_EVENT_DB_FAIL,
70219820Sjeff	PERFMGR_EVENT_DB_NOMEM,
71219820Sjeff	PERFMGR_EVENT_DB_GUIDNOTFOUND,
72219820Sjeff	PERFMGR_EVENT_DB_PORTNOTFOUND,
73219820Sjeff	PERFMGR_EVENT_DB_NOT_IMPL
74219820Sjeff} perfmgr_db_err_t;
75219820Sjeff
76219820Sjeff/** =========================================================================
77219820Sjeff * Port error reading
78219820Sjeff */
79219820Sjefftypedef struct {
80219820Sjeff	uint64_t symbol_err_cnt;
81219820Sjeff	uint64_t link_err_recover;
82219820Sjeff	uint64_t link_downed;
83219820Sjeff	uint64_t rcv_err;
84219820Sjeff	uint64_t rcv_rem_phys_err;
85219820Sjeff	uint64_t rcv_switch_relay_err;
86219820Sjeff	uint64_t xmit_discards;
87219820Sjeff	uint64_t xmit_constraint_err;
88219820Sjeff	uint64_t rcv_constraint_err;
89219820Sjeff	uint64_t link_integrity;
90219820Sjeff	uint64_t buffer_overrun;
91219820Sjeff	uint64_t vl15_dropped;
92219820Sjeff	time_t time;
93219820Sjeff} perfmgr_db_err_reading_t;
94219820Sjeff
95219820Sjeff/** =========================================================================
96219820Sjeff * Port data count reading
97219820Sjeff */
98219820Sjefftypedef struct {
99219820Sjeff	uint64_t xmit_data;	/* can be used for std or extended */
100219820Sjeff	uint64_t rcv_data;	/* can be used for std or extended */
101219820Sjeff	uint64_t xmit_pkts;	/* can be used for std or extended */
102219820Sjeff	uint64_t rcv_pkts;	/* can be used for std or extended */
103219820Sjeff	uint64_t unicast_xmit_pkts;
104219820Sjeff	uint64_t unicast_rcv_pkts;
105219820Sjeff	uint64_t multicast_xmit_pkts;
106219820Sjeff	uint64_t multicast_rcv_pkts;
107219820Sjeff	time_t time;
108219820Sjeff} perfmgr_db_data_cnt_reading_t;
109219820Sjeff
110219820Sjeff/** =========================================================================
111219820Sjeff * Port select errors
112219820Sjeff */
113219820Sjefftypedef struct {
114219820Sjeff	uint64_t xmit_wait;
115219820Sjeff	time_t time;
116219820Sjeff} perfmgr_db_ps_reading_t;
117219820Sjeff
118219820Sjeff/** =========================================================================
119219820Sjeff * Dump output options
120219820Sjeff */
121219820Sjefftypedef enum {
122219820Sjeff	PERFMGR_EVENT_DB_DUMP_HR = 0,	/* Human readable */
123219820Sjeff	PERFMGR_EVENT_DB_DUMP_MR	/* Machine readable */
124219820Sjeff} perfmgr_db_dump_t;
125219820Sjeff
126219820Sjeff/** =========================================================================
127219820Sjeff * Port counter object.
128219820Sjeff * Store all the port counters for a single port.
129219820Sjeff */
130219820Sjefftypedef struct _db_port {
131219820Sjeff	perfmgr_db_err_reading_t err_total;
132219820Sjeff	perfmgr_db_err_reading_t err_previous;
133219820Sjeff	perfmgr_db_data_cnt_reading_t dc_total;
134219820Sjeff	perfmgr_db_data_cnt_reading_t dc_previous;
135219820Sjeff	time_t last_reset;
136219820Sjeff} _db_port_t;
137219820Sjeff
138219820Sjeff/** =========================================================================
139219820Sjeff * group port counters for ports into the nodes
140219820Sjeff */
141219820Sjeff#define NODE_NAME_SIZE (IB_NODE_DESCRIPTION_SIZE << 1)
142219820Sjefftypedef struct _db_node {
143219820Sjeff	cl_map_item_t map_item;	/* must be first */
144219820Sjeff	uint64_t node_guid;
145219820Sjeff	_db_port_t *ports;
146219820Sjeff	uint8_t num_ports;
147219820Sjeff	char node_name[NODE_NAME_SIZE];
148219820Sjeff} _db_node_t;
149219820Sjeff
150219820Sjeff/** =========================================================================
151219820Sjeff * all nodes in the system.
152219820Sjeff */
153219820Sjefftypedef struct _db {
154219820Sjeff	cl_qmap_t pc_data;	/* stores type (_db_node_t *) */
155219820Sjeff	cl_plock_t lock;
156219820Sjeff	struct osm_perfmgr *perfmgr;
157219820Sjeff} perfmgr_db_t;
158219820Sjeff
159219820Sjeff/**
160219820Sjeff * functions
161219820Sjeff */
162219820Sjeffperfmgr_db_t *perfmgr_db_construct(struct osm_perfmgr *perfmgr);
163219820Sjeffvoid perfmgr_db_destroy(perfmgr_db_t * db);
164219820Sjeff
165219820Sjeffperfmgr_db_err_t perfmgr_db_create_entry(perfmgr_db_t * db, uint64_t guid,
166219820Sjeff					 uint8_t num_ports, char *node_name);
167219820Sjeff
168219820Sjeffperfmgr_db_err_t perfmgr_db_add_err_reading(perfmgr_db_t * db, uint64_t guid,
169219820Sjeff					    uint8_t port,
170219820Sjeff					    perfmgr_db_err_reading_t * reading);
171219820Sjeffperfmgr_db_err_t perfmgr_db_get_prev_err(perfmgr_db_t * db, uint64_t guid,
172219820Sjeff					 uint8_t port,
173219820Sjeff					 perfmgr_db_err_reading_t * reading);
174219820Sjeffperfmgr_db_err_t perfmgr_db_clear_prev_err(perfmgr_db_t * db, uint64_t guid,
175219820Sjeff					   uint8_t port);
176219820Sjeff
177219820Sjeffperfmgr_db_err_t perfmgr_db_add_dc_reading(perfmgr_db_t * db, uint64_t guid,
178219820Sjeff					   uint8_t port,
179219820Sjeff					   perfmgr_db_data_cnt_reading_t *
180219820Sjeff					   reading);
181219820Sjeffperfmgr_db_err_t perfmgr_db_get_prev_dc(perfmgr_db_t * db, uint64_t guid,
182219820Sjeff					uint8_t port,
183219820Sjeff					perfmgr_db_data_cnt_reading_t *
184219820Sjeff					reading);
185219820Sjeffperfmgr_db_err_t perfmgr_db_clear_prev_dc(perfmgr_db_t * db, uint64_t guid,
186219820Sjeff					  uint8_t port);
187219820Sjeff
188219820Sjeffvoid perfmgr_db_clear_counters(perfmgr_db_t * db);
189219820Sjeffperfmgr_db_err_t perfmgr_db_dump(perfmgr_db_t * db, char *file,
190219820Sjeff				 perfmgr_db_dump_t dump_type);
191219820Sjeffvoid perfmgr_db_print_by_name(perfmgr_db_t * db, char *nodename, FILE *fp);
192219820Sjeffvoid perfmgr_db_print_by_guid(perfmgr_db_t * db, uint64_t guid, FILE *fp);
193219820Sjeff
194219820Sjeff/** =========================================================================
195219820Sjeff * helper functions to fill in the various db objects from wire objects
196219820Sjeff */
197219820Sjeff
198219820Sjeffvoid perfmgr_db_fill_err_read(ib_port_counters_t * wire_read,
199219820Sjeff			      perfmgr_db_err_reading_t * reading);
200219820Sjeffvoid perfmgr_db_fill_data_cnt_read_pc(ib_port_counters_t * wire_read,
201219820Sjeff				      perfmgr_db_data_cnt_reading_t * reading);
202219820Sjeffvoid perfmgr_db_fill_data_cnt_read_epc(ib_port_counters_ext_t * wire_read,
203219820Sjeff				       perfmgr_db_data_cnt_reading_t * reading);
204219820Sjeff
205219820SjeffEND_C_DECLS
206219820Sjeff
207219820Sjeff#endif				/* ENABLE_OSM_PERF_MGR */
208219820Sjeff
209219820Sjeff#endif				/* _PERFMGR_PM_DB_H_ */
210