asterisk/include/asterisk/stun.h
Richard Mudgett 83cd844b82 Re-resolve the STUN address if a STUN poll fails for res_stun_monitor.
The STUN socket must remain open between polls or the external address
seen by the STUN server is likely to change.  However, if the STUN request
poll fails then the STUN server address needs to be re-resolved and the
STUN socket needs to be closed and reopened.

* Re-resolve the STUN server address and create a new socket if the STUN
request poll fails.

* Fix ast_stun_request() return value consistency.

* Fix ast_stun_request() to check the received packet for expected message
type and transaction ID.

* Fix ast_stun_request() to read packets until timeout or an associated
response packet is found.  The stun_purge_socket() hack is no longer
required.

* Reduce ast_stun_request() error messages to debug output.

* No longer pass in the destination address to ast_stun_request() if the
socket is already bound or connected to the destination.

(closes issue ASTERISK-18327)
Reported by: Wolfram Joost
Tested by: rmudgett

Review: https://reviewboard.asterisk.org/r/1595/
........

Merged revisions 346700 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 346701 from http://svn.asterisk.org/svn/asterisk/branches/10


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@346709 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-01 21:19:41 +00:00

99 lines
2.8 KiB
C

/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2008, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*!
* \file stun.h
* \brief STUN support.
*
* STUN is defined in RFC 3489.
*/
#ifndef _ASTERISK_STUN_H
#define _ASTERISK_STUN_H
#include "asterisk/network.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
static const int STANDARD_STUN_PORT = 3478;
enum ast_stun_result {
AST_STUN_IGNORE = 0,
AST_STUN_ACCEPT,
};
struct stun_attr;
/*!
* \brief Generic STUN request.
*
* \param s The socket used to send the request.
* \param dst If non null, the address of the STUN server.
* Only needed if the socket is not bound or connected.
* \param username If non null, add the username in the request.
* \param answer If non null, the function waits for a response and
* puts here the externally visible address.
*
* \details
* Send a generic STUN request to the server specified, possibly
* waiting for a reply and filling the answer parameter with the
* externally visible address. Note that in this case the
* request will be blocking.
*
* \note The interface may change slightly in the future.
*
* \retval 0 on success.
* \retval <0 on error.
* \retval >0 on timeout.
*/
int ast_stun_request(int s, struct sockaddr_in *dst, const char *username, struct sockaddr_in *answer);
/*! \brief callback type to be invoked on stun responses. */
typedef int (stun_cb_f)(struct stun_attr *attr, void *arg);
/*!
* \brief handle an incoming STUN message.
*
* \param s Socket to send any response to.
* \param src Address where packet came from.
* \param data STUN packet buffer to process.
* \param len Length of packet
* \param stun_cb If not NULL, callback for each STUN attribute.
* \param arg Arg to pass to callback.
*
* \details
* Do some basic sanity checks on packet size and content,
* try to extract a bit of information, and possibly reply.
* At the moment this only processes BIND requests, and returns
* the externally visible address of the request.
* If a callback is specified, invoke it with the attribute.
*
* \retval AST_STUN_ACCEPT if responed to a STUN request
* \retval AST_STUN_IGNORE
* \retval -1 on error
*/
int ast_stun_handle_packet(int s, struct sockaddr_in *src, unsigned char *data, size_t len, stun_cb_f *stun_cb, void *arg);
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
#endif /* _ASTERISK_STUN_H */