@Override
  public void consume(DataUnit dataUnit) {
    super.consume(dataUnit);
    if (!dataUnit.isIntact()) {
      return;
    }

    switch (dataUnit.getNid().getDuid().getId()) {
      case Duid.ID_TRUNK_SIGNALING:
        ((TrunkSignalDataUnit) dataUnit)
            .getBlocks()
            .forEach(
                block -> {
                  channelIdMap.consume(block);

                  switch (block.getOpCode()) {
                    case TrunkSignalBlock.GROUP_VOICE_CHAN_GRANT:
                      followGroupChannelGrant((GroupVoiceChannelGrant) block);
                      break;

                    case TrunkSignalBlock.GROUP_VOICE_CHAN_GRANT_UPDATE_EXPLICIT:
                      followGroupChannelGrantExplicit((GroupVoiceChannelGrantUpdateExplicit) block);
                      break;
                  }
                });
        break;
    }
  }
  private void followGroupChannelGrantExplicit(GroupVoiceChannelGrantUpdateExplicit grant) {
    Integer channelId = grant.getTransmitId();
    Optional<IdUpdateBlock> idBlock = channelIdMap.getBlockForId(channelId);

    if (!idBlock.isPresent()) {
      log.debug(
          followRequest.getChannelId()
              + " unable to process voice channel grant, id map missing "
              + channelId);
    } else {
      sendRequest(buildCaptureRequest(grant, grant.getDownlinkFreq(idBlock.get())));
    }
  }