ReSIProcate 1.8 Release
 Getting the software
- Download Directory
- Subversion Path to Release Branch
- Official Debian packages (will be part of Debian 7.0 (wheezy))
- Official Ubuntu packages (since Quantal Quetzal)
- Official Fedora RPM packages
- OpenWRT - patch submitted for building repro and reTurnServer packages to run in OpenWRT routers
NEW in 1.8:
- the contrib directories are now distributed in a separate tarball, resiprocate-contrib-1.8.x.tar.gz
- Linux users often don't need the contrib tarball because all the contrib items are available as packages on Debian, Ubuntu and Fedora
- Windows users often do need the contrib tarball
- All users should look at the new INSTALL file in the repository for build instructions
This releases are made from the
resiprocate-1.8.x tags and can be checked out from SVN using paths like this (for example, 1.8.5):
For the standard subversion client you can fetch this with either:
To see a full list of tags and the latest tag, just click here:
 Release Notes v 1.8
 New features
- added new REND project for for Registration and Presence load testing
 Build system
 New features
- the old build system was completely replaced with an autotools build system
- resip now builds on Solaris SunPro
- update BerkeleyDb to 4.8 in contrib
- added MaxMind GeoIP library to contrib
- added MySQL client connector library to contrib
- allow resip's asio drop to build with OpenSSL 1.0 and above
- allow testStack to use popt for VS2010 projects
 Bug fixes
- fixed many compilation errors and warnings on various platforms
 New features
- added Timer::resetT1 to make it easier to tweak T1
- added ConfigParse class to aid with configuration file and command line parsing
- Data class enhancements
- made Data class smaller, without sacrificing functionality. Data is 20 (56 vs 36) bytes smaller on 64-bit libs, and 4 (36 vs 32) bytes smaller on 32-bit libs.
- several very simple functions have been inlined.
- Data::md5() has been changed to Data::md5(Data::EncodingType type=HEX); this allows the output of md5() to be encoded as hex or Base64, or not encoded at all (binary).
- Data::replace(const Data& match, const Data& target) has been updated to Data::replace(const Data& match, const Data& target, int max=INT_MAX); this allows the maximum number of replacements to be specified.
- specialized hashing and comparison functions have been added:
- Data::caseInsensitiveTokenHash(); this is a case-insensitive hash that assumes that the Data is an RFC 3261 token (eg; branch params). This hash function is based on the Hsieh hash.
- bool Data::caseInsensitiveTokenCompare(const Data& rhs); this is an equality comparison that assumes that both Datas are RFC 3261 tokens (eg; branch parameters) and is faster than strncasecmp().
- Data& schemeLowercase(); this is an optimized variant of lowercase() that assumes the Data is an RFC 3261 scheme.
- performance improvements to ParseBuffer
- most functions that returned a Pointer now return a much more lightweight CurrentPosition object.
- allow some of the simpler functions to be inlined
- integer parsing code is more efficient, and overflow detection is better
- performance enhancements to DnsUtil
- DnsUtil::inet_ntop(): For some reason, the stock system inet_ntop is dreadfully inefficient on OS X. A dirt-simple hand-rolled implementation was 5-6 times as fast. This is shocking. The Linux implementation is plenty efficient, though, so we're using preprocessor to activate the hand-rolled code.
- DnsUtil::isIpV4Address(): The implementation uses sscanf(), which is pretty expensive. Hand-rolled some code that is much faster.
- moved XMLCursor class from resip/stack to rutil
- custom ares build was moved from /contrib/ares to /rutil/dns/ares, since it is a heavily customize version of the ares library - building with c-ares as an alternative is still possible
- added new ServerProcess class to encapsulate method for daemonizing and other server/daemon requirements like PID files
- added new KeyValueStore class for highly efficient generic storage
- keys are simple integer indexes into a vector and must be allocated before they are used
- currently supports storage and retrieval of the following types: Data, bool, short, unsigned short, int, unsigned int, and UInt64
- added Inserter functionality for collections that store pointers to items. Use InserterP instead of Inserter for such collections.
 Bug fixes
