13b0edf7dSAndrew Thompson /*- 23b0edf7dSAndrew Thompson * Copyright (c) 2008 Andrew Thompson. All rights reserved. 33b0edf7dSAndrew Thompson * 43b0edf7dSAndrew Thompson * Redistribution and use in source and binary forms, with or without 53b0edf7dSAndrew Thompson * modification, are permitted provided that the following conditions 63b0edf7dSAndrew Thompson * are met: 73b0edf7dSAndrew Thompson * 1. Redistributions of source code must retain the above copyright 83b0edf7dSAndrew Thompson * notice, this list of conditions and the following disclaimer. 93b0edf7dSAndrew Thompson * 2. Redistributions in binary form must reproduce the above copyright 103b0edf7dSAndrew Thompson * notice, this list of conditions and the following disclaimer in the 113b0edf7dSAndrew Thompson * documentation and/or other materials provided with the distribution. 123b0edf7dSAndrew Thompson * 133b0edf7dSAndrew Thompson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 143b0edf7dSAndrew Thompson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 153b0edf7dSAndrew Thompson * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 163b0edf7dSAndrew Thompson * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 173b0edf7dSAndrew Thompson * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 183b0edf7dSAndrew Thompson * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 193b0edf7dSAndrew Thompson * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 203b0edf7dSAndrew Thompson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 213b0edf7dSAndrew Thompson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 223b0edf7dSAndrew Thompson * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 233b0edf7dSAndrew Thompson * THE POSSIBILITY OF SUCH DAMAGE. 243b0edf7dSAndrew Thompson */ 253b0edf7dSAndrew Thompson 26f325335cSAndrey V. Elsukov #include <sys/cdefs.h> 27f325335cSAndrey V. Elsukov __FBSDID("$FreeBSD$"); 283b0edf7dSAndrew Thompson 293b0edf7dSAndrew Thompson #include <sys/param.h> 303b0edf7dSAndrew Thompson #include <sys/ioctl.h> 313b0edf7dSAndrew Thompson #include <sys/socket.h> 323b0edf7dSAndrew Thompson #include <sys/sockio.h> 333b0edf7dSAndrew Thompson #include <net/if.h> 343b0edf7dSAndrew Thompson #include <net/if_gre.h> 353b0edf7dSAndrew Thompson 363b0edf7dSAndrew Thompson #include <ctype.h> 37f325335cSAndrey V. Elsukov #include <limits.h> 383b0edf7dSAndrew Thompson #include <stdio.h> 393b0edf7dSAndrew Thompson #include <stdlib.h> 40f325335cSAndrey V. Elsukov #include <string.h> 413b0edf7dSAndrew Thompson #include <err.h> 423b0edf7dSAndrew Thompson 433b0edf7dSAndrew Thompson #include "ifconfig.h" 443b0edf7dSAndrew Thompson 45f325335cSAndrey V. Elsukov #define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ" 46f325335cSAndrey V. Elsukov 473b0edf7dSAndrew Thompson static void gre_status(int s); 483b0edf7dSAndrew Thompson 493b0edf7dSAndrew Thompson static void 503b0edf7dSAndrew Thompson gre_status(int s) 513b0edf7dSAndrew Thompson { 52f325335cSAndrey V. Elsukov uint32_t opts = 0; 533b0edf7dSAndrew Thompson 54f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 553b0edf7dSAndrew Thompson if (ioctl(s, 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; 59f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) != 0 || opts == 0) 60f325335cSAndrey V. Elsukov return; 61f325335cSAndrey V. Elsukov printb("\toptions", opts, GREBITS); 62f325335cSAndrey V. Elsukov putchar('\n'); 633b0edf7dSAndrew Thompson } 643b0edf7dSAndrew Thompson 653b0edf7dSAndrew Thompson static void 663b0edf7dSAndrew Thompson setifgrekey(const char *val, int dummy __unused, int s, 673b0edf7dSAndrew Thompson const struct afswtch *afp) 683b0edf7dSAndrew Thompson { 69f325335cSAndrey V. Elsukov uint32_t grekey = strtol(val, NULL, 0); 703b0edf7dSAndrew Thompson 713b0edf7dSAndrew Thompson strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 723b0edf7dSAndrew Thompson ifr.ifr_data = (caddr_t)&grekey; 733b0edf7dSAndrew Thompson if (ioctl(s, GRESKEY, (caddr_t)&ifr) < 0) 743b0edf7dSAndrew Thompson warn("ioctl (set grekey)"); 753b0edf7dSAndrew Thompson } 763b0edf7dSAndrew Thompson 77f325335cSAndrey V. Elsukov static void 78f325335cSAndrey V. Elsukov setifgreopts(const char *val, int d, int s, const struct afswtch *afp) 79f325335cSAndrey V. Elsukov { 80f325335cSAndrey V. Elsukov uint32_t opts; 81f325335cSAndrey V. Elsukov 82f325335cSAndrey V. Elsukov ifr.ifr_data = (caddr_t)&opts; 83f325335cSAndrey V. Elsukov if (ioctl(s, GREGOPTS, &ifr) == -1) { 84f325335cSAndrey V. Elsukov warn("ioctl(GREGOPTS)"); 85f325335cSAndrey V. Elsukov return; 86f325335cSAndrey V. Elsukov } 87f325335cSAndrey V. Elsukov 88f325335cSAndrey V. Elsukov if (d < 0) 89f325335cSAndrey V. Elsukov opts &= ~(-d); 90f325335cSAndrey V. Elsukov else 91f325335cSAndrey V. Elsukov opts |= d; 92f325335cSAndrey V. Elsukov 93f325335cSAndrey V. Elsukov if (ioctl(s, GRESOPTS, &ifr) == -1) { 94f325335cSAndrey V. Elsukov warn("ioctl(GIFSOPTS)"); 95f325335cSAndrey V. Elsukov return; 96f325335cSAndrey V. Elsukov } 97f325335cSAndrey V. Elsukov } 98f325335cSAndrey V. Elsukov 99f325335cSAndrey V. Elsukov 1003b0edf7dSAndrew Thompson static struct cmd gre_cmds[] = { 1013b0edf7dSAndrew Thompson DEF_CMD_ARG("grekey", setifgrekey), 102f325335cSAndrey V. Elsukov DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts), 103f325335cSAndrey V. Elsukov DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts), 104f325335cSAndrey V. Elsukov DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts), 105f325335cSAndrey V. Elsukov DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts), 1063b0edf7dSAndrew Thompson }; 1073b0edf7dSAndrew Thompson static struct afswtch af_gre = { 1083b0edf7dSAndrew Thompson .af_name = "af_gre", 1093b0edf7dSAndrew Thompson .af_af = AF_UNSPEC, 1103b0edf7dSAndrew Thompson .af_other_status = gre_status, 1113b0edf7dSAndrew Thompson }; 1123b0edf7dSAndrew Thompson 1133b0edf7dSAndrew Thompson static __constructor void 1143b0edf7dSAndrew Thompson gre_ctor(void) 1153b0edf7dSAndrew Thompson { 116b59dcaeeSXin LI size_t i; 1173b0edf7dSAndrew Thompson 118*abd71050SEnji Cooper for (i = 0; i < nitems(gre_cmds); i++) 1193b0edf7dSAndrew Thompson cmd_register(&gre_cmds[i]); 1203b0edf7dSAndrew Thompson af_register(&af_gre); 1213b0edf7dSAndrew Thompson } 122