| // SPDX-License-Identifier: GPL-2.0 | |
| #include <errno.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <arpa/inet.h> | |
| #include <sys/socket.h> | |
| #include <netdb.h> | |
| #include "../../net/lib/ksft.h" | |
| int main(int argc, char *argv[]) | |
| { | |
| struct sockaddr_storage address; | |
| struct addrinfo *result; | |
| struct addrinfo hints; | |
| unsigned int napi_id; | |
| socklen_t addr_len; | |
| socklen_t optlen; | |
| char buf[1024]; | |
| int opt = 1; | |
| int family; | |
| int server; | |
| int client; | |
| int ret; | |
| memset(&hints, 0, sizeof(hints)); | |
| hints.ai_family = AF_UNSPEC; | |
| hints.ai_socktype = SOCK_STREAM; | |
| hints.ai_flags = AI_PASSIVE; | |
| ret = getaddrinfo(argv[1], argv[2], &hints, &result); | |
| if (ret != 0) { | |
| fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); | |
| return 1; | |
| } | |
| family = result->ai_family; | |
| addr_len = result->ai_addrlen; | |
| server = socket(family, SOCK_STREAM, IPPROTO_TCP); | |
| if (server < 0) { | |
| perror("socket creation failed"); | |
| freeaddrinfo(result); | |
| if (errno == EAFNOSUPPORT) | |
| return -1; | |
| return 1; | |
| } | |
| if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { | |
| perror("setsockopt"); | |
| freeaddrinfo(result); | |
| return 1; | |
| } | |
| memcpy(&address, result->ai_addr, result->ai_addrlen); | |
| freeaddrinfo(result); | |
| if (bind(server, (struct sockaddr *)&address, addr_len) < 0) { | |
| perror("bind failed"); | |
| return 1; | |
| } | |
| if (listen(server, 1) < 0) { | |
| perror("listen"); | |
| return 1; | |
| } | |
| ksft_ready(); | |
| client = accept(server, NULL, 0); | |
| if (client < 0) { | |
| perror("accept"); | |
| return 1; | |
| } | |
| optlen = sizeof(napi_id); | |
| ret = getsockopt(client, SOL_SOCKET, SO_INCOMING_NAPI_ID, &napi_id, | |
| &optlen); | |
| if (ret != 0) { | |
| perror("getsockopt"); | |
| return 1; | |
| } | |
| read(client, buf, 1024); | |
| ksft_wait(); | |
| if (napi_id == 0) { | |
| fprintf(stderr, "napi ID is 0\n"); | |
| return 1; | |
| } | |
| close(client); | |
| close(server); | |
| return 0; | |
| } |