mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	chan_sip: Isolate code that manages struct sip_route.
* Move route code to sip/route.c + sip/include/route.h
* Rename functions to sip_route_*
* Replace ad-hoc list code with macro's from linkedlists.h
* Create sip_route_process_header() to processes Path and Record-Route headers
  (previously done with different code in build_route and build_path)
* Add use of const where possible
* Move struct uriparams, struct contact and contactliststruct from sip.h to
  reqresp_parser.h.  sip/route.c uses reqresp_parser.h but not sip.h, this was
  a problem.  These moved declares are not used outside of reqresp_parser.
* While modifying reqprep() the lack of {} caused me trouble.  I added them.
* Code outside route.c treats sip_route as an opaque structure, using macro's
  or procedures for all access.
(closes issue ASTERISK-22582)
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/3173/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@407926 65c4cc65-6c06-0410-ace0-fbb531ad65f3
			
			
This commit is contained in:
		| @@ -22,6 +22,30 @@ | ||||
| #ifndef _SIP_REQRESP_H | ||||
| #define _SIP_REQRESP_H | ||||
|  | ||||
| /*! \brief uri parameters */ | ||||
| struct uriparams { | ||||
| 	char *transport; | ||||
| 	char *user; | ||||
| 	char *method; | ||||
| 	char *ttl; | ||||
| 	char *maddr; | ||||
| 	int lr; | ||||
| }; | ||||
|  | ||||
| struct contact { | ||||
| 	AST_LIST_ENTRY(contact) list; | ||||
| 	char *name; | ||||
| 	char *user; | ||||
| 	char *pass; | ||||
| 	char *hostport; | ||||
| 	struct uriparams params; | ||||
| 	char *headers; | ||||
| 	char *expires; | ||||
| 	char *q; | ||||
| }; | ||||
|  | ||||
| AST_LIST_HEAD_NOLOCK(contactliststruct, contact); | ||||
|  | ||||
| /*! | ||||
|  * \brief parses a URI in its components. | ||||
|  * | ||||
|   | ||||
							
								
								
									
										120
									
								
								channels/sip/include/route.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								channels/sip/include/route.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| /* | ||||
|  * Asterisk -- An open source telephony toolkit. | ||||
|  * | ||||
|  * Copyright (C) 2013, Digium, Inc. | ||||
|  * | ||||
|  * 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 | ||||
|  * \brief sip_route header file | ||||
|  */ | ||||
|  | ||||
| #ifndef _SIP_ROUTE_H | ||||
| #define _SIP_ROUTE_H | ||||
|  | ||||
| #include "asterisk/linkedlists.h" | ||||
| #include "asterisk/strings.h" | ||||
|  | ||||
| /*! | ||||
|  * \brief Opaque storage of a sip route hop | ||||
|  */ | ||||
| struct sip_route_hop; | ||||
|  | ||||
| /*! | ||||
|  * \internal \brief Internal enum to remember last calculated | ||||
|  */ | ||||
| enum sip_route_type { | ||||
| 	route_loose = 0,    /*!< The first hop contains ;lr or does not exist */ | ||||
| 	route_strict,       /*!< The first hop exists and does not contain ;lr */ | ||||
| 	route_invalidated,  /*!< strict/loose routing needs to be rechecked */ | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|  * \brief Structure to store route information | ||||
|  * | ||||
|  * \note This must be zero-filled on allocation | ||||
|  */ | ||||
| struct sip_route { | ||||
| 	AST_LIST_HEAD_NOLOCK(, sip_route_hop) list; | ||||
| 	enum sip_route_type type; | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|  * \brief Add a new hop to the route | ||||
|  * | ||||
|  * \param route Route | ||||
|  * \param uri Address of this hop | ||||
|  * \param len Length of hop not including null terminator | ||||
|  * \param inserthead If true then inserted the new route to the top of the list | ||||
|  * | ||||
|  * \retval Pointer to null terminated copy of URI on success | ||||
|  * \retval NULL on error | ||||
|  */ | ||||
| const char *sip_route_add(struct sip_route *route, const char *uri, size_t len, int inserthead); | ||||
|  | ||||
| /*! | ||||
|  * \brief Add routes from header | ||||
|  * | ||||
|  * \note This procedure is for headers that require use of <brackets>. | ||||
|  */ | ||||
| void sip_route_process_header(struct sip_route *route, const char *header, int inserthead); | ||||
|  | ||||
| /*! | ||||
|  * \brief copy route-set | ||||
|  * | ||||
|  * \retval non-zero on failure | ||||
|  * \retval 0 on success | ||||
|  */ | ||||
| void sip_route_copy(struct sip_route *dst, const struct sip_route *src); | ||||
|  | ||||
| /*! | ||||
|  * \brief Free all routes in the list | ||||
|  */ | ||||
| void sip_route_clear(struct sip_route *route); | ||||
|  | ||||
| /*! | ||||
|  * \brief Verbose dump of all hops for debugging | ||||
|  */ | ||||
| void sip_route_dump(const struct sip_route *route); | ||||
|  | ||||
| /*! | ||||
|  * \brief Make the comma separated list of route hops | ||||
|  * | ||||
|  * \param route Source of route list | ||||
|  * \param formatcli Add's space after comma's, print's N/A if list is empty. | ||||
|  * \param skip Number of hops to skip | ||||
|  * | ||||
|  * \retval an allocated struct ast_str on success | ||||
|  * \retval NULL on failure | ||||
|  */ | ||||
| struct ast_str *sip_route_list(const struct sip_route *route, int formatcli, int skip) | ||||
| 		__attribute_malloc__ __attribute_warn_unused_result__; | ||||
|  | ||||
| /*! | ||||
|  * \brief Check if the route is strict | ||||
|  * | ||||
|  * \note The result is cached in route->type | ||||
|  */ | ||||
| int sip_route_is_strict(struct sip_route *route); | ||||
|  | ||||
| /*! | ||||
|  * \brief Get the URI of the route's first hop | ||||
|  */ | ||||
| const char *sip_route_first_uri(const struct sip_route *route); | ||||
|  | ||||
| /*! | ||||
|  * \brief Check if route has no URI's | ||||
|  */ | ||||
| #define sip_route_empty(route) AST_LIST_EMPTY(&(route)->list) | ||||
|  | ||||
| #endif | ||||
| @@ -39,6 +39,8 @@ | ||||
| #include "asterisk/netsock2.h" | ||||
| #include "asterisk/features_config.h" | ||||
|  | ||||
| #include "route.h" | ||||
|  | ||||
| #ifndef FALSE | ||||
| #define FALSE    0 | ||||
| #endif | ||||
| @@ -847,12 +849,6 @@ struct sip_invite_param { | ||||
| 	struct sip_proxy *outboundproxy; /*!< Outbound proxy URI */ | ||||
| }; | ||||
|  | ||||
| /*! \brief Structure to save routing information for a SIP session */ | ||||
| struct sip_route { | ||||
| 	struct sip_route *next; | ||||
| 	char hop[0]; | ||||
| }; | ||||
|  | ||||
| /*! \brief Structure to store Via information */ | ||||
| struct sip_via { | ||||
| 	char *via; | ||||
| @@ -1119,7 +1115,7 @@ struct sip_pvt { | ||||
| 	struct ast_sockaddr ourip;           /*!< Our IP (as seen from the outside) */ | ||||
| 	enum transfermodes allowtransfer;   /*!< REFER: restriction scheme */ | ||||
| 	struct ast_channel *owner;          /*!< Who owns us (if we have an owner) */ | ||||
| 	struct sip_route *route;            /*!< Head of linked list of routing steps (fm Record-Route) */ | ||||
| 	struct sip_route route;             /*!< List of routing steps (fm Record-Route) */ | ||||
| 	struct sip_notify *notify;          /*!< Custom notify type */ | ||||
| 	struct sip_auth_container *peerauth;/*!< Realm authentication credentials */ | ||||
| 	int noncecount;                     /*!< Nonce-count */ | ||||
| @@ -1346,7 +1342,7 @@ struct sip_peer { | ||||
| 	int timer_t1;                   /*!<  The maximum T1 value for the peer */ | ||||
| 	int timer_b;                    /*!<  The maximum timer B (transaction timeouts) */ | ||||
| 	int fromdomainport;             /*!<  The From: domain port */ | ||||
| 	struct sip_route *path;         /*!<  Head of linked list of out-of-dialog outgoing routing steps (fm Path headers) */ | ||||
| 	struct sip_route path;          /*!<  List of out-of-dialog outgoing routing steps (fm Path headers) */ | ||||
|  | ||||
| 	/*XXX Seems like we suddenly have two flags with the same content. Why? To be continued... */ | ||||
| 	enum sip_peer_type type; /*!< Distinguish between "user" and "peer" types. This is used solely for CLI and manager commands */ | ||||
| @@ -1804,34 +1800,6 @@ struct sip_monitor_instance { | ||||
| 	struct sip_epa_entry *suspension_entry; | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|  * \brief uri parameters | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| struct uriparams { | ||||
| 	char *transport; | ||||
| 	char *user; | ||||
| 	char *method; | ||||
| 	char *ttl; | ||||
| 	char *maddr; | ||||
| 	int lr; | ||||
| }; | ||||
|  | ||||
| struct contact { | ||||
| 	AST_LIST_ENTRY(contact) list; | ||||
| 	char *name; | ||||
| 	char *user; | ||||
| 	char *pass; | ||||
| 	char *hostport; | ||||
| 	struct uriparams params; | ||||
| 	char *headers; | ||||
| 	char *expires; | ||||
| 	char *q; | ||||
| }; | ||||
|  | ||||
| AST_LIST_HEAD_NOLOCK(contactliststruct, contact); | ||||
|  | ||||
| /*! \brief List of well-known SIP options. If we get this in a require, | ||||
|    we should check the list and answer accordingly. */ | ||||
| static const struct cfsip_options { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user