- fixed a Windows API issue with ThreadLocalStorage. The Windows API functions for TLS do not guarantee that the id / index number will be less than 1088. Change the code to use a std::map<DWORD> instead of a fixed size array. The previous code would cause heap corruption if the OS passed back an index number of 1088.
- fixed a bad assert in Random class - we shouldn't be using RAND_MAX to look at what is returned by random()
- fix bug in Data. If Data is wrapping memory allocated externally (ie. Share mode = BORROW) and you start appending to it. It is possible that the append method will write a NULL character off the end of the buffer. Changed the resize condition to make the buffer larger 1 character sooner, to accommodate for this.
- fix for IPv6 - If localhost is used at init time, then IP family wasn't properly populated in ares
- fix for IPv6 - If DNS servers are reached over IPv6, then they were not printed to the logs correctly
 New features
- the various parameter types now have their scope restricted to the grammar element/s for which they are defined, instead of having them all be equally valid for all grammar elements.
- added two new flags added to MessageDecorators that instruct the stack to copy the decorator from the INVITE request to any resulting stack generated CANCEL requests or ACK failure requests. This functionality was added so that it is possible to decorate all request messaging on the wire.
- enhanced the MarkListener class to allow control over the DNS Grey / Black list. The onMark function is now called before insertion to the list and you can now change the expiry value to 0 if you don't want the entry added to the grey/black list, or change the amount of time it is on the list.
- reduced the memory footprint associated with storing URIs
- change how branch parameters are encoded.
- old format: z9hG4bK-d8754z-<branch>-<transportseq>-<clientData>-<sigcompCompartment>-d8754z-
- new Format: z9hG4bK-524287-<transportseq>-<clientData>-<sigcompComprtment>-<branch>
- this format encodes faster, parses faster (with _much_ simpler code), and takes up less space on the wire.
- some other small optimizations; avoid copies associated with calling Data::base64encode()/base64decode() on empty Datas, and reorder the SIP cookie comparisons to be more efficient.
- reduced the memory consumed by storing TransationState
- reduction in buffer reallocations while encoding a SipMessage
- added multiple threads in the stack. Allow transaction processing, transport processing, and DNS processing to be broken off into separate threads.
- SipStack::run() causes the creation and run of three threads; a TransactionControllerThread, and TransportSelectorThread, and a DnsThread. You continue to use stuff like StackThread and EventStackThread to give cycles to the rest of the stack (mainly processing app timers and statistics logging). In other words, to use the new multi-threaded mode, all you have to do is throw in a call to SipStack::run() before you fire up your normal SipStack processing, and a SipStack::shutdownAndJoinThreads() when you're done.
- in the Connection read/write code, process reads/writes until EAGAIN, or we run out of stuff to send. Gives a healthy performance boost on connection-based transports.
- in TransactionController, put transaction timers in their own fifo. This prevents timers from firing late when the state machine fifo gets congested.
- process at most 16 TransactionMessages from the state machine fifo at a time, to prevent starving other parts of the system.
- unhook the TransactionController's processing loop from that of the TransportSelector. This simplifies this API considerably, but required the addition of a new feature to Fifo. Fifo can now take an (optional) AsyncProcessHandler* that will be notified when the fifo goes from empty to non-empty. Actually pretty useful.
- allow setPollGrp() to be called multiple times on the various classes that have this function. This allows the FdPollGrp to be re-set when the SipStack enters multithreaded mode.
- added a "multithreadedstack" --thread-type option to testStack. Exercise this option in testStackStd.sh
- added the ability to run any of the existing Transport objects in their own thread, by a combination of a new transport flag (RESIP_TRANSPORT_FLAG_OWNTHREAD), and a new TransportThread class. Added support for this mode to testStack using the --tf option. Also exercised this feature in testStackStd.sh.
- installed SelectInterruptors at the TransportSelector, each Transport object, and the DnsStub (this last one required moving SelectInterruptor to rutil). This is critical to making multithreaded mode work in a performant manner, and imposes almost no performance penalty due to the way they are invoked.
- SipStack now creates its own SelectInterruptor if one is not supplied externally. This is because it is critical to be able to wake the TransactionController up when new work comes down from the TU, or from the transports.
- new congestion-management framework
- allow testStack, tfm/repro/sanityTests, and repro to be run with a congestion manager via a configuration flag.
- efficient wait-time estimation in AbstractFifo; keeps track of how rapidly messages are consumed, allowing good estimates of how long a new message will take to be serviced. More efficient than the time-depth logic in TimeLimitFifo, and a better predictor too.
- the ability to shed load at the transport level when the TransactionController is congested, in a very efficient manner, using new functionality in Helper and SipMessage (Helper::makeRawResponse() and SipMessage::encodeSingleHeader())
- the ability to shed load coming from the TU when the TransactionController is congested. This is crucial when congestion is being caused by a TU trying to do too much.
- changed the way load-shedding is handled for TransactionUsers to use the new API
- a flexible congestion-management API, allowing load-shedding decisions to be made in an arbitrary fashion.
- a generalized CongestionManager implementation that is powerful enough to be useful.
- the TransactionController will now defer retransmissions of requests if sufficiently congested (ie; the response is probably stuck in mStateMacFifo)
- the TransactionController now determines its hostname with a single call to DnsUtil::getLocalHostName() on construction, for use in 503s. Previously, it would make this call every time a 503 was sent; this call blocks sometimes!
- don't call DnsResult::blacklistLast() on a Retry-After: 0
- several fixes for the processing loop in testStack that were causing starvation of one type of work or another when congestion occurred.
- small efficiency improvement in Random::getCryptoRandom(int) Random::getCryptoRandom(unsigned int len) was implemented by calling Random::getCryptoRandom() repeatedly, and collecting the return values in a buffer. In the openssl case, we now use a single call to RAND_bytes().
- use a priority_queue instead of a multiset for storing timers.
- slight refactoring of Timer so that transaction timers and payload timers (ie; timers that carry a Message*) are a separate classes. Transaction timers no longer have an unused Message* member, and payload timers no longer have the unused transaction-id, Timer::Type, and duration. This saves a _lot_ of memory for apps that use lots of app timers with long lifetimes.
- less wasteful population of Call-IDs: When generating Call-IDs, Helper was computing an md5 hash of the hostname and some salt, hex-encoding it, and then Base64 encoding the hex data. We now Base64 encode the md5 hash directly. This is less computationally expensive, requires less memory because the resulting string is half the size, and requires fewer bytes on the wire.
- make TransactionMap case-insensitive; Data::caseInsensitiveTokenHash() is fast enough that performance actually increases a little.
- std::bitset-based parsing in a number of places for improved performance
- don't check whether the encoding tables are initted for every single character; check once before the encode operation begins. Also, checking the value of a static bool to determine whether an init has been carried out is pointless; that bool might not be initted yet, and it could have any value. The static init code now copes with both accesses to the encoding tables during static initialization, and from multiple threads during runtime.
- don't bother generating a transaction identifier unless the parse fails to extract one.
- some refactoring of the FdPollGrp stuff. Now is compatible with cares, using a bit of a hack. Also compatible with being driven with the old buildFdSet()/select()/process(FdSet&) call sequence, although this is now deprecated. Fixing these compatibility problems allowed us to switch over to using FdPollGrp in all cases, instead of having dual mode everywhere.
- buffer classes for Fifo to reduce lock contention. Using them in a few places, will use them in more once we phase out TimeLimitFifo with the new congestion management code.
- use the --ignore-case option for generation of ParameterHash.cxx, instead of the nasty sed rewriting we are using now. Should also be slightly faster, since gperf handles case-insensitive hashing more efficiently than our hack was.
- added a local memory pool to SipMessage, to cut down (dramatically) on heap allocation overhead. Some minor refactoring to free up wasted space in SipMessage as well (makes more room for the pool). Changing the way the start-line is stored to no longer use a full-blown ParserContainer+ HeaderFieldValueList.
- added method to SipStack to be able to retrieve a dump of the DNS cache
- added operator<< for Statistics Payload
- allow SipStack statistics to be reset/zero'd out
- modified GetStackStats command to be able to retrieve statistics that are accurate at the time of the request, instead of just returning the statistics as of the last statistics interval
- added a new method to SipStack so that you can post to TU without needing to clone/copy the message
- tls: add support for loading a directory of root certificates or a file containing a bundle of roort certificates
- tls: support for mutual TLS/client certificate verification
- tls: optional facility to accept email address subjectAltNames as if they were SIP URIs
- added new Helper method: Tuple getClientPublicAddress(const SipMessage& request) - look at Via headers, and finds the first public IP address closest to the sending client.
- renamed Helper::isSenderBehindNAT to isClientBehindNAT for consistency
- allow a DateCategory to be created from time_t
- allow transport type be pre-populated in a via header to force the stack to use a particular transport type (ie. UDP, TCP, TLS)
 Bug fixes
