private GearmanPacket generateCanDoPacket(FunctionDefinition def) {
    GearmanPacketType pt = GearmanPacketType.CAN_DO;
    byte[] data = null;
    byte[] name = ByteUtils.toUTF8Bytes(def.getFactory().getFunctionName());
    long timeout = def.getTimeout();

    if (timeout > 0) {
      pt = GearmanPacketType.CAN_DO_TIMEOUT;
      byte[] to = ByteUtils.toUTF8Bytes(String.valueOf(timeout));
      data = new byte[name.length + to.length + 1];
      System.arraycopy(name, 0, data, 0, name.length);
      data[name.length] = ByteUtils.NULL;
      System.arraycopy(to, 0, data, name.length + 1, to.length);
    } else {
      data = name;
    }
    return new GearmanPacketImpl(GearmanPacketMagic.REQ, pt, data);
  }