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 }