- fix for testStack running on OS X
- fixed issue where resiprocate would encode headers that are not directly modified, potentially causing header formatting to change where there is a difference in resip encoding vs received encoding.
- modified LazyParser to encode from the raw HeaderFieldValue if it has not been modified (or at least, the non-const version of checkParsed() has not been called).
- added SipMessage::const_header for the various header types, to allow explicit const-only access with a non-const SipMessage
- use this const_header function in a number of places where we do not want the LazyParser marking itself as "dirty".
- fixed a bug in URI parsing code when an @ or : appeared in a quoted parameter
- fix for DtlsTransport - fix in _doHandshake(), switch must be done on SSL_get_error() return value
- fixed a static initialization race with the Uri encoding tables
- fix for missing statistics in output string for stack statistics
- fix possible memory corruption in SdpContents::Session::Medium::codecs() due to Codec::parse() and the Medium's AttributeHelper, the AttributeHelper free's up the memory that was used by parse()
- fix to make nc (nonce count) lowercase, per definition of LHEX in RFC2831
- use getaddrinfo() instead of the non-threadsafe gethostbyname().
- remove unused (and non-threadsafe) Timer::mTimerCount/Timer::mId.
- get rid of a wasteful double-encode, in Message.cxx
- fixed a nasty bug in NameAddr - where unknown parameters uri parameters on a NameAddr/Uri with no angle brackets are treated as NameAddr parameters. When this is done, the memory for these parameters was only a temporary Data object.
- resip TCP transports can crash repro on uncaught exception - if garbage is received on the socket, and there is no Content-Length header, then SipMessage::Exception can throw, and it was not caught with the existing ParseException catch handler. Changed to catch BaseException instead.
- fixed possible assert if a transport error is seen after trying to send an ACK message
- added TlsDestructorInitializer as a field to LogStaticInitializer in order to make sure an instance of TlsDestructorInitializer is created before LogStaticInitializer is initialized
- removed print in TcpConnection that could end up printing garbage at the end of messages that are not null terminated
- added loopback address checking to Tuple::isPrivateAddress
 New features
