13b0edf7dSAndrew Thompson /*- 2*1de7b4b8SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*1de7b4b8SPedro 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 47f325335cSAndrey V. Elsukov #define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ" 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 { 54f325335cSAndrey V. Elsukov uint32_t opts = 0; 553b0edf7dSAndrew Thompson 56f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 573b0edf7dSAndrew Thompson if (ioctl(s, GREGKEY, &ifr) == 0) 58f325335cSAndrey V. Elsukov if (opts != 0) 59f325335cSAndrey V. Elsukov printf("\tgrekey: 0x%x (%u)\n", opts, opts); 60f325335cSAndrey V. Elsukov opts = 0; 61f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) != 0 || opts == 0) 62f325335cSAndrey V. Elsukov return; 63f325335cSAndrey V. Elsukov printb("\toptions", opts, GREBITS); 64f325335cSAndrey V. Elsukov putchar('\n'); 653b0edf7dSAndrew Thompson } 663b0edf7dSAndrew Thompson 673b0edf7dSAndrew Thompson static void 683b0edf7dSAndrew Thompson setifgrekey(const char *val, int dummy __unused, int s, 693b0edf7dSAndrew Thompson const struct afswtch *afp) 703b0edf7dSAndrew Thompson { 71f325335cSAndrey V. Elsukov uint32_t grekey = strtol(val, NULL, 0); 723b0edf7dSAndrew Thompson 73c8711749SDon Lewis strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 743b0edf7dSAndrew Thompson ifr.ifr_data = (caddr_t)&grekey; 753b0edf7dSAndrew Thompson if (ioctl(s, GRESKEY, (caddr_t)&ifr) < 0) 763b0edf7dSAndrew Thompson warn("ioctl (set grekey)"); 773b0edf7dSAndrew Thompson } 783b0edf7dSAndrew Thompson 79f325335cSAndrey V. Elsukov static void 80f325335cSAndrey V. Elsukov setifgreopts(const char *val, int d, int s, const struct afswtch *afp) 81f325335cSAndrey V. Elsukov { 82f325335cSAndrey V. Elsukov uint32_t opts; 83f325335cSAndrey V. Elsukov 84f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 85f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) == -1) { 86f325335cSAndrey V. Elsukov warn("ioctl(GREGOPTS)"); 87f325335cSAndrey V. Elsukov return; 88f325335cSAndrey V. Elsukov } 89f325335cSAndrey V. Elsukov 90f325335cSAndrey V. Elsukov if (d < 0) 91f325335cSAndrey V. Elsukov opts &= ~(-d); 92f325335cSAndrey V. Elsukov else 93f325335cSAndrey V. Elsukov opts |= d; 94f325335cSAndrey V. Elsukov 95f325335cSAndrey V. Elsukov if (ioctl(s, GRESOPTS, &ifr) == -1) { 96f325335cSAndrey V. Elsukov warn("ioctl(GIFSOPTS)"); 97f325335cSAndrey V. Elsukov return; 98f325335cSAndrey V. Elsukov } 99f325335cSAndrey V. Elsukov } 100f325335cSAndrey V. Elsukov 101f325335cSAndrey V. Elsukov 1023b0edf7dSAndrew Thompson static struct cmd gre_cmds[] = { 1033b0edf7dSAndrew Thompson DEF_CMD_ARG("grekey", setifgrekey), 104f325335cSAndrey V. Elsukov DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts), 105f325335cSAndrey V. Elsukov DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts), 106f325335cSAndrey V. Elsukov DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts), 107f325335cSAndrey V. Elsukov DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts), 1083b0edf7dSAndrew Thompson }; 1093b0edf7dSAndrew Thompson static struct afswtch af_gre = { 1103b0edf7dSAndrew Thompson .af_name = "af_gre", 1113b0edf7dSAndrew Thompson .af_af = AF_UNSPEC, 1123b0edf7dSAndrew Thompson .af_other_status = gre_status, 1133b0edf7dSAndrew Thompson }; 1143b0edf7dSAndrew Thompson 1153b0edf7dSAndrew Thompson static __constructor void 1163b0edf7dSAndrew Thompson gre_ctor(void) 1173b0edf7dSAndrew Thompson { 118b59dcaeeSXin LI size_t i; 1193b0edf7dSAndrew Thompson 120abd71050SEnji Cooper for (i = 0; i < nitems(gre_cmds); i++) 1213b0edf7dSAndrew Thompson cmd_register(&gre_cmds[i]); 1223b0edf7dSAndrew Thompson af_register(&af_gre); 1233b0edf7dSAndrew Thompson } 124