1 /*****************************************************************************\
2  *  $Id: ipmipower.h,v 1.145 2010-02-08 22:02:31 chu11 Exp $
3  *****************************************************************************
4  *  Copyright (C) 2007-2015 Lawrence Livermore National Security, LLC.
5  *  Copyright (C) 2003-2007 The Regents of the University of California.
6  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
7  *  Written by Albert Chu <chu11@llnl.gov>
8  *  UCRL-CODE-155698
9  *
10  *  This file is part of Ipmipower, a remote power control utility.
11  *  For details, see http://www.llnl.gov/linux/.
12  *
13  *  Ipmipower is free software; you can redistribute it and/or modify
14  *  it under the terms of the GNU General Public License as published by the
15  *  Free Software Foundation; either version 3 of the License, or (at your
16  *  option) any later version.
17  *
18  *  Ipmipower is distributed in the hope that it will be useful, but
19  *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
20  *  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21  *  for more details.
22  *
23  *  You should have received a copy of the GNU General Public License along
24  *  with Ipmipower.  If not, see <http://www.gnu.org/licenses/>.
25 \*****************************************************************************/
26 
27 #ifndef IPMIPOWER_H
28 #define IPMIPOWER_H
29 
30 #if HAVE_CONFIG_H
31 #include "config.h"
32 #endif /* HAVE_CONFIG_H */
33 
34 #if TIME_WITH_SYS_TIME
35 #include <sys/time.h>
36 #include <time.h>
37 #else  /* !TIME_WITH_SYS_TIME */
38 #if HAVE_SYS_TIME_H
39 #include <sys/time.h>
40 #else /* !HAVE_SYS_TIME_H */
41 #include <time.h>
42 #endif  /* !HAVE_SYS_TIME_H */
43 #endif /* !TIME_WITH_SYS_TIME */
44 #include <sys/param.h>
45 #include <netinet/in.h>
46 #include <limits.h>             /* MAXHOSTNAMELEN */
47 #ifdef HAVE_NETDB_H
48 #include <netdb.h>              /* MAXHOSTNAMELEN Solaris */
49 #endif /* HAVE_NETDB_H */
50 
51 #include <freeipmi/freeipmi.h>
52 
53 #include "cbuf.h"
54 #include "fi_hostlist.h"
55 #include "list.h"
56 #include "tool-cmdline-common.h"
57 
58 #include "ipmidetect.h"
59 
60 #ifndef MAXHOSTNAMELEN
61 #define MAXHOSTNAMELEN 64
62 #endif /* MAXHOSTNAMELEN */
63 
64 #define MAXPORTBUFLEN 16
65 
66 #define IPMIPOWER_MIN_TTY_BUF 1024*4
67 #define IPMIPOWER_MAX_TTY_BUF 1024*32
68 
69 #define IPMIPOWER_LAN_INITIAL_OUTBOUND_SEQUENCE_NUMBER       1
70 
71 #define IPMIPOWER_RMCPPLUS_INITIAL_OUTBOUND_SEQUENCE_NUMBER  0
72 
73 #define IPMIPOWER_PACKET_BUFLEN                          1024
74 
75 #define IPMIPOWER_OUTPUT_BUFLEN                          65536
76 
77 #define IPMI_MAX_SIK_KEY_LENGTH                          64
78 
79 #define IPMI_MAX_INTEGRITY_KEY_LENGTH                    64
80 
81 #define IPMI_MAX_CONFIDENTIALITY_KEY_LENGTH              64
82 
83 #define IPMI_MAX_KEY_EXCHANGE_AUTHENTICATION_CODE_LENGTH 64
84 
85 typedef enum
86   {
87     IPMIPOWER_POWER_CMD_NONE                       = 0x00,
88     IPMIPOWER_POWER_CMD_POWER_OFF                  = 0x01,
89     IPMIPOWER_POWER_CMD_POWER_ON                   = 0x02,
90     IPMIPOWER_POWER_CMD_POWER_CYCLE                = 0x03,
91     IPMIPOWER_POWER_CMD_POWER_RESET                = 0x04,
92     IPMIPOWER_POWER_CMD_POWER_STATUS               = 0x05,
93     IPMIPOWER_POWER_CMD_PULSE_DIAGNOSTIC_INTERRUPT = 0x06,
94     IPMIPOWER_POWER_CMD_SOFT_SHUTDOWN_OS           = 0x07,
95     IPMIPOWER_POWER_CMD_IDENTIFY_ON                = 0x08,
96     IPMIPOWER_POWER_CMD_IDENTIFY_OFF               = 0x09,
97     IPMIPOWER_POWER_CMD_IDENTIFY_STATUS            = 0x0A,
98   } ipmipower_power_cmd_t;
99 
100 #define IPMIPOWER_POWER_CMD_VALID(__c)             \
101   (((__c) >= IPMIPOWER_POWER_CMD_POWER_OFF         \
102     && (__c) <= IPMIPOWER_POWER_CMD_IDENTIFY_STATUS) ? 1 : 0)
103 
104 #define IPMIPOWER_POWER_CMD_REQUIRES_OPERATOR_PRIVILEGE_LEVEL(__c)    \
105   ((__c) == IPMIPOWER_POWER_CMD_POWER_OFF                             \
106    || (__c) == IPMIPOWER_POWER_CMD_POWER_ON                           \
107    || (__c) == IPMIPOWER_POWER_CMD_POWER_CYCLE                        \
108    || (__c) == IPMIPOWER_POWER_CMD_POWER_RESET                        \
109    || (__c) == IPMIPOWER_POWER_CMD_PULSE_DIAGNOSTIC_INTERRUPT         \
110    || (__c) == IPMIPOWER_POWER_CMD_SOFT_SHUTDOWN_OS                   \
111    || (__c) == IPMIPOWER_POWER_CMD_IDENTIFY_ON                        \
112    || (__c) == IPMIPOWER_POWER_CMD_IDENTIFY_OFF)
113 
114 typedef enum
115   {
116     IPMIPOWER_OEM_POWER_TYPE_NONE    = 0,
117     IPMIPOWER_OEM_POWER_TYPE_C410X   = 1,
118     IPMIPOWER_OEM_POWER_TYPE_INVALID = 255
119   } oem_power_type_t;
120 
121 #define IPMIPOWER_OEM_POWER_TYPE_NONE_STR "none"
122 #define IPMIPOWER_OEM_POWER_TYPE_C410X_STR "c410x"
123 
124 #define IPMIPOWER_OEM_POWER_TYPE_VALID(__v)     \
125   (((__v) == IPMIPOWER_OEM_POWER_TYPE_NONE      \
126     || (__v) == IPMIPOWER_OEM_POWER_TYPE_C410X) ? 1 : 0)
127 
128 #define IPMIPOWER_OEM_POWER_TYPE_REQUIRES_EXTRA_ARGUMENT(__v) \
129   (((__v) == IPMIPOWER_OEM_POWER_TYPE_C410X) ? 1 : 0)
130 
131 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_OFF                  0x0001
132 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_ON                   0x0002
133 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_CYCLE                0x0004
134 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_RESET                0x0008
135 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_STATUS               0x0010
136 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_DIAGNOSTIC_INTERRUPT 0x0020
137 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_SOFT_SHUTDOWN_OS     0x0040
138 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_IDENTIFY_ON          0x0080
139 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_IDENTIFY_OFF         0x0100
140 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_IDENTIFY_STATUS      0x0200
141 #define IPMIPOWER_OEM_POWER_TYPE_SUPPORT_ALL                  0xFFFF
142 
143 struct oem_power_type_data {
144   char *name;
145   unsigned int supported_operations;
146 };
147 
148 typedef enum
149   {
150     IPMIPOWER_PACKET_TYPE_AUTHENTICATION_CAPABILITIES_RQ    = 0x101,
151     IPMIPOWER_PACKET_TYPE_AUTHENTICATION_CAPABILITIES_RS    = 0x201,
152     IPMIPOWER_PACKET_TYPE_GET_SESSION_CHALLENGE_RQ          = 0x102,
153     IPMIPOWER_PACKET_TYPE_GET_SESSION_CHALLENGE_RS          = 0x202,
154     IPMIPOWER_PACKET_TYPE_ACTIVATE_SESSION_RQ               = 0x103,
155     IPMIPOWER_PACKET_TYPE_ACTIVATE_SESSION_RS               = 0x203,
156     IPMIPOWER_PACKET_TYPE_OPEN_SESSION_REQUEST              = 0x104,
157     IPMIPOWER_PACKET_TYPE_OPEN_SESSION_RESPONSE             = 0x204,
158     IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_1                    = 0x105,
159     IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_2                    = 0x205,
160     IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_3                    = 0x106,
161     IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_4                    = 0x206,
162     IPMIPOWER_PACKET_TYPE_SET_SESSION_PRIVILEGE_LEVEL_RQ    = 0x107,
163     IPMIPOWER_PACKET_TYPE_SET_SESSION_PRIVILEGE_LEVEL_RS    = 0x207,
164     IPMIPOWER_PACKET_TYPE_GET_CHASSIS_STATUS_RQ             = 0x108,
165     IPMIPOWER_PACKET_TYPE_GET_CHASSIS_STATUS_RS             = 0x208,
166     IPMIPOWER_PACKET_TYPE_CHASSIS_CONTROL_RQ                = 0x109,
167     IPMIPOWER_PACKET_TYPE_CHASSIS_CONTROL_RS                = 0x209,
168     IPMIPOWER_PACKET_TYPE_CHASSIS_IDENTIFY_RQ               = 0x10A,
169     IPMIPOWER_PACKET_TYPE_CHASSIS_IDENTIFY_RS               = 0x20A,
170     IPMIPOWER_PACKET_TYPE_C410X_GET_SENSOR_READING_RQ       = 0x10B,
171     IPMIPOWER_PACKET_TYPE_C410X_GET_SENSOR_READING_RS       = 0x20B,
172     IPMIPOWER_PACKET_TYPE_C410X_SLOT_POWER_CONTROL_RQ       = 0x10C,
173     IPMIPOWER_PACKET_TYPE_C410X_SLOT_POWER_CONTROL_RS       = 0x20C,
174     IPMIPOWER_PACKET_TYPE_CLOSE_SESSION_RQ                  = 0x10D,
175     IPMIPOWER_PACKET_TYPE_CLOSE_SESSION_RS                  = 0x20D,
176   } ipmipower_packet_type_t;
177 
178 #define IPMIPOWER_PACKET_TYPE_RQ_MASK      0x100
179 #define IPMIPOWER_PACKET_TYPE_RS_MASK      0x200
180 #define IPMIPOWER_PACKET_TYPE_MIN          0x001
181 #define IPMIPOWER_PACKET_TYPE_MAX          0x00D
182 #define IPMIPOWER_PACKET_TYPE_PACKET_MASK  0x0FF
183 
184 #define IPMIPOWER_PACKET_TYPE_PACKET_VALID(__p)                             \
185   (((__p) & IPMIPOWER_PACKET_TYPE_PACKET_MASK) >= IPMIPOWER_PACKET_TYPE_MIN \
186    && ((__p) & IPMIPOWER_PACKET_TYPE_PACKET_MASK) <= IPMIPOWER_PACKET_TYPE_MAX)
187 
188 #define IPMIPOWER_PACKET_TYPE_RQ(__p)       \
189   ((((__p) & IPMIPOWER_PACKET_TYPE_RQ_MASK) \
190     && IPMIPOWER_PACKET_TYPE_PACKET_VALID ((__p))) ? 1 : 0)
191 
192 #define IPMIPOWER_PACKET_TYPE_RS(__p)       \
193   ((((__p) & IPMIPOWER_PACKET_TYPE_RS_MASK) \
194     && IPMIPOWER_PACKET_TYPE_PACKET_VALID ((__p))) ? 1 : 0)
195 
196 #define IPMIPOWER_PACKET_TYPE_VALID(__p) \
197   ((IPMIPOWER_PACKET_TYPE_RQ ((__p))     \
198     || IPMIPOWER_PACKET_TYPE_RS ((__p))) ? 1 : 0)
199 
200 #define IPMIPOWER_PACKET_TYPE_IPMI_1_5_SETUP(__p)                     \
201   ((((__p) == IPMIPOWER_PACKET_TYPE_AUTHENTICATION_CAPABILITIES_RQ    \
202      || (__p) == IPMIPOWER_PACKET_TYPE_AUTHENTICATION_CAPABILITIES_RS \
203      || (__p) == IPMIPOWER_PACKET_TYPE_GET_SESSION_CHALLENGE_RQ       \
204      || (__p) == IPMIPOWER_PACKET_TYPE_GET_SESSION_CHALLENGE_RS       \
205      || (__p) == IPMIPOWER_PACKET_TYPE_ACTIVATE_SESSION_RQ            \
206      || (__p) == IPMIPOWER_PACKET_TYPE_ACTIVATE_SESSION_RS)) ? 1 : 0)
207 
208 #define IPMIPOWER_PACKET_TYPE_IPMI_1_5_SETUP_RQ(__p) \
209   ((IPMIPOWER_PACKET_TYPE_IPMI_1_5_SETUP (__p)       \
210     && IPMIPOWER_PACKET_TYPE_RQ (__p)) ? 1 : 0)
211 
212 #define IPMIPOWER_PACKET_TYPE_IPMI_1_5_SETUP_RS(__p) \
213   ((IPMIPOWER_PACKET_TYPE_IPMI_1_5_SETUP (__p)       \
214     && IPMIPOWER_PACKET_TYPE_RS (__p)) ? 1 : 0)
215 
216 #define IPMIPOWER_PACKET_TYPE_IPMI_2_0_SETUP(__p)           \
217   ((((__p) == IPMIPOWER_PACKET_TYPE_OPEN_SESSION_REQUEST    \
218     || (__p) == IPMIPOWER_PACKET_TYPE_OPEN_SESSION_RESPONSE \
219     || (__p) == IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_1        \
220     || (__p) == IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_2        \
221     || (__p) == IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_3        \
222     || (__p) == IPMIPOWER_PACKET_TYPE_RAKP_MESSAGE_4))  ? 1 : 0)
223 
224 #define IPMIPOWER_PACKET_TYPE_IPMI_2_0_SETUP_RQ(__p) \
225   ((IPMIPOWER_PACKET_TYPE_IPMI_2_0_SETUP (__p)       \
226     && IPMIPOWER_PACKET_TYPE_RQ (__p)) ? 1 : 0)
227 
228 #define IPMIPOWER_PACKET_TYPE_IPMI_2_0_SETUP_RS(__p) \
229   ((IPMIPOWER_PACKET_TYPE_IPMI_2_0_SETUP (__p)       \
230     && IPMIPOWER_PACKET_TYPE_RS (__p)) ? 1 : 0)
231 
232 #define IPMIPOWER_PACKET_TYPE_IPMI_SESSION_PACKET(__p)                  \
233   ((((__p) == IPMIPOWER_PACKET_TYPE_SET_SESSION_PRIVILEGE_LEVEL_RQ      \
234      || (__p) == IPMIPOWER_PACKET_TYPE_SET_SESSION_PRIVILEGE_LEVEL_RS   \
235      || (__p) == IPMIPOWER_PACKET_TYPE_GET_CHASSIS_STATUS_RQ            \
236      || (__p) == IPMIPOWER_PACKET_TYPE_GET_CHASSIS_STATUS_RS            \
237      || (__p) == IPMIPOWER_PACKET_TYPE_CHASSIS_CONTROL_RQ               \
238      || (__p) == IPMIPOWER_PACKET_TYPE_CHASSIS_CONTROL_RS               \
239      || (__p) == IPMIPOWER_PACKET_TYPE_CHASSIS_IDENTIFY_RQ              \
240      || (__p) == IPMIPOWER_PACKET_TYPE_CHASSIS_IDENTIFY_RS              \
241      || (__p) == IPMIPOWER_PACKET_TYPE_C410X_GET_SENSOR_READING_RQ      \
242      || (__p) == IPMIPOWER_PACKET_TYPE_C410X_GET_SENSOR_READING_RS      \
243      || (__p) == IPMIPOWER_PACKET_TYPE_C410X_SLOT_POWER_CONTROL_RQ      \
244      || (__p) == IPMIPOWER_PACKET_TYPE_C410X_SLOT_POWER_CONTROL_RS      \
245      || (__p) == IPMIPOWER_PACKET_TYPE_CLOSE_SESSION_RQ                 \
246      || (__p) == IPMIPOWER_PACKET_TYPE_CLOSE_SESSION_RS)) ? 1 : 0)
247 
248 #define IPMIPOWER_PACKET_TYPE_IPMI_SESSION_PACKET_RQ(__p) \
249   ((IPMIPOWER_PACKET_TYPE_IPMI_SESSION_PACKET (__p)       \
250     && IPMIPOWER_PACKET_TYPE_RQ (__p)) ? 1 : 0)
251 
252 #define IPMIPOWER_PACKET_TYPE_IPMI_SESSION_PACKET_RS(__p) \
253   ((IPMIPOWER_PACKET_TYPE_IPMI_SESSION_PACKET (__p)       \
254     && IPMIPOWER_PACKET_TYPE_RS (__p)) ? 1 : 0)
255 
256 typedef enum
257   {
258     IPMIPOWER_PROTOCOL_STATE_START                                = 0x00,
259     IPMIPOWER_PROTOCOL_STATE_AUTHENTICATION_CAPABILITIES_SENT     = 0x01,
260     IPMIPOWER_PROTOCOL_STATE_GET_SESSION_CHALLENGE_SENT           = 0x02,
261     IPMIPOWER_PROTOCOL_STATE_ACTIVATE_SESSION_SENT                = 0x03,
262     IPMIPOWER_PROTOCOL_STATE_OPEN_SESSION_REQUEST_SENT            = 0x04,
263     IPMIPOWER_PROTOCOL_STATE_RAKP_MESSAGE_1_SENT                  = 0x05,
264     IPMIPOWER_PROTOCOL_STATE_RAKP_MESSAGE_3_SENT                  = 0x06,
265     IPMIPOWER_PROTOCOL_STATE_SET_SESSION_PRIVILEGE_LEVEL_SENT     = 0x07,
266     IPMIPOWER_PROTOCOL_STATE_GET_CHASSIS_STATUS_SENT              = 0x08,
267     IPMIPOWER_PROTOCOL_STATE_CHASSIS_CONTROL_SENT                 = 0x09,
268     IPMIPOWER_PROTOCOL_STATE_CHASSIS_IDENTIFY_SENT                = 0x0A,
269     IPMIPOWER_PROTOCOL_STATE_C410X_GET_SENSOR_READING_SENT        = 0x0B,
270     IPMIPOWER_PROTOCOL_STATE_C410X_SLOT_POWER_CONTROL_SENT        = 0x0C,
271     IPMIPOWER_PROTOCOL_STATE_CLOSE_SESSION_SENT                   = 0x0D,
272     IPMIPOWER_PROTOCOL_STATE_END                                  = 0x0E,
273   } ipmipower_protocol_state_t;
274 
275 #define IPMIPOWER_PROTOCOL_STATE_VALID(__s)    \
276   (((__s) >= IPMIPOWER_PROTOCOL_STATE_START    \
277     && (__s) <= IPMIPOWER_PROTOCOL_STATE_END) ? 1 : 0)
278 
279 typedef enum
280   {
281     IPMIPOWER_DISCOVER_STATE_DISCOVERED     = 0x01,
282     IPMIPOWER_DISCOVER_STATE_UNDISCOVERED   = 0x02,
283     IPMIPOWER_DISCOVER_STATE_BADCONNECTION  = 0x03,
284   } ipmipower_discover_state_t;
285 
286 #define IPMIPOWER_DISCOVER_STATE_VALID(__s)      \
287   (((__s) >= IPMIPOWER_DISCOVER_STATE_DISCOVERED \
288     && (__s) <= IPMIPOWER_DISCOVER_STATE_BADCONNECTION) ? 1 : 0)
289 
290 typedef enum
291   {
292     IPMIPOWER_LINK_STATE_GOOD = 0x01,
293     IPMIPOWER_LINK_STATE_BAD  = 0x02,
294   } ipmipower_link_state_t;
295 
296 #define IPMIPOWER_LINK_STATE_VALID(__s) \
297   (((__s) >= IPMIPOWER_LINK_STATE_GOOD  \
298    && (__s) <= IPMIPOWER_LINK_STATE_BAD) ? 1 : 0)
299 
300 typedef enum
301   {
302     IPMIPOWER_MSG_TYPE_ON                                 =  0,
303     IPMIPOWER_MSG_TYPE_OFF                                =  1,
304     IPMIPOWER_MSG_TYPE_OK                                 =  2,
305     IPMIPOWER_MSG_TYPE_UNKNOWN                            =  3,
306     IPMIPOWER_MSG_TYPE_USERNAME_INVALID                   =  4,
307     IPMIPOWER_MSG_TYPE_PASSWORD_INVALID                   =  5,
308     IPMIPOWER_MSG_TYPE_PASSWORD_LENGTH_INVALID            =  6,
309     IPMIPOWER_MSG_TYPE_K_G_INVALID                        =  7,
310     IPMIPOWER_MSG_TYPE_PRIVILEGE_LEVEL_CANNOT_BE_OBTAINED =  8,
311     IPMIPOWER_MSG_TYPE_OPERATION_INVALID                  =  9,
312     IPMIPOWER_MSG_TYPE_AUTHENTICATION_TYPE_UNAVAILABLE    = 10,
313     IPMIPOWER_MSG_TYPE_CIPHER_SUITE_ID_UNAVAILABLE        = 11,
314     IPMIPOWER_MSG_TYPE_PASSWORD_VERIFICATION_TIMEOUT      = 12,
315     IPMIPOWER_MSG_TYPE_CONNECTION_TIMEOUT                 = 13,
316     IPMIPOWER_MSG_TYPE_SESSION_TIMEOUT                    = 14,
317     IPMIPOWER_MSG_TYPE_NOTDISCOVERED                      = 15,
318     IPMIPOWER_MSG_TYPE_BADCONNECTION                      = 16,
319     IPMIPOWER_MSG_TYPE_HOSTNAME_INVALID                   = 17,
320     IPMIPOWER_MSG_TYPE_UNCONFIGURED_HOSTNAME              = 18,
321     IPMIPOWER_MSG_TYPE_RESOURCES                          = 19,
322     IPMIPOWER_MSG_TYPE_IPMI_2_0_UNAVAILABLE               = 20,
323     IPMIPOWER_MSG_TYPE_INVALID_ARGUMENT_FOR_OEM_EXTENSION = 21,
324     IPMIPOWER_MSG_TYPE_BMC_BUSY                           = 22,
325     IPMIPOWER_MSG_TYPE_BMC_ERROR                          = 23,
326   } ipmipower_msg_type_t;
327 
328 #define IPMIPOWER_MSG_TYPE_VALID(__m)         \
329   ((__m) >= IPMIPOWER_MSG_TYPE_ON             \
330    && (__m) <= IPMIPOWER_MSG_TYPE_BMC_ERROR)
331 
332 #define IPMIPOWER_MSG_TYPE_ERROR_MIN IPMIPOWER_MSG_TYPE_UNKNOWN
333 #define IPMIPOWER_MSG_TYPE_ERROR_MAX IPMIPOWER_MSG_TYPE_BMC_ERROR
334 
335 #define IPMIPOWER_MSG_TYPE_NUM_ENTRIES (IPMIPOWER_MSG_TYPE_BMC_ERROR + 1)
336 
337 /* ipmipower_powercmd
338  * - Stores all information needed to execute a power command
339  */
340 struct ipmipower_powercmd {
341   ipmipower_power_cmd_t cmd;
342   ipmipower_protocol_state_t protocol_state;
343 
344   /*
345    * Protocol State Machine Variables
346    */
347   struct timeval time_begin;
348   unsigned int retransmission_count;
349   uint8_t close_timeout;
350 
351   /*
352    * Protocol Maintenance Variables
353    */
354   unsigned int session_inbound_count;
355   uint32_t highest_received_sequence_number;
356   uint32_t previously_received_list;
357 
358   /* IPMI 1.5 specific */
359   int permsgauth_enabled;
360 
361   /* IPMI 2.0 specific */
362   uint8_t requested_maximum_privilege_level;
363   uint8_t authentication_algorithm;
364   uint8_t integrity_algorithm;
365   uint8_t confidentiality_algorithm;
366   uint8_t sik_key[IPMI_MAX_SIK_KEY_LENGTH];
367   void *sik_key_ptr;
368   unsigned int sik_key_len;
369   uint8_t integrity_key[IPMI_MAX_INTEGRITY_KEY_LENGTH];
370   void *integrity_key_ptr;
371   unsigned int integrity_key_len;
372   uint8_t confidentiality_key[IPMI_MAX_CONFIDENTIALITY_KEY_LENGTH];
373   void *confidentiality_key_ptr;
374   unsigned int confidentiality_key_len;
375   uint8_t initial_message_tag;
376   uint8_t message_tag_count;
377   uint32_t session_sequence_number;
378   uint8_t name_only_lookup;
379   uint32_t remote_console_session_id;
380   uint8_t remote_console_random_number[IPMI_REMOTE_CONSOLE_RANDOM_NUMBER_LENGTH];
381 
382   /* Ipmipower variables */
383   int wait_until_on_state;
384   int wait_until_off_state;
385 
386   struct ipmipower_connection *ic;
387 
388   fiid_obj_t obj_rmcp_hdr_rq;
389   fiid_obj_t obj_rmcp_hdr_rs;
390   fiid_obj_t obj_lan_session_hdr_rq;
391   fiid_obj_t obj_lan_session_hdr_rs;
392   fiid_obj_t obj_lan_msg_hdr_rq;
393   fiid_obj_t obj_lan_msg_hdr_rs;
394   fiid_obj_t obj_lan_msg_trlr_rs;
395   fiid_obj_t obj_rmcpplus_session_hdr_rq;
396   fiid_obj_t obj_rmcpplus_session_hdr_rs;
397   fiid_obj_t obj_rmcpplus_payload_rs;
398   fiid_obj_t obj_rmcpplus_session_trlr_rq;
399   fiid_obj_t obj_rmcpplus_session_trlr_rs;
400 
401   fiid_obj_t obj_authentication_capabilities_rq;
402   fiid_obj_t obj_authentication_capabilities_rs;
403   fiid_obj_t obj_get_session_challenge_rq;
404   fiid_obj_t obj_get_session_challenge_rs;
405   fiid_obj_t obj_activate_session_rq;
406   fiid_obj_t obj_activate_session_rs;
407   fiid_obj_t obj_open_session_rq;
408   fiid_obj_t obj_open_session_rs;
409   fiid_obj_t obj_rakp_message_1_rq;
410   fiid_obj_t obj_rakp_message_2_rs;
411   fiid_obj_t obj_rakp_message_3_rq;
412   fiid_obj_t obj_rakp_message_4_rs;
413   fiid_obj_t obj_set_session_privilege_level_rq;
414   fiid_obj_t obj_set_session_privilege_level_rs;
415   fiid_obj_t obj_get_chassis_status_rq;
416   fiid_obj_t obj_get_chassis_status_rs;
417   fiid_obj_t obj_chassis_control_rq;
418   fiid_obj_t obj_chassis_control_rs;
419   fiid_obj_t obj_chassis_identify_rq;
420   fiid_obj_t obj_chassis_identify_rs;
421   fiid_obj_t obj_c410x_get_sensor_reading_rq;
422   fiid_obj_t obj_c410x_get_sensor_reading_rs;
423   fiid_obj_t obj_c410x_slot_power_control_rq;
424   fiid_obj_t obj_c410x_slot_power_control_rs;
425   fiid_obj_t obj_close_session_rq;
426   fiid_obj_t obj_close_session_rs;
427 
428   List sockets_to_close;
429 
430   /* for oem power control ; extra arg passed in via "+extra" at end of hostname */
431   char *extra_arg;
432 
433   /* for oem power control to the same node */
434   struct ipmipower_powercmd *next;
435 };
436 
437 struct ipmipower_connection_extra_arg
438 {
439   struct ipmipower_connection_extra_arg *next;
440   char *extra_arg;
441 };
442 
443 /* ipmipower_connection
444  * - Stores various information and data for each remote node ipmi
445  * "connection" we have.
446  */
447 struct ipmipower_connection
448 {
449   int ipmi_fd;
450   int ping_fd;
451   cbuf_t ipmi_in;
452   cbuf_t ipmi_out;
453   cbuf_t ping_in;
454   cbuf_t ping_out;
455   unsigned int ipmi_requester_sequence_number_counter;
456   unsigned int ping_sequence_number_counter;
457   struct timeval last_ipmi_send;
458   struct timeval last_ping_send;
459   struct timeval last_ipmi_recv;
460   struct timeval last_ping_recv;
461 
462   ipmipower_link_state_t link_state;
463   unsigned int ping_last_packet_recv_flag;
464   unsigned int ping_packet_count_send;
465   unsigned int ping_packet_count_recv;
466   unsigned int ping_consec_count;
467 
468   ipmipower_discover_state_t discover_state;
469   char hostname[MAXHOSTNAMELEN+1];
470   /* for oem power types ; extra arg passed in via "+extra" at end of hostname */
471   struct ipmipower_connection_extra_arg *extra_args;
472   struct sockaddr *srcaddr;
473   socklen_t srcaddrlen;
474   struct sockaddr_in srcaddr4;
475   struct sockaddr_in6 srcaddr6;
476   struct sockaddr *destaddr;
477   socklen_t destaddrlen;
478   struct sockaddr_in destaddr4;
479   struct sockaddr_in6 destaddr6;
480 
481   /* for eliminate option */
482   int skip;
483 };
484 
485 typedef struct ipmipower_powercmd *ipmipower_powercmd_t;
486 typedef struct ipmipower_connection *ipmipower_connection_t;
487 
488 enum ipmipower_argp_option_keys
489   {
490     IPMI_VERSION_KEY = 160,       /* legacy option */
491     RMCPDUMP_KEY = 161,
492 
493     ON_KEY = 'n',
494     OFF_KEY = 'f',
495     CYCLE_KEY = 'c',
496     RESET_KEY = 'r',
497     STAT_KEY = 's',
498     PULSE_KEY = 162,
499     SOFT_KEY = 163,
500     ON_IF_OFF_KEY = 164,
501     WAIT_UNTIL_OFF_KEY = 165,
502     WAIT_UNTIL_ON_KEY = 166,
503     OEM_POWER_TYPE_KEY = 167,
504 
505     RETRY_WAIT_TIMEOUT_KEY = 168,
506     RETRANSMISSION_WAIT_TIMEOUT_KEY = 169,
507     RETRY_BACKOFF_COUNT_KEY = 170,
508     RETRANSMISSION_BACKOFF_COUNT_KEY = 171,
509     PING_INTERVAL_KEY = 172,
510     PING_TIMEOUT_KEY = 173,
511     PING_PACKET_COUNT_KEY = 174,
512     PING_PERCENT_KEY = 175,
513     PING_CONSEC_COUNT_KEY = 176,
514   };
515 
516 struct ipmipower_arguments
517 {
518   struct common_cmd_args common_args;
519 #ifndef NDEBUG
520   int rmcpdump;
521 #endif /* NDEBUG */
522 
523   ipmipower_power_cmd_t powercmd;
524   int on_if_off;
525   int wait_until_on;
526   int wait_until_off;
527   oem_power_type_t oem_power_type;
528 
529   unsigned int retransmission_wait_timeout;
530   unsigned int retransmission_backoff_count;
531   unsigned int ping_interval;
532   unsigned int ping_timeout;
533   unsigned int ping_packet_count;
534   unsigned int ping_percent;
535   unsigned int ping_consec_count;
536 };
537 
538 #endif /* IPMIPOWER_H */
539