blob: b8820dec17bda4d564194f462baf75b6cbba609e [file] [log] [blame]
/* $Id$ */
/*
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PJNATH_NAT_DETECT_H__
#define __PJNATH_NAT_DETECT_H__
/**
* @file ice_session.h
* @brief ICE session management
*/
#include <pjnath/stun_session.h>
PJ_BEGIN_DECL
/**
* @defgroup PJNATH_NAT_DETECT NAT Classification/Detection Tool
* @brief NAT Classification/Detection Tool
* @ingroup PJNATH
* @{
*
* This module provides one function to perform NAT classification and
* detection. NAT type detection is performed by calling
* #pj_stun_detect_nat_type() function.
*/
/**
* This enumeration describes the NAT types, as specified by RFC 3489
* Section 5, NAT Variations.
*/
typedef enum pj_stun_nat_type
{
/**
* NAT type is unknown because the detection has not been performed.
*/
PJ_STUN_NAT_TYPE_UNKNOWN,
/**
* NAT type is unknown because there is failure in the detection
* process, possibly because server does not support RFC 3489.
*/
PJ_STUN_NAT_TYPE_ERR_UNKNOWN,
/**
* This specifies that the client has open access to Internet (or
* at least, its behind a firewall that behaves like a full-cone NAT,
* but without the translation)
*/
PJ_STUN_NAT_TYPE_OPEN,
/**
* This specifies that communication with server has failed, probably
* because UDP packets are blocked.
*/
PJ_STUN_NAT_TYPE_BLOCKED,
/**
* Firewall that allows UDP out, and responses have to come back to
* the source of the request (like a symmetric NAT, but no
* translation.
*/
PJ_STUN_NAT_TYPE_SYMMETRIC_UDP,
/**
* A full cone NAT is one where all requests from the same internal
* IP address and port are mapped to the same external IP address and
* port. Furthermore, any external host can send a packet to the
* internal host, by sending a packet to the mapped external address.
*/
PJ_STUN_NAT_TYPE_FULL_CONE,
/**
* A symmetric NAT is one where all requests from the same internal
* IP address and port, to a specific destination IP address and port,
* are mapped to the same external IP address and port. If the same
* host sends a packet with the same source address and port, but to
* a different destination, a different mapping is used. Furthermore,
* only the external host that receives a packet can send a UDP packet
* back to the internal host.
*/
PJ_STUN_NAT_TYPE_SYMMETRIC,
/**
* A restricted cone NAT is one where all requests from the same
* internal IP address and port are mapped to the same external IP
* address and port. Unlike a full cone NAT, an external host (with
* IP address X) can send a packet to the internal host only if the
* internal host had previously sent a packet to IP address X.
*/
PJ_STUN_NAT_TYPE_RESTRICTED,
/**
* A port restricted cone NAT is like a restricted cone NAT, but the
* restriction includes port numbers. Specifically, an external host
* can send a packet, with source IP address X and source port P,
* to the internal host only if the internal host had previously sent
* a packet to IP address X and port P.
*/
PJ_STUN_NAT_TYPE_PORT_RESTRICTED
} pj_stun_nat_type;
/**
* This structure contains the result of NAT classification function.
*/
typedef struct pj_stun_nat_detect_result
{
/**
* Status of the detection process. If this value is not PJ_SUCCESS,
* the detection has failed and \a nat_type field will contain
* PJ_STUN_NAT_TYPE_UNKNOWN.
*/
pj_status_t status;
/**
* The text describing the status, if the status is not PJ_SUCCESS.
*/
const char *status_text;
/**
* This contains the NAT type as detected by the detection procedure.
* This value is only valid when the \a status is PJ_SUCCESS.
*/
pj_stun_nat_type nat_type;
/**
* Text describing that NAT type.
*/
const char *nat_type_name;
} pj_stun_nat_detect_result;
/**
* Type of callback to be called when the NAT detection function has
* completed.
*/
typedef void pj_stun_nat_detect_cb(void *user_data,
const pj_stun_nat_detect_result *res);
/**
* Get the NAT name from the specified NAT type.
*
* @param type NAT type.
*
* @return NAT name.
*/
PJ_DECL(const char*) pj_stun_get_nat_name(pj_stun_nat_type type);
/**
* Perform NAT classification function according to the procedures
* specified in RFC 3489. Once this function returns successfully,
* the procedure will run in the "background" and will complete
* asynchronously. Application can register a callback to be notified
* when such detection has completed.
*
* @param server STUN server address.
* @param stun_cfg A structure containing various STUN configurations,
* such as the ioqueue and timer heap instance used
* to receive network I/O and timer events.
* @param user_data Application data, which will be returned back
* in the callback.
* @param cb Callback to be registered to receive notification
* about detection result.
*
* @return If this function returns PJ_SUCCESS, the procedure
* will complete asynchronously and callback will be
* called when it completes. For other return
* values, it means that an error has occured and
* the procedure did not start.
*/
PJ_DECL(pj_status_t) pj_stun_detect_nat_type(const pj_sockaddr_in *server,
pj_stun_config *stun_cfg,
void *user_data,
pj_stun_nat_detect_cb *cb);
/**
* @}
*/
PJ_END_DECL
#endif /* __PJNATH_NAT_DETECT_H__ */