diff options
Diffstat (limited to 'net/ipv6/xfrm6_tunnel.c')
| -rw-r--r-- | net/ipv6/xfrm6_tunnel.c | 35 | 
1 files changed, 16 insertions, 19 deletions
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index 2969cad408d..1c66465a42d 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c @@ -12,8 +12,7 @@   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + * along with this program; if not, see <http://www.gnu.org/licenses/>.   *   * Authors	Mitsuru KANDA  <mk@linux-ipv6.org>   * 		YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> @@ -68,11 +67,11 @@ static DEFINE_SPINLOCK(xfrm6_tunnel_spi_lock);  static struct kmem_cache *xfrm6_tunnel_spi_kmem __read_mostly; -static inline unsigned xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr) +static inline unsigned int xfrm6_tunnel_spi_hash_byaddr(const xfrm_address_t *addr)  { -	unsigned h; +	unsigned int h; -	h = (__force u32)(addr->a6[0] ^ addr->a6[1] ^ addr->a6[2] ^ addr->a6[3]); +	h = ipv6_addr_hash((const struct in6_addr *)addr);  	h ^= h >> 16;  	h ^= h >> 8;  	h &= XFRM6_TUNNEL_SPI_BYADDR_HSIZE - 1; @@ -80,28 +79,27 @@ static inline unsigned xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr)  	return h;  } -static inline unsigned xfrm6_tunnel_spi_hash_byspi(u32 spi) +static inline unsigned int xfrm6_tunnel_spi_hash_byspi(u32 spi)  {  	return spi % XFRM6_TUNNEL_SPI_BYSPI_HSIZE;  } -static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr) +static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr)  {  	struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);  	struct xfrm6_tunnel_spi *x6spi; -	struct hlist_node *pos; -	hlist_for_each_entry_rcu(x6spi, pos, +	hlist_for_each_entry_rcu(x6spi,  			     &xfrm6_tn->spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)],  			     list_byaddr) { -		if (memcmp(&x6spi->addr, saddr, sizeof(x6spi->addr)) == 0) +		if (xfrm6_addr_equal(&x6spi->addr, saddr))  			return x6spi;  	}  	return NULL;  } -__be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr) +__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr)  {  	struct xfrm6_tunnel_spi *x6spi;  	u32 spi; @@ -120,9 +118,8 @@ static int __xfrm6_tunnel_spi_check(struct net *net, u32 spi)  	struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);  	struct xfrm6_tunnel_spi *x6spi;  	int index = xfrm6_tunnel_spi_hash_byspi(spi); -	struct hlist_node *pos; -	hlist_for_each_entry(x6spi, pos, +	hlist_for_each_entry(x6spi,  			     &xfrm6_tn->spi_byspi[index],  			     list_byspi) {  		if (x6spi->spi == spi) @@ -203,15 +200,15 @@ static void xfrm6_tunnel_free_spi(struct net *net, xfrm_address_t *saddr)  {  	struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);  	struct xfrm6_tunnel_spi *x6spi; -	struct hlist_node *pos, *n; +	struct hlist_node *n;  	spin_lock_bh(&xfrm6_tunnel_spi_lock); -	hlist_for_each_entry_safe(x6spi, pos, n, +	hlist_for_each_entry_safe(x6spi, n,  				  &xfrm6_tn->spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)],  				  list_byaddr)  	{ -		if (memcmp(&x6spi->addr, saddr, sizeof(x6spi->addr)) == 0) { +		if (xfrm6_addr_equal(&x6spi->addr, saddr)) {  			if (atomic_dec_and_test(&x6spi->refcnt)) {  				hlist_del_rcu(&x6spi->list_byaddr);  				hlist_del_rcu(&x6spi->list_byspi); @@ -237,11 +234,11 @@ static int xfrm6_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)  static int xfrm6_tunnel_rcv(struct sk_buff *skb)  {  	struct net *net = dev_net(skb->dev); -	struct ipv6hdr *iph = ipv6_hdr(skb); +	const struct ipv6hdr *iph = ipv6_hdr(skb);  	__be32 spi; -	spi = xfrm6_tunnel_spi_lookup(net, (xfrm_address_t *)&iph->saddr); -	return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi) > 0 ? : 0; +	spi = xfrm6_tunnel_spi_lookup(net, (const xfrm_address_t *)&iph->saddr); +	return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi);  }  static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  | 
