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