CycloneTechnology/ChaMP

View on GitHub
champ-ipmi/src/main/scala/com/cyclone/ipmi/command/oem/dell/GetSystemInfoParametersEx.scala

Summary

Maintainability
A
0 mins
Test Coverage
package com.cyclone.ipmi.command.oem.dell

import akka.util.{ByteString, ByteStringBuilder}
import com.cyclone.ipmi.codec._
import com.cyclone.ipmi.command.{CommandCode, NetworkFunction, StatusCodeTranslator}
import com.cyclone.ipmi.command.ipmiMessagingSupport.GetSystemInfoParameters.ParameterSelector
import com.cyclone.ipmi.command.ipmiMessagingSupport.ParameterRevision
import com.cyclone.ipmi.protocol.packet.{CommandResultCodec, IpmiCommandResult, IpmiStandardCommand}

/**
  * Extension to GetSystemInfoParameters command for getting 11G/12G Mac addresses
  * (selector param 0xda) (anything else?). Includes two extra bytes in the command:
  *
  * byte 5 : offset into data to read
  * byte 6 : length of data to read
  */
object GetSystemInfoParametersEx {

  object CommandResult {
    implicit val decoder: Decoder[CommandResult] = new Decoder[CommandResult] {

      def decode(data: ByteString): CommandResult = {
        val iterator = data.iterator
        val is = iterator.asInputStream

        val parameterRevision = is.readByte.as[ParameterRevision]

        val responseData = iterator.toByteString

        CommandResult(parameterRevision, responseData)
      }
    }

    implicit val statusCodeTranslator: StatusCodeTranslator[CommandResult] =
      StatusCodeTranslator[CommandResult]()
  }

  case class CommandResult(parameterRevision: ParameterRevision, responseData: ByteString) extends IpmiCommandResult

  object Command {
    implicit val coder: Coder[Command] = new Coder[Command] {

      def encode(request: Command): ByteString = {
        import request._

        val b = new ByteStringBuilder

        b += 0x00.toByte // bit7 0b = Get Parameter, 1b = Get Parameter Revision Only, bits0to6 - reserved
        b ++= parameterSelector.toBin
        b += setSelector.toByte
        b += blockSelector.toByte
        b += readOffset.toByte
        b += readLength.toByte

        b.result()
      }
    }

    implicit val codec: CommandResultCodec[Command, CommandResult] =
      CommandResultCodec.commandResultCodecFor[Command, CommandResult]
  }

  // TODO if used other than for macs make generic as have in main GetSystemInfoParameters command?
  case class Command(
    parameterSelector: ParameterSelector,
    readOffset: Int = 0,
    readLength: Int = 0,
    setSelector: Int = 0,
    blockSelector: Int = 0
  ) extends IpmiStandardCommand {

    val networkFunction: NetworkFunction = NetworkFunction.ApplicationRequest
    val commandCode = CommandCode(0x59)
  }

}