13b0edf7dSAndrew Thompson /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 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 47aee793eeSAndrey V. Elsukov #define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ\03UDPENCAP" 48f325335cSAndrey V. Elsukov 493b0edf7dSAndrew Thompson static void 506e3a9d7fSAlexander V. Chernikov gre_status(if_ctx *ctx) 513b0edf7dSAndrew Thompson { 52*7fa282e6SAlexander V. Chernikov uint32_t opts = 0, port; 53*7fa282e6SAlexander V. Chernikov struct ifreq ifr = { .ifr_data = (caddr_t)&opts }; 543b0edf7dSAndrew Thompson 556e3a9d7fSAlexander V. Chernikov if (ioctl_ctx(ctx, GREGKEY, &ifr) == 0) 56f325335cSAndrey V. Elsukov if (opts != 0) 57f325335cSAndrey V. Elsukov printf("\tgrekey: 0x%x (%u)\n", opts, opts); 58f325335cSAndrey V. Elsukov opts = 0; 596e3a9d7fSAlexander V. Chernikov if (ioctl_ctx(ctx, GREGOPTS, &ifr) != 0 || opts == 0) 60f325335cSAndrey V. Elsukov return; 61aee793eeSAndrey V. Elsukov 62aee793eeSAndrey V. Elsukov port = 0; 63aee793eeSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&port; 64*7fa282e6SAlexander V. Chernikov if (ioctl_ctx_ifr(ctx, GREGPORT, &ifr) == 0 && port != 0) 65aee793eeSAndrey V. Elsukov printf("\tudpport: %u\n", port); 66f325335cSAndrey V. Elsukov printb("\toptions", opts, GREBITS); 67f325335cSAndrey V. Elsukov putchar('\n'); 683b0edf7dSAndrew Thompson } 693b0edf7dSAndrew Thompson 703b0edf7dSAndrew Thompson static void 716e3a9d7fSAlexander V. Chernikov setifgrekey(if_ctx *ctx, const char *val, int dummy __unused) 723b0edf7dSAndrew Thompson { 73f325335cSAndrey V. Elsukov uint32_t grekey = strtol(val, NULL, 0); 74*7fa282e6SAlexander V. Chernikov struct ifreq ifr = { .ifr_data = (caddr_t)&grekey }; 753b0edf7dSAndrew Thompson 763b0edf7dSAndrew Thompson ifr.ifr_data = (caddr_t)&grekey; 77*7fa282e6SAlexander V. Chernikov if (ioctl_ctx_ifr(ctx, GRESKEY, &ifr) < 0) 783b0edf7dSAndrew Thompson warn("ioctl (set grekey)"); 793b0edf7dSAndrew Thompson } 803b0edf7dSAndrew Thompson 81f325335cSAndrey V. Elsukov static void 826e3a9d7fSAlexander V. Chernikov setifgreport(if_ctx *ctx, const char *val, int dummy __unused) 83aee793eeSAndrey V. Elsukov { 84aee793eeSAndrey V. Elsukov uint32_t udpport = strtol(val, NULL, 0); 85*7fa282e6SAlexander V. Chernikov struct ifreq ifr = { .ifr_data = (caddr_t)&udpport }; 86aee793eeSAndrey V. Elsukov 87*7fa282e6SAlexander V. Chernikov if (ioctl_ctx_ifr(ctx, GRESPORT, &ifr) < 0) 88aee793eeSAndrey V. Elsukov warn("ioctl (set udpport)"); 89aee793eeSAndrey V. Elsukov } 90aee793eeSAndrey V. Elsukov 91aee793eeSAndrey V. Elsukov static void 920c2beef7SAlexander V. Chernikov setifgreopts(if_ctx *ctx, const char *val __unused, int d) 93f325335cSAndrey V. Elsukov { 94f325335cSAndrey V. Elsukov uint32_t opts; 95*7fa282e6SAlexander V. Chernikov struct ifreq ifr = { .ifr_data = (caddr_t)&opts }; 96f325335cSAndrey V. Elsukov 97*7fa282e6SAlexander V. Chernikov if (ioctl_ctx_ifr(ctx, GREGOPTS, &ifr) == -1) { 98f325335cSAndrey V. Elsukov warn("ioctl(GREGOPTS)"); 99f325335cSAndrey V. Elsukov return; 100f325335cSAndrey V. Elsukov } 101f325335cSAndrey V. Elsukov 102f325335cSAndrey V. Elsukov if (d < 0) 103f325335cSAndrey V. Elsukov opts &= ~(-d); 104f325335cSAndrey V. Elsukov else 105f325335cSAndrey V. Elsukov opts |= d; 106f325335cSAndrey V. Elsukov 107*7fa282e6SAlexander V. Chernikov if (ioctl_ctx(ctx, GRESOPTS, &ifr) == -1) { 108f325335cSAndrey V. Elsukov warn("ioctl(GIFSOPTS)"); 109f325335cSAndrey V. Elsukov return; 110f325335cSAndrey V. Elsukov } 111f325335cSAndrey V. Elsukov } 112f325335cSAndrey V. Elsukov 113f325335cSAndrey V. Elsukov 1143b0edf7dSAndrew Thompson static struct cmd gre_cmds[] = { 1153b0edf7dSAndrew Thompson DEF_CMD_ARG("grekey", setifgrekey), 116aee793eeSAndrey V. Elsukov DEF_CMD_ARG("udpport", setifgreport), 117f325335cSAndrey V. Elsukov DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts), 118f325335cSAndrey V. Elsukov DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts), 119f325335cSAndrey V. Elsukov DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts), 120f325335cSAndrey V. Elsukov DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts), 121aee793eeSAndrey V. Elsukov DEF_CMD("udpencap", GRE_UDPENCAP, setifgreopts), 122aee793eeSAndrey V. Elsukov DEF_CMD("-udpencap",-GRE_UDPENCAP, setifgreopts), 1233b0edf7dSAndrew Thompson }; 1243b0edf7dSAndrew Thompson static struct afswtch af_gre = { 1253b0edf7dSAndrew Thompson .af_name = "af_gre", 1263b0edf7dSAndrew Thompson .af_af = AF_UNSPEC, 1273b0edf7dSAndrew Thompson .af_other_status = gre_status, 1283b0edf7dSAndrew Thompson }; 1293b0edf7dSAndrew Thompson 1303b0edf7dSAndrew Thompson static __constructor void 1313b0edf7dSAndrew Thompson gre_ctor(void) 1323b0edf7dSAndrew Thompson { 133b59dcaeeSXin LI size_t i; 1343b0edf7dSAndrew Thompson 135abd71050SEnji Cooper for (i = 0; i < nitems(gre_cmds); i++) 1363b0edf7dSAndrew Thompson cmd_register(&gre_cmds[i]); 1373b0edf7dSAndrew Thompson af_register(&af_gre); 1383b0edf7dSAndrew Thompson } 139