summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cmd-inet/lib/nwamd/ncu.h
blob: 7f0f5a1d7dc32bc0cbad4eb4a3118b2d3c610742 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*
 * 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) 2010, Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
 */

#ifndef _NCU_H
#define	_NCU_H

#include <dhcpagent_ipc.h>
#include <dhcpagent_util.h>
#include <libdladm.h>
#include <libdlpi.h>
#include <libdlwlan.h>
#include <libinetutil.h>
#include <libipadm.h>
#include <libnwam.h>
#include <libnwam_priv.h>
#include <libuutil.h>
#include <pthread.h>
#include <sys/mac.h>

#include "events.h"

extern pthread_mutex_t active_ncp_mutex;
extern pthread_mutex_t active_loc_mutex;
extern char active_loc[];
extern uint64_t wireless_scan_interval;
extern dladm_wlan_strength_t wireless_scan_level;
extern boolean_t wireless_autoconf;
extern boolean_t wireless_strict_bssid;

/*
 * NCPs are collections of NCUs.  At the moment there is one NCP in the system
 * and its expected there will never be many.  There is a lock on the NCP which
 * must be obtained to add or remove anything from the NCP.
 *
 * NCUs are also kept in a uu list for easy walking.  Each NCU has a lock which
 * is used to protect manipulation of its contents.  One of its members is a
 * reference count which is initialized to 1 when its placed on the NCP.  As
 * references are passed around that should be manipulated as necessary
 * (helper functions YYY provided).  It is removed from the NCP by
 * ncu_destroy() but the memory containing it is not returned to the free pool
 * until the reference count falls to 0.
 *
 * As we add
 * more complex system objects their relationship becomes more complex.  That
 * is represented by the links within the NCUs.  Reference counts should be
 * used to maintain the consistency of these links.  Care should be used when
 * walking more complex structures that might contain cycles.
 */

/* Stores details of last/current WiFi scans */
typedef struct nwamd_wifi_scan {
	char nwamd_wifi_scan_link[NWAM_MAX_NAME_LEN];
	nwam_wlan_t nwamd_wifi_scan_last[NWAMD_MAX_NUM_WLANS];
	uint_t nwamd_wifi_scan_last_num;
	nwam_wlan_t nwamd_wifi_scan_curr[NWAMD_MAX_NUM_WLANS];
	uint_t nwamd_wifi_scan_curr_num;
	boolean_t nwamd_wifi_scan_changed;
	uint32_t nwamd_wifi_scan_last_time;
} nwamd_wifi_scan_t;

typedef struct nwamd_link {
	pthread_mutex_t nwamd_link_wifi_mutex;
	pthread_t nwamd_link_wifi_scan_thread;
	pthread_t nwamd_link_wifi_monitor_thread;
	char nwamd_link_wifi_essid[DLADM_STRSIZE];
	char nwamd_link_wifi_bssid[DLADM_STRSIZE];
	char nwamd_link_wifi_keyname[DLADM_STRSIZE];
	char nwamd_link_wifi_signal_strength[DLADM_STRSIZE];
	boolean_t nwamd_link_wifi_add_to_known_wlans;
	boolean_t nwamd_link_wifi_connected;
	uint32_t nwamd_link_wifi_security_mode;
	dladm_wlan_key_t *nwamd_link_wifi_key;
	nwamd_wifi_scan_t nwamd_link_wifi_scan;
	uint64_t nwamd_link_wifi_priority;
	boolean_t nwamd_link_wifi_autoconf;
	uint32_t nwamd_link_id;
	uint32_t nwamd_link_media;
	uint64_t nwamd_link_flags;
	dlpi_handle_t nwamd_link_dhp;
	pthread_t nwamd_link_dlpi_thread;
	uint64_t nwamd_link_activation_mode;
	uint64_t nwamd_link_priority_mode;
	uint64_t nwamd_link_priority_group;
	char *nwamd_link_mac_addr;
	size_t nwamd_link_mac_addr_len;
	uint64_t nwamd_link_mtu;
	char **nwamd_link_autopush;
	uint_t nwamd_link_num_autopush;
} nwamd_link_t;

struct nwamd_if_address {
	sa_family_t family;
	ipadm_addr_type_t ipaddr_atype;
	ipadm_addrobj_t ipaddr;
	boolean_t configured;
	struct sockaddr_storage conf_addr;	/* address configured for */
	struct sockaddr_storage conf_stateless_addr; /* this nwamd_if_address */
	struct nwamd_if_address *next;
};

typedef struct nwamd_if {
	boolean_t nwamd_if_dhcp_requested;
	boolean_t nwamd_if_dhcp_configured;
	boolean_t nwamd_if_stateful_requested;
	boolean_t nwamd_if_stateful_configured;
	boolean_t nwamd_if_stateless_requested;
	boolean_t nwamd_if_stateless_configured;
	struct nwamd_if_address *nwamd_if_list;
	struct sockaddr_in nwamd_if_ipv4_default_route;
	boolean_t nwamd_if_ipv4_default_route_set;
	struct sockaddr_in6 nwamd_if_ipv6_default_route;
	boolean_t nwamd_if_ipv6_default_route_set;
	boolean_t nwamd_if_ipv4;
	boolean_t nwamd_if_ipv6;
} nwamd_if_t;

