mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-10 01:40:26 +00:00
* nua: try to cope if a re-INVITE nor its ACK contain SDP Some SIP user-agents use INVITE without SDP offer to refresh session. By default, NUA sends an offer in 200 OK to such an INVITE and expects an answer back in ACK. Now nua tries to recover from such a Offer/Answer protocol error. Also, if NUTAG_REFRESH_WITHOUT_SDP(1) tag is used, and if the re-INVITE was received without SDP, no SDP offer is sent in 200 OK. Thanks for Anthony Minessale for reporting the problem. git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10829 d0543943-73ff-0310-b7d9-9358b9ac24b2
274 lines
8.7 KiB
C
274 lines
8.7 KiB
C
/*
|
|
* This file is part of the Sofia-SIP package
|
|
*
|
|
* Copyright (C) 2006 Nokia Corporation.
|
|
*
|
|
* Contact: Pekka Pessi <pekka.pessi@nokia.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
* as published by the Free Software Foundation; either version 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef NUA_PARAMS_H
|
|
/** Defined when <nua_params.h> has been included. */
|
|
#define NUA_PARAMS_H
|
|
|
|
/**@internal @file nua_params.h
|
|
* @brief Parameters and their handling
|
|
*
|
|
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
|
|
* @author Kai Vehmanen <Kai.Vehmanen@nokia.com>
|
|
*
|
|
* @date Created: Wed Mar 8 11:38:18 EET 2006 ppessi
|
|
*/
|
|
|
|
#include <nua_types.h>
|
|
|
|
/**@internal @brief NUA preferences.
|
|
*
|
|
* This structure contains values for various preferences and a separate
|
|
* bitmap (nhp_set) for each preference. Preferences are set using
|
|
* nua_set_params() or nua_set_hparams() or a handle-specific operation
|
|
* setting the preferences, including nua_invite(), nua_respond(),
|
|
* nua_ack(), nua_prack(), nua_update(), nua_info(), nua_bye(),
|
|
* nua_options(), nua_message(), nua_register(), nua_publish(), nua_refer(),
|
|
* nua_subscribe(), nua_notify(), nua_refer(), and nua_notifier().
|
|
*
|
|
* The stack uses preference value if corresponding bit in bitmap is set,
|
|
* otherwise it uses preference value from default handle.
|
|
*
|
|
* @see NHP_GET(), NH_PGET(), NHP_ISSET(), NH_PISSET()
|
|
*/
|
|
struct nua_handle_preferences
|
|
{
|
|
unsigned nhp_retry_count; /**< times to retry a request */
|
|
unsigned nhp_max_subscriptions;
|
|
|
|
/* Session-related preferences */
|
|
char const *nhp_soa_name;
|
|
unsigned nhp_media_enable:1;
|
|
unsigned nhp_invite_enable:1;
|
|
unsigned nhp_auto_alert:1;
|
|
unsigned nhp_early_answer:1; /**< Include answer in 1XX */
|
|
unsigned nhp_early_media:1; /**< Establish early media with 100rel */
|
|
unsigned nhp_only183_100rel:1;/**< Only 100rel 183. */
|
|
unsigned nhp_auto_answer:1;
|
|
unsigned nhp_auto_ack:1; /**< Automatically ACK a final response */
|
|
unsigned :0;
|
|
|
|
/** INVITE timeout.
|
|
*
|
|
* If no response is received in nhp_invite_timeout seconds,
|
|
* INVITE client transaction times out
|
|
*/
|
|
unsigned nhp_invite_timeout;
|
|
/** Default session timer (in seconds, 0 disables) */
|
|
unsigned nhp_session_timer;
|
|
/** Default Min-SE Delta value */
|
|
unsigned nhp_min_se;
|
|
/** no (preference), local or remote */
|
|
enum nua_session_refresher nhp_refresher;
|
|
unsigned nhp_update_refresh:1; /**< Use UPDATE to refresh */
|
|
|
|
/**< Accept refreshes without SDP */
|
|
unsigned nhp_refresh_without_sdp:1;
|
|
|
|
/* Messaging preferences */
|
|
unsigned nhp_message_enable : 1;
|
|
/** Be bug-compatible with Windows Messenger */
|
|
unsigned nhp_win_messenger_enable : 1;
|
|
/** PIM-IW hack */
|
|
unsigned nhp_message_auto_respond : 1;
|
|
|
|
/* Preferences for registration (and dialog establishment) */
|
|
unsigned nhp_callee_caps:1; /**< Add callee caps to contact */
|
|
unsigned nhp_media_features:1;/**< Add media features to caps*/
|
|
/** Enable Service-Route */
|
|
unsigned nhp_service_route_enable:1;
|
|
/** Enable Path */
|
|
unsigned nhp_path_enable:1;
|
|
/** Authentication cache policy */
|
|
unsigned nhp_auth_cache:1;
|
|
|
|
/** Always include id with Event: refer */
|
|
unsigned nhp_refer_with_id:1;
|
|
unsigned:0;
|
|
|
|
/* Default lifetime for implicit subscriptions created by REFER */
|
|
unsigned nhp_refer_expires;
|
|
|
|
/* Subscriber state, i.e. nua_substate_pending */
|
|
unsigned nhp_substate;
|
|
unsigned nhp_sub_expires;
|
|
|
|
/* REGISTER keepalive intervals */
|
|
unsigned nhp_keepalive, nhp_keepalive_stream;
|
|
char const *nhp_registrar;
|
|
|
|
sip_allow_t *nhp_allow;
|
|
sip_supported_t *nhp_supported;
|
|
sip_allow_events_t *nhp_allow_events;
|
|
char const *nhp_user_agent;
|
|
char const *nhp_organization;
|
|
|
|
char const *nhp_m_display;
|
|
char const *nhp_m_username;
|
|
char const *nhp_m_params;
|
|
char const *nhp_m_features;
|
|
char const *nhp_instance;
|
|
|
|
/** Outbound OPTIONS */
|
|
char const *nhp_outbound;
|
|
|
|
sip_allow_t *nhp_appl_method;
|
|
|
|
/** Initial route set */
|
|
sip_route_t *nhp_initial_route;
|
|
|
|
/** Next hop URI (used instead of route). */
|
|
url_string_t *nhp_proxy;
|
|
|
|
union { struct {
|
|
/* A bit for each feature set by application */
|
|
/* NOTE:
|
|
Some compilers behave weird if there are bitfields
|
|
together with width > 32
|
|
So there should be a padding field (unsigned:0;)
|
|
every 32 bits.
|
|
*/
|
|
unsigned nhb_retry_count:1;
|
|
unsigned nhb_max_subscriptions:1;
|
|
|
|
unsigned nhb_soa_name:1;
|
|
unsigned nhb_media_enable:1;
|
|
unsigned nhb_invite_enable:1;
|
|
unsigned nhb_auto_alert:1;
|
|
unsigned nhb_early_answer:1;
|
|
unsigned nhb_early_media:1;
|
|
unsigned nhb_only183_100rel:1;
|
|
unsigned nhb_auto_answer:1;
|
|
unsigned nhb_auto_ack:1;
|
|
unsigned nhb_invite_timeout:1;
|
|
|
|
unsigned nhb_session_timer:1;
|
|
unsigned nhb_min_se:1;
|
|
unsigned nhb_refresher:1;
|
|
unsigned nhb_update_refresh:1;
|
|
unsigned nhb_refresh_without_sdp:1;
|
|
unsigned nhb_message_enable:1;
|
|
unsigned nhb_win_messenger_enable:1;
|
|
unsigned nhb_message_auto_respond:1;
|
|
unsigned nhb_callee_caps:1;
|
|
unsigned nhb_media_features:1;
|
|
unsigned nhb_service_route_enable:1;
|
|
unsigned nhb_path_enable:1;
|
|
unsigned nhb_auth_cache:1;
|
|
unsigned nhb_refer_with_id:1;
|
|
unsigned nhb_refer_expires:1;
|
|
unsigned nhb_substate:1;
|
|
unsigned nhb_sub_expires:1;
|
|
unsigned nhb_keepalive:1;
|
|
unsigned nhb_keepalive_stream:1;
|
|
unsigned nhb_registrar:1;
|
|
unsigned :0; /* at most 32 bits before this point */
|
|
|
|
unsigned nhb_allow:1;
|
|
unsigned nhb_supported:1;
|
|
|
|
unsigned nhb_allow_events:1;
|
|
unsigned nhb_user_agent:1;
|
|
unsigned nhb_organization:1;
|
|
|
|
unsigned nhb_m_display:1;
|
|
unsigned nhb_m_username:1;
|
|
unsigned nhb_m_params:1;
|
|
unsigned nhb_m_features:1;
|
|
unsigned nhb_instance:1;
|
|
unsigned nhb_outbound:1;
|
|
unsigned nhb_appl_method:1;
|
|
unsigned nhb_initial_route:1;
|
|
unsigned nhb_proxy:1;
|
|
unsigned :0;
|
|
} set_bits;
|
|
unsigned set_unsigned[2];
|
|
} nhp_set_;
|
|
};
|
|
|
|
#define nhp_set nhp_set_.set_bits
|
|
|
|
/** Global preferences for nua. */
|
|
struct nua_global_preferences {
|
|
/** Network detection: NONE, INFORMAL, TRY_FULL */
|
|
signed int ngp_detect_network_updates:3;
|
|
/** Pass events during shutdown, too */
|
|
int ngp_shutdown_events:1;
|
|
|
|
unsigned :0; /* pad */
|
|
union { struct {
|
|
/* A bit for each feature set by application */
|
|
unsigned ngp_detect_network_updates:1;
|
|
unsigned ngp_shutdown_events:1;
|
|
unsigned :0;
|
|
} set_bits;
|
|
unsigned set_unsigned[2];
|
|
} ngp_set_;
|
|
};
|
|
|
|
#define ngp_set ngp_set_.set_bits
|
|
|
|
#define DNHP_GET(dnhp, pref) ((dnhp)->nhp_##pref)
|
|
|
|
#define NHP_GET(nhp, dnhp, pref) \
|
|
((nhp)->nhp_set.nhb_##pref \
|
|
? (nhp)->nhp_##pref : (dnhp)->nhp_##pref)
|
|
|
|
#define NHP_SET(nhp, pref, value) \
|
|
((nhp)->nhp_##pref = (value), \
|
|
(nhp)->nhp_set.nhb_##pref = 1)
|
|
|
|
/* Check if preference is set */
|
|
#define NHP_ISSET(nhp, pref) \
|
|
((nhp)->nhp_set.nhb_##pref)
|
|
|
|
#define NHP_UNSET_ALL(nhp) (memset(&(nhp)->nhp_set, 0, sizeof (nhp)->nhp_set))
|
|
#define NHP_SET_ALL(nhp) (memset(&(nhp)->nhp_set, 255, sizeof (nhp)->nhp_set))
|
|
|
|
/* Get preference from handle, if set, otherwise from default handle */
|
|
#define NH_PGET(nh, pref) \
|
|
NHP_GET((nh)->nh_prefs, (nh)->nh_dprefs, pref)
|
|
|
|
/* Get preference from handle, if exists and set,
|
|
otherwise from default handle */
|
|
#define NUA_PGET(nua, nh, pref) \
|
|
NHP_GET((nh) ? (nh)->nh_prefs : (nua)->nua_dhandle->nh_prefs, \
|
|
(nua)->nua_dhandle->nh_prefs, \
|
|
pref)
|
|
|
|
/* Get preference from default handle */
|
|
#define DNH_PGET(dnh, pref) \
|
|
DNHP_GET((dnh)->nh_prefs, pref)
|
|
/* Check if preference is set in the handle */
|
|
#define NH_PISSET(nh, pref) \
|
|
(NHP_ISSET((nh)->nh_prefs, pref) && \
|
|
(nh)->nh_nua->nua_dhandle->nh_prefs != (nh)->nh_prefs)
|
|
|
|
/* Check if preference has been set by application */
|
|
#define NUA_PISSET(nua, nh, pref) \
|
|
(NHP_ISSET((nua)->nua_dhandle->nh_prefs, pref) || \
|
|
((nh) && NHP_ISSET((nh)->nh_prefs, pref)))
|
|
|
|
#endif /* NUA_PARAMS_H */
|