Skip to content

Commit

Permalink
ipv4: Avoid use of signed integers in fib_trie code.
Browse files Browse the repository at this point in the history
GCC emits all kinds of crazy zero extensions when we go from signed
int, to unsigned short, etc. etc.

This transformation has to be legal because:

1) In tkey_extract_bits() in mask_pfx(), the values are used to
   perform shifts, on which negative values are undefined by C.

2) In fib_table_lookup() we perform comparisons with unsigned
   values, constants, and additions.  None of which should
   encounter negative values.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Feb 17, 2011
1 parent 3c7bd1a commit 3b00456
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions net/ipv4/fib_trie.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,12 +217,12 @@ static inline int tnode_child_length(const struct tnode *tn)
return 1 << tn->bits;
}

static inline t_key mask_pfx(t_key k, unsigned short l)
static inline t_key mask_pfx(t_key k, unsigned int l)
{
return (l == 0) ? 0 : k >> (KEYLENGTH-l) << (KEYLENGTH-l);
}

static inline t_key tkey_extract_bits(t_key a, int offset, int bits)
static inline t_key tkey_extract_bits(t_key a, unsigned int offset, unsigned int bits)
{
if (offset < KEYLENGTH)
return ((t_key)(a << offset)) >> (KEYLENGTH - bits);
Expand Down Expand Up @@ -1378,11 +1378,11 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
int ret;
struct rt_trie_node *n;
struct tnode *pn;
int pos, bits;
unsigned int pos, bits;
t_key key = ntohl(flp->fl4_dst);
int chopped_off;
unsigned int chopped_off;
t_key cindex = 0;
int current_prefix_length = KEYLENGTH;
unsigned int current_prefix_length = KEYLENGTH;
struct tnode *cn;
t_key pref_mismatch;

Expand Down

0 comments on commit 3b00456

Please sign in to comment.