[Click] random bit errors element
Eddie Kohler
kohler at cs.ucla.edu
Mon Feb 27 14:08:55 EST 2006
Hi Alastair,
Thanks for the patch! You missed one important fix, around line 168, which
would need changes to produce a random number with 28 bits of randomness.
There are a few other places too. I've checked in a fixed (I hope) version
that seems to work. Thanks again!
Eddie
Alastair McKinley wrote:
> Hi everyone,
>
> I would like to use the RandomBitErrors element to produce a lower bit
> error rate than currently possible. At the moment its minimum bit error
> rate is 2x10-5. So I've been trying to figure out how this element
> works and unfortunately in my lameness, I haven't quite got to the
> bottom of it. I want to use 28 bits of fraction for the conversion of
> the bit error configuration string.
>
> I've made a guess at how it might work and attached a diff. Would
> someone be able to tell me if this will work correctly?
>
> Best regards and thanks,
>
> Alastair
>
>
>
>
> --- randomerror.cc.bak 2006-02-23 12:08:51.000000000 +0000
> +++ randomerror.cc 2006-02-23 13:54:23.000000000 +0000
> @@ -83,9 +83,9 @@
> void
> RandomBitErrors::set_bit_error(unsigned bit_error)
> {
> - assert(bit_error <= 0x10000);
> + assert(bit_error <= 0x10000000);
> _p_bit_error = bit_error;
> - unsigned non_bit_error = (0xFFFF - bit_error) + 1;
> + unsigned non_bit_error = (0xFFFFFFF - bit_error) + 1;
> // _p_error[i] is the probability that i bits are flipped.
> // _p_error[i] = bit_error^i * (1-bit_error)^(8-i) * #combinations
>
> @@ -93,13 +93,13 @@
> for (int i = 0; i < 9; i++) {
> uint64_t p = 0x100000000LL;
> for (int j = 0; j < i; j++)
> - p = (p * bit_error) >> 16;
> + p = (p * bit_error) >> 28;
> for (int j = i; j < 8; j++)
> - p = (p * non_bit_error) >> 16;
> + p = (p * non_bit_error) >> 28;
> // account for # of combinations
> p *= bit_flip_array_idx[i+1] - bit_flip_array_idx[i];
> accum += p;
> - _p_error[i] = (accum >> 16) & 0x1FFFF;
> + _p_error[i] = (accum >> 28) & 0x1FFFFFFF;
> if ((accum & 0xFFFFFFFF) >= 0x80000000)
> _p_error[i]++;
> }
> @@ -112,7 +112,7 @@
> String kind_str = "flip";
> bool on = true;
> if (cp_va_parse(conf, this, errh,
> - cpUnsignedReal2, "bit error probability", 16, &bit_error,
> + cpUnsignedReal2, "bit error probability", 28, &bit_error,
> cpOptional,
> cpString, "action (set/clear/flip)", &kind_str,
> cpBool, "active?", &on,
> @@ -130,7 +130,7 @@
> return errh->error("bad action '%s' (must be 'set', 'clear', or 'flip')",
> kind_str.c_str());
>
> - if (bit_error > 0x10000)
> + if (bit_error > 0x10000000)
> return errh->error("drop probability must be between 0 and 1");
> if (bit_error == 0)
> errh->warning("zero bit error probability (underflow?)");
> @@ -147,7 +147,7 @@
> RandomBitErrors::simple_action(Packet *p_in)
> {
> // if no chance we'll flip a bit, return now
> - if (!_on || _p_error[0] >= 0x10000)
> + if (!_on || _p_error[0] >= 0x10000000)
> return p_in;
>
> WritablePacket *p = p_in->uniqueify();
> @@ -184,7 +184,7 @@
> int which = (intptr_t)vwhich;
> RandomBitErrors *lossage = (RandomBitErrors *)f;
> if (which == 0)
> - return cp_unparse_real2(lossage->p_bit_error(), 16);
> + return cp_unparse_real2(lossage->p_bit_error(), 28);
> else if (which == 1) {
> switch (lossage->kind()) {
> case 0: return "clear";
>
>
>
>
>
>
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list