/** https://tools.ietf.org/html/rfc3315#section-17.2.2 */
  @Override
  protected Dhcp6Message advertise(
      final Dhcp6RequestContext requestContext, final Dhcp6Message incomingMsg)
      throws Dhcp6Exception {
    Dhcp6Message reply = createReply(incomingMsg);
    reply.setMessageType(Dhcp6MessageType.DHCP_ADVERTISE);

    final Dhcp6Message lease = leaseManager.lease(requestContext, incomingMsg, reply);

    leaseManager.requestInformation(requestContext, incomingMsg, reply);

    return lease;
  }
  /** https://tools.ietf.org/html/rfc3315#section-18.2.3 */
  @Override
  protected Dhcp6Message renew(
      final Dhcp6RequestContext requestContext, final Dhcp6Message incomingMsg)
      throws Dhcp6Exception {
    Dhcp6Message reply = createReply(incomingMsg);

    final Dhcp6Message renew = leaseManager.renew(requestContext, incomingMsg, reply);

    // The server includes other options containing configuration
    // information to be returned to the client as described in section 18.2.
    leaseManager.requestInformation(requestContext, incomingMsg, renew);

    return renew;
  }
  /** https://tools.ietf.org/html/rfc3315#section-18.2.7 */
  @Override
  protected Dhcp6Message decline(
      final Dhcp6RequestContext requestContext, final Dhcp6Message incomingMsg)
      throws Dhcp6Exception {
    final Dhcp6Message reply = createReply(incomingMsg);

    return leaseManager.decline(requestContext, incomingMsg, reply);
  }
 /** Handle message with no specific handler implemented */
 @Override
 @Nullable
 protected Dhcp6Message handle(
     final Dhcp6RequestContext requestContext, final Dhcp6Message incomingMsg)
     throws Dhcp6Exception {
   // Delegate full handling of unknown message to lease manager
   return leaseManager.handle(requestContext, incomingMsg);
 }
  /** https://tools.ietf.org/html/rfc3315#section-18.2.5 */
  @Override
  protected Dhcp6Message requestInformation(
      final Dhcp6RequestContext requestContext, final Dhcp6Message incomingMsg)
      throws Dhcp6Exception {
    Dhcp6Message reply = createGenericReply(incomingMsg, Dhcp6MessageType.DHCP_REPLY);

    if (incomingMsg.getOptions().contains(ClientIdOption.class)) {
      reply.getOptions().add(incomingMsg.getOptions().get(ClientIdOption.class));
    }

    return leaseManager.requestInformation(requestContext, incomingMsg, reply);
  }