udp_dontroute.c revision 265586
1/* 2 * Copyright (c) 2014 Spectra Logic Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions, and the following disclaimer, 10 * without modification. 11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12 * substantially similar to the "NO WARRANTY" disclaimer below 13 * ("Disclaimer") and any redistribution must be conditioned upon 14 * including a substantially similar Disclaimer requirement for further 15 * binary redistribution. 16 * 17 * NO WARRANTY 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGES. 29 * 30 * Authors: Alan Somers (Spectra Logic Corporation) 31 * 32 * $FreeBSD: stable/10/tests/sys/netinet/udp_dontroute.c 265586 2014-05-07 18:49:25Z asomers $ 33 */ 34 35#include <arpa/inet.h> 36#include <netinet/in.h> 37#include <sys/types.h> 38#include <sys/socket.h> 39 40#include <err.h> 41#include <errno.h> 42#include <stdio.h> 43#include <stdlib.h> 44#include <string.h> 45 46/* 47 * Sends a single UDP packet to the provided address, with SO_DONTROUTE set 48 * I couldn't find a way to do this with builtin utilities like nc(1) 49 */ 50int 51main(int argc, char **argv) 52{ 53 struct sockaddr_in dst; 54 int s; 55 int opt; 56 int ret; 57 const char* buf = "Hello, World!"; 58 59 if (argc != 2) { 60 fprintf(stderr, "Usage: %s ip_address\n", argv[0]); 61 exit(2); 62 } 63 s = socket(PF_INET, SOCK_DGRAM, 0); 64 if (s < 0) 65 err(errno, "socket"); 66 opt = 1; 67 68 ret = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, &opt, sizeof(opt)); 69 if (ret == -1) 70 err(errno, "setsockopt(SO_DONTROUTE)"); 71 72 dst.sin_len = sizeof(dst); 73 dst.sin_family = AF_INET; 74 dst.sin_port = htons(46120); 75 dst.sin_addr.s_addr = inet_addr(argv[1]); 76 if (dst.sin_addr.s_addr == htonl(INADDR_NONE)) { 77 fprintf(stderr, "Invalid address: %s\n", argv[1]); 78 exit(2); 79 } 80 ret = sendto(s, buf, strlen(buf), 0, (struct sockaddr*)&dst, 81 dst.sin_len); 82 if (ret == -1) 83 err(errno, "sendto"); 84 85 return (0); 86} 87