2005-04-17 02:20:36 +04:00
/* linux/net/inet/arp.h */
# ifndef _ARP_H
# define _ARP_H
# include <linux/if_arp.h>
2012-08-09 01:52:28 +04:00
# include <linux/hash.h>
2005-04-17 02:20:36 +04:00
# include <net/neighbour.h>
extern struct neigh_table arp_tbl ;
2011-07-11 12:37:28 +04:00
static inline u32 arp_hashfn ( u32 key , const struct net_device * dev , u32 hash_rnd )
{
2012-08-09 01:52:28 +04:00
u32 val = key ^ hash32_ptr ( dev ) ;
2011-07-11 12:37:28 +04:00
return val * hash_rnd ;
}
2012-07-02 13:02:15 +04:00
static inline struct neighbour * __ipv4_neigh_lookup_noref ( struct net_device * dev , u32 key )
2011-07-12 02:44:24 +04:00
{
2012-07-02 13:02:15 +04:00
struct neigh_hash_table * nht = rcu_dereference_bh ( arp_tbl . nht ) ;
2011-07-12 02:44:24 +04:00
struct neighbour * n ;
u32 hash_val ;
2011-12-29 00:06:58 +04:00
hash_val = arp_hashfn ( key , dev , nht - > hash_rnd [ 0 ] ) > > ( 32 - nht - > hash_shift ) ;
2011-07-12 02:44:24 +04:00
for ( n = rcu_dereference_bh ( nht - > hash_buckets [ hash_val ] ) ;
n ! = NULL ;
n = rcu_dereference_bh ( n - > next ) ) {
2012-07-02 13:02:15 +04:00
if ( n - > dev = = dev & & * ( u32 * ) n - > primary_key = = key )
return n ;
2011-07-12 02:44:24 +04:00
}
2012-07-02 13:02:15 +04:00
return NULL ;
}
static inline struct neighbour * __ipv4_neigh_lookup ( struct net_device * dev , u32 key )
{
struct neighbour * n ;
rcu_read_lock_bh ( ) ;
n = __ipv4_neigh_lookup_noref ( dev , key ) ;
if ( n & & ! atomic_inc_not_zero ( & n - > refcnt ) )
n = NULL ;
2011-07-12 02:44:24 +04:00
rcu_read_unlock_bh ( ) ;
return n ;
}
2013-08-01 04:31:35 +04:00
void arp_init ( void ) ;
int arp_find ( unsigned char * haddr , struct sk_buff * skb ) ;
int arp_ioctl ( struct net * net , unsigned int cmd , void __user * arg ) ;
void arp_send ( int type , int ptype , __be32 dest_ip ,
struct net_device * dev , __be32 src_ip ,
const unsigned char * dest_hw ,
const unsigned char * src_hw , const unsigned char * th ) ;
int arp_mc_map ( __be32 addr , u8 * haddr , struct net_device * dev , int dir ) ;
void arp_ifdown ( struct net_device * dev ) ;
2005-04-17 02:20:36 +04:00
2013-08-01 04:31:35 +04:00
struct sk_buff * arp_create ( int type , int ptype , __be32 dest_ip ,
struct net_device * dev , __be32 src_ip ,
const unsigned char * dest_hw ,
const unsigned char * src_hw ,
const unsigned char * target_hw ) ;
void arp_xmit ( struct sk_buff * skb ) ;
2011-01-08 16:57:12 +03:00
int arp_invalidate ( struct net_device * dev , __be32 ip ) ;
2005-04-17 02:20:36 +04:00
# endif /* _ARP_H */