udp_dontroute.c revision 264917
1263445Sasomers/* 2263445Sasomers * Copyright (c) 2014 Spectra Logic Corporation 3263445Sasomers * All rights reserved. 4264917Sasomers * 5263445Sasomers * Redistribution and use in source and binary forms, with or without 6263445Sasomers * modification, are permitted provided that the following conditions 7263445Sasomers * are met: 8263445Sasomers * 1. Redistributions of source code must retain the above copyright 9263445Sasomers * notice, this list of conditions, and the following disclaimer, 10263445Sasomers * without modification. 11263445Sasomers * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12263445Sasomers * substantially similar to the "NO WARRANTY" disclaimer below 13263445Sasomers * ("Disclaimer") and any redistribution must be conditioned upon 14263445Sasomers * including a substantially similar Disclaimer requirement for further 15263445Sasomers * binary redistribution. 16264917Sasomers * 17263445Sasomers * NO WARRANTY 18263445Sasomers * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19263445Sasomers * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20263445Sasomers * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21263445Sasomers * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22263445Sasomers * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23263445Sasomers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24263445Sasomers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25263445Sasomers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26263445Sasomers * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27263445Sasomers * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28263445Sasomers * POSSIBILITY OF SUCH DAMAGES. 29264917Sasomers * 30263445Sasomers * Authors: Alan Somers (Spectra Logic Corporation) 31263445Sasomers * 32263445Sasomers * $FreeBSD: head/tests/sys/netinet/udp_dontroute.c 264917 2014-04-25 14:35:30Z asomers $ 33263445Sasomers */ 34263445Sasomers 35263445Sasomers#include <arpa/inet.h> 36263445Sasomers#include <netinet/in.h> 37263445Sasomers#include <sys/types.h> 38263445Sasomers#include <sys/socket.h> 39263445Sasomers 40263445Sasomers#include <err.h> 41263445Sasomers#include <errno.h> 42263445Sasomers#include <stdio.h> 43263445Sasomers#include <stdlib.h> 44263445Sasomers#include <string.h> 45263445Sasomers 46264917Sasomers/* 47263445Sasomers * Sends a single UDP packet to the provided address, with SO_DONTROUTE set 48263445Sasomers * I couldn't find a way to do this with builtin utilities like nc(1) 49263445Sasomers */ 50264917Sasomersint 51264917Sasomersmain(int argc, char **argv) 52263445Sasomers{ 53263445Sasomers struct sockaddr_in dst; 54263445Sasomers int s; 55263445Sasomers int opt; 56263445Sasomers int ret; 57263445Sasomers const char* buf = "Hello, World!"; 58263445Sasomers 59263445Sasomers if (argc != 2) { 60263445Sasomers fprintf(stderr, "Usage: %s ip_address\n", argv[0]); 61263445Sasomers exit(2); 62263445Sasomers } 63263445Sasomers s = socket(PF_INET, SOCK_DGRAM, 0); 64263445Sasomers if (s < 0) 65263445Sasomers err(errno, "socket"); 66263445Sasomers opt = 1; 67263445Sasomers 68263445Sasomers ret = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, &opt, sizeof(opt)); 69263445Sasomers if (ret == -1) 70263445Sasomers err(errno, "setsockopt(SO_DONTROUTE)"); 71263445Sasomers 72263445Sasomers dst.sin_len = sizeof(dst); 73263445Sasomers dst.sin_family = AF_INET; 74263445Sasomers dst.sin_port = htons(46120); 75263445Sasomers dst.sin_addr.s_addr = inet_addr(argv[1]); 76263445Sasomers if (dst.sin_addr.s_addr == htonl(INADDR_NONE)) { 77263445Sasomers fprintf(stderr, "Invalid address: %s\n", argv[1]); 78263445Sasomers exit(2); 79263445Sasomers } 80263445Sasomers ret = sendto(s, buf, strlen(buf), 0, (struct sockaddr*)&dst, 81263445Sasomers dst.sin_len); 82263445Sasomers if (ret == -1) 83263445Sasomers err(errno, "sendto"); 84264917Sasomers 85263445Sasomers return (0); 86263445Sasomers} 87