summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/ip_arp.h
blob: 91ce3565497f45f5db2bb01396dbbf6c928a00d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _IP_ARP_H
#define	_IP_ARP_H

/*
 * Data-structures and functions related to the IP STREAMS queue that handles
 * packets with the SAP set to 0x806 (ETHERTYPE_ARP).
 */

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <inet/ip.h>
#include <inet/ip_ndp.h>
#include <sys/stream.h>

#ifdef _KERNEL
extern struct streamtab dummymodinfo;

struct arl_ill_common_s;
/*
 * The arl_s structure tracks the state of the associated ARP stream.
 */
typedef struct arl_s {
	queue_t		*arl_rq;
	queue_t		*arl_wq;
	ip_stack_t	*arl_ipst;
	zoneid_t	arl_zoneid;
	cred_t		*arl_credp;
	ip_m_t		arl_media;
	struct arl_ill_common_s *arl_common;
	int		arl_muxid;
	uint_t		arl_ppa;
	t_uscalar_t	arl_sap;
	t_uscalar_t	arl_sap_length;
	uint_t	arl_phys_addr_length;
	char		*arl_name;
	int		arl_name_length;
	t_uscalar_t	arl_mactype;
#define	arl_first_mp_to_free	arl_dlpi_deferred
	mblk_t		*arl_dlpi_deferred;
	mblk_t		*arl_unbind_mp;
	mblk_t		*arl_detach_mp;
#define	arl_last_mp_to_free	arl_detach_mp
	uint_t		arl_state_flags;
	uint_t
		arl_needs_attach:1,
		arl_dlpi_style_set:1,
		arl_pad_to_bit_31:30;
	uint_t		arl_refcnt;
	kcondvar_t	arl_cv;
	t_uscalar_t	arl_dlpi_pending;
	kmutex_t	arl_lock;
	int		arl_error;
} arl_t;

/*
 * The arl_ill_common_t structure is a super-structure that contains pointers
 * to a pair of matching ill_t, arl_t structures. Given an arl_t (or
 * ill_t) the corresponding ill_t (or arl_t) must be obtained by
 * synchronizing on the ai_lock,  and ensuring that the desired ill/arl
 * pointer is non-null, not condemned. The arl_ill_common_t is allocated in
 * arl_init() and freed only when both the ill_t and the arl_t structures
 * become NULL.
 * Lock hierarchy: the ai_lock must be take before the ill_lock or arl_lock.
 */

typedef struct arl_ill_common_s {
	kmutex_t	ai_lock;
	ill_t		*ai_ill;
	arl_t		*ai_arl;
	kcondvar_t	ai_ill_unplumb_done; /* sent from ip_modclose() */
} arl_ill_common_t;

extern	boolean_t	arp_no_defense;

extern	struct module_info arp_mod_info;
extern	int		arp_ll_up(ill_t *);
extern	int		arp_ll_down(ill_t *);
extern	boolean_t	arp_announce(ncec_t *);
extern	boolean_t	arp_probe(ncec_t *);
extern	int		arp_request(ncec_t *, in_addr_t, ill_t *);
extern	void		arp_failure(mblk_t *, ip_recv_attr_t *);
extern	int		arl_wait_for_info_ack(arl_t *);
extern	int		arl_init(queue_t *, arl_t *);
extern	void		arl_set_muxid(ill_t *, int);
extern	int		arl_get_muxid(ill_t *);
extern	void		arp_send_replumb_conf(ill_t *);
extern	void		arp_unbind_complete(ill_t *);
extern  ill_t		*arl_to_ill(arl_t *);
extern	uint32_t	arp_hw_type(t_uscalar_t);
#endif

#define	ARP_RETRANS_TIMER	500 /* time in milliseconds */

/* The following are arl_state_flags */
#define	ARL_LL_SUBNET_PENDING	0x01	/* Waiting for DL_INFO_ACK from drv */
#define	ARL_CONDEMNED		0x02	/* No more new ref's to the ILL */
#define	ARL_DL_UNBIND_IN_PROGRESS	0x04	/* UNBIND_REQ is sent */
#define	ARL_LL_BIND_PENDING	0x0020	/* BIND sent */
#define	ARL_LL_UP		0x0040	/* BIND acked */
#define	ARL_LL_DOWN		0x0080
#define	ARL_LL_UNBOUND		0x0100	/* UNBIND acked */
#define	ARL_LL_REPLUMBING	0x0200	/* replumb in progress */

#ifdef __cplusplus
}
#endif

#endif /* _IP_ARP_H */