selcommands.cpp (11b9c3b1bd22c6719868d3b5589640ab188a24f8) selcommands.cpp (c1921c637bb124538638bb99510771da3e497df8)
1/*
2 * Copyright (c) 2018 Intel Corporation.
3 * Copyright (c) 2018-present Facebook.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *

--- 311 unchanged lines hidden (view full) ---

320 int responseID = selObj.addEntry(ipmiRaw.c_str());
321 if (responseID < 0)
322 {
323 return ipmi::responseUnspecifiedError();
324 }
325 return ipmi::responseSuccess((uint16_t)responseID);
326}
327
1/*
2 * Copyright (c) 2018 Intel Corporation.
3 * Copyright (c) 2018-present Facebook.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *

--- 311 unchanged lines hidden (view full) ---

320 int responseID = selObj.addEntry(ipmiRaw.c_str());
321 if (responseID < 0)
322 {
323 return ipmi::responseUnspecifiedError();
324 }
325 return ipmi::responseSuccess((uint16_t)responseID);
326}
327
328ipmi::RspType<uint8_t> ipmiStorageClearSEL(uint16_t reservationID,
329 const std::array<uint8_t, 3> &clr,
330 uint8_t eraseOperation)
331{
332 if (!checkSELReservation(reservationID))
333 {
334 return ipmi::responseInvalidReservationId();
335 }
336
337 static constexpr std::array<uint8_t, 3> clrExpected = {'C', 'L', 'R'};
338 if (clr != clrExpected)
339 {
340 return ipmi::responseInvalidFieldRequest();
341 }
342
343 /* If there is no sel then return erase complete */
344 if (selObj.getCount() == 0)
345 {
346 return ipmi::responseSuccess(fb_oem::ipmi::sel::eraseComplete);
347 }
348
349 /* Erasure status cannot be fetched, so always return erasure
350 * status as `erase completed`.
351 */
352 if (eraseOperation == fb_oem::ipmi::sel::getEraseStatus)
353 {
354 return ipmi::responseSuccess(fb_oem::ipmi::sel::eraseComplete);
355 }
356
357 /* Check that initiate erase is correct */
358 if (eraseOperation != fb_oem::ipmi::sel::initiateErase)
359 {
360 return ipmi::responseInvalidFieldRequest();
361 }
362
363 /* Per the IPMI spec, need to cancel any reservation when the
364 * SEL is cleared
365 */
366 cancelSELReservation();
367
368 /* Clear the complete Sel Json object */
369 if (selObj.clear() < 0)
370 {
371 return ipmi::responseUnspecifiedError();
372 }
373
374 return ipmi::responseSuccess(fb_oem::ipmi::sel::eraseComplete);
375}
376
377ipmi::RspType<uint32_t> ipmiStorageGetSELTime()
378{
379 struct timespec selTime = {};
380
381 if (clock_gettime(CLOCK_REALTIME, &selTime) < 0)
382 {
383 return ipmi::responseUnspecifiedError();
384 }
385
386 return ipmi::responseSuccess(selTime.tv_sec);
387}
388
389ipmi::RspType<> ipmiStorageSetSELTime(uint32_t selTime)
390{
391 // Set SEL Time is not supported
392 return ipmi::responseInvalidCommand();
393}
394
395ipmi::RspType<uint16_t> ipmiStorageGetSELTimeUtcOffset()
396{
397 /* TODO: For now, the SEL time stamp is based on UTC time,
398 * so return 0x0000 as offset. Might need to change once
399 * supporting zones in SEL time stamps
400 */
401
402 uint16_t utcOffset = 0x0000;
403 return ipmi::responseSuccess(utcOffset);
404}
405
328void registerSELFunctions()
329{
330 // <Get SEL Info>
331 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
332 ipmi::storage::cmdGetSelInfo, ipmi::Privilege::User,
333 ipmiStorageGetSELInfo);
334
335 // <Get SEL Entry>
336 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
337 ipmi::storage::cmdGetSelEntry, ipmi::Privilege::User,
338 ipmiStorageGetSELEntry);
339
340 // <Add SEL Entry>
341 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
342 ipmi::storage::cmdAddSelEntry,
343 ipmi::Privilege::Operator, ipmiStorageAddSELEntry);
344
406void registerSELFunctions()
407{
408 // <Get SEL Info>
409 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
410 ipmi::storage::cmdGetSelInfo, ipmi::Privilege::User,
411 ipmiStorageGetSELInfo);
412
413 // <Get SEL Entry>
414 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
415 ipmi::storage::cmdGetSelEntry, ipmi::Privilege::User,
416 ipmiStorageGetSELEntry);
417
418 // <Add SEL Entry>
419 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
420 ipmi::storage::cmdAddSelEntry,
421 ipmi::Privilege::Operator, ipmiStorageAddSELEntry);
422
423 // <Clear SEL>
424 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
425 ipmi::storage::cmdClearSel, ipmi::Privilege::Operator,
426 ipmiStorageClearSEL);
427
428 // <Get SEL Time>
429 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
430 ipmi::storage::cmdGetSelTime, ipmi::Privilege::User,
431 ipmiStorageGetSELTime);
432
433 // <Set SEL Time>
434 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
435 ipmi::storage::cmdSetSelTime,
436 ipmi::Privilege::Operator, ipmiStorageSetSELTime);
437
438 // <Get SEL Time UTC Offset>
439 ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
440 ipmi::storage::cmdGetSelTimeUtcOffset,
441 ipmi::Privilege::User,
442 ipmiStorageGetSELTimeUtcOffset);
443
345 return;
346}
347
348} // namespace storage
349} // namespace ipmi
444 return;
445}
446
447} // namespace storage
448} // namespace ipmi