GNUnet 0.21.1
nat_stun.h
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009, 2015, 2016 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
31#define STUN_IGNORE (0)
32#define STUN_ACCEPT (1)
33
34#define STUN_MAGIC_COOKIE 0x2112A442
35
36typedef struct
37{
38 uint32_t id[3];
40
41
43{
44 uint16_t msgtype;
45 uint16_t msglen;
46 uint32_t magic;
49
50
52{
53 uint16_t attr;
54 uint16_t len;
56
57
62{
63 uint8_t unused;
64
68 uint8_t family;
69
73 uint16_t port;
74
78 uint32_t addr;
80
81
86{
88 STUN_REQUEST = 0x0000,
90 STUN_RESPONSE = 0x0002,
91 STUN_ERROR_RESPONSE = 0x0003
92};
93
95{
97 STUN_BINDING = 0x0001,
99 STUN_ALLOCATE = 0x0003,
100 STUN_REFRESH = 0x0004,
101 STUN_SEND = 0x0006,
102 STUN_DATA = 0x0007,
104 STUN_CHANNEL_BIND = 0x0009
106
107
113{
125 STUN_REALM = 0x0014,
126 STUN_NONCE = 0x0015,
132 STUN_FINGERPRINT = 0x8028
134
135
142static enum StunClasses
144{
145 /* Sorry for the magic, but this maps the class according to rfc5245 */
146 return (enum StunClasses) ((msg & 0x0010) >> 4) | ((msg & 0x0100) >> 7);
147}
148
149
156static enum StunMethods
158{
159 return (enum StunMethods) (msg & 0x000f) | ((msg & 0x00e0) >> 1) | ((msg
160 & 0x3e00)
161 >> 2);
162}
163
164
172static const char *
174{
175 static const struct
176 {
177 enum StunClasses value;
178 const char *name;
179 } classes[] = {
180 { STUN_REQUEST, "Request" },
181 { STUN_INDICATION, "Indication" },
182 { STUN_RESPONSE, "Response" },
183 { STUN_ERROR_RESPONSE, "Error Response" },
184 { INVALID_CLASS, NULL }
185 };
186 static const struct
187 {
188 enum StunMethods value;
189 const char *name;
190 } methods[] = {
191 { STUN_BINDING, "Binding" },
192 { INVALID_METHOD, NULL }
193 };
194 static char result[64];
195 const char *msg_class = NULL;
196 const char *method = NULL;
197 enum StunClasses cvalue;
198 enum StunMethods mvalue;
199
200 cvalue = decode_class (msg);
201 for (unsigned int i = 0; classes[i].name; i++)
202 if (classes[i].value == cvalue)
203 {
204 msg_class = classes[i].name;
205 break;
206 }
207 mvalue = decode_method (msg);
208 for (unsigned int i = 0; methods[i].name; i++)
209 if (methods[i].value == mvalue)
210 {
211 method = methods[i].name;
212 break;
213 }
215 sizeof(result),
216 "%s %s",
217 method ? : "Unknown Method",
218 msg_class ? : "Unknown Class Message");
219 return result;
220}
221
222
230static const char *
232{
233 static const struct
234 {
236 const char *name;
237 } attrs[] = {
238 { STUN_MAPPED_ADDRESS, "Mapped Address" },
239 { STUN_RESPONSE_ADDRESS, "Response Address" },
240 { STUN_CHANGE_ADDRESS, "Change Address" },
241 { STUN_SOURCE_ADDRESS, "Source Address" },
242 { STUN_CHANGED_ADDRESS, "Changed Address" },
243 { STUN_USERNAME, "Username" },
244 { STUN_PASSWORD, "Password" },
245 { STUN_MESSAGE_INTEGRITY, "Message Integrity" },
246 { STUN_ERROR_CODE, "Error Code" },
247 { STUN_UNKNOWN_ATTRIBUTES, "Unknown Attributes" },
248 { STUN_REFLECTED_FROM, "Reflected From" },
249 { STUN_REALM, "Realm" },
250 { STUN_NONCE, "Nonce" },
251 { STUN_XOR_MAPPED_ADDRESS, "XOR Mapped Address" },
252 { STUN_MS_VERSION, "MS Version" },
253 { STUN_MS_XOR_MAPPED_ADDRESS, "MS XOR Mapped Address" },
254 { STUN_SOFTWARE, "Software" },
255 { STUN_ALTERNATE_SERVER, "Alternate Server" },
256 { STUN_FINGERPRINT, "Fingerprint" },
257 { 0, NULL }
258 };
259
260 for (unsigned int i = 0; attrs[i].name; i++)
261 if (attrs[i].value == msg)
262 return attrs[i].name;
263 return "Unknown Attribute";
264}
265
266
267/* end of nat_stun.h */
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
static char * name
Name (label) of the records to list.
static char * value
Value of the record to add/remove.
static int result
Global testing status.
#define GNUNET_UNUSED
gcc-ism to document unused arguments
#define GNUNET_PACKED
gcc-ism to get packed structs.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
static enum StunClasses decode_class(int msg)
Convert a message to a StunClass.
Definition: nat_stun.h:143
static const char * stun_msg2str(int msg)
Print a class and method from a STUN message.
Definition: nat_stun.h:173
static const char * stun_attr2str(enum StunAttributes msg)
Print attribute name.
Definition: nat_stun.h:231
StunMethods
Definition: nat_stun.h:95
@ STUN_REFRESH
Definition: nat_stun.h:100
@ STUN_CHANNEL_BIND
Definition: nat_stun.h:104
@ STUN_ALLOCATE
Definition: nat_stun.h:99
@ STUN_BINDING
Definition: nat_stun.h:97
@ STUN_SEND
Definition: nat_stun.h:101
@ STUN_DATA
Definition: nat_stun.h:102
@ STUN_SHARED_SECRET
Definition: nat_stun.h:98
@ INVALID_METHOD
Definition: nat_stun.h:96
@ STUN_CREATE_PERMISSION
Definition: nat_stun.h:103
StunAttributes
Basic attribute types in stun messages.
Definition: nat_stun.h:113
@ STUN_RESPONSE_ADDRESS
Definition: nat_stun.h:115
@ STUN_ERROR_CODE
Definition: nat_stun.h:122
@ STUN_UNKNOWN_ATTRIBUTES
Definition: nat_stun.h:123
@ STUN_MS_VERSION
Definition: nat_stun.h:128
@ STUN_MS_XOR_MAPPED_ADDRESS
Definition: nat_stun.h:129
@ STUN_PASSWORD
Definition: nat_stun.h:120
@ STUN_SOFTWARE
Definition: nat_stun.h:130
@ STUN_FINGERPRINT
Definition: nat_stun.h:132
@ STUN_CHANGED_ADDRESS
Definition: nat_stun.h:118
@ STUN_SOURCE_ADDRESS
Definition: nat_stun.h:117
@ STUN_CHANGE_ADDRESS
Definition: nat_stun.h:116
@ STUN_REFLECTED_FROM
Definition: nat_stun.h:124
@ STUN_USERNAME
Definition: nat_stun.h:119
@ STUN_NONCE
Definition: nat_stun.h:126
@ STUN_MESSAGE_INTEGRITY
Definition: nat_stun.h:121
@ STUN_ALTERNATE_SERVER
Definition: nat_stun.h:131
@ STUN_REALM
Definition: nat_stun.h:125
@ STUN_MAPPED_ADDRESS
Definition: nat_stun.h:114
@ STUN_XOR_MAPPED_ADDRESS
Definition: nat_stun.h:127
static enum StunMethods decode_method(int msg)
Convert a message to a StunMethod.
Definition: nat_stun.h:157
StunClasses
STUN message classes.
Definition: nat_stun.h:86
@ INVALID_CLASS
Definition: nat_stun.h:87
@ STUN_REQUEST
Definition: nat_stun.h:88
@ STUN_INDICATION
Definition: nat_stun.h:89
@ STUN_ERROR_RESPONSE
Definition: nat_stun.h:91
@ STUN_RESPONSE
Definition: nat_stun.h:90
The format normally used for addresses carried by STUN messages.
Definition: nat_stun.h:62
uint8_t family
Address family, we expect AF_INET.
Definition: nat_stun.h:68
uint8_t unused
Definition: nat_stun.h:63
uint32_t addr
IPv4 address.
Definition: nat_stun.h:78
uint16_t port
Port number.
Definition: nat_stun.h:73
uint16_t len
Definition: nat_stun.h:54
uint16_t attr
Definition: nat_stun.h:53
uint16_t msglen
Definition: nat_stun.h:45
uint16_t msgtype
Definition: nat_stun.h:44
uint32_t magic
Definition: nat_stun.h:46
stun_trans_id id
Definition: nat_stun.h:47