xref: /titanic_52/usr/src/uts/common/fs/sockfs/nl7cnca.c (revision e1c679fa4b0ab8c4bcaa6263974ca0c46e5b027f)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 
30 #include <sys/types.h>
31 #include <sys/conf.h>
32 #include <sys/modctl.h>
33 #include <sys/stream.h>
34 #include <sys/strsubr.h>
35 #include <sys/stropts.h>
36 #define	_SUN_TPI_VERSION 2
37 #include <sys/ddi.h>
38 #include <sys/sunddi.h>
39 #include <sys/cmn_err.h>
40 #include <sys/debug.h>
41 #include <sys/vtrace.h>
42 #include <sys/errno.h>
43 #include <inet/common.h>
44 #include <inet/led.h>
45 #include <inet/mi.h>
46 #include <inet/nd.h>
47 #include <sys/strsun.h>
48 
49 #include <fs/sockfs/nl7c.h>
50 #include <fs/sockfs/nl7curi.h>
51 
52 #include <inet/nca/nca.h>
53 #include <inet/nca/ncalogd.h>
54 
55 /*
56  * This file is for NCA compatability, specifically it provides ndd
57  * support for existing NCA ndd ...
58  */
59 
60 extern boolean_t	nl7c_logd_enabled;
61 extern nca_fio_t	*nl7c_logd_fio;
62 extern clock_t		nl7c_uri_ttl;
63 extern boolean_t	nl7c_use_kmem;
64 extern uint64_t		nl7c_file_prefetch;
65 extern uint64_t		nl7c_uri_max;
66 extern uint64_t		nl7c_uri_bytes;
67 
68 extern void		nl7c_mi_report_addr(mblk_t *);
69 
70 #define	MS	1L
71 #define	SECONDS	(1000 * MS)
72 #define	MINUTES	(60 * SECONDS)
73 #define	HOURS	(60 * MINUTES)
74 #define	DAYS	(24 * HOURS)
75 
76 #define	PARAM_MAX UINT_MAX
77 #define	PARAML_MAX ULONG_MAX
78 
79 #include <inet/nca/ncandd.h>
80 
81 uint32_t nca_major_version = 1;
82 uint32_t nca_minor_version = 3;
83 uint32_t nca_httpd_version = NCA_HTTP_VERSION1;
84 uint32_t nca_logd_version = NCA_LOG_VERSION1;
85 
86 caddr_t	nca_g_nd;	/* Head of 'named dispatch' variable list */
87 
88 /*
89  * min, max, and value are int64_t's, addr is the optional address of an
90  * external int64_t to be updated at init/set, name is the ndd name used
91  * to access. Note, if min == max then only get is allowed, i.e. RO.
92  */
93 
94 /* BEGIN CSTYLED */
95 ncaparam_t	nca_param_arr[] = {
96  /*min	max		value		name */
97  { 0,	1,		1,		"nca_log_cycle"},
98  { 0,	1,		0,		"no_caching"},
99  { 0,	PARAML_MAX,    	0,		"nca_log_size"},
100  { 0,	PARAM_MAX,     	10000000,	"nca_max_cache_size"},
101  { 0,	PARAM_MAX,	300*SECONDS,	"nca_http_timeout"},
102  { 0,	PARAM_MAX,	15*SECONDS,	"nca_http_keep_alive_timeout"},
103  { 0,	PARAM_MAX,	100,		"nca_http_keep_alive_max"},
104  { 0,	1,		1,		"nca_inq_nointr"},
105  { 0,	1,		1,		"nca_use_hwcksum"},
106  { 0,	PARAM_MAX,	0,		"nca_segmap_min_size"},
107 };
108 
109 /*
110  * Obsolete ip variables, use "/dev/ip" instead.
111  */
112 
113 ncaparam_t	nca_ip_obsolete_arr[] = {
114  { 0, 0, 0, "ip_forwarding"},
115  { 0, 0, 0, "ip_respond_to_address_mask_broadcast"},
116  { 0, 0, 0, "ip_respond_to_echo_broadcast"},
117  { 0, 0, 0, "ip_respond_to_timestamp"},
118  { 0, 0, 0, "ip_respond_to_timestamp_broadcast"},
119  { 0, 0, 0, "ip_send_redirects"},
120  { 0, 0, 0, "ip_forward_directed_broadcasts"},
121  { 0, 0, 0, "ip_debug"},
122  { 0, 0, 0, "ip_mrtdebug"},
123  { 0, 0, 0, "ip_ire_cleanup_interval" },
124  { 0, 0, 0, "ip_ire_flush_interval" },
125  { 0, 0, 0, "ip_ire_redirect_interval" },
126  { 0, 0, 0, "ip_def_ttl" },
127  { 0, 0, 0, "ip_forward_src_routed"},
128  { 0, 0, 0, "ip_wroff_extra" },
129  { 0, 0, 0, "ip_ire_pathmtu_interval" },
130  { 0, 0, 0, "ip_icmp_return_data_bytes" },
131  { 0, 0, 0, "ip_send_source_quench" },
132  { 0, 0, 0, "ip_path_mtu_discovery" },
133  { 0, 0, 0, "ip_ignore_delete_time" },
134  { 0, 0, 0, "ip_ignore_redirect" },
135  { 0, 0, 0, "ip_output_queue" },
136  { 0, 0, 0, "ip_broadcast_ttl" },
137  { 0, 0, 0, "ip_icmp_err_interval" },
138  { 0, 0, 0, "ip_reass_queue_bytes" },
139  { 0, 0, 0, "ip_strict_dst_multihoming" },
140  { 0, 0, 0, "ip_addrs_per_if"},
141 };
142 
143 /*
144  * Obsolete tcp variables, use "/dev/tcp" instead.
145  */
146 
147 ncaparam_t	nca_tcp_obsolete_arr[] = {
148  { 0, 0, 0, "tcp_time_wait_interval"},
149  { 0, 0, 0, "tcp_conn_req_max_q" },
150  { 0, 0, 0, "tcp_conn_req_max_q0" },
151  { 0, 0, 0, "tcp_conn_req_min" },
152  { 0, 0, 0, "tcp_conn_grace_period" },
153  { 0, 0, 0, "tcp_cwnd_max" },
154  { 0, 0, 0, "tcp_debug" },
155  { 0, 0, 0, "tcp_smallest_nonpriv_port"},
156  { 0, 0, 0, "tcp_ip_abort_cinterval"},
157  { 0, 0, 0, "tcp_ip_abort_linterval"},
158  { 0, 0, 0, "tcp_ip_abort_interval"},
159  { 0, 0, 0, "tcp_ip_notify_cinterval"},
160  { 0, 0, 0, "tcp_ip_notify_interval"},
161  { 0, 0, 0, "tcp_ip_ttl"},
162  { 0, 0, 0, "tcp_keepalive_interval"},
163  { 0, 0, 0, "tcp_maxpsz_multiplier" },
164  { 0, 0, 0, "tcp_mss_def"},
165  { 0, 0, 0, "tcp_mss_max"},
166  { 0, 0, 0, "tcp_mss_min"},
167  { 0, 0, 0, "tcp_naglim_def"},
168  { 0, 0, 0, "tcp_rexmit_interval_initial"},
169  { 0, 0, 0, "tcp_rexmit_interval_max"},
170  { 0, 0, 0, "tcp_rexmit_interval_min"},
171  { 0, 0, 0, "tcp_wroff_xtra" },
172  { 0, 0, 0, "tcp_deferred_ack_interval" },
173  { 0, 0, 0, "tcp_snd_lowat_fraction" },
174  { 0, 0, 0, "tcp_sth_rcv_hiwat" },
175  { 0, 0, 0, "tcp_sth_rcv_lowat" },
176  { 0, 0, 0, "tcp_dupack_fast_retransmit" },
177  { 0, 0, 0, "tcp_ignore_path_mtu" },
178  { 0, 0, 0, "tcp_rcv_push_wait" },
179  { 0, 0, 0, "tcp_smallest_anon_port"},
180  { 0, 0, 0, "tcp_largest_anon_port"},
181  { 0, 0, 0, "tcp_xmit_hiwat"},
182  { 0, 0, 0, "tcp_xmit_lowat"},
183  { 0, 0, 0, "tcp_recv_hiwat"},
184  { 0, 0, 0, "tcp_recv_hiwat_minmss"},
185  { 0, 0, 0, "tcp_fin_wait_2_flush_interval"},
186  { 0, 0, 0, "tcp_co_min"},
187  { 0, 0, 0, "tcp_max_buf"},
188  { 0, 0, 0, "tcp_strong_iss"},
189  { 0, 0, 0, "tcp_rtt_updates"},
190  { 0, 0, 0, "tcp_wscale_always"},
191  { 0, 0, 0, "tcp_tstamp_always"},
192  { 0, 0, 0, "tcp_tstamp_if_wscale"},
193  { 0, 0, 0, "tcp_rexmit_interval_extra"},
194  { 0, 0, 0, "tcp_deferred_acks_max"},
195  { 0, 0, 0, "tcp_slow_start_after_idle"},
196  { 0, 0, 0, "tcp_slow_start_initial"},
197  { 0, 0, 0, "tcp_co_timer_interval"},
198  { 0, 0, 0, "tcp_sack_permitted"},
199 #ifdef DEBUG
200  { 0, 0, 0, "tcp_drop_oob"},
201 #endif
202 };
203 
204 /*
205  * Obsolete nca variables, just warn.
206  */
207 
208 ncaparam_t	nca_nca_obsolete_arr[] = {
209  { 0, 0, 0, "nca_ipport_table_bucket"},
210  { 0, 0, 0, "nca_ipport_table_size"},
211  { 0, 0, 0, "nca_ipport_table_expand"},
212  { 0, 0, 0, "nca_ipport_table_shrink"},
213  { 0, 0, 0, "nca_ip_virtual_hosting"},
214  { 0, 0, 0, "httpd_door_address"},
215  { 0, 0, 0, "httpd_door_path"},
216  { 0, 0, 0, "httpd_downdoor_path"},
217  { 0, 0, 0, "nca_ppmax"},
218  { 0, 0, 0, "nca_vpmax"},
219  { 0, 0, 0, "nca_use_segmap"},
220  { 0, 0, 0, "nca_availrmem"},
221  { 0, 0, 0, "nca_maxkmem"},
222  { 0, 0, 0, "nca_log_file"},
223  { 0, 0, 0, "conn_status"},
224  { 0, 0, 0, "conn_status_all"},
225  { 0, 0, 0, "nca_conn_req_max_q"},
226  { 0, 0, 0, "nca_conn_req_max_q0"},
227  { 0, 0, 0, "cache_clear"},
228  { 0, 0, 0, "nca_node_hash"},
229  { 0, 0, 0, "node_status"},
230 #ifdef DEBUG
231  { 0, 0, 0, "nca_debug_counter"},
232 #endif
233 };
234 /* END CSTYLED */
235 
236 static int
237 /*ARGSUSED*/
238 nl7c_uri_ttl_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
239 {
240 	(void) mi_mpprintf(mp, "%ld", nl7c_uri_ttl);
241 	return (0);
242 }
243 
244 static int
245 /*ARGSUSED*/
246 nl7c_uri_ttl_set(queue_t *q, mblk_t *mp, char *value, caddr_t nu, cred_t *cr)
247 {
248 	if (ddi_strtol(value, NULL, 10, &nl7c_uri_ttl) != 0)
249 		return (EINVAL);
250 	return (0);
251 }
252 
253 static int
254 /*ARGSUSED*/
255 nca_logging_on_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
256 {
257 	(void) mi_mpprintf(mp, "%d", nl7c_logd_enabled);
258 	return (0);
259 }
260 
261 static int
262 /*ARGSUSED*/
263 nca_logging_on_set(queue_t *q, mblk_t *mp, char *value, caddr_t nu, cred_t *cr)
264 {
265 	long new_value;
266 
267 	if (ddi_strtol(value, NULL, 10, &new_value) != 0 || new_value < 0 ||
268 	    new_value > 1) {
269 		return (EINVAL);
270 	}
271 	if (nca_fio_cnt(nl7c_logd_fio) == 0)
272 		return (EINVAL);
273 	nl7c_logd_enabled = new_value;
274 
275 	return (0);
276 }
277 
278 static int
279 /*ARGSUSED*/
280 nca_version_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
281 {
282 	(void) mi_mpprintf(mp, "%d.%d", nca_major_version, nca_minor_version);
283 	return (0);
284 }
285 
286 static int
287 /*ARGSUSED*/
288 nca_httpd_version_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
289 {
290 	(void) mi_mpprintf(mp, "%d", nca_httpd_version);
291 	return (0);
292 }
293 
294 static int
295 /*ARGSUSED*/
296 nca_logd_version_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
297 {
298 	(void) mi_mpprintf(mp, "%d", nca_logd_version);
299 	return (0);
300 }
301 
302 static int
303 /*ARGSUSED*/
304 nca_httpd_door_inst_get(queue_t *q, mblk_t *mp, caddr_t nu, cred_t *cr)
305 {
306 	nl7c_mi_report_addr(mp);
307 	return (0);
308 }
309 
310 static int
311 /*ARGSUSED*/
312 nca_param_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
313 {
314 	ncaparam_t	*ncapa = (ncaparam_t *)cp;
315 
316 	(void) mi_mpprintf(mp, "%ld", ncapa->param_val);
317 	return (0);
318 }
319 
320 static int
321 /*ARGSUSED*/
322 nca_param_set(queue_t *q, mblk_t *mp, char *value, caddr_t cp, cred_t *cr)
323 {
324 	ulong_t		new_value;
325 	ncaparam_t	*ncapa = (ncaparam_t *)cp;
326 
327 	if (ddi_strtoul(value, NULL, 10, &new_value) != 0 ||
328 	    new_value < ncapa->param_min || new_value > ncapa->param_max) {
329 		return (EINVAL);
330 	}
331 	ncapa->param_val = new_value;
332 	return (0);
333 }
334 
335 static int
336 /*ARGSUSED*/
337 nca_obsolete(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
338 {
339 	(void) mi_mpprintf(mp, "obsolete");
340 	return (0);
341 }
342 
343 static int
344 /*ARGSUSED*/
345 nca_ip_obsolete(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
346 {
347 	(void) mi_mpprintf(mp, "obsolete for /dev/nca, use /dev/ip");
348 	return (0);
349 }
350 
351 static int
352 /*ARGSUSED*/
353 nca_tcp_obsolete(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
354 {
355 	(void) mi_mpprintf(mp, "obsolete for /dev/nca, use /dev/tcp");
356 	return (0);
357 }
358 
359 static int
360 /*ARGSUSED*/
361 nca_nca_obsolete(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *cr)
362 {
363 	(void) mi_mpprintf(mp, "obsolete for /dev/nca");
364 	return (0);
365 }
366 
367 static boolean_t
368 nca_param_register(ncaparam_t *ncapa, int cnt)
369 {
370 	for (; cnt-- > 0; ncapa++) {
371 		if (ncapa->param_name && ncapa->param_name[0]) {
372 			if (!nd_load(&nca_g_nd, ncapa->param_name,
373 			    nca_param_get, nca_param_set,
374 			    (caddr_t)ncapa)) {
375 				goto error;
376 			}
377 		}
378 
379 	}
380 	if (!nd_load(&nca_g_nd, "nca_version", nca_version_get, nil(pfi_t),
381 			nil(caddr_t))) {
382 		goto error;
383 	}
384 	if (!nd_load(&nca_g_nd, "nca_logd_version", nca_logd_version_get,
385 			nil(pfi_t), nil(caddr_t))) {
386 		goto error;
387 	}
388 	if (!nd_load(&nca_g_nd, "nca_logging_on", nca_logging_on_get,
389 	    nca_logging_on_set, nil(caddr_t))) {
390 		goto error;
391 	}
392 
393 	if (!nd_load(&nca_g_nd, "uri_time_to_live", nl7c_uri_ttl_get,
394 	    nl7c_uri_ttl_set, nil(caddr_t))) {
395 		goto error;
396 	}
397 	if (!nd_load(&nca_g_nd, "nca_httpd_version", nca_httpd_version_get,
398 			nil(pfi_t), nil(caddr_t))) {
399 		goto error;
400 	}
401 	if (!nd_load(&nca_g_nd, "httpd_door_instance", nca_httpd_door_inst_get,
402 			nil(pfi_t), nil(caddr_t))) {
403 		nd_free(&nca_g_nd);
404 		return (B_FALSE);
405 	}
406 
407 	ncapa = nca_ip_obsolete_arr;
408 	cnt = A_CNT(nca_ip_obsolete_arr);
409 	for (; cnt-- > 0; ncapa++) {
410 		if (ncapa->param_name && ncapa->param_name[0]) {
411 			if (!nd_load(&nca_g_nd, ncapa->param_name,
412 			    nca_ip_obsolete, NULL, (caddr_t)ncapa)) {
413 				goto error;
414 			}
415 		}
416 
417 	}
418 
419 	ncapa = nca_tcp_obsolete_arr;
420 	cnt = A_CNT(nca_tcp_obsolete_arr);
421 	for (; cnt-- > 0; ncapa++) {
422 		if (ncapa->param_name && ncapa->param_name[0]) {
423 			if (!nd_load(&nca_g_nd, ncapa->param_name,
424 			    nca_tcp_obsolete, NULL, (caddr_t)ncapa)) {
425 				goto error;
426 			}
427 		}
428 
429 	}
430 
431 	ncapa = nca_nca_obsolete_arr;
432 	cnt = A_CNT(nca_nca_obsolete_arr);
433 	for (; cnt-- > 0; ncapa++) {
434 		if (ncapa->param_name && ncapa->param_name[0]) {
435 			if (!nd_load(&nca_g_nd, ncapa->param_name,
436 			    nca_nca_obsolete, NULL, (caddr_t)ncapa)) {
437 				goto error;
438 			}
439 		}
440 
441 	}
442 
443 	return (B_TRUE);
444 
445 error:
446 	nd_free(&nca_g_nd);
447 	return (B_FALSE);
448 }
449 
450 void
451 nl7c_nca_init(void)
452 {
453 	if (! nca_g_nd) {
454 		if (! nca_param_register(nca_param_arr, A_CNT(nca_param_arr)))
455 			cmn_err(CE_WARN,
456 			    "nl7c: /dev/nca ndd initialization failed.");
457 	}
458 }
459