GNUnet 0.21.1
gnunet-service-nat_stun.h File Reference

This code provides some support for doing STUN transactions. More...

#include "platform.h"
Include dependency graph for gnunet-service-nat_stun.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int GNUNET_NAT_stun_handle_packet_ (const void *data, size_t len, struct sockaddr_in *arg)
 Handle an incoming STUN response. More...
 

Detailed Description

This code provides some support for doing STUN transactions.

We receive the simplest possible packet as the STUN server and try to respond properly.

All STUN packets start with a simple header made of a type, length (excluding the header) and a 16-byte random transaction id. Following the header we may have zero or more attributes, each structured as a type, length and a value (whose format depends on the type, but often contains addresses). Of course all fields are in network format.

This code was based on ministun.c.

Functions for STUN functionality

Author
Bruno Souza Cabral

Definition in file gnunet-service-nat_stun.h.

Function Documentation

◆ GNUNET_NAT_stun_handle_packet_()

int GNUNET_NAT_stun_handle_packet_ ( const void *  data,
size_t  len,
struct sockaddr_in *  arg 
)

Handle an incoming STUN response.

Do some basic sanity checks on packet size and content, try to extract information. At the moment this only processes BIND requests, and returns the externally visible address of the original request.

Parameters
datathe packet
lenthe length of the packet in data
[out]argsockaddr_in where we will set our discovered address
Returns
GNUNET_OK on success, GNUNET_NO if the packet is invalid (not a stun packet)

Definition at line 125 of file gnunet-service-nat_stun.c.

128{
129 const struct stun_header *hdr;
130 const struct stun_attr *attr;
131 struct StunState st;
132 uint32_t advertised_message_size;
133 uint32_t message_magic_cookie;
134 int ret = GNUNET_SYSERR;
135
136 /* On entry, 'len' is the length of the UDP payload. After the
137 * initial checks it becomes the size of unprocessed options,
138 * while 'data' is advanced accordingly.
139 */
140 if (len < sizeof(struct stun_header))
141 {
143 "Packet too short to be a STUN packet\n");
144 return GNUNET_NO;
145 }
146 hdr = data;
147 /* Skip header as it is already in hdr */
148 len -= sizeof(struct stun_header);
149 data += sizeof(struct stun_header);
150
151 /* len as advertised in the message */
152 advertised_message_size = ntohs (hdr->msglen);
153 message_magic_cookie = ntohl (hdr->magic);
154 /* Compare if the cookie match */
155 if (STUN_MAGIC_COOKIE != message_magic_cookie)
156 {
158 "Invalid magic cookie for STUN packet\n");
159 return GNUNET_NO;
160 }
161
163 "STUN Packet, msg %s (%04x), length: %d\n",
164 stun_msg2str (ntohs (hdr->msgtype)),
165 ntohs (hdr->msgtype),
166 advertised_message_size);
167 if (advertised_message_size > len)
168 {
170 "Scrambled STUN packet length (got %d, expecting %d)\n",
171 advertised_message_size,
172 (int) len);
173 return GNUNET_NO;
174 }
175 len = advertised_message_size;
176 memset (&st, 0, sizeof(st));
177
178 while (len > 0)
179 {
180 if (len < sizeof(struct stun_attr))
181 {
183 "Attribute too short (got %d, expecting %d)\n",
184 (int) len,
185 (int) sizeof(struct stun_attr));
186 break;
187 }
188 attr = (const struct stun_attr *) data;
189
190 /* compute total attribute length */
191 advertised_message_size = ntohs (attr->len) + sizeof(struct stun_attr);
192
193 /* Check if we still have space in our buffer */
194 if (advertised_message_size > len)
195 {
197 "Inconsistent attribute (length %d exceeds remaining msg len %d)\n",
198 advertised_message_size,
199 (int) len);
200 break;
201 }
202 if (GNUNET_OK ==
204 attr,
205 hdr->magic,
206 arg))
207 ret = GNUNET_OK;
208 data += advertised_message_size;
209 len -= advertised_message_size;
210 }
211 return ret;
212}
static int ret
Final status code.
Definition: gnunet-arm.c:94
static struct GNUNET_SCHEDULER_Task * st
The shutdown task.
static char * data
The data to insert into the dht.
#define LOG(kind,...)
static int stun_get_mapped(struct StunState *st, const struct stun_attr *attr, uint32_t magic, struct sockaddr_in *arg)
Extract the STUN_MAPPED_ADDRESS from the stun response.
@ GNUNET_OK
@ GNUNET_NO
@ GNUNET_SYSERR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define STUN_MAGIC_COOKIE
Definition: nat_stun.h:34
static const char * stun_msg2str(int msg)
Print a class and method from a STUN message.
Definition: nat_stun.h:173
Context for stun_get_mapped().
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

References find_typedefs::arg, stun_attr::attr, data, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, stun_attr::len, LOG, stun_header::magic, stun_header::msglen, stun_header::msgtype, ret, st, stun_get_mapped(), STUN_MAGIC_COOKIE, and stun_msg2str().

Referenced by handle_stun().

Here is the call graph for this function:
Here is the caller graph for this function: