aboutsummaryrefslogtreecommitdiffstats
path: root/lib/diameter/src
AgeCommit message (Collapse)Author
2013-05-29Merge branch 'anders/diameter/watchdog_function_clause/OTP-11115' into maintAnders Svensson
* anders/diameter/watchdog_function_clause/OTP-11115: Fix watchdog function_clause
2013-05-29Remove redundant integer type specifiers from binariesAnders Svensson
2013-05-27Fix watchdog function_clauseAnders Svensson
Commit 0b7c87dc caused diameter_watchdog:restart/2 to start returning 'stop', so that a watchdog process for a listening transport that allowed multiple connections to the same peer would die one watchdog timeout after losing a connection. The new return value was supposed to be passed up to transition/2, but was instead passed to set_watchdog/1, resulting in a function_clause error. The resulting crash was harmless but unseemly. Not detected by dialyzer. Thanks to Aleksander Nycz.
2013-05-17Adapt Failed-AVP setting to RFC 6733Anders Svensson
When setting these from an #diameter_packet.errors list, select one Result-Code or {Result-Code, Failed-AVP}, instead of accumulating all AVP's from the 2-tuples in the list. This is more in keeping with RFC 6733: 7.5. Failed-AVP AVP The Failed-AVP AVP (AVP Code 279) is of type Grouped and provides debugging information in cases where a request is rejected or not fully processed due to erroneous information in a specific AVP. The value of the Result-Code AVP will provide information on the reason for the Failed-AVP AVP. A Diameter answer message SHOULD contain an instance of the Failed-AVP AVP that corresponds to the error indicated by the Result-Code AVP. For practical purposes, this Failed-AVP would typically refer to the first AVP processing error that a Diameter node encounters. The text of RFC 3588 was less specific, not including the last two sentences. Note that an improper AVP Length will result in both 5014 and 5005 being detected for the same AVP. Without this commit, Failed-AVP would be populated with two AVP's for the same error.
2013-05-17Add spec to diameter_codecAnders Svensson
2013-05-17Fix recognition of 5014 (INVALID_AVP_LENGTH) errorsAnders Svensson
Invalid lengths come in two flavours: ones that correctly point at the end of an AVP's payload but don't agree with its type, and ones that point elsewhere. The former are relatively harmless but the latter leave no way to recover AVP boundaries, which typically results in failure to decode subsequent AVP's in the message in question. In the case that AVP Length points past the end of the message, diameter incorrectly regarded the error as 5009, INVALID_AVP_BITS: not right since the error has nothing to do with AVP Flags. Ditto if the length was less than 8, a minimal header length. Only in the remaining case was the detected error 5014, INVALID_AVP_LENGTH. However, in this case it slavishly followed RFC 3588 in suggesting the undecodable AVP as Failed-AVP, thereby passing the woeful payload back to the sender to have equal difficulty decoding. Now follow RFC 6733 and suggest an AVP with a zero-filled payload.
2013-05-03Ensure setting Failed-AVP is appropriateAnders Svensson
When setting Failed-AVP in a message record, it was never tested that the field was actually present. RFC 6733 says it should be, 3588 says MAY.
2013-04-22Fix decode failure when AVP Length < 8Anders Svensson
Such a length caused decode of a message with valid (24-bit) length to fail. Note that the error detected is wrong: it should be 5014 (INVALID_AVP_LENGTH), not 3009 (INVALID_AVP_BITS). This will be dealt with by OTP-11007.
2013-04-18Fix mkdir raceAnders Svensson
Creating examples/code and examples/dict in parallel can fail when examples doesn't exists. This has been seen on FreeBSD.
2013-04-12Merge branch 'anders/diameter/watchdog_leak/OTP-11019' into maintAnders Svensson
* anders/diameter/watchdog_leak/OTP-11019: Minor doc fix Add testcase to exercise reconnect behaviour Fix watchdog table leak
2013-04-11Make explicit local address to diameter_tcp:start/3 optionalAnders Svensson
Use the default address address (as selected by gen_tcp) if none is configured, passing it in the new 'connected' message introduced by the previous commit. The corresponding update to diameter_sctp has to wait until problems with inet:sockname/1 are resolved: the function currently only returns one address, and sometimes {0,0,0,0}. See OTP-11018.
2013-04-11Add transport interface 'connected' message with local address listAnders Svensson
A transport module can return a local address list from its start/3 function in order to specify addresses to be used as Host-IP-Address during capabilities exchange. Now allow addresses to be communicated in a 'connected' message in the case of a connecting transport, so that diameter_tcp (in particular) can make local address configuration optional, communicating the gen_tcp default after connection establishment instead.
2013-04-10Fix watchdog table leakAnders Svensson
A service process maintains a table keyed on watchdog process pids. When a watchdog process dies the corresponding entry should be removed but this was broken in commit f115a9f7, causing entries with watchdog state DOWN to accumulate. Watchdog processes die as a result of diameter:remove_transport/2, or when a peer reestablishes a connection in the listening case. Neither is typically a frequent occurrence. The fault manifests itself in the return value of diameter:service_info(SvcName, transport), which displays entries for watchdog processes that are no longer alive.
2013-04-06Fix handling of unknown options to diameter:start_service/2Anders Svensson
{error, Reason} is now returned, instead of the options being ignored. Note that diameter:add_transport/2 purposely ignores unknown options and that the behaviour is documented. This is historic: some users depend on it in order to store their own options for identifying transport config, instead of using the reference returned by add_transport.
2013-03-26Fix faulty sequence validationAnders Svensson
The validation of {sequence, {H,N}} incorrectly checked that H was an N-bit integer, instead of the intended 32-N.
2013-03-26Deal with config errors detected at transport start less brutallyAnders Svensson
Crashing watchdog and peer_fsm processes was somewhat unseemly. Emit an error report and die silently instead.
2013-03-26Move most transport_opt() validation into diameter_configAnders Svensson
Faulty configuration was previously passed directly on to watchdog and peer_fsm processes, diameter:add_transport/2 happily returning ok and the error resulting on failure of watchdog and/or peer_fsm processes. Now check for errors before getting this far, returning {error, Reason} from diameter:add_transport/2 when one is detected. There are still some errors that can only be detected after transport start (eg. a misbehaving callback) but most will be caught early.
2013-03-26Minor doc/spec fixAnders Svensson
'infinity' is a valid transport_config timeout.
2013-03-25Minor diameter_lib cleanupAnders Svensson
Remove unused functions, add dialyzer specs, make wait/1 less fallible.
2013-03-19Merge branch 'maint-r16' into maintAnders Svensson
2013-03-18Update appup, vsn -> 1.4.1.1Anders Svensson
2013-03-18Deal with RFC 6733 change to Vendor-Specific-Application-IdAnders Svensson
RFC 6733 has changed the arity of Vendor-Id in this Grouped AVP, from 1* in RFC 3588 to 1 in RFC 6773. This impacts the generated dictionary modules: Vendor-Id is expected to be list-valued in the 3588 dictionary, integer-valued in the 6733 dictionary. This, in turn, breaks the independence of capabilities configuration on a service or transport from the dictionary that will be used to encode an outgoing CER or CEA. This commit fixes this by massaging any Vendor-Specific-Application-Id config as appropriate when constructing CER or CEA for a given dictionary.
2013-03-18Update appupAnders Svensson
2013-03-17More flexible distribution configAnders Svensson
Allow both share_peers and use_shared_peers to be a list of nodes, or a function that returns a list of nodes.
2013-03-17Distribution fixesAnders Svensson
This is the functionality that allows transports to be shared between identically-named services on different nodes, which has been neither documented nor tested (until now).
2013-03-12Tweak okay -> suspect configAnders Svensson
Make it just a number of timeouts, without a new DWR being sent.
2013-03-04Rework stats to avoid concurrent read and writeAnders Svensson
Counters read by diameter:service_info(SvcName, transport) can be selected at the same time as the diameter_stats server is folding them into another key, possibly resulting in inaccurate values. Have diameter_stats select from the server process to avoid this and add diameter_stats:sum/1 to sum values from all contributors on a given term.
2013-03-04Minor spec fixAnders Svensson
2013-03-04Add transport_opt() watchdog_configAnders Svensson
To make the number of watchdogs sent before the transitions REOPEN -> OKAY and OKAY -> SUSPECT configurable. Using anything other then the default config is non-standard and should only be used for test.
2013-02-23Merge branch 'anders/diameter/SoC/OTP-10688'Anders Svensson
* anders/diameter/SoC/OTP-10688: Add RFC 6733 commentary to SoC chapter Add RFC 6737 Capabilities Update dictionary Remove cruft from doc Makefile
2013-02-22Update copyright yearsBjörn-Egil Dahlberg
2013-02-20Add RFC 6737 Capabilities Update dictionaryAnders Svensson
Although it's neither built nor supported in code yet.
2013-02-18Update appup for diameter-1.4.1 in R16BAnders Svensson
Also add comments to identify the corresponding OTP releases. Purposely don't use regexp version numbers to be explicit about previously released versions. (Could use them in one direction but then app suite needs to be adapted.)
2013-02-18Make tweaksAnders Svensson
Add a 'strict' target to compile with -Werror and fix a dependency. Reorder test suites alphabetically. The two suites that currently take the longest to run conveniently come last.
2013-02-18Remove dialyzer nowarn_unused_function workaroundAnders Svensson
The workaround (commit 57d5564f) was to dialyzer only understanding nowarn_unused_function on individual functions. This is no longer the case as of R15B01 (commit 477fd95a).
2013-02-17Answer 5xxx errors with application_opt() request_errors = answerAnders Svensson
RFC 3588 allowed only 3xxx result codes in an answer-message (that is, an answer that sets the E-bit) while RFC 6733 also allows 5xxx result codes. Setting request_errors = answer tells diameter to answer 5xxx errors itself. Returning {answer_message, integer()} from a handle_request callback allows both 3xxx and 5xxx result codes to be set. {protocol_error, integer()} is retained for 3xxx result codes.
2013-02-16Comments and minor Result-Code fixAnders Svensson
In particular, don't put an error tuple in the errors field of a #diameter_packet{} when Result-Code and the E-bit are in conflict, put {integer(), #diameter_avp{}}.
2013-02-16Be less brutal in setting Result-Code/Failed-AVPAnders Svensson
When receiving a request for which errors have been detected during decode, diameter previously used the errors list in the decoded diameter_packet record to unconditionally set Result-Code and Failed-AVP in the outgoing answer. It wasn't particularly delicate in doing so however and would happily set a 5xxx Result-Code even if a handle_request callback returned an answer-message, leading to an encode error. This behaviour became even less endearing as of commit ac452e28, which made it possible to handle_request to take place even for protocol errors. (ie. When a callback typically should return an answer-message.) This commit fixes the behaviour by only setting a value that's appropriate for the answer in question, either a 3xxx or a 5xxx, depending on if the answer's an answer-message or not. It also allows handle_request to prevent diameter from setting anything by setting errors = false in a returned diameter_packet. Ideally it should have been errors = [] but the empty list is the default value for the errors field and changing the default (ideally there shouldn't have been one) would require recompilation of all modules including diameter.hrl: choose the less attractive 'false' to avoid such backwards incompatibility. The request reception is also refactored somewhat to shorten some call chains.
2013-02-16Add application_opt() request_errorsAnders Svensson
Configuring the value 'callback' all errors detected in incoming requests to result in a handle_request callback. The default value 'answer_3xxx' is the previous behaviour in which diameter answers protocol errors without a callback.
2013-02-11Add transport_opt() length_errorsAnders Svensson
The value determines whether or not an unexpected message length in the header of an incoming messages causes the peer process to exit, the message to be discarded or handled as usual. The latter may only be appropriate for message-oriented transport (eg. SCTP) since stream-oriented transport (eg. TCP) may not be able to recover the message boundary once a length error has occurred.
2013-02-10Only start a fragment timer when there's something to flushAnders Svensson
2013-02-10Simplify and document diameter_tcp fragment timerAnders Svensson
Don't start a new timer with each incoming message. Instead, start a timer at timeout and flush after two successive timeouts with no message reception.
2013-02-10Comment fixAnders Svensson
2013-02-10Remove upgrade code not needed after application restartAnders Svensson
Which will be the case in R16B.
2013-02-08Remove trailing whitespaceAnders Svensson
2013-02-08Tweak service interface towards diameter_peerAnders Svensson
2013-02-08Split message handling in diameter_service into diameter_trafficAnders Svensson
Traffic handling is connected to the service implementation through the pick_peer callback and failover but diameter_service was getting unwieldy as home to both the service process and traffic handling.
2013-02-08Simplify request recordAnders Svensson
In particular, remove fields containing values that are known (as of the preceding commit) to the request process.
2013-02-08Move failover out of service processAnders Svensson
In order to be able to remove fields from the request process that don't need to be there and do less in the service process. The pick_peer callback now takes place in the request process in the case of immutable state, just as in the case of the initial send.
2013-02-08Add exprecs '#new-'/1 clause taking list argumentAnders Svensson
As an inverse to '#get-'/1 in the preceding commit.