at v5.16-rc4 67 lines 1.4 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2#include <errno.h> 3#include <netdb.h> 4#include <stdio.h> 5#include <stdlib.h> 6#include <string.h> 7#include <unistd.h> 8#include <linux/types.h> 9#include <sys/socket.h> 10 11int main(int argc, const char **argv) 12{ 13 char cbuf[CMSG_SPACE(sizeof(__u32))]; 14 struct addrinfo hints, *ai; 15 struct cmsghdr *cmsg; 16 struct iovec iov[1]; 17 struct msghdr msg; 18 int mark; 19 int err; 20 int fd; 21 22 if (argc != 4) { 23 fprintf(stderr, "Usage: %s <dst_ip> <port> <mark>\n", argv[0]); 24 return 1; 25 } 26 mark = atoi(argv[3]); 27 28 memset(&hints, 0, sizeof(hints)); 29 hints.ai_family = AF_UNSPEC; 30 hints.ai_socktype = SOCK_DGRAM; 31 32 ai = NULL; 33 err = getaddrinfo(argv[1], argv[2], &hints, &ai); 34 if (err) { 35 fprintf(stderr, "Can't resolve address: %s\n", strerror(errno)); 36 return 1; 37 } 38 39 fd = socket(ai->ai_family, SOCK_DGRAM, IPPROTO_UDP); 40 if (fd < 0) { 41 fprintf(stderr, "Can't open socket: %s\n", strerror(errno)); 42 freeaddrinfo(ai); 43 return 1; 44 } 45 46 iov[0].iov_base = "bla"; 47 iov[0].iov_len = 4; 48 49 msg.msg_name = ai->ai_addr; 50 msg.msg_namelen = ai->ai_addrlen; 51 msg.msg_iov = iov; 52 msg.msg_iovlen = 1; 53 msg.msg_control = cbuf; 54 msg.msg_controllen = sizeof(cbuf); 55 56 cmsg = CMSG_FIRSTHDR(&msg); 57 cmsg->cmsg_level = SOL_SOCKET; 58 cmsg->cmsg_type = SO_MARK; 59 cmsg->cmsg_len = CMSG_LEN(sizeof(__u32)); 60 *(__u32 *)CMSG_DATA(cmsg) = mark; 61 62 err = sendmsg(fd, &msg, 0); 63 64 close(fd); 65 freeaddrinfo(ai); 66 return err != 4; 67}