18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* linux/net/inet/arp.h */ 38c2ecf20Sopenharmony_ci#ifndef _ARP_H 48c2ecf20Sopenharmony_ci#define _ARP_H 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/if_arp.h> 78c2ecf20Sopenharmony_ci#include <linux/hash.h> 88c2ecf20Sopenharmony_ci#include <net/neighbour.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ciextern struct neigh_table arp_tbl; 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic inline u32 arp_hashfn(const void *pkey, const struct net_device *dev, u32 *hash_rnd) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci u32 key = *(const u32 *)pkey; 168c2ecf20Sopenharmony_ci u32 val = key ^ hash32_ptr(dev); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci return val * hash_rnd[0]; 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#ifdef CONFIG_INET 228c2ecf20Sopenharmony_cistatic inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) 258c2ecf20Sopenharmony_ci key = INADDR_ANY; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci return ___neigh_lookup_noref(&arp_tbl, neigh_key_eq32, arp_hashfn, &key, dev); 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci#else 308c2ecf20Sopenharmony_cistatic inline 318c2ecf20Sopenharmony_cistruct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci return NULL; 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci#endif 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic inline struct neighbour *__ipv4_neigh_lookup(struct net_device *dev, u32 key) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci struct neighbour *n; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci rcu_read_lock_bh(); 428c2ecf20Sopenharmony_ci n = __ipv4_neigh_lookup_noref(dev, key); 438c2ecf20Sopenharmony_ci if (n && !refcount_inc_not_zero(&n->refcnt)) 448c2ecf20Sopenharmony_ci n = NULL; 458c2ecf20Sopenharmony_ci rcu_read_unlock_bh(); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci return n; 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic inline void __ipv4_confirm_neigh(struct net_device *dev, u32 key) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci struct neighbour *n; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci rcu_read_lock_bh(); 558c2ecf20Sopenharmony_ci n = __ipv4_neigh_lookup_noref(dev, key); 568c2ecf20Sopenharmony_ci if (n) { 578c2ecf20Sopenharmony_ci unsigned long now = jiffies; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci /* avoid dirtying neighbour */ 608c2ecf20Sopenharmony_ci if (READ_ONCE(n->confirmed) != now) 618c2ecf20Sopenharmony_ci WRITE_ONCE(n->confirmed, now); 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci rcu_read_unlock_bh(); 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_civoid arp_init(void); 678c2ecf20Sopenharmony_ciint arp_ioctl(struct net *net, unsigned int cmd, void __user *arg); 688c2ecf20Sopenharmony_civoid arp_send(int type, int ptype, __be32 dest_ip, 698c2ecf20Sopenharmony_ci struct net_device *dev, __be32 src_ip, 708c2ecf20Sopenharmony_ci const unsigned char *dest_hw, 718c2ecf20Sopenharmony_ci const unsigned char *src_hw, const unsigned char *th); 728c2ecf20Sopenharmony_ciint arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir); 738c2ecf20Sopenharmony_civoid arp_ifdown(struct net_device *dev); 748c2ecf20Sopenharmony_ciint arp_invalidate(struct net_device *dev, __be32 ip, bool force); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistruct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, 778c2ecf20Sopenharmony_ci struct net_device *dev, __be32 src_ip, 788c2ecf20Sopenharmony_ci const unsigned char *dest_hw, 798c2ecf20Sopenharmony_ci const unsigned char *src_hw, 808c2ecf20Sopenharmony_ci const unsigned char *target_hw); 818c2ecf20Sopenharmony_civoid arp_xmit(struct sk_buff *skb); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#endif /* _ARP_H */ 84