xref: /linux-6.15/include/linux/if_arp.h (revision a4f39c9f)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * INET		An implementation of the TCP/IP protocol suite for the LINUX
41da177e4SLinus Torvalds  *		operating system.  INET is implemented using the  BSD Socket
51da177e4SLinus Torvalds  *		interface as the means of communication with the user level.
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  *		Global definitions for the ARP (RFC 826) protocol.
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * Version:	@(#)if_arp.h	1.0.1	04/16/93
101da177e4SLinus Torvalds  *
111da177e4SLinus Torvalds  * Authors:	Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988
121da177e4SLinus Torvalds  *		Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source.
1302c30a84SJesper Juhl  *		Ross Biro
141da177e4SLinus Torvalds  *		Fred N. van Kempen, <[email protected]>
151da177e4SLinus Torvalds  *		Florian La Roche,
161da177e4SLinus Torvalds  *		Jonathan Layes <[email protected]>
171da177e4SLinus Torvalds  *		Arnaldo Carvalho de Melo <[email protected]> ARPHRD_HWX25
181da177e4SLinus Torvalds  */
191da177e4SLinus Torvalds #ifndef _LINUX_IF_ARP_H
201da177e4SLinus Torvalds #define _LINUX_IF_ARP_H
211da177e4SLinus Torvalds 
22d0a92be0SArnaldo Carvalho de Melo #include <linux/skbuff.h>
23607ca46eSDavid Howells #include <uapi/linux/if_arp.h>
24d0a92be0SArnaldo Carvalho de Melo 
arp_hdr(const struct sk_buff * skb)25d0a92be0SArnaldo Carvalho de Melo static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
26d0a92be0SArnaldo Carvalho de Melo {
27d0a92be0SArnaldo Carvalho de Melo 	return (struct arphdr *)skb_network_header(skb);
28d0a92be0SArnaldo Carvalho de Melo }
29988b7050SPavel Emelyanov 
arp_hdr_len(const struct net_device * dev)306ade97daSAlexey Dobriyan static inline unsigned int arp_hdr_len(const struct net_device *dev)
31988b7050SPavel Emelyanov {
326752c8dbSYOSHIFUJI Hideaki / 吉藤英明 	switch (dev->type) {
336752c8dbSYOSHIFUJI Hideaki / 吉藤英明 #if IS_ENABLED(CONFIG_FIREWIRE_NET)
346752c8dbSYOSHIFUJI Hideaki / 吉藤英明 	case ARPHRD_IEEE1394:
356752c8dbSYOSHIFUJI Hideaki / 吉藤英明 		/* ARP header, device address and 2 IP addresses */
366752c8dbSYOSHIFUJI Hideaki / 吉藤英明 		return sizeof(struct arphdr) + dev->addr_len + sizeof(u32) * 2;
376752c8dbSYOSHIFUJI Hideaki / 吉藤英明 #endif
386752c8dbSYOSHIFUJI Hideaki / 吉藤英明 	default:
39988b7050SPavel Emelyanov 		/* ARP header, plus 2 device addresses, plus 2 IP addresses. */
40988b7050SPavel Emelyanov 		return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
41988b7050SPavel Emelyanov 	}
426752c8dbSYOSHIFUJI Hideaki / 吉藤英明 }
43c491680fSDaniel Borkmann 
dev_is_mac_header_xmit(const struct net_device * dev)44c491680fSDaniel Borkmann static inline bool dev_is_mac_header_xmit(const struct net_device *dev)
45c491680fSDaniel Borkmann {
46c491680fSDaniel Borkmann 	switch (dev->type) {
47c491680fSDaniel Borkmann 	case ARPHRD_TUNNEL:
48c491680fSDaniel Borkmann 	case ARPHRD_TUNNEL6:
49c491680fSDaniel Borkmann 	case ARPHRD_SIT:
50c491680fSDaniel Borkmann 	case ARPHRD_IPGRE:
51a3fa449fSGuillaume Nault 	case ARPHRD_IP6GRE:
52c491680fSDaniel Borkmann 	case ARPHRD_VOID:
53c491680fSDaniel Borkmann 	case ARPHRD_NONE:
543b707c30SMaciej Żenczykowski 	case ARPHRD_RAWIP:
554ee06de7SNicolas Dichtel 	case ARPHRD_PIMREG:
56*a4f39c9fSNicolas Dichtel 	/* PPP adds its l2 header automatically in ppp_start_xmit().
57*a4f39c9fSNicolas Dichtel 	 * This makes it look like an l3 device to __bpf_redirect() and tcf_mirred_init().
58*a4f39c9fSNicolas Dichtel 	 */
59*a4f39c9fSNicolas Dichtel 	case ARPHRD_PPP:
60c491680fSDaniel Borkmann 		return false;
61c491680fSDaniel Borkmann 	default:
62c491680fSDaniel Borkmann 		return true;
63c491680fSDaniel Borkmann 	}
64c491680fSDaniel Borkmann }
65c491680fSDaniel Borkmann 
661da177e4SLinus Torvalds #endif	/* _LINUX_IF_ARP_H */
67