aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/protocol.c
diff options
context:
space:
mode:
authorBhaskar Dutta <bhaskie@gmail.com>2009-09-03 07:55:47 -0400
committerVlad Yasevich <vladislav.yasevich@hp.com>2009-09-04 18:21:01 -0400
commit723884339f90a9c420783135168cc1045750eb5d (patch)
treec8538602e56f2310470b0970bf121a1000313401 /net/sctp/protocol.c
parent8da645e101a8c20c6073efda3c7cc74eec01b87f (diff)
sctp: Sysctl configuration for IPv4 Address Scoping
This patch introduces a new sysctl option to make IPv4 Address Scoping configurable <draft-stewart-tsvwg-sctp-ipv4-00.txt>. In networking environments where DNAT rules in iptables prerouting chains convert destination IP's to link-local/private IP addresses, SCTP connections fail to establish as the INIT chunk is dropped by the kernel due to address scope match failure. For example to support overlapping IP addresses (same IP address with different vlan id) a Layer-5 application listens on link local IP's, and there is a DNAT rule that maps the destination IP to a link local IP. Such applications never get the SCTP INIT if the address-scoping draft is strictly followed. This sysctl configuration allows SCTP to function in such unconventional networking environments. Sysctl options: 0 - Disable IPv4 address scoping draft altogether 1 - Enable IPv4 address scoping (default, current behavior) 2 - Enable address scoping but allow IPv4 private addresses in init/init-ack 3 - Enable address scoping but allow IPv4 link local address in init/init-ack Signed-off-by: Bhaskar Dutta <bhaskar.dutta@globallogic.com> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Diffstat (limited to 'net/sctp/protocol.c')
-rw-r--r--net/sctp/protocol.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
index a76da657244a..60093be8385d 100644
--- a/net/sctp/protocol.c
+++ b/net/sctp/protocol.c
@@ -431,16 +431,14 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
431 * of requested destination address, sender and receiver 431 * of requested destination address, sender and receiver
432 * SHOULD include all of its addresses with level greater 432 * SHOULD include all of its addresses with level greater
433 * than or equal to L. 433 * than or equal to L.
434 *
435 * IPv4 scoping can be controlled through sysctl option
436 * net.sctp.addr_scope_policy
434 */ 437 */
435static sctp_scope_t sctp_v4_scope(union sctp_addr *addr) 438static sctp_scope_t sctp_v4_scope(union sctp_addr *addr)
436{ 439{
437 sctp_scope_t retval; 440 sctp_scope_t retval;
438 441
439 /* Should IPv4 scoping be a sysctl configurable option
440 * so users can turn it off (default on) for certain
441 * unconventional networking environments?
442 */
443
444 /* Check for unusable SCTP addresses. */ 442 /* Check for unusable SCTP addresses. */
445 if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr)) { 443 if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr)) {
446 retval = SCTP_SCOPE_UNUSABLE; 444 retval = SCTP_SCOPE_UNUSABLE;
@@ -1259,6 +1257,9 @@ SCTP_STATIC __init int sctp_init(void)
1259 /* Disable AUTH by default. */ 1257 /* Disable AUTH by default. */
1260 sctp_auth_enable = 0; 1258 sctp_auth_enable = 0;
1261 1259
1260 /* Set SCOPE policy to enabled */
1261 sctp_scope_policy = SCTP_SCOPE_POLICY_ENABLE;
1262
1262 sctp_sysctl_register(); 1263 sctp_sysctl_register();
1263 1264
1264 INIT_LIST_HEAD(&sctp_address_families); 1265 INIT_LIST_HEAD(&sctp_address_families);