xref: /titanic_41/usr/src/cmd/smbsrv/fksmbd/fksmbd_kmod.c (revision cf115f3609b69ef25a8b5a1c0a4a5afa19271fa8)
17206bf49SGordon Ross /*
27206bf49SGordon Ross  * This file and its contents are supplied under the terms of the
37206bf49SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
47206bf49SGordon Ross  * You may only use this file in accordance with the terms of version
57206bf49SGordon Ross  * 1.0 of the CDDL.
67206bf49SGordon Ross  *
77206bf49SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
87206bf49SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
97206bf49SGordon Ross  * http://www.illumos.org/license/CDDL.
107206bf49SGordon Ross  */
117206bf49SGordon Ross 
127206bf49SGordon Ross /*
137206bf49SGordon Ross  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
147206bf49SGordon Ross  */
157206bf49SGordon Ross 
167206bf49SGordon Ross /*
177206bf49SGordon Ross  * These replace NODIRECT functions of the same name in
187206bf49SGordon Ross  * $SRC/lib/smbsrv/libsmb/common/smb_kmod.c including:
197206bf49SGordon Ross  *	smb_kmod_bind, smb_kmod_ioctl, smb_kmod_isbound,
207206bf49SGordon Ross  *	smb_kmod_start, smb_kmod_stop, smb_kmod_unbind.
217206bf49SGordon Ross  *
227206bf49SGordon Ross  * For all the other smb_kmod_... functions, we can just use the
237206bf49SGordon Ross  * libsmb code because those all call smb_kmod_ioctl, for which
247206bf49SGordon Ross  * we have an override here.
257206bf49SGordon Ross  *
267206bf49SGordon Ross  * The replacment functions here just call the libfksmbsrv code
277206bf49SGordon Ross  * directly where the real (in-kernel) versions would be entered
287206bf49SGordon Ross  * via the driver framework (open, close, ioctl).  Aside from that,
297206bf49SGordon Ross  * the call sequences are intentionally the same (where possible).
307206bf49SGordon Ross  * In particular, that makes it possible to debug startup/teardown
317206bf49SGordon Ross  * problems in the user-space version of this code.
327206bf49SGordon Ross  */
337206bf49SGordon Ross 
347206bf49SGordon Ross #include <sys/types.h>
357206bf49SGordon Ross #include <sys/stat.h>
367206bf49SGordon Ross #include <sys/ioccom.h>
377206bf49SGordon Ross #include <sys/param.h>
387206bf49SGordon Ross #include <stddef.h>
397206bf49SGordon Ross #include <stdio.h>
407206bf49SGordon Ross #include <string.h>
417206bf49SGordon Ross #include <strings.h>
427206bf49SGordon Ross #include <stdlib.h>
437206bf49SGordon Ross #include <unistd.h>
447206bf49SGordon Ross #include <fcntl.h>
457206bf49SGordon Ross #include <errno.h>
467206bf49SGordon Ross #include <note.h>
477206bf49SGordon Ross 
487206bf49SGordon Ross #include <smbsrv/smbinfo.h>
497206bf49SGordon Ross #include <smbsrv/smb_ioctl.h>
507206bf49SGordon Ross #include "smbd.h"
517206bf49SGordon Ross 
527206bf49SGordon Ross boolean_t smbdrv_opened = B_FALSE;
537206bf49SGordon Ross 
547206bf49SGordon Ross /*
557206bf49SGordon Ross  * We want to adjust a few things in the standard configuration
567206bf49SGordon Ross  * passed to the "fake" version of the smbsrv kernel module.
577206bf49SGordon Ross  *
587206bf49SGordon Ross  * Reduce the maximum number of connections and workers, just for
597206bf49SGordon Ross  * convenience while debugging.  (Don't want hundreds of threads.)
607206bf49SGordon Ross  */
617206bf49SGordon Ross static void
fksmbd_adjust_config(smb_ioc_header_t * ioc_hdr)627206bf49SGordon Ross fksmbd_adjust_config(smb_ioc_header_t *ioc_hdr)
637206bf49SGordon Ross {
647206bf49SGordon Ross 	smb_ioc_cfg_t *ioc = (smb_ioc_cfg_t *)ioc_hdr;
657206bf49SGordon Ross 
667206bf49SGordon Ross 	ioc->maxconnections = 10;
677206bf49SGordon Ross 	ioc->maxworkers = 20;
687206bf49SGordon Ross 	smbd_report("maxconnections=%d, maxworkers=%d",
697206bf49SGordon Ross 	    ioc->maxconnections, ioc->maxworkers);
707206bf49SGordon Ross }
717206bf49SGordon Ross 
727206bf49SGordon Ross boolean_t
smb_kmod_isbound(void)737206bf49SGordon Ross smb_kmod_isbound(void)
747206bf49SGordon Ross {
757206bf49SGordon Ross 	return (smbdrv_opened);
767206bf49SGordon Ross }
777206bf49SGordon Ross 
787206bf49SGordon Ross int
smb_kmod_bind(void)797206bf49SGordon Ross smb_kmod_bind(void)
807206bf49SGordon Ross {
817206bf49SGordon Ross 	int rc;
827206bf49SGordon Ross 
837206bf49SGordon Ross 	if (smbdrv_opened) {
847206bf49SGordon Ross 		smbdrv_opened = B_FALSE;
857206bf49SGordon Ross 		(void) fksmbsrv_drv_close();
867206bf49SGordon Ross 	}
877206bf49SGordon Ross 
887206bf49SGordon Ross 	rc = fksmbsrv_drv_open();
897206bf49SGordon Ross 	if (rc == 0)
907206bf49SGordon Ross 		smbdrv_opened = B_TRUE;
917206bf49SGordon Ross 
927206bf49SGordon Ross 	return (rc);
937206bf49SGordon Ross }
947206bf49SGordon Ross 
957206bf49SGordon Ross void
smb_kmod_unbind(void)967206bf49SGordon Ross smb_kmod_unbind(void)
977206bf49SGordon Ross {
987206bf49SGordon Ross 	if (smbdrv_opened) {
997206bf49SGordon Ross 		smbdrv_opened = B_FALSE;
1007206bf49SGordon Ross 		(void) fksmbsrv_drv_close();
1017206bf49SGordon Ross 	}
1027206bf49SGordon Ross }
1037206bf49SGordon Ross 
1047206bf49SGordon Ross int
smb_kmod_ioctl(int cmd,smb_ioc_header_t * ioc,uint32_t len)1057206bf49SGordon Ross smb_kmod_ioctl(int cmd, smb_ioc_header_t *ioc, uint32_t len)
1067206bf49SGordon Ross {
1077206bf49SGordon Ross 	int rc;
1087206bf49SGordon Ross 
1097206bf49SGordon Ross 	_NOTE(ARGUNUSED(len));
1107206bf49SGordon Ross 
1117206bf49SGordon Ross 	if (!smbdrv_opened)
1127206bf49SGordon Ross 		return (EBADF);
1137206bf49SGordon Ross 
1147206bf49SGordon Ross 	if (cmd == SMB_IOC_CONFIG)
1157206bf49SGordon Ross 		fksmbd_adjust_config(ioc);
1167206bf49SGordon Ross 
1177206bf49SGordon Ross 	rc = fksmbsrv_drv_ioctl(cmd, ioc);
1187206bf49SGordon Ross 	return (rc);
1197206bf49SGordon Ross }
1207206bf49SGordon Ross 
1217206bf49SGordon Ross /* ARGSUSED */
1227206bf49SGordon Ross int
smb_kmod_start(int opipe,int lmshr,int udoor)1237206bf49SGordon Ross smb_kmod_start(int opipe, int lmshr, int udoor)
1247206bf49SGordon Ross {
1257206bf49SGordon Ross 	smb_ioc_start_t ioc;
1267206bf49SGordon Ross 	int rc;
1277206bf49SGordon Ross 
1287206bf49SGordon Ross 	bzero(&ioc, sizeof (ioc));
1297206bf49SGordon Ross 
1307206bf49SGordon Ross 	/* These three are unused */
1317206bf49SGordon Ross 	ioc.opipe = -1;
1327206bf49SGordon Ross 	ioc.lmshrd = -1;
1337206bf49SGordon Ross 	ioc.udoor = -1;
1347206bf49SGordon Ross 
1357206bf49SGordon Ross 	/* These are the "door" dispatch callbacks */
1367206bf49SGordon Ross 	ioc.lmshr_func = NULL; /* not used */
137*cf115f36SGordon Ross 	ioc.opipe_func = NULL; /* not used */
1387206bf49SGordon Ross 	ioc.udoor_func = (void *)fksmbd_door_dispatch;
1397206bf49SGordon Ross 
1407206bf49SGordon Ross 	rc = smb_kmod_ioctl(SMB_IOC_START, &ioc.hdr, sizeof (ioc));
1417206bf49SGordon Ross 	return (rc);
1427206bf49SGordon Ross }
1437206bf49SGordon Ross 
1447206bf49SGordon Ross void
smb_kmod_stop(void)1457206bf49SGordon Ross smb_kmod_stop(void)
1467206bf49SGordon Ross {
1477206bf49SGordon Ross 	smb_ioc_header_t ioc;
1487206bf49SGordon Ross 
1497206bf49SGordon Ross 	bzero(&ioc, sizeof (ioc));
1507206bf49SGordon Ross 	(void) smb_kmod_ioctl(SMB_IOC_STOP, &ioc, sizeof (ioc));
1517206bf49SGordon Ross }
152