Luigi Rizzo [Sun, 22 Jul 2007 19:08:37 +0000 (19:08 +0000)]
comment and slightly restructure handle_request() in the part that handles
responses, so that there is a common exit point.
Mark two places where probably we could return -1 instead of 0 to report
an error to the caller.
(change triggered by investigations on how the 'SIP_PKT_IGNORE' field was used).
Luigi Rizzo [Sun, 22 Jul 2007 18:41:57 +0000 (18:41 +0000)]
Cleanup of flags used in struct sip_request, moving them to
individual variables. Apart from SIP_PKT_IGNORE which was used
a zillion times, the other two are used seldom.
On passing:
- move the arrays to the end of struct sip_request, so a (small)
buffer overflow is less likely to overwrite the other fields;
- note that the 'ignore' argument to handle_invite_replaces() is not
used and should be removed (will be done in a separate commit).
Luigi Rizzo [Sun, 22 Jul 2007 08:42:24 +0000 (08:42 +0000)]
document the way sipdebug works, and implement it through
variables and not flags.
NOTE:
The old behaviour (preserved in this commit) is that if sipdebug
is set in the config file, it can only be disabled by reloading the
config. I am not sure if this is accidental or voluntary, but it
is really unconvenient and I think it should be handled in the same
way as other options i.e. consider requests from the config file
or the cli (or the command line) to be fully equivalent and act on
the same status variable.
Luigi Rizzo [Sat, 21 Jul 2007 17:32:00 +0000 (17:32 +0000)]
Add a note to document how the temporary 'pvt' should be initialized
before using it.
I am unclear on the details right now so i hope someone can comment
more. The obvious (and lazy) approach would be to bzero() all of it
(except for the string pool), but isn't that too much work ?
Feedback wanted here...
Luigi Rizzo [Sat, 21 Jul 2007 03:53:17 +0000 (03:53 +0000)]
use explicit variables for things that don't need to
be stored in ast_flags. First victim is 'SIP_NO_HISTORY'
replaced by a 'do_history' field in the sip_pvt structure.
Luigi Rizzo [Sat, 21 Jul 2007 02:33:25 +0000 (02:33 +0000)]
Use ast_str_append() instead of ast_build_string() to construct
the sdp messages. Overall the code is slightly more readable
(because the string is fully described by a single pointer),
and more efficient (because the length is stored explicitly
so you don't need to do strlen()).
(I have been using this code for almost a year now.)
I wish we had infix string operators to do this sort of things!
Backport a fix for a memory leak that was fixed in trunk in reivision 76221
by rizzo. The memory used for the localaddr list was not freed during a
configuration reload.
Luigi Rizzo [Sat, 21 Jul 2007 01:25:13 +0000 (01:25 +0000)]
We have two 'technology' descriptors for a SIP channel, so
define and use a macro to determine whether we are pointing to
one of them, so when one goes away (or a new one appears) we don't
have to touch all the code.
Luigi Rizzo [Sat, 21 Jul 2007 01:01:10 +0000 (01:01 +0000)]
Enhance NAT support as discussed on the -dev list, i.e.:
+ extensive documentation changes both in sip.conf.sample and in the source;
+ allow "externip" and "externhost" to include a port number as well;
+ allow "bindaddr" to have a port number (making bindport unnecessary,
even though it is still present for backward compatibility);
+ introduce the new "stunaddr" parameter to specify an STUN server to
be used from the main SIP socket;
+ extend the "sip show settings" output to show all the above.
Internally:
+ change related data structures from struct in_addr to struct sockaddr_in
to store the port numbers as well;
+ reorganize ast_sip_ouraddrfor() (should also be renamed to sip_ouraddrfor()
because it is not a generic API, though it might become so if called with
a socket as an additional argument, in which case it can be moved elsewhere).
As mentioned in the documentation, media sessions still do not use STUN so the
port numbers may still be incorrect when Asterisk is behind a NAT
On passing, some of the debugging messages printing media addresses are
probably using the wrong values, but this will be checked/fixed in a
subsequent commit if needed.
Part of the following chunk in the function that handles a "sip reload" is
probably needed on previous versions as well, to avoid leaking the memory
used for the "localaddr" list:
Jason Parker [Fri, 20 Jul 2007 22:25:41 +0000 (22:25 +0000)]
Add support for default "say mode" (whether to use the "old" method or "new" method. "new" method being config file)
Add support for autocomplete of "say load" CLI command.
When using users.conf for the entries in the directory, if multiple users had the same last name, only the first user listed would be available
in the directory.
(closes issue #10200, reported by mrskippy, patched by me)
Use the define that specifies the default length of an artificially created
DTMF digit in the ast_senddigit() function. The define is set to 100ms by
default, which is the same thing that this function was using. But, using
the define lets changes take effect in this case, as well as the others where
it was already used.
(closes issue #10247)
Reported by: fkasumovic
Patches:
chan_sip.patch uploaded by fkasumovic (license #101)
Drop any peer realm authentication entries when reloading so multiple entries do not get added to the peer.
(closes issue #10246)
Reported by: fkasumovic
Patches:
res_conver.patch uploaded by fkasumovic (license #101)
Use the last occurance of . to find the extension, not the first occurance.
Luigi Rizzo [Fri, 20 Jul 2007 14:54:01 +0000 (14:54 +0000)]
Extend the 'network settings' section with indication on the
localnet settings (requires the change in SVN 76034), and also
give an indication on whether/why/how the remapping of addresses
in SIP message is done or not.
I think this is especially useful for debugging the configuration,
as the address remapping depends on a combination of at least 3
parameters (localnet, externhost, externip) and successful DNS lookup.
An example of the output of this section is below:
I leave to the community the judgement if the above info is a
useful addition for 1.4. It is not a bugfix, but it is neither a
new feature, only a useful diagnostic tool.
Note that I would like to move there also the bindaddress/port
information, in the usual addr:port format e.g.
Luigi Rizzo [Fri, 20 Jul 2007 14:38:36 +0000 (14:38 +0000)]
expose struct ast_ha so external code can do things such as printing it
(e.g. chan_sip.c in a subsequent commit).
Obviously exposing the internals of a data structure is far from ideal
(especially in a case like this where the implementation is very
inefficient and will need to be changed at some point).
On the other hand, it was also unclear what additional APIs should
we provide instead, and because exposing the stucture has no impact
on source and binary compatibility, this seemed to me the best option at
this time.
Steve Murphy [Thu, 19 Jul 2007 23:24:27 +0000 (23:24 +0000)]
After some study, thought, comparing, etc. I've backed out the previous universal mod to make ast_flags a 64 bit thing. Instead, I added a 64-bit version of ast_flags (ast_flags64), and 64-bit versions of the test-flag, set-flag, etc. macros, and an app_parse_options64 routine, and I use these in app_dial alone, to eliminate the 30-option limit it had grown to meet. There is room now for 32 more options and flags. I was heavily tempted to implement some of the other ideas that were presented, but this solution does not intro any new versions of dial, doesn't have a different API, has a minimal/zero impact on code outside of dial, and doesn't seriously (I hope) affect the code structure of dial. It's the best I can think of right now. My goal was NOT to rewrite dial. I leave that to a future, coordinated effort.
Changes in handling return values of several functions in app_queue. This all started as a fix for issue #10008
but now includes all of the following changes:
1. Simplifying the code to handle positive return values from ast API calls.
2. Removing the background_file function.
3. The fix for issue #10008
(closes issue #10008, reported and patched by dimas)
Russell Bryant [Thu, 19 Jul 2007 15:59:19 +0000 (15:59 +0000)]
(closes issue #10210, reported and patched by juggie)
This merges the trunk only part of the patches from this issue. In 1.4, res_agi
will issue a warning if you try to use DeadAGI on a channel that is not hung up.
Now, in trunk, it just plain won't let you do it.
When processing full frames, take sequence number wraparound into account when
deciding whether or not we need to request retransmissions by sending a VNAK.
This code could cause VNAKs to be sent erroneously in some cases, and to not
be sent in other cases when it should have been.
(closes issue #10237, reported and patched by mihai)
Luigi Rizzo [Thu, 19 Jul 2007 08:07:04 +0000 (08:07 +0000)]
print more of the network settings (externip, externhost etc.)
in the "sip show settings" cli output. I have put these in a
separate section, probably even bindaddr and SIP port should go
there.
There are more things to add here e.g. localnet and so on.
Russell Bryant [Wed, 18 Jul 2007 22:52:54 +0000 (22:52 +0000)]
I thought I noticed a memory leak earlier when I saw that the contents of this
list were not destroyed when the module is unloaded. However, after reading
the code related to the use of this list a lot today, I realized that it isn't
necessary. So, I have added a comment to explain why it isn't necessary.
When traversing the queue of frames for possible retransmission after
receiving a VNAK, handle sequence number wraparound so that all frames that
should be retransmitted actually do get retransmitted.
(issue #10227, reported and patched by mihai)
Steve Murphy [Wed, 18 Jul 2007 14:35:07 +0000 (14:35 +0000)]
This corrects the problem with flags and %lld formats on 64-bit machines, where uint64_t is NOT acceptable for %lld, and also works on 32-bit machines. At least, with gcc.
Ensure that when encoding the contents of an ast_frame into an iax_frame, that
the size of the destination buffer is known in the iax_frame so that code
won't write past the end of the allocated buffer when sending outgoing frames.
(ASA-2007-014)
After parsing information elements in IAX frames, set the data length to zero,
so that code later on does not think it has data to copy.
(ASA-2007-015)
In ast_pbx_run(), mark a channel as hung up after an application returned -1,
or when it runs out of extensions to execute. This is so that code can detect
that this channel has been hung up for things like making sure DeadAGI is used
on actual dead channels, and is beneficial for other things, like making sure
someone doesn't try to start spying on a channel that is about to go away.
Luigi Rizzo [Tue, 17 Jul 2007 14:32:15 +0000 (14:32 +0000)]
Introduce ast_parse_arg() , a generic function to parse strings
in a consistent way. This is meant to replace the custom code
which is repeated all over the place in the various files when
parsing config files, CLI entries and other string information.
Right now the code supports parsing int32, uint32 and sockaddr_in with
optional default values and bound checks. It contains minimal error
checking, but that can be easily extended as the need arises.
Being a new API i am introducing this only in trunk, though I believe
that once the interface has been ironed out it might become a
worthwhile addition to 1.4 as well - basically, the first time
we will need to fix a piece of argument parsing code, we might as
well bring in this change and use the new API instead.
Luigi Rizzo [Tue, 17 Jul 2007 12:46:25 +0000 (12:46 +0000)]
Initialize a variable to avoid a warning when the compiler
(and/or the optimization level) may think it is used uninitialized.
The code was indeed correct, but unfortunately the result of
some compiler checks such as -Wunused and -Wuninitialized depends
heavily on the optimization level.
For my next trick I will make it so dialplan functions no longer need to call ast_module_user_add and ast_module_user_remove. These are now called in the ast_func_read and ast_func_write functions outside of the module.
Restoring functionality from 1.2 wherein Retrydial will not exit if there is no announce file specified.
This change makes it so that if there is no announce file specified, the application will continue until finished (or caller hangs up).
If a bogus announce file is specified, then a warning message will be printed saying that the file could not be found, but execution will
still continue.
(closes issue #10186, reported by jon, patched by me)
Applications no longer need to call ast_module_user_add and ast_module_user_remove. This is now taken care of in the pbx_exec function outside of the application.
It is no longer required for each module that deals with a channel to call ast_module_user_hangup_all in it's unload function. The loader will automatically perform this action for it.
Russell Bryant [Mon, 16 Jul 2007 02:51:56 +0000 (02:51 +0000)]
Merge a bunch of doxygen updates to header files. This includes changes to
use the \retval tag for documenting return values, fixing various warnings
when generating the documentation, and various other things.
(closes issue #10203, snuffy)
Russell Bryant [Mon, 16 Jul 2007 02:44:49 +0000 (02:44 +0000)]
Cast the 2nd argument to iconv() to a void *, as some systems define it as a
(const char *), while others define it as (char *). This is done to suppress
compiler warnings about it.
Fixed an issue where chanspy flags were uninitialized if no options were passed.
What triggered this investigation was an IRC chat where some people's quiet flags were
set while others' weren't even though none of them had specified the q option.