xref: /xnu-10002.81.5/bsd/netinet/in_arp.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 2009-2013 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _NETINET_IN_ARP_H_
30 #define _NETINET_IN_ARP_H_
31 #ifdef KERNEL
32 #include <sys/kernel_types.h>
33 
34 struct sockaddr;
35 struct sockaddr_dl;
36 struct sockaddr_in;
37 
38 /*!
39  *	@function inet_arp_lookup
40  *	@discussion This function will check the routing table for a cached
41  *		arp entry or trigger an arp query to resolve the ip address to a
42  *		link-layer address.
43  *
44  *		Arp entries are stored in the routing table. This function will
45  *		lookup the ip destination in the routing table. If the
46  *		destination requires forwarding to a gateway, the route of the
47  *		gateway will be looked up. The route entry is inspected to
48  *		determine if the link layer destination address is known. If
49  *		unknown, the arp generation function for IP attached to the
50  *		interface is called to create an arp request packet.
51  *	@param interface The interface the packet is being sent on.
52  *	@param ip_dest The ip destination of the packet.
53  *	@param ll_dest On output, the link-layer destination.
54  *	@param ll_dest_len The length of the buffer for ll_dest.
55  *	@param hint Any routing hint passed down from the protocol.
56  *	@param packet The packet being transmitted.
57  *	@result May return an error such as EHOSTDOWN or ENETUNREACH. If
58  *		this function returns EJUSTRETURN, the packet has been queued
59  *		and will be sent when an arp response is received. If any other
60  *		value is returned, the caller is responsible for disposing of
61  *		the packet.
62  */
63 #ifdef BSD_KERNEL_PRIVATE
64 extern boolean_t arp_is_entry_probing(route_t p_route);
65 extern errno_t arp_lookup_ip(ifnet_t interface,
66     const struct sockaddr_in *ip_dest, struct sockaddr_dl *ll_dest,
67     size_t ll_dest_len, route_t hint, mbuf_t packet);
68 #define inet_arp_lookup arp_lookup_ip
69 #else
70 extern errno_t inet_arp_lookup(ifnet_t interface,
71     const struct sockaddr_in *ip_dest, struct sockaddr_dl *ll_dest,
72     size_t ll_dest_len, route_t hint, mbuf_t packet);
73 #endif /* !BSD_KERNEL_PRIVATE */
74 
75 /*!
76  *	@function inet_arp_handle_input
77  *	@discussion This function should be called by code that handles
78  *		inbound arp packets. The caller should parse the ARP packet to
79  *		pull out the operation and the relevant addresses. If a response
80  *		is required, the proto_media_send_arp function will be called.
81  *
82  *		This function will lookup the sender in the routing table and
83  *		add an arp entry if necessary. Any queued packets waiting for
84  *		the arp resolution will also be transmitted.
85  *	@param interface The interface the packet was received on.
86  *	@param arp_op The arp operation, ARPOP_REQUEST or ARPOP_REPLY
87  *	@param sender_hw The sender hardware address from the arp payload.
88  *	@param sender_ip The sender IP address from the arp payload.
89  *	@param target_ip The target IP address from the arp payload.
90  *	@result 0 on success or an errno error value on failure.
91  */
92 #ifdef BSD_KERNEL_PRIVATE
93 extern errno_t arp_ip_handle_input(ifnet_t ifp, u_int16_t arpop,
94     const struct sockaddr_dl *sender_hw, const struct sockaddr_in *sender_ip,
95     const struct sockaddr_in *target_ip);
96 #define inet_arp_handle_input arp_ip_handle_input
97 #else
98 extern errno_t inet_arp_handle_input(ifnet_t ifp, u_int16_t arpop,
99     const struct sockaddr_dl *sender_hw, const struct sockaddr_in *sender_ip,
100     const struct sockaddr_in *target_ip);
101 #endif /* !BSD_KERNEL_PRIVATE */
102 
103 /*!
104  *	@function inet_arp_init_ifaddr
105  *	@discussion This function should be called in two places, when an IP
106  *		address is added and when the hardware address changes. This
107  *		function will setup the ifaddr_t for use with the IP ARP
108  *		functions. This function will also trigger the transmission of a
109  *		gratuitous ARP packet.
110  *
111  *		When the SIOCSIFADDR ioctl is handled, the data parameter will
112  *		be an ifaddr_t. If this is an IP address, inet_arp_init_ifaddr
113  *		should be called. This is usually performed in the protocol
114  *		attachment's ioctl handler.
115  *
116  *		When the event handler for the protocol attachment receives a
117  *		KEV_DL_LINK_ADDRESS_CHANGED event, the event handler should call
118  *		inet_arp_init_ifaddr for each interface ip address.
119  *
120  *		For an example, see bsd/net/ether_inet_pr_module.c in xnu.
121  *		Search for inet_arp_init_ifaddr.
122  *	@param interface The interface the packet was received on.
123  *	@param ipaddr The ip interface address.
124  */
125 #ifdef BSD_KERNEL_PRIVATE
126 /* inet_arp_init_ifaddr is aliased to arp_ifinit (if_ether.h) */
127 #define inet_arp_init_ifaddr    arp_ifinit
128 #else
129 extern void inet_arp_init_ifaddr(ifnet_t interface, ifaddr_t ipaddr);
130 #endif /* !BSD_KERNEL_PRIVATE */
131 
132 #ifdef BSD_KERNEL_PRIVATE
133 extern void arp_init(void);
134 extern void in_arpdrain(void *);
135 extern void arp_llreach_set_reachable(struct ifnet *, void *, unsigned int);
136 #endif /* BSD_KERNEL_PRIVATE */
137 #endif /* KERNEL */
138 #endif /* _NETINET_IN_ARP_H_ */
139