From c7bf6d2e4d4ae559ffd1ca429cbe605f710e7f0c Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Wed, 9 Jan 2013 14:39:31 -0500 Subject: Allow raw socket options for TCP and SSL This patch lets the user set and use raw socket options as described in inet:setopts/2 documentation. The raw options can be useful to use TCP features that are platform- specific and not supported in inet in general, such as TCP_DEFER_ACCEPT or TCP_LINGER2 in linux stacks, for example. --- src/ranch.erl | 5 +++++ src/ranch_ssl.erl | 2 +- src/ranch_tcp.erl | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ranch.erl b/src/ranch.erl index 752819e..6f1b6fe 100644 --- a/src/ranch.erl +++ b/src/ranch.erl @@ -169,6 +169,11 @@ filter_options([Opt = {Key, _}|Tail], AllowedKeys, Acc) -> case lists:member(Key, AllowedKeys) of true -> filter_options(Tail, AllowedKeys, [Opt|Acc]); false -> filter_options(Tail, AllowedKeys, Acc) + end; +filter_options([Opt = {raw, _, _, _}|Tail], AllowedKeys, Acc) -> + case lists:member(raw, AllowedKeys) of + true -> filter_options(Tail, AllowedKeys, [Opt|Acc]); + false -> filter_options(Tail, AllowedKeys, Acc) end. %% @doc Add an option to a list, but only if it wasn't previously set. diff --git a/src/ranch_ssl.erl b/src/ranch_ssl.erl index 734de21..d880cc8 100644 --- a/src/ranch_ssl.erl +++ b/src/ranch_ssl.erl @@ -95,7 +95,7 @@ listen(Opts) -> %% first argument. ssl:listen(0, ranch:filter_options(Opts2, [backlog, cacertfile, certfile, ciphers, ip, - keyfile, nodelay, password, port, verify], + keyfile, nodelay, password, port, raw, verify], [binary, {active, false}, {packet, raw}, {reuseaddr, true}, {nodelay, true}])). diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl index b113186..bb7ad55 100644 --- a/src/ranch_tcp.erl +++ b/src/ranch_tcp.erl @@ -70,7 +70,7 @@ listen(Opts) -> %% We set the port to 0 because it is given in the Opts directly. %% The port in the options takes precedence over the one in the %% first argument. - gen_tcp:listen(0, ranch:filter_options(Opts2, [backlog, ip, nodelay, port], + gen_tcp:listen(0, ranch:filter_options(Opts2, [backlog, ip, nodelay, port, raw], [binary, {active, false}, {packet, raw}, {reuseaddr, true}, {nodelay, true}])). -- cgit v1.2.3