Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sbin/ifconfig/ifgre.c
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2008 Andrew Thompson. All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
* IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
19
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
* SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
25
* THE POSSIBILITY OF SUCH DAMAGE.
26
*/
27
28
#include <sys/param.h>
29
#include <sys/ioctl.h>
30
#include <sys/socket.h>
31
#include <sys/sockio.h>
32
#include <net/if.h>
33
#include <net/if_gre.h>
34
35
#include <ctype.h>
36
#include <limits.h>
37
#include <stdio.h>
38
#include <stdlib.h>
39
#include <string.h>
40
#include <err.h>
41
42
#include "ifconfig.h"
43
44
static const char *GREBITS[] = {
45
[0] = "ENABLE_CSUM",
46
[1] = "ENABLE_SEQ",
47
[2] = "UDPENCAP",
48
};
49
50
static void
51
gre_status(if_ctx *ctx)
52
{
53
uint32_t opts = 0, port;
54
struct ifreq ifr = { .ifr_data = (caddr_t)&opts };
55
56
if (ioctl_ctx(ctx, GREGKEY, &ifr) == 0)
57
if (opts != 0)
58
printf("\tgrekey: 0x%x (%u)\n", opts, opts);
59
opts = 0;
60
if (ioctl_ctx(ctx, GREGOPTS, &ifr) != 0 || opts == 0)
61
return;
62
63
port = 0;
64
ifr.ifr_data = (caddr_t)&port;
65
if (ioctl_ctx_ifr(ctx, GREGPORT, &ifr) == 0 && port != 0)
66
printf("\tudpport: %u\n", port);
67
printf("\toptions=%x", opts);
68
print_bits("options", &opts, 1, GREBITS, nitems(GREBITS));
69
putchar('\n');
70
}
71
72
static void
73
setifgrekey(if_ctx *ctx, const char *val, int dummy __unused)
74
{
75
uint32_t grekey = strtol(val, NULL, 0);
76
struct ifreq ifr = { .ifr_data = (caddr_t)&grekey };
77
78
ifr.ifr_data = (caddr_t)&grekey;
79
if (ioctl_ctx_ifr(ctx, GRESKEY, &ifr) < 0)
80
warn("ioctl (set grekey)");
81
}
82
83
static void
84
setifgreport(if_ctx *ctx, const char *val, int dummy __unused)
85
{
86
uint32_t udpport = strtol(val, NULL, 0);
87
struct ifreq ifr = { .ifr_data = (caddr_t)&udpport };
88
89
if (ioctl_ctx_ifr(ctx, GRESPORT, &ifr) < 0)
90
warn("ioctl (set udpport)");
91
}
92
93
static void
94
setifgreopts(if_ctx *ctx, const char *val __unused, int d)
95
{
96
uint32_t opts;
97
struct ifreq ifr = { .ifr_data = (caddr_t)&opts };
98
99
if (ioctl_ctx_ifr(ctx, GREGOPTS, &ifr) == -1) {
100
warn("ioctl(GREGOPTS)");
101
return;
102
}
103
104
if (d < 0)
105
opts &= ~(-d);
106
else
107
opts |= d;
108
109
if (ioctl_ctx(ctx, GRESOPTS, &ifr) == -1) {
110
warn("ioctl(GIFSOPTS)");
111
return;
112
}
113
}
114
115
116
static struct cmd gre_cmds[] = {
117
DEF_CMD_ARG("grekey", setifgrekey),
118
DEF_CMD_ARG("udpport", setifgreport),
119
DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts),
120
DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts),
121
DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts),
122
DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts),
123
DEF_CMD("udpencap", GRE_UDPENCAP, setifgreopts),
124
DEF_CMD("-udpencap",-GRE_UDPENCAP, setifgreopts),
125
};
126
static struct afswtch af_gre = {
127
.af_name = "af_gre",
128
.af_af = AF_UNSPEC,
129
.af_other_status = gre_status,
130
};
131
132
static __constructor void
133
gre_ctor(void)
134
{
135
size_t i;
136
137
for (i = 0; i < nitems(gre_cmds); i++)
138
cmd_register(&gre_cmds[i]);
139
af_register(&af_gre);
140
}
141
142