- added a getRequest() method to ClientOutOfDialogReq so that the request for the response can be accessed
- implemented InviteSession::reject while in the SentReinviteAnswered state. This is useful when needing to reject with an empty ACK an offer that was requested (using an empty INVITE) while in a dialog.
- added ability to asynchronously end an AppDialogSet using AppDialogSet::endCommand.
- added new public APIs to DialogUsageManager so that the application can find AppDialogs/AppDialogSets from a DialogId or a DialogSetId. This is useful if the application wants to find a dialog set from a SIP message alone.
- added the ability to end a publication without sending a final PUBLISH with an expires of 0
- modified client subscription to allow a subscription to be terminated without sending a final SUBSCRIBE request, useful in cases where an extension Subscription-State is used that signifies that the subscription is terminated
- added ServerAuthManager support for UA's who set auth username="user@domain" rather than username="user"
- support for mutual TLS/client certificate verification (as DUM feature)
- enhanced ServerRegistration:
- ensure that ContactInstanceRecord::mReceivedFrom is always populated - not just in outbound use cases - added a new flag to indicate when flow routing is required
- added a new mPublicAddress flag member to ContactInstanceRecord - to assist repro feature to do geo proximity routing
- test/basicClient - allow subscription and call if not registering
 Bug fixes
- fixed a bug where we were using a description parameter in a Reason header, instead of a text parameter
- fixed incorrect assert in ServerSubscription due to missing break statement
- removed unsafe logging statement in DumTimeout - if DUM and stack are in different threads, then crash could occur
- fixed a bug where the CSeq can be wrong in a client subscription re-subscribe / refresh in the case where we receive the first NOTIFY before the 200/SUB response
- dum/test/basicClient - fixed a trap during shutdown, due to order of destructed objects
 New features
