diff options
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/bind_addr.c | 21 | ||||
-rw-r--r-- | net/sctp/protocol.c | 11 | ||||
-rw-r--r-- | net/sctp/sysctl.c | 12 |
3 files changed, 38 insertions, 6 deletions
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 6d5944a745d4..13a6fba41077 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -510,9 +510,28 @@ int sctp_in_scope(const union sctp_addr *addr, sctp_scope_t scope) | |||
510 | * of requested destination address, sender and receiver | 510 | * of requested destination address, sender and receiver |
511 | * SHOULD include all of its addresses with level greater | 511 | * SHOULD include all of its addresses with level greater |
512 | * than or equal to L. | 512 | * than or equal to L. |
513 | * | ||
514 | * Address scoping can be selectively controlled via sysctl | ||
515 | * option | ||
513 | */ | 516 | */ |
514 | if (addr_scope <= scope) | 517 | switch (sctp_scope_policy) { |
518 | case SCTP_SCOPE_POLICY_DISABLE: | ||
515 | return 1; | 519 | return 1; |
520 | case SCTP_SCOPE_POLICY_ENABLE: | ||
521 | if (addr_scope <= scope) | ||
522 | return 1; | ||
523 | break; | ||
524 | case SCTP_SCOPE_POLICY_PRIVATE: | ||
525 | if (addr_scope <= scope || SCTP_SCOPE_PRIVATE == addr_scope) | ||
526 | return 1; | ||
527 | break; | ||
528 | case SCTP_SCOPE_POLICY_LINK: | ||
529 | if (addr_scope <= scope || SCTP_SCOPE_LINK == addr_scope) | ||
530 | return 1; | ||
531 | break; | ||
532 | default: | ||
533 | break; | ||
534 | } | ||
516 | 535 | ||
517 | return 0; | 536 | return 0; |
518 | } | 537 | } |
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 | */ |
435 | static sctp_scope_t sctp_v4_scope(union sctp_addr *addr) | 438 | static 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); |
diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 63eabbc71298..ab7151da120f 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c | |||
@@ -51,6 +51,7 @@ static int timer_max = 86400000; /* ms in one day */ | |||
51 | static int int_max = INT_MAX; | 51 | static int int_max = INT_MAX; |
52 | static int sack_timer_min = 1; | 52 | static int sack_timer_min = 1; |
53 | static int sack_timer_max = 500; | 53 | static int sack_timer_max = 500; |
54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ | ||
54 | 55 | ||
55 | extern int sysctl_sctp_mem[3]; | 56 | extern int sysctl_sctp_mem[3]; |
56 | extern int sysctl_sctp_rmem[3]; | 57 | extern int sysctl_sctp_rmem[3]; |
@@ -272,6 +273,17 @@ static ctl_table sctp_table[] = { | |||
272 | .proc_handler = proc_dointvec, | 273 | .proc_handler = proc_dointvec, |
273 | .strategy = sysctl_intvec | 274 | .strategy = sysctl_intvec |
274 | }, | 275 | }, |
276 | { | ||
277 | .ctl_name = CTL_UNNUMBERED, | ||
278 | .procname = "addr_scope_policy", | ||
279 | .data = &sctp_scope_policy, | ||
280 | .maxlen = sizeof(int), | ||
281 | .mode = 0644, | ||
282 | .proc_handler = &proc_dointvec_minmax, | ||
283 | .strategy = &sysctl_intvec, | ||
284 | .extra1 = &zero, | ||
285 | .extra2 = &addr_scope_max, | ||
286 | }, | ||
275 | { .ctl_name = 0 } | 287 | { .ctl_name = 0 } |
276 | }; | 288 | }; |
277 | 289 | ||