udp_dontroute.c revision 263445
1263445Sasomers/* 2263445Sasomers * Copyright (c) 2014 Spectra Logic Corporation 3263445Sasomers * All rights reserved. 4263445Sasomers * 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. 16263445Sasomers * 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. 29263445Sasomers * 30263445Sasomers * Authors: Alan Somers (Spectra Logic Corporation) 31263445Sasomers * 32263445Sasomers * $FreeBSD: head/tests/sys/netinet/udp_dontroute.c 263445 2014-03-20 20:39:41Z 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 46263445Sasomers/* 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 */ 50263445Sasomersint main(int argc, char **argv) 51263445Sasomers{ 52263445Sasomers struct sockaddr_in dst; 53263445Sasomers int s; 54263445Sasomers int opt; 55263445Sasomers int ret; 56263445Sasomers const char* buf = "Hello, World!"; 57263445Sasomers 58263445Sasomers if (argc != 2) { 59263445Sasomers fprintf(stderr, "Usage: %s ip_address\n", argv[0]); 60263445Sasomers exit(2); 61263445Sasomers } 62263445Sasomers s = socket(PF_INET, SOCK_DGRAM, 0); 63263445Sasomers if (s < 0) 64263445Sasomers err(errno, "socket"); 65263445Sasomers opt = 1; 66263445Sasomers 67263445Sasomers ret = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, &opt, sizeof(opt)); 68263445Sasomers if (ret == -1) 69263445Sasomers err(errno, "setsockopt(SO_DONTROUTE)"); 70263445Sasomers 71263445Sasomers dst.sin_len = sizeof(dst); 72263445Sasomers dst.sin_family = AF_INET; 73263445Sasomers dst.sin_port = htons(46120); 74263445Sasomers dst.sin_addr.s_addr = inet_addr(argv[1]); 75263445Sasomers if (dst.sin_addr.s_addr == htonl(INADDR_NONE)) { 76263445Sasomers fprintf(stderr, "Invalid address: %s\n", argv[1]); 77263445Sasomers exit(2); 78263445Sasomers } 79263445Sasomers ret = sendto(s, buf, strlen(buf), 0, (struct sockaddr*)&dst, 80263445Sasomers dst.sin_len); 81263445Sasomers if (ret == -1) 82263445Sasomers err(errno, "sendto"); 83263445Sasomers 84263445Sasomers return (0); 85263445Sasomers} 86