typedef struct nwamd_ncu {
	nwam_ncu_type_t ncu_type;
	char *ncu_name;
	char ncu_parent[NWAM_MAX_NAME_LEN];
	boolean_t ncu_enabled; /* whether NCU has been enabled or not */
	union {
		nwamd_link_t u_link;
		nwamd_if_t u_if;
	} ncu_node;
} nwamd_ncu_t;

#define	ncu_link	ncu_node.u_link
#define	ncu_if		ncu_node.u_if

#define	LOOPBACK_IF				"lo0"

struct nwamd_dhcp_thread_arg {
	char *name;
	dhcp_ipc_type_t type;
	ipadm_addrobj_t ipaddr;
	volatile uint32_t *guard;
};

#define	WIRELESS_SCAN_INTERVAL_DEFAULT		120
#define	WIRELESS_SCAN_INTERVAL_MIN		30
#define	WIRELESS_SCAN_REQUESTED_INTERVAL_MIN	10
#define	WIRELESS_MONITOR_SIGNAL_INTERVAL	10
#define	WIRELESS_RETRY_INTERVAL			30
#define	WIRELESS_SCAN_LEVEL_DEFAULT		DLADM_WLAN_STRENGTH_WEAK
#define	NWAMD_DHCP_RETRIES			5
#define	NWAMD_DHCP_RETRY_WAIT_TIME		10
#define	NWAMD_READONLY_RETRY_INTERVAL		5

/*
 * This dladm and ipadm handles are opened before interfaces are initialized
 * and closed only when nwamd shuts down.
 */
extern dladm_handle_t dld_handle;
extern ipadm_handle_t ipadm_handle;

extern nwamd_object_t nwamd_ncu_object_find(nwam_ncu_type_t, const char *);
extern void nwamd_log_ncus(void);
extern void nwamd_ncu_free(nwamd_ncu_t *);

/* WLAN functions */
extern void nwamd_set_selected_connected(nwamd_ncu_t *, boolean_t, boolean_t);
extern nwam_error_t nwamd_wlan_select(const char *, const char *, const char *,
    uint32_t, boolean_t);
extern nwam_error_t nwamd_wlan_set_key(const char *, const char *, const char *,
    uint32_t, uint_t, char *);
extern nwam_error_t nwamd_wlan_scan(const char *);
extern void nwamd_wlan_connect(const char *);
extern boolean_t nwamd_wlan_connected(nwamd_object_t);
extern void nwamd_wlan_monitor_signal(const char *);
extern void nwamd_ncu_create_periodic_scan_event(nwamd_object_t);
extern dladm_wlan_key_t *nwamd_wlan_get_key_named(const char *, uint32_t);
extern void nwamd_set_key_name(const char *, const char *, char *, size_t);

/* Link functions */
extern link_state_t nwamd_get_link_state(const char *);
extern const char *nwamd_sockaddr_to_str(const struct sockaddr *, char *,
    size_t);
extern void nwamd_propogate_link_up_down_to_ip(const char *, boolean_t);
extern void nwamd_set_unset_link_properties(nwamd_ncu_t *, boolean_t);
/* DLPI event hooking */
extern void nwamd_dlpi_add_link(nwamd_object_t);
extern void nwamd_dlpi_delete_link(nwamd_object_t);

/* IP functions */
extern boolean_t nwamd_static_addresses_configured(nwamd_ncu_t *, sa_family_t);
extern void nwamd_plumb_interface(nwamd_ncu_t *, sa_family_t);
extern void nwamd_unplumb_interface(nwamd_ncu_t *, sa_family_t);
extern boolean_t nwamd_dhcp_managing(int, nwamd_ncu_t *);
extern void nwamd_configure_interface_addresses(nwamd_ncu_t *);
extern char *nwamd_get_dhcpinfo_data(const char *, char *);
extern void nwamd_dhcp_release(const char *);
extern void nwamd_add_default_routes(nwamd_ncu_t *);
extern void nwamd_add_route(struct sockaddr *, struct sockaddr *,
    struct sockaddr *, const char *);

/* NCU value set/get functions */
extern nwam_error_t nwamd_set_ncu_uint(nwam_ncu_handle_t, uint64_t *, uint_t,
    const char *);
extern nwam_error_t nwamd_set_ncu_string(nwam_ncu_handle_t, char **, uint_t,
    const char *);
extern nwam_error_t nwamd_get_ncu_uint(nwam_ncu_handle_t, nwam_value_t *,
    uint64_t **, uint_t *, const char *);
extern nwam_error_t nwamd_get_ncu_string(nwam_ncu_handle_t, nwam_value_t *,
    char ***, uint_t *, const char *);
extern nwam_error_t nwamd_get_ncu_boolean(nwam_ncu_handle_t, nwam_value_t *,
    boolean_t **, uint_t *, const char *);

extern void nwamd_walk_physical_configuration(void);

#endif /* _NCU_H */