code: def _send_and_receive(self, target, lun, netfn, cmdid, payload):
          
          self._inc_sequence_number()
  
          # assemble IPMB header
          header = IpmbHeaderReq()
          header.netfn = netfn
          header.rs_lun = lun
          header.rs_sa = target.ipmb_address
          header.rq_seq = self.next_sequence_number
          header.rq_lun = 0
          header.rq_sa = self.slave_address
          header.cmd_id = cmdid
  
          retries = 0
          while retries < self.max_retries:
              try:
                  self._send_raw(header, payload)
                  rx_data = self._receive_raw(header)
                  break
              except IpmiTimeoutError:
                  log().warning('I2C transaction timed out'),
  
              retries += 1
  
          else:
              raise IpmiTimeoutError()
  
          return rx_data.tostring()[5:-1]
docs: Send and receive data using aardvark interface.
  
          target:
          lun:
          netfn:
          cmdid:
          payload: IPMI message payload as bytestring
  
          Returns the received data as bytestring