xref: /f-stack/lib/ff_ngctl.c (revision 2317ada5)
13b2bd0f6Slogwang /*
2*2317ada5Sfengbojiang  * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
33b2bd0f6Slogwang  * All rights reserved.
43b2bd0f6Slogwang  *
53b2bd0f6Slogwang  * Redistribution and use in source and binary forms, with or without
63b2bd0f6Slogwang  * modification, are permitted provided that the following conditions are met:
73b2bd0f6Slogwang  *
83b2bd0f6Slogwang  * 1. Redistributions of source code must retain the above copyright notice, this
93b2bd0f6Slogwang  *   list of conditions and the following disclaimer.
103b2bd0f6Slogwang  * 2. Redistributions in binary form must reproduce the above copyright notice,
113b2bd0f6Slogwang  *   this list of conditions and the following disclaimer in the documentation
123b2bd0f6Slogwang  *   and/or other materials provided with the distribution.
133b2bd0f6Slogwang  *
143b2bd0f6Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
153b2bd0f6Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
163b2bd0f6Slogwang  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
173b2bd0f6Slogwang  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
183b2bd0f6Slogwang  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
193b2bd0f6Slogwang  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
203b2bd0f6Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
213b2bd0f6Slogwang  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
223b2bd0f6Slogwang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
233b2bd0f6Slogwang  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
243b2bd0f6Slogwang  *
253b2bd0f6Slogwang  *
263b2bd0f6Slogwang  */
273b2bd0f6Slogwang 
283b2bd0f6Slogwang #include <sys/types.h>
293b2bd0f6Slogwang #include <sys/socket.h>
303b2bd0f6Slogwang #include <sys/syscallsubr.h>
313b2bd0f6Slogwang #include <sys/sysproto.h>
323b2bd0f6Slogwang #include <sys/pcpu.h>
333b2bd0f6Slogwang #include <sys/proc.h>
343b2bd0f6Slogwang #include <netgraph/ng_message.h>
353b2bd0f6Slogwang #include <netgraph/ng_socket.h>
363b2bd0f6Slogwang 
373b2bd0f6Slogwang #include "ff_api.h"
383b2bd0f6Slogwang #include "ff_host_interface.h"
393b2bd0f6Slogwang 
403b2bd0f6Slogwang static int
ngctl_socket(struct socket_args * uap)413b2bd0f6Slogwang ngctl_socket(struct socket_args *uap)
423b2bd0f6Slogwang {
433b2bd0f6Slogwang     int error = sys_socket(curthread, uap);
443b2bd0f6Slogwang     if (error) {
453b2bd0f6Slogwang 	ff_os_errno(error);
463b2bd0f6Slogwang         return -1;
473b2bd0f6Slogwang     }
483b2bd0f6Slogwang     return curthread->td_retval[0];
493b2bd0f6Slogwang }
503b2bd0f6Slogwang 
513b2bd0f6Slogwang static int
ngctl_connect(struct connect_args * uap)523b2bd0f6Slogwang ngctl_connect(struct connect_args *uap)
533b2bd0f6Slogwang {
543b2bd0f6Slogwang     int error = sys_connect(curthread, uap);
553b2bd0f6Slogwang     if (error) {
563b2bd0f6Slogwang         ff_os_errno(error);
573b2bd0f6Slogwang         return (-1);
583b2bd0f6Slogwang     }
593b2bd0f6Slogwang 
603b2bd0f6Slogwang     return (error);
613b2bd0f6Slogwang }
623b2bd0f6Slogwang 
633b2bd0f6Slogwang static int
ngctl_bind(struct bind_args * uap)643b2bd0f6Slogwang ngctl_bind(struct bind_args *uap)
653b2bd0f6Slogwang {
663b2bd0f6Slogwang     int error = sys_bind(curthread, uap);
673b2bd0f6Slogwang     if (error) {
683b2bd0f6Slogwang         ff_os_errno(error);
693b2bd0f6Slogwang         return (-1);
703b2bd0f6Slogwang     }
713b2bd0f6Slogwang 
723b2bd0f6Slogwang     return (error);
733b2bd0f6Slogwang }
743b2bd0f6Slogwang 
753b2bd0f6Slogwang static int
ngctl_recvfrom(struct recvfrom_args * uap)763b2bd0f6Slogwang ngctl_recvfrom(struct recvfrom_args *uap)
773b2bd0f6Slogwang {
783b2bd0f6Slogwang     int error = sys_recvfrom(curthread, uap);
793b2bd0f6Slogwang     if (error) {
803b2bd0f6Slogwang         ff_os_errno(error);
813b2bd0f6Slogwang         return (-1);
823b2bd0f6Slogwang     }
833b2bd0f6Slogwang     return curthread->td_retval[0];
843b2bd0f6Slogwang }
853b2bd0f6Slogwang 
863b2bd0f6Slogwang static int
ngctl_sendto(struct sendto_args * uap)873b2bd0f6Slogwang ngctl_sendto(struct sendto_args *uap)
883b2bd0f6Slogwang {
893b2bd0f6Slogwang     int error = sys_sendto(curthread, uap);
903b2bd0f6Slogwang     if (error) {
913b2bd0f6Slogwang         ff_os_errno(error);
923b2bd0f6Slogwang         return (-1);
933b2bd0f6Slogwang     }
943b2bd0f6Slogwang     return curthread->td_retval[0];
953b2bd0f6Slogwang }
963b2bd0f6Slogwang 
973b2bd0f6Slogwang static int
ngctl_close(int sockfd)983b2bd0f6Slogwang ngctl_close(int sockfd)
993b2bd0f6Slogwang {
1003b2bd0f6Slogwang     int error = kern_close(curthread, sockfd);
1013b2bd0f6Slogwang     if (error) {
1023b2bd0f6Slogwang         ff_os_errno(error);
1033b2bd0f6Slogwang         return (-1);
1043b2bd0f6Slogwang     }
1053b2bd0f6Slogwang     return (error);
1063b2bd0f6Slogwang }
1073b2bd0f6Slogwang 
1083b2bd0f6Slogwang int
ff_ngctl(int cmd,void * data)1093b2bd0f6Slogwang ff_ngctl(int cmd, void *data)
1103b2bd0f6Slogwang {
1113b2bd0f6Slogwang     switch(cmd) {
1123b2bd0f6Slogwang         case NGCTL_SOCKET:
1133b2bd0f6Slogwang             return ngctl_socket((struct socket_args *)data);
1143b2bd0f6Slogwang         case NGCTL_CONNECT:
1153b2bd0f6Slogwang             return ngctl_connect((struct connect_args *)data);
1163b2bd0f6Slogwang         case NGCTL_BIND:
1173b2bd0f6Slogwang             return ngctl_bind((struct bind_args *)data);
1183b2bd0f6Slogwang         case NGCTL_SEND:
1193b2bd0f6Slogwang             return ngctl_sendto((struct sendto_args *)data);
1203b2bd0f6Slogwang         case NGCTL_RECV:
1213b2bd0f6Slogwang             return ngctl_recvfrom((struct recvfrom_args *)data);
1223b2bd0f6Slogwang         case NGCTL_CLOSE:
1233b2bd0f6Slogwang             return ngctl_close(*(int *)data);
1243b2bd0f6Slogwang         default:
1253b2bd0f6Slogwang             break;
1263b2bd0f6Slogwang     }
1273b2bd0f6Slogwang 
1283b2bd0f6Slogwang     ff_os_errno(EINVAL);
1293b2bd0f6Slogwang     return (-1);
1303b2bd0f6Slogwang }
1313b2bd0f6Slogwang 
132