1fa74a859Slogwang /*
2*2317ada5Sfengbojiang * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
3fa74a859Slogwang * All rights reserved.
4fa74a859Slogwang *
5fa74a859Slogwang * Redistribution and use in source and binary forms, with or without
6fa74a859Slogwang * modification, are permitted provided that the following conditions are met:
7fa74a859Slogwang *
8fa74a859Slogwang * 1. Redistributions of source code must retain the above copyright notice, this
9fa74a859Slogwang * list of conditions and the following disclaimer.
10fa74a859Slogwang * 2. Redistributions in binary form must reproduce the above copyright notice,
11fa74a859Slogwang * this list of conditions and the following disclaimer in the documentation
12fa74a859Slogwang * and/or other materials provided with the distribution.
13fa74a859Slogwang *
14fa74a859Slogwang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15fa74a859Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16fa74a859Slogwang * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17fa74a859Slogwang * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18fa74a859Slogwang * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19fa74a859Slogwang * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20fa74a859Slogwang * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21fa74a859Slogwang * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22fa74a859Slogwang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23fa74a859Slogwang * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24fa74a859Slogwang *
25fa74a859Slogwang */
26fa74a859Slogwang
27fa74a859Slogwang #include <string.h>
28fa74a859Slogwang #include <errno.h>
29fa74a859Slogwang #include <sys/socket.h>
30fa74a859Slogwang
31fa74a859Slogwang #include "rtioctl.h"
32fa74a859Slogwang #include "ff_ipc.h"
33fa74a859Slogwang
34fa74a859Slogwang int rt_shutdown_rd = 0;
35fa74a859Slogwang int rt_sofib = 0;
36fa74a859Slogwang
37fa74a859Slogwang int
rt_socket(int domain,int type,int protocol)38fa74a859Slogwang rt_socket(int domain, int type, int protocol)
39fa74a859Slogwang {
40fa74a859Slogwang if (domain != PF_ROUTE || type != SOCK_RAW) {
41fa74a859Slogwang errno = EINVAL;
42fa74a859Slogwang return -1;
43fa74a859Slogwang }
44fa74a859Slogwang
45fa74a859Slogwang return 0;
46fa74a859Slogwang }
47fa74a859Slogwang
48fa74a859Slogwang int
rt_shutdown(int fd,int how)49fa74a859Slogwang rt_shutdown(int fd, int how)
50fa74a859Slogwang {
51fa74a859Slogwang if (how == SHUT_RD) {
52fa74a859Slogwang rt_shutdown_rd = 1;
53fa74a859Slogwang }
54fa74a859Slogwang return 0;
55fa74a859Slogwang }
56fa74a859Slogwang
57fa74a859Slogwang int
rt_setsockopt(int sockfd,int level,int optname,const void * optval,socklen_t optlen)58fa74a859Slogwang rt_setsockopt(int sockfd, int level, int optname,
59fa74a859Slogwang const void *optval, socklen_t optlen)
60fa74a859Slogwang {
61fa74a859Slogwang if (level == SOL_SOCKET && optname == SO_SETFIB) {
62fa74a859Slogwang rt_sofib = *(int *)optval;
63fa74a859Slogwang }
64fa74a859Slogwang return 0;
65fa74a859Slogwang }
66fa74a859Slogwang
67fa74a859Slogwang void
rt_close(int fd)68fa74a859Slogwang rt_close(int fd)
69fa74a859Slogwang {
70fa74a859Slogwang return;
71fa74a859Slogwang }
72fa74a859Slogwang
73fa74a859Slogwang int
rtioctl(char * data,unsigned len,unsigned read_len)74fa74a859Slogwang rtioctl(char *data, unsigned len, unsigned read_len)
75fa74a859Slogwang {
76fa74a859Slogwang struct ff_msg *msg, *retmsg = NULL;
77fa74a859Slogwang unsigned maxlen;
78fa74a859Slogwang
79fa74a859Slogwang msg = ff_ipc_msg_alloc();
80fa74a859Slogwang if (msg == NULL) {
81fa74a859Slogwang errno = ENOMEM;
82fa74a859Slogwang return -1;
83fa74a859Slogwang }
84fa74a859Slogwang
85fa74a859Slogwang if (len > msg->buf_len) {
86fa74a859Slogwang errno = EINVAL;
87fa74a859Slogwang ff_ipc_msg_free(msg);
88fa74a859Slogwang return -1;
89fa74a859Slogwang }
90fa74a859Slogwang
91fa74a859Slogwang if (read_len > msg->buf_len) {
92fa74a859Slogwang read_len = msg->buf_len;
93fa74a859Slogwang }
94fa74a859Slogwang
95fa74a859Slogwang maxlen = read_len ? read_len : len;
96fa74a859Slogwang
97fa74a859Slogwang msg->msg_type = FF_ROUTE;
98fa74a859Slogwang msg->route.fib = rt_sofib;
99fa74a859Slogwang msg->route.len = len;
100fa74a859Slogwang msg->route.maxlen = maxlen;
101fa74a859Slogwang msg->route.data = msg->buf_addr;
102fa74a859Slogwang memcpy(msg->route.data, data, len);
103fa74a859Slogwang msg->buf_addr += len;
104fa74a859Slogwang
105fa74a859Slogwang int ret = ff_ipc_send(msg);
106fa74a859Slogwang if (ret < 0) {
107fa74a859Slogwang errno = EPIPE;
108fa74a859Slogwang ff_ipc_msg_free(msg);
109fa74a859Slogwang return -1;
110fa74a859Slogwang }
111fa74a859Slogwang
112fa74a859Slogwang do {
113fa74a859Slogwang if (retmsg != NULL) {
114fa74a859Slogwang ff_ipc_msg_free(retmsg);
115fa74a859Slogwang }
1166194fcd2Sfengbojiang(姜凤波) ret = ff_ipc_recv(&retmsg, msg->msg_type);
117fa74a859Slogwang if (ret < 0) {
118fa74a859Slogwang errno = EPIPE;
119fa74a859Slogwang return -1;
120fa74a859Slogwang }
121fa74a859Slogwang } while (msg != retmsg);
122fa74a859Slogwang
123fa74a859Slogwang if (retmsg->result == 0) {
124fa74a859Slogwang ret = retmsg->route.len;
125fa74a859Slogwang
126fa74a859Slogwang if (!rt_shutdown_rd && read_len > 0) {
127fa74a859Slogwang memcpy(data, retmsg->route.data, retmsg->route.len);
128fa74a859Slogwang }
129fa74a859Slogwang } else {
130fa74a859Slogwang ret = -1;
131fa74a859Slogwang errno = retmsg->result;
132fa74a859Slogwang }
133fa74a859Slogwang
134fa74a859Slogwang ff_ipc_msg_free(msg);
135fa74a859Slogwang
136fa74a859Slogwang return ret;
137fa74a859Slogwang }
138fa74a859Slogwang
139