The port rover should not get overwritten when using random mode,
otherwise other rules will also use more or less random ports.
Signed-off-by: Patrick McHardy <kaber@trash.net>
{
unsigned int range_size, min, i;
__be16 *portptr;
{
unsigned int range_size, min, i;
__be16 *portptr;
if (maniptype == IP_NAT_MANIP_SRC)
portptr = &tuple->src.u.all;
if (maniptype == IP_NAT_MANIP_SRC)
portptr = &tuple->src.u.all;
range_size = ntohs(range->max.all) - min + 1;
}
range_size = ntohs(range->max.all) - min + 1;
}
if (range->flags & IP_NAT_RANGE_PROTO_RANDOM)
if (range->flags & IP_NAT_RANGE_PROTO_RANDOM)
- for (i = 0; i < range_size; i++, (*rover)++) {
- *portptr = htons(min + *rover % range_size);
- if (!nf_nat_used_tuple(tuple, ct))
- return 1;
+ for (i = 0; i < range_size; i++, off++) {
+ *portptr = htons(min + off % range_size);
+ if (nf_nat_used_tuple(tuple, ct))
+ continue;
+ if (!(range->flags & IP_NAT_RANGE_PROTO_RANDOM))
+ *rover = off;
+ return 1;