1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <errno.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <unistd.h> 8 #include <arpa/inet.h> 9 #include <sys/socket.h> 10 #include <netdb.h> 11 12 #include "../../net/lib/ksft.h" 13 14 int main(int argc, char *argv[]) 15 { 16 struct sockaddr_storage address; 17 struct addrinfo *result; 18 struct addrinfo hints; 19 unsigned int napi_id; 20 socklen_t addr_len; 21 socklen_t optlen; 22 char buf[1024]; 23 int opt = 1; 24 int family; 25 int server; 26 int client; 27 int ret; 28 29 memset(&hints, 0, sizeof(hints)); 30 hints.ai_family = AF_UNSPEC; 31 hints.ai_socktype = SOCK_STREAM; 32 hints.ai_flags = AI_PASSIVE; 33 34 ret = getaddrinfo(argv[1], argv[2], &hints, &result); 35 if (ret != 0) { 36 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); 37 return 1; 38 } 39 40 family = result->ai_family; 41 addr_len = result->ai_addrlen; 42 43 server = socket(family, SOCK_STREAM, IPPROTO_TCP); 44 if (server < 0) { 45 perror("socket creation failed"); 46 freeaddrinfo(result); 47 if (errno == EAFNOSUPPORT) 48 return -1; 49 return 1; 50 } 51 52 if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { 53 perror("setsockopt"); 54 freeaddrinfo(result); 55 return 1; 56 } 57 58 memcpy(&address, result->ai_addr, result->ai_addrlen); 59 freeaddrinfo(result); 60 61 if (bind(server, (struct sockaddr *)&address, addr_len) < 0) { 62 perror("bind failed"); 63 return 1; 64 } 65 66 if (listen(server, 1) < 0) { 67 perror("listen"); 68 return 1; 69 } 70 71 ksft_ready(); 72 73 client = accept(server, NULL, 0); 74 if (client < 0) { 75 perror("accept"); 76 return 1; 77 } 78 79 optlen = sizeof(napi_id); 80 ret = getsockopt(client, SOL_SOCKET, SO_INCOMING_NAPI_ID, &napi_id, 81 &optlen); 82 if (ret != 0) { 83 perror("getsockopt"); 84 return 1; 85 } 86 87 read(client, buf, 1024); 88 89 ksft_wait(); 90 91 if (napi_id == 0) { 92 fprintf(stderr, "napi ID is 0\n"); 93 return 1; 94 } 95 96 close(client); 97 close(server); 98 99 return 0; 100 } 101