- added new configuration mechanism for repro
- removed use of popt, now using a new name/value pair approach (using new rutil/ConfigParser classs) to read settings from a .config file
- allows command line options - but is not backwards compatible with old popt command line format
- added a new Command interface/server to repro that operates over a TCP socket and uses XML formatted messaging. Supporting the following commands:
- added new reprocmd executable that connects to repro via new command socket server and sends commands based on command line arguments
- upgraded the MySQL support in repro to a deployable state
- allow MySQL connection parameters to be specified in repro config
- cleaned up MySQL initialization, so we fail to start if there is a db connect error
- remove all generic throws from MySQL implementation
- implemented MySQL connection recovery on errors - when connection errors occur on query, try to re-connect immediately (once)
- optimized query building in MySQLDb class
- added ability for repro.config to provide a select statement that allows a1 password retrieval from an arbitrary database table on the MySQL server
- added .sql script to create repro tables on MySQL
- added a singleResultQuery API to MySqlDb
- added my sql implementation of AVPs (attribute-value-pair) with two indexes/attributes
- increase MySQL AVP (attribute-value-pair) table size for value field from 1024 to 4096
- modifications to make MySQL client use properly protected for multi-threaded access - refuse to start if linked with mysql library that doesn't support multi-threading
- use CLIENT_MULTI_RESULTS flag when opening mysql database (enables multiple results, since some custom stored procedures might require this)
- add ability for a repro admin to add manual / permanent registrations (including Path information) - such manually added registrations are persisted to the database, and loaded at startup - manual registrations can be added on the Registration Web Page
- added new Baboon: GeoProximityTargetSorter - If enabled, then this baboon can post-process the target list. This includes targets from the StaticRoute monkey and/or targets from the LocationServer monkey. Requests that meet the filter criteria will have their Target list, flatened (serialized) and ordered based on the proximity of the target to the client sending the request. Proximity is determined by looking for a x-repro-geolocation="<latitude>,<longitude>" parameter on the Contact header of a received request, or the Contact headers of Registration requests. If this parameter is not found, then this processor will attempt to determine the public IP address closest to the client or target and use the MaxMind Geo IP library to lookup the geo location.
- added new RequestFilter monkey
- allows user to configure conditions under which an inbound request should be rejected or not
- allows two regular expression conditions that can be applied to any SIP message header: this includes the request-line, standard SIP headers and custom SIP headers. If a header that can appear multiple time is specified, then each instance of the header is checked.
- When conditions are met, allows the action carried out to be defined:
- Accept - accepts this request and stops further processing in Request Filter monkey
- Reject - rejects this request with the provided SIP status code and reason text
- SQL query - only available when MySQL support is compiled in - runs an arbitrary stored procedure or query, using replacement strings from the 2 condition regular expressions
- query must return an empty string or "0" to instruct repro to Accept the request, or a string containing "<SIP Reject Status Code>[, <SIP Reject Reason>]" to Reject the request
- using the repro configuration file the SQL Query can be configured to operate on a completely different mySQL instance/server than the repro configuration
- filters are defined in the HTTP web interface via new Add Filter, Edit Filter and Show Filters web pages. There is an ability to test the condition regular expressions from the web page as well.
- other Monkey settings are configured in the repro configuration file or via command line: DisableRequestFilterProcessor, RequestFilterDefaultNoMatchBehavior, RequestFilterDefaultDBErrorBehavior, RequestFilterMySQLServer (and other mySQL related settings)
- can be used to implement a User Blocking functionality - ie. calls and instant messages from user X to user Y should always be blocked, because user X is in user Y's block list
- introduced new FilterStore configuration database table to store the Filters configured on the web pages
- added optional MessageSilo support to repro
- stores IM's (ie. SIP MESSAGE requests) for offline users
- replays messages to users when they register (ie. come back online)
- records are persisted to a database table, so they survive shutdowns
- configurable filters exist for DestUri, MimeType, MessageBody size
- Web Admin GUI improvements
- made use of HTML tables consistent across all web interfaces pages
- made table backgrounds white to improved appearance
- added title to right hand side pane
- cleaned up formatting on many pages
- added warning to Domains page, that repro must be restarted
- added bottom banner with link to www.resiprocate.org
- added repro version display on top banner
- added new Settings page to repro web interface to show current command line / files settings in use - will also display some some low level stack info, congestion stats (if enabled), and the contents of the DNS cache
- added Clear DNS Cache button to settings page
- added Restart Proxy button to settings page (reloads everything, applies new configuration, but keeps in memory registration table)
- added display of registered contact's QValue on registrations web page
- Routes: stop webpage from being able to add two routes with the same Key, optimized data fetch for displaying routes on web page
- propagate db insert/update failures to callers - web interface now shows errors if record fails to update in db
- added an ability to configure a different database instance for some of the repro database tables. New configuration file settings, RuntimeMySQLServer and it's subsettings, were added to facilitate this. The Users and MessageSilo database tables are different from the other repro configuration database tables, in that they are accessed at runtime as SIP requests arrive. It may be desirable to use BerkeleyDb for the other repro tables (which are read at starup time, then cached in memory), and MySQL for the runtime accessed tables; or two separate MySQL instances for these different table sets. The new configuration settings allow you to achieve this.
- added option to enable some basic P-Asserted-Identity header handling
- After auth is successful
- if P-Perferred-Identity header is present remove it
- if no P-Asserted-Identity header is present, then add one
- Removal of P-Asserted-Identity if Privacy header is set to "id"
- Note: Since we have no better mechanism to determine if destination is trusted or not we assume that all destinations outside our domain are not-trusted and will remove the P-Asserted-Identity header
- After auth is successful
- added ability for repro to report a 404 error when attempting to reach a user that does not exist - previously repro would always send a 480 response when attempting to reach an AOR that wasn't registered
- major changes to how repro is started up, to allow easier additions of custom startup logic, such as adding custom Processors (Monkeys, Lemurs and Baboons) to the default Processor chains
- almost all logic that was in repro.cxx has been moved out to a new class (ReproRunner), and split into smaller virtual methods that can be overridden
- see comments at the top of repro.cxx for an example of how to add custom processors
- add support for daemonizing on platforms supporting fork()
- added ability to create a linux PID file on startup
- add support for loading a directory of root certificates or a file containing a bundle of root certificates
- support for mutual TLS/client certificate verification (as repro monkey)
- added congestion manager settings to be configured in repro configuration file
- added KeyValueStore to three strategic locations in repro, allowing custom Processors (Monkeys, Lemurs and Baboons) to store state scoped as follows:
- Global Proxy Scope - Proxy::getKeyValueStore
- Request Scope - RequestContext::getKeyValueStore
- Target Scope - Target::getKeyValueStore
- Before this storage can be used you must statically allocate a storage key. See mFromTrustedNodeKey use in the IsTrustedNode class for an example.
- implemented proper q-value processing of contacts in a redirect response
- modified repro so that Registration authentication uses the same pool of worker threads that the DigestAuthenticator uses when looking up credentials from the database. Previously only auth look ups for non-REGISTER requests (ie. INVITE, SUBSCRIBE, etc.) would be done in a manner that didn't block inbound message processing. A lengthy auth check for a REGISTER request would cause delays in processing all other REGISTER requests.
- allow custom repro implementations to add themselves to the RegistrarHandler so that registration messages can be processed and reacted to
- added abililty to tweak timer T1 in repro configuration
- allow specifying a ;lr flag on static routes to perform loose routing, instead of re-writing the request URI
- modified repro to allow an application overridden RequestContext to be able to provide a virtual fn for cancelClientTransaction
- added resip ExternalLogger to repro, so that Error logs are also logged to the console when file logging is enabled
- added some new configuration settings: LogFileName, LogFileMaxBytes
- made the number of worker threads in the repro authgrabber dispatcher configurable via the repro configuration file
- modified UserAuthGrabber to use UserStore::getUserAuthInfo, instead of UserStore::getUserInfo API - we don't use the other fields retrieved, so this will provide an optimization
- optimized the Worker thread to avoid making a copy of the Message when posting to the stack
- added new config setting StatisticsLogInterval to specify how often statistics are dumped to the log files
- added two new constructors to QValueTarget to make is easier to form targets from a NameAddr or Uri only
- renamed Target::targetPtrCompare to Target::priorityMetricCompare to be more descriptive
- cleanup some old hacks now that we have the ability to manually add registrations
- ParallelForkStaticRoutes no longer combines StaticRoutes Targets and LocationServer Targets
- static Routes are no longer added as QValueTargets, they are now added as simple Targets. So they are no longer susceptible to the various QValue Settings - ie. QValueMsBeforeCancel.
- added new ContinueProcessingAfterRoutesFound setting: By default (false) we will stop looking for more Targets if we have found matching routes. Setting this value to true will allow the LocationServer Monkey to run after StaticRoutes have been found. In this case the matching StaticRoutes become fallback targets, processed only after all location server Targets fail.
- cleaned up Processor and ProcessorChain classes
- added mName property in anticipation of a future capability to define processor chains in the configuration file
- simplified operator<< for processors, to use Name
- added a series of interfaces to make is easier to implement new Asynchronous Monkey's / Processors that utilize a common thread pool
- removed getTransactionId from ForkControlMessage - method exists on base class, so it's not needed
- removed getTransactionId and tid() from UserInfoMessage - getTransactionId method exists on base class, so they are not needed
- added AsyncProcessorDispatcher / thread pool to repro that be shared by all AsyncProcessors - currently used by new RequestFilter and Message Silo monkeys
- cleaned up some implementation in AbstractDb to remove some code duplication
- remove unused AbstractDb API's: writeRoute and writeFilter
- added ability for tables to have non-unique keys (ie. duplicate records)
- added secondary database support to BerkeleyDb - allows tables with a secondary index
- optimized data copies when reading records from BerkeleyDb
- modified WorkerThread to support work that does not require a response to be queued back to the stack
- added database transaction support to BerekelyDb and MySQL implementations
- removed unused SipStack parameter to DigestAuthenticator monkey
- option to enforce the requirement of a client certificate for third party domains
- added new repro setting to assume that first hop supports outbound
- support for storing passwordHashAlt - changes users schema and users db version. passwordHashAlt can be used with MySQLCustomUserAuthQuery, in future it will work seamlessly in conjunction with passwordHash
- avoid unnecessary iteration through target list in StaticRoute when try to determine if auth is required
- removed some unused code in ResponseContext: addOutboundBatch and mOutboundMap
 Bug fixes
- fix for a long standing issue in repro that started in rev6794, where repro can be over protective and issue 403 responses for legitimate mid-dialog requests. The issue occurs when a repro domain user forms a dialog with a user in another external domain. Any mid-dialog requests coming from the external domain would get 403'd. This was due to the logic in the AmIResponsible monkey, and the fact that such requests have the repro endpoints contact address in the RequestUri (typically the endpoints IP address), so not belonging to repro's domain, and the From user is not being from repro's domain.
- fix a bug in repro web interface, where fragmented HTTP messages were not being handled correctly
 New features
- reTurnServer: read config settings from reTurnServer.config instead of using hard coded values
- add support for daemonizing on platforms supporting fork()
- log error in UdpServer if failure to bind
- add StackLog logging of request type when encoding a message
- added a man page for reTurnServer
- added ability to create a linux PID file on startup
- return server - suppress socket errors when closing relay
 Bug fixes
- fixed problem where classic stun responses come from the wrong socket
- ensure asio doesn't throw exceptions under error conditions
- added missing request type TurnCreatePermissionMethod to operator<<
- log hex() version of HMAC keys, since they are binary
- client API: TurnSocket - ensure we are connected before allowing send
- client API: Remove warning about 'this' use in initiator list - pointer is only stored
- client API: Increase allowed send size from 1024 bytes to 2048
- client API: fix potential memory leak with mActiveRequestMap (TurnAsyncSocket class)
- client API: ensure retrans timer is stopped when request is removed from map
 tfm (repro)
 New features
- added VS2008 project files for Windows
- move tfm/contrib items to top level contrib directory
- make file logging the default on tfm, since console logging blocks the run too much
 Bug fixes
- adjust some timeout values so that tests will pass on slower systems
 tfm (dum)
 Bug fixes
- fixed a place where a NameAddr param (methods) was being used as a Uri param
 New features
- add support for TLS and sips uri scheme