xref: /illumos-gate/usr/src/uts/common/inet/ip_arp.h (revision 21ad40f5447a73ac8a7ed2b9b66dd73ff1b088c1)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef _IP_ARP_H
27 #define	_IP_ARP_H
28 
29 /*
30  * Data-structures and functions related to the IP STREAMS queue that handles
31  * packets with the SAP set to 0x806 (ETHERTYPE_ARP).
32  */
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include <sys/types.h>
39 #include <inet/ip.h>
40 #include <inet/ip_ndp.h>
41 #include <sys/stream.h>
42 
43 #ifdef _KERNEL
44 extern struct streamtab dummymodinfo;
45 
46 struct arl_ill_common_s;
47 /*
48  * The arl_s structure tracks the state of the associated ARP stream.
49  */
50 typedef struct arl_s {
51 	queue_t		*arl_rq;
52 	queue_t		*arl_wq;
53 	ip_stack_t	*arl_ipst;
54 	zoneid_t	arl_zoneid;
55 	cred_t		*arl_credp;
56 	ip_m_t		arl_media;
57 	struct arl_ill_common_s *arl_common;
58 	int		arl_muxid;
59 	uint_t		arl_ppa;
60 	t_uscalar_t	arl_sap;
61 	t_uscalar_t	arl_sap_length;
62 	uint_t	arl_phys_addr_length;
63 	char		*arl_name;
64 	int		arl_name_length;
65 	t_uscalar_t	arl_mactype;
66 #define	arl_first_mp_to_free	arl_dlpi_deferred
67 	mblk_t		*arl_dlpi_deferred;
68 	mblk_t		*arl_unbind_mp;
69 	mblk_t		*arl_detach_mp;
70 #define	arl_last_mp_to_free	arl_detach_mp
71 	uint_t		arl_state_flags;
72 	uint_t
73 		arl_needs_attach:1,
74 		arl_dlpi_style_set:1,
75 		arl_pad_to_bit_31:30;
76 	uint_t		arl_refcnt;
77 	kcondvar_t	arl_cv;
78 	t_uscalar_t	arl_dlpi_pending;
79 	kmutex_t	arl_lock;
80 	int		arl_error;
81 } arl_t;
82 
83 /*
84  * The arl_ill_common_t structure is a super-structure that contains pointers
85  * to a pair of matching ill_t, arl_t structures. Given an arl_t (or
86  * ill_t) the corresponding ill_t (or arl_t) must be obtained by
87  * synchronizing on the ai_lock,  and ensuring that the desired ill/arl
88  * pointer is non-null, not condemned. The arl_ill_common_t is allocated in
89  * arl_init() and freed only when both the ill_t and the arl_t structures
90  * become NULL.
91  * Lock hierarchy: the ai_lock must be take before the ill_lock or arl_lock.
92  */
93 
94 typedef struct arl_ill_common_s {
95 	kmutex_t	ai_lock;
96 	ill_t		*ai_ill;
97 	arl_t		*ai_arl;
98 	kcondvar_t	ai_ill_unplumb_done; /* sent from ip_modclose() */
99 } arl_ill_common_t;
100 
101 extern	boolean_t	arp_no_defense;
102 
103 extern	struct module_info arp_mod_info;
104 extern	int		arp_ll_up(ill_t *);
105 extern	int		arp_ll_down(ill_t *);
106 extern	boolean_t	arp_announce(ncec_t *);
107 extern	boolean_t	arp_probe(ncec_t *);
108 extern	int		arp_request(ncec_t *, in_addr_t, ill_t *);
109 extern	void		arp_failure(mblk_t *, ip_recv_attr_t *);
110 extern	int		arl_wait_for_info_ack(arl_t *);
111 extern	int		arl_init(queue_t *, arl_t *);
112 extern	void		arl_set_muxid(ill_t *, int);
113 extern	int		arl_get_muxid(ill_t *);
114 extern	void		arp_send_replumb_conf(ill_t *);
115 extern	void		arp_unbind_complete(ill_t *);
116 extern  ill_t		*arl_to_ill(arl_t *);
117 extern	uint32_t	arp_hw_type(t_uscalar_t);
118 #endif
119 
120 #define	ARP_RETRANS_TIMER	500 /* time in milliseconds */
121 
122 /* The following are arl_state_flags */
123 #define	ARL_LL_SUBNET_PENDING	0x01	/* Waiting for DL_INFO_ACK from drv */
124 #define	ARL_CONDEMNED		0x02	/* No more new ref's to the ILL */
125 #define	ARL_DL_UNBIND_IN_PROGRESS	0x04	/* UNBIND_REQ is sent */
126 #define	ARL_LL_BIND_PENDING	0x0020	/* BIND sent */
127 #define	ARL_LL_UP		0x0040	/* BIND acked */
128 #define	ARL_LL_DOWN		0x0080
129 #define	ARL_LL_UNBOUND		0x0100	/* UNBIND acked */
130 #define	ARL_LL_REPLUMBING	0x0200	/* replumb in progress */
131 
132 #ifdef __cplusplus
133 }
134 #endif
135 
136 #endif /* _IP_ARP_H */
137