1 /**
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *   http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <stdlib.h>
17 #include <string.h>
18 #include <sys/socket.h>
19 #include <netinet/in.h>
20 #include <fcntl.h>
21 #include <unistd.h>
22 #include <errno.h>
23 #include <pthread.h>
24 #include <sys/wait.h>
25 #include <poll.h>
26 #include "functionalext.h"
27 
28 
29 /**
30  * 该用例未在编译构建文件内开启,需手动开启,添加到test_src_functionalext_supplement_network.gni内
31  * 该用例需要两台测试设备,两台设备连接同一热点网络,本文件产物作为server端
32  * 测试前,client端设备执行ipconfig -a指令,查询wlan0 ipv6地址,设置给client端dst addr
33  * server端程序为循环监听,除非系统调用发生异常退出,否则需手动退出
34  */
main(void)35 int main(void)
36 {
37     int udp6_socket, ret;
38     socklen_t addr_len;
39     struct sockaddr_in6 saddr = {0};
40     struct sockaddr_in6 daddr = {0};
41     char buffer[] = "test.check.platform.com A 111.111.11.11";
42     char recvbuff[1024] = {0};
43     struct pollfd fds[1];
44 
45     saddr.sin6_addr = in6addr_any;
46     saddr.sin6_family = AF_INET6;
47     saddr.sin6_port = htons(40000);
48     saddr.sin6_scope_id = 0;
49 
50     daddr.sin6_family = AF_INET6;
51 
52     udp6_socket = socket(AF_INET6, SOCK_DGRAM, 0);
53     if (udp6_socket == -1) {
54         t_error("%s create udp6 socket failed, errno is %d\n", __func__, errno);
55         return t_status;
56     }
57 
58     ret = setsockopt(udp6_socket, IPPROTO_IPV6, IPV6_V6ONLY, &(int){0}, sizeof(int));
59     if (ret == -1) {
60         close(udp6_socket);
61         t_error("%s setsockopt failed, errno is %d\n", __func__, errno);
62         return t_status;
63     }
64 
65     if (bind(udp6_socket, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in6))) {
66         close(udp6_socket);
67         t_error("%s udp6 bind addr failed, errno is %d\n", __func__, errno);
68         return t_status;
69     }
70 
71     fds[0].fd = udp6_socket;
72     fds[0].events = POLLIN;
73 
74     while (1) {
75         ret = poll(fds, 1, -1);
76         if (ret < 0) {
77             t_error("%s poll failed, errno is %d\n", __func__, errno);
78             goto out;
79         }
80 
81         ret = recvfrom(udp6_socket, recvbuff, 1024, 0, (struct sockaddr *)&daddr, &addr_len);
82         if (ret < 0) {
83             t_error("%s udp6 recv failed, errno is %d\n", __func__, errno);
84             goto out;
85         }
86 
87         ret = sendto(udp6_socket, &buffer[0], sizeof(buffer), 0, (struct sockaddr *)&daddr,
88             sizeof(struct sockaddr_in6));
89     }
90 
91 out:
92     close(udp6_socket);
93     return t_status;
94 }