1 /*- 2 * Copyright (c) 2011 Alexander V. Chernikov 3 * Copyright (c) 2011 Christian S.J. Peron 4 * Copyright (c) 2011 Bjoern A. Zeeb 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 * $FreeBSD$ 29 */ 30 31 #include <sys/param.h> 32 #include <sys/ioctl.h> 33 #include <sys/socket.h> 34 #include <sys/sockio.h> 35 36 #include <net/if.h> 37 #include <net/route.h> 38 39 #include <stdio.h> 40 #include <stdlib.h> 41 #include <string.h> 42 #include <err.h> 43 44 #include "ifconfig.h" 45 46 static void 47 fib_status(int s) 48 { 49 struct ifreq ifr; 50 51 memset(&ifr, 0, sizeof(ifr)); 52 strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 53 if (ioctl(s, SIOCGIFFIB, (caddr_t)&ifr) == 0 && 54 ifr.ifr_fib != RT_DEFAULT_FIB) 55 printf("\tfib: %u\n", ifr.ifr_fib); 56 57 memset(&ifr, 0, sizeof(ifr)); 58 strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 59 if (ioctl(s, SIOCGTUNFIB, (caddr_t)&ifr) == 0 && 60 ifr.ifr_fib != RT_DEFAULT_FIB) 61 printf("\ttunnelfib: %u\n", ifr.ifr_fib); 62 } 63 64 static void 65 setiffib(const char *val, int dummy __unused, int s, 66 const struct afswtch *afp) 67 { 68 unsigned long fib; 69 char *ep; 70 71 fib = strtoul(val, &ep, 0); 72 if (*ep != '\0' || fib > UINT_MAX) { 73 warn("fib %s not valid", val); 74 return; 75 } 76 77 strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 78 ifr.ifr_fib = fib; 79 if (ioctl(s, SIOCSIFFIB, (caddr_t)&ifr) < 0) 80 warn("ioctl (SIOCSIFFIB)"); 81 } 82 83 static void 84 settunfib(const char *val, int dummy __unused, int s, 85 const struct afswtch *afp) 86 { 87 unsigned long fib; 88 char *ep; 89 90 fib = strtoul(val, &ep, 0); 91 if (*ep != '\0' || fib > UINT_MAX) { 92 warn("fib %s not valid", val); 93 return; 94 } 95 96 strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 97 ifr.ifr_fib = fib; 98 if (ioctl(s, SIOCSTUNFIB, (caddr_t)&ifr) < 0) 99 warn("ioctl (SIOCSTUNFIB)"); 100 } 101 102 static struct cmd fib_cmds[] = { 103 DEF_CMD_ARG("fib", setiffib), 104 DEF_CMD_ARG("tunnelfib", settunfib), 105 }; 106 107 static struct afswtch af_fib = { 108 .af_name = "af_fib", 109 .af_af = AF_UNSPEC, 110 .af_other_status = fib_status, 111 }; 112 113 static __constructor void 114 fib_ctor(void) 115 { 116 size_t i; 117 118 for (i = 0; i < nitems(fib_cmds); i++) 119 cmd_register(&fib_cmds[i]); 120 af_register(&af_fib); 121 } 122