13b0edf7dSAndrew Thompson /*- 21de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 31de7b4b8SPedro F. Giffuni * 43b0edf7dSAndrew Thompson * Copyright (c) 2008 Andrew Thompson. All rights reserved. 53b0edf7dSAndrew Thompson * 63b0edf7dSAndrew Thompson * Redistribution and use in source and binary forms, with or without 73b0edf7dSAndrew Thompson * modification, are permitted provided that the following conditions 83b0edf7dSAndrew Thompson * are met: 93b0edf7dSAndrew Thompson * 1. Redistributions of source code must retain the above copyright 103b0edf7dSAndrew Thompson * notice, this list of conditions and the following disclaimer. 113b0edf7dSAndrew Thompson * 2. Redistributions in binary form must reproduce the above copyright 123b0edf7dSAndrew Thompson * notice, this list of conditions and the following disclaimer in the 133b0edf7dSAndrew Thompson * documentation and/or other materials provided with the distribution. 143b0edf7dSAndrew Thompson * 153b0edf7dSAndrew Thompson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 163b0edf7dSAndrew Thompson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 173b0edf7dSAndrew Thompson * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 183b0edf7dSAndrew Thompson * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 193b0edf7dSAndrew Thompson * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 203b0edf7dSAndrew Thompson * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 213b0edf7dSAndrew Thompson * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 223b0edf7dSAndrew Thompson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 233b0edf7dSAndrew Thompson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 243b0edf7dSAndrew Thompson * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 253b0edf7dSAndrew Thompson * THE POSSIBILITY OF SUCH DAMAGE. 263b0edf7dSAndrew Thompson */ 273b0edf7dSAndrew Thompson 28f325335cSAndrey V. Elsukov #include <sys/cdefs.h> 29f325335cSAndrey V. Elsukov __FBSDID("$FreeBSD$"); 303b0edf7dSAndrew Thompson 313b0edf7dSAndrew Thompson #include <sys/param.h> 323b0edf7dSAndrew Thompson #include <sys/ioctl.h> 333b0edf7dSAndrew Thompson #include <sys/socket.h> 343b0edf7dSAndrew Thompson #include <sys/sockio.h> 353b0edf7dSAndrew Thompson #include <net/if.h> 363b0edf7dSAndrew Thompson #include <net/if_gre.h> 373b0edf7dSAndrew Thompson 383b0edf7dSAndrew Thompson #include <ctype.h> 39f325335cSAndrey V. Elsukov #include <limits.h> 403b0edf7dSAndrew Thompson #include <stdio.h> 413b0edf7dSAndrew Thompson #include <stdlib.h> 42f325335cSAndrey V. Elsukov #include <string.h> 433b0edf7dSAndrew Thompson #include <err.h> 443b0edf7dSAndrew Thompson 453b0edf7dSAndrew Thompson #include "ifconfig.h" 463b0edf7dSAndrew Thompson 47*aee793eeSAndrey V. Elsukov #define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ\03UDPENCAP" 48f325335cSAndrey V. Elsukov 493b0edf7dSAndrew Thompson static void gre_status(int s); 503b0edf7dSAndrew Thompson 513b0edf7dSAndrew Thompson static void 523b0edf7dSAndrew Thompson gre_status(int s) 533b0edf7dSAndrew Thompson { 54*aee793eeSAndrey V. Elsukov uint32_t opts, port; 553b0edf7dSAndrew Thompson 56*aee793eeSAndrey V. Elsukov opts = 0; 57f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 583b0edf7dSAndrew Thompson if (ioctl(s, GREGKEY, &ifr) == 0) 59f325335cSAndrey V. Elsukov if (opts != 0) 60f325335cSAndrey V. Elsukov printf("\tgrekey: 0x%x (%u)\n", opts, opts); 61f325335cSAndrey V. Elsukov opts = 0; 62f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) != 0 || opts == 0) 63f325335cSAndrey V. Elsukov return; 64*aee793eeSAndrey V. Elsukov 65*aee793eeSAndrey V. Elsukov port = 0; 66*aee793eeSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&port; 67*aee793eeSAndrey V. Elsukov if (ioctl(s, GREGPORT, &ifr) == 0 && port != 0) 68*aee793eeSAndrey V. Elsukov printf("\tudpport: %u\n", port); 69f325335cSAndrey V. Elsukov printb("\toptions", opts, GREBITS); 70f325335cSAndrey V. Elsukov putchar('\n'); 713b0edf7dSAndrew Thompson } 723b0edf7dSAndrew Thompson 733b0edf7dSAndrew Thompson static void 743b0edf7dSAndrew Thompson setifgrekey(const char *val, int dummy __unused, int s, 753b0edf7dSAndrew Thompson const struct afswtch *afp) 763b0edf7dSAndrew Thompson { 77f325335cSAndrey V. Elsukov uint32_t grekey = strtol(val, NULL, 0); 783b0edf7dSAndrew Thompson 79c8711749SDon Lewis strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 803b0edf7dSAndrew Thompson ifr.ifr_data = (caddr_t)&grekey; 813b0edf7dSAndrew Thompson if (ioctl(s, GRESKEY, (caddr_t)&ifr) < 0) 823b0edf7dSAndrew Thompson warn("ioctl (set grekey)"); 833b0edf7dSAndrew Thompson } 843b0edf7dSAndrew Thompson 85f325335cSAndrey V. Elsukov static void 86*aee793eeSAndrey V. Elsukov setifgreport(const char *val, int dummy __unused, int s, 87*aee793eeSAndrey V. Elsukov const struct afswtch *afp) 88*aee793eeSAndrey V. Elsukov { 89*aee793eeSAndrey V. Elsukov uint32_t udpport = strtol(val, NULL, 0); 90*aee793eeSAndrey V. Elsukov 91*aee793eeSAndrey V. Elsukov strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 92*aee793eeSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&udpport; 93*aee793eeSAndrey V. Elsukov if (ioctl(s, GRESPORT, (caddr_t)&ifr) < 0) 94*aee793eeSAndrey V. Elsukov warn("ioctl (set udpport)"); 95*aee793eeSAndrey V. Elsukov } 96*aee793eeSAndrey V. Elsukov 97*aee793eeSAndrey V. Elsukov static void 98f325335cSAndrey V. Elsukov setifgreopts(const char *val, int d, int s, const struct afswtch *afp) 99f325335cSAndrey V. Elsukov { 100f325335cSAndrey V. Elsukov uint32_t opts; 101f325335cSAndrey V. Elsukov 102f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 103f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) == -1) { 104f325335cSAndrey V. Elsukov warn("ioctl(GREGOPTS)"); 105f325335cSAndrey V. Elsukov return; 106f325335cSAndrey V. Elsukov } 107f325335cSAndrey V. Elsukov 108f325335cSAndrey V. Elsukov if (d < 0) 109f325335cSAndrey V. Elsukov opts &= ~(-d); 110f325335cSAndrey V. Elsukov else 111f325335cSAndrey V. Elsukov opts |= d; 112f325335cSAndrey V. Elsukov 113f325335cSAndrey V. Elsukov if (ioctl(s, GRESOPTS, &ifr) == -1) { 114f325335cSAndrey V. Elsukov warn("ioctl(GIFSOPTS)"); 115f325335cSAndrey V. Elsukov return; 116f325335cSAndrey V. Elsukov } 117f325335cSAndrey V. Elsukov } 118f325335cSAndrey V. Elsukov 119f325335cSAndrey V. Elsukov 1203b0edf7dSAndrew Thompson static struct cmd gre_cmds[] = { 1213b0edf7dSAndrew Thompson DEF_CMD_ARG("grekey", setifgrekey), 122*aee793eeSAndrey V. Elsukov DEF_CMD_ARG("udpport", setifgreport), 123f325335cSAndrey V. Elsukov DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts), 124f325335cSAndrey V. Elsukov DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts), 125f325335cSAndrey V. Elsukov DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts), 126f325335cSAndrey V. Elsukov DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts), 127*aee793eeSAndrey V. Elsukov DEF_CMD("udpencap", GRE_UDPENCAP, setifgreopts), 128*aee793eeSAndrey V. Elsukov DEF_CMD("-udpencap",-GRE_UDPENCAP, setifgreopts), 1293b0edf7dSAndrew Thompson }; 1303b0edf7dSAndrew Thompson static struct afswtch af_gre = { 1313b0edf7dSAndrew Thompson .af_name = "af_gre", 1323b0edf7dSAndrew Thompson .af_af = AF_UNSPEC, 1333b0edf7dSAndrew Thompson .af_other_status = gre_status, 1343b0edf7dSAndrew Thompson }; 1353b0edf7dSAndrew Thompson 1363b0edf7dSAndrew Thompson static __constructor void 1373b0edf7dSAndrew Thompson gre_ctor(void) 1383b0edf7dSAndrew Thompson { 139b59dcaeeSXin LI size_t i; 1403b0edf7dSAndrew Thompson 141abd71050SEnji Cooper for (i = 0; i < nitems(gre_cmds); i++) 1423b0edf7dSAndrew Thompson cmd_register(&gre_cmds[i]); 1433b0edf7dSAndrew Thompson af_register(&af_gre); 1443b0edf7dSAndrew Thompson } 145