• G
    batman-adv: fix batadv_nc_random_weight_tq · fd0c42c4
    George Spelvin 提交于
    and change to pseudorandom numbers, as this is a traffic dithering
    operation that doesn't need crypto-grade.
    
    The previous code operated in 4 steps:
    
    1. Generate a random byte 0 <= rand_tq <= 255
    2. Multiply it by BATADV_TQ_MAX_VALUE - tq
    3. Divide by 255 (= BATADV_TQ_MAX_VALUE)
    4. Return BATADV_TQ_MAX_VALUE - rand_tq
    
    This would apperar to scale (BATADV_TQ_MAX_VALUE - tq) by a random
    value between 0/255 and 255/255.
    
    But!  The intermediate value between steps 3 and 4 is stored in a u8
    variable.  So it's truncated, and most of the time, is less than 255, after
    which the division produces 0.  Specifically, if tq is odd, the product is
    always even, and can never be 255.  If tq is even, there's exactly one
    random byte value that will produce a product byte of 255.
    
    Thus, the return value is 255 (511/512 of the time) or 254 (1/512
    of the time).
    
    If we assume that the truncation is a bug, and the code is meant to scale
    the input, a simpler way of looking at it is that it's returning a random
    value between tq and BATADV_TQ_MAX_VALUE, inclusive.
    
    Well, we have an optimized function for doing just that.
    
    Fixes: 3c12de9a ("batman-adv: network coding - code and transmit packets if possible")
    Signed-off-by: NGeorge Spelvin <lkml@sdf.org>
    Signed-off-by: NSven Eckelmann <sven@narfation.org>
    Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
    fd0c42c4
network-coding.c 57.8 KB