#include "CephxProtocol.h"
#include "auth/KeyRing.h"
+#include "include/random.h"
#include "common/config.h"
#include "common/dout.h"
}
CephXAuthenticate req;
- get_random_bytes((char *)&req.client_challenge, sizeof(req.client_challenge));
+ req.client_challenge = ceph::util::generate_random_number<uint64_t>();
std::string error;
cephx_calc_client_server_challenge(cct, secret, server_challenge,
req.client_challenge, &req.key, error);
#include <errno.h>
#include <sstream>
+#include "include/random.h"
#include "common/config.h"
#include "common/debug.h"
{
entity_name = name;
- get_random_bytes((char *)&server_challenge, sizeof(server_challenge));
- if (!server_challenge)
- server_challenge = 1; // always non-zero.
+ uint64_t min = 1; // always non-zero
+ uint64_t max = std::numeric_limits<uint64_t>::max();
+ server_challenge = ceph::util::generate_random_number<uint64_t>(min, max);
ldout(cct, 10) << "start_session server_challenge " << hex << server_challenge << dec << dendl;
CephXServerChallenge ch;
#include "include/ceph_features.h"
#include "include/compat.h"
+#include "include/random.h"
#include "common/config.h"
#include "common/strtol.h"
"MDS names may not start with a numeric digit." << dendl;
}
- uint64_t nonce = 0;
- get_random_bytes((char*)&nonce, sizeof(nonce));
+ auto nonce = ceph::util::generate_random_number<uint64_t>();
std::string public_msgr_type = g_conf->ms_public_type.empty() ? g_conf->get_val<std::string>("ms_type") : g_conf->ms_public_type;
Messenger *msgr = Messenger::create(g_ceph_context, public_msgr_type,
#define DAMAGE_TABLE_H_
#include "mdstypes.h"
-#include "auth/Crypto.h"
+#include "include/random.h"
class CDir;
DamageEntry()
{
- id = get_random(0, 0xffffffff);
+ id = ceph::util::generate_random_number<damage_entry_id_t>(0, 0xffffffff);
reported_at = ceph_clock_now();
}
Messenger *Messenger::create_client_messenger(CephContext *cct, string lname)
{
std::string public_msgr_type = cct->_conf->ms_public_type.empty() ? cct->_conf->get_val<std::string>("ms_type") : cct->_conf->ms_public_type;
- uint64_t nonce = 0;
- get_random_bytes((char*)&nonce, sizeof(nonce));
+ auto nonce = ceph::util::generate_random_number<uint64_t>();
return Messenger::create(cct, public_msgr_type, entity_name_t::CLIENT(),
std::move(lname), nonce, 0);
}
#include <unistd.h>
#include "include/Context.h"
+#include "include/random.h"
#include "common/errno.h"
#include "AsyncMessenger.h"
#include "AsyncConnection.h"
out_q.clear();
}
-int AsyncConnection::randomize_out_seq()
+void AsyncConnection::randomize_out_seq()
{
if (get_features() & CEPH_FEATURE_MSG_AUTH) {
- // Set out_seq to a random value, so CRC won't be predictable. Don't bother checking seq_error
- // here. We'll check it on the call. PLR
- uint64_t rand_seq;
- int seq_error = get_random_bytes((char *)&rand_seq, sizeof(rand_seq));
- rand_seq &= SEQ_MASK;
+ // Set out_seq to a random value, so CRC won't be predictable.
+ auto rand_seq = ceph::util::generate_random_number<uint64_t>(0, SEQ_MASK);
lsubdout(async_msgr->cct, ms, 10) << __func__ << " randomize_out_seq " << rand_seq << dendl;
out_seq = rand_seq;
- return seq_error;
} else {
// previously, seq #'s always started at 0.
out_seq = 0;
- return 0;
}
}
dispatch_queue->queue_remote_reset(this);
- if (randomize_out_seq()) {
- ldout(async_msgr->cct, 15) << __func__ << " could not get random bytes to set seq number for session reset; set seq number to " << out_seq << dendl;
- }
+ randomize_out_seq();
in_seq = 0;
connect_seq = 0;
void discard_out_queue();
void discard_requeued_up_to(uint64_t seq);
void requeue_sent();
- int randomize_out_seq();
+ void randomize_out_seq();
void handle_ack(uint64_t seq);
void _append_keepalive_or_ack(bool ack=false, utime_t *t=NULL);
ssize_t write_message(Message *m, bufferlist& bl, bool more);
// Below included to get encode_encrypt(); That probably should be in Crypto.h, instead
-#include "auth/Crypto.h"
#include "auth/cephx/CephxProtocol.h"
#include "auth/AuthSessionHandler.h"
#include "include/sock_compat.h"
+#include "include/random.h"
// Constant to limit starting sequence number to 2^31. Nothing special about it, just a big number. PLR
#define SEQ_MASK 0x7fffffff
connection_state->pipe = get();
}
- if (randomize_out_seq()) {
- lsubdout(msgr->cct,ms,15) << "Pipe(): Could not get random bytes to set seq number for session reset; set seq number to " << out_seq << dendl;
- }
-
+ randomize_out_seq();
msgr->timeout = msgr->cct->_conf->ms_tcp_read_timeout * 1000; //convert to ms
if (msgr->timeout == 0)
}
}
-int Pipe::randomize_out_seq()
+void Pipe::randomize_out_seq()
{
if (connection_state->get_features() & CEPH_FEATURE_MSG_AUTH) {
- // Set out_seq to a random value, so CRC won't be predictable. Don't bother checking seq_error
- // here. We'll check it on the call. PLR
- int seq_error = get_random_bytes((char *)&out_seq, sizeof(out_seq));
- out_seq &= SEQ_MASK;
+ // Set out_seq to a random value, so CRC won't be predictable.
+ out_seq = ceph::util::generate_random_number<uint64_t>(0, SEQ_MASK);
lsubdout(msgr->cct, ms, 10) << "randomize_out_seq " << out_seq << dendl;
- return seq_error;
} else {
// previously, seq #'s always started at 0.
out_seq = 0;
- return 0;
}
}
msgr->dispatch_queue.queue_remote_reset(connection_state.get());
- if (randomize_out_seq()) {
- lsubdout(msgr->cct,ms,15) << "was_session_reset(): Could not get random bytes to set seq number for session reset; set seq number to " << out_seq << dendl;
- }
+ randomize_out_seq();
in_seq = 0;
connect_seq = 0;
void writer();
void unlock_maybe_reap();
- int randomize_out_seq();
+ void randomize_out_seq();
int read_message(Message **pm,
AuthSessionHandler *session_security_copy);
#include "cls/lock/cls_lock_client.h"
-#include "auth/Crypto.h"
+#include "include/random.h"
#include <boost/asio/yield.hpp>
}
RGWDataSyncEnv sync_env_local = sync_env;
sync_env_local.http_manager = &http_manager;
- uint64_t instance_id;
- get_random_bytes((char *)&instance_id, sizeof(instance_id));
+ auto instance_id = ceph::util::generate_random_number<uint64_t>();
ret = crs.run(new RGWInitDataSyncStatusCoroutine(&sync_env_local, num_shards, instance_id, tn, &sync_status));
http_manager.stop();
return ret;
tn->log(20, SSTR("init"));
sync_status.sync_info.num_shards = num_shards;
uint64_t instance_id;
- get_random_bytes((char *)&instance_id, sizeof(instance_id));
+ instance_id = ceph::util::generate_random_number<uint64_t>();
yield call(new RGWInitDataSyncStatusCoroutine(sync_env, num_shards, instance_id, tn, &sync_status));
if (retcode < 0) {
tn->log(0, SSTR("ERROR: failed to init sync, retcode=" << retcode));
#include "cls/rgw/cls_rgw_client.h"
#include "cls/refcount/cls_refcount_client.h"
#include "cls/lock/cls_lock_client.h"
-#include "auth/Crypto.h"
+#include "include/random.h"
#include <list>
{
int max_secs = cct->_conf->rgw_gc_processor_max_time;
- unsigned start;
- int ret = get_random_bytes((char *)&start, sizeof(start));
- if (ret < 0)
- return ret;
+ const int start = ceph::util::generate_random_number(0, max_objs - 1);
for (int i = 0; i < max_objs; i++) {
int index = (i + start) % max_objs;
- ret = process(index, max_secs);
+ int ret = process(index, max_secs);
if (ret < 0)
return ret;
}
#include "common/Formatter.h"
#include <common/errno.h>
-#include "auth/Crypto.h"
+#include "include/random.h"
#include "cls/rgw/cls_rgw_client.h"
#include "cls/lock/cls_lock_client.h"
#include "rgw_common.h"
{
int max_secs = cct->_conf->rgw_lc_lock_max_time;
- unsigned start;
- int ret = get_random_bytes((char *)&start, sizeof(start));
- if (ret < 0)
- return ret;
+ const int start = ceph::util::generate_random_number(0, max_objs - 1);
for (int i = 0; i < max_objs; i++) {
int index = (i + start) % max_objs;
- ret = process(index, max_secs);
+ int ret = process(index, max_secs);
if (ret < 0)
return ret;
}
#include <atomic>
#include <list>
#include <map>
-#include "auth/Crypto.h" // get_random_bytes()
+#include "include/random.h"
#include "rgw_log.h"
}
}
- map<string, bufferlist>::iterator miter;
+ auto miter = m.begin();
if (m.size() > 1) {
- vector<string> v;
- for (miter = m.begin(); miter != m.end(); ++miter) {
- v.push_back(miter->first);
- }
-
- uint32_t r;
- ret = get_random_bytes((char *)&r, sizeof(r));
- if (ret < 0)
- return ret;
-
- int i = r % v.size();
- pool_name = v[i];
- } else {
- miter = m.begin();
- pool_name = miter->first;
+ // choose a pool at random
+ auto r = ceph::util::generate_random_number<size_t>(0, m.size() - 1);
+ std::advance(miter, r);
}
+ pool_name = miter->first;
rule_info->data_pool = pool_name;
rule_info->data_extra_pool = pool_name;
#include "common/ceph_crypto.h"
#include "common/Clock.h"
-#include "auth/Crypto.h"
+#include "include/random.h"
#include "rgw_client_io.h"
#include "rgw_http_client.h"
static int encode_token(CephContext *cct, string& swift_user, string& key,
bufferlist& bl)
{
- uint64_t nonce;
-
- int ret = get_random_bytes((char *)&nonce, sizeof(nonce));
- if (ret < 0)
- return ret;
+ const auto nonce = ceph::util::generate_random_number<uint64_t>();
utime_t expiration = ceph_clock_now();
expiration += cct->_conf->rgw_swift_token_expiration;
#include "common/TextTable.h"
#include "include/stringify.h"
#include "mds/inode_backtrace.h"
-#include "auth/Crypto.h"
+#include "include/random.h"
#include <iostream>
#include <fstream>
#include "RadosImport.h"
using namespace librados;
+using ceph::util::generate_random_number;
// two steps seem to be necessary to do this right
#define STR(x) _STR(x)
static const char alphanum_table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-int gen_rand_alphanumeric(char *dest, int size) /* size should be the required string size + 1 */
+void gen_rand_alphanumeric(char *dest, int size) /* size should be the required string size + 1 */
{
- int ret = get_random_bytes(dest, size);
- if (ret < 0) {
- cerr << "cannot get random bytes: " << cpp_strerror(ret) << std::endl;
- return -1;
- }
+ const int max = sizeof(alphanum_table) - 2;
int i;
for (i=0; i<size - 1; i++) {
- int pos = (unsigned)dest[i];
- dest[i] = alphanum_table[pos & 63];
+ int pos = generate_random_number(0, max);
+ dest[i] = alphanum_table[pos];
}
dest[i] = '\0';
-
- return 0;
}
struct obj_info {
gen_rand_alphanumeric(buf, 16);
info.name = "obj-";
info.name.append(buf);
- info.len = get_random(min_obj_len, max_obj_len);
+ info.len = generate_random_number(min_obj_len, max_obj_len);
// throttle...
while (completions.size() > max_ops) {
void LoadGen::gen_op(LoadGenOp *op)
{
- int i = get_random(0, objs.size() - 1);
+ int i = generate_random_number<int>(0, objs.size() - 1);
obj_info& info = objs[i];
op->oid = info.name;
- size_t len = get_random(min_op_len, max_op_len);
+ size_t len = generate_random_number(min_op_len, max_op_len);
if (len > info.len)
len = info.len;
- size_t off = get_random(0, info.len);
+ size_t off = generate_random_number<size_t>(0, info.len);
if (off + len > info.len)
off = info.len - len;
op->off = off;
op->len = len;
- i = get_random(1, 100);
+ i = generate_random_number(1, 100);
if (i > read_percent)
op->type = OP_WRITE;
else