diff options
Diffstat (limited to 'net/sctp/protocol.c')
| -rw-r--r-- | net/sctp/protocol.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 0ec234b762c2..9258dfe784ae 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
| @@ -108,14 +108,23 @@ static __init int sctp_proc_init(void) | |||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | if (sctp_snmp_proc_init()) | 110 | if (sctp_snmp_proc_init()) |
| 111 | goto out_nomem; | 111 | goto out_snmp_proc_init; |
| 112 | if (sctp_eps_proc_init()) | 112 | if (sctp_eps_proc_init()) |
| 113 | goto out_nomem; | 113 | goto out_eps_proc_init; |
| 114 | if (sctp_assocs_proc_init()) | 114 | if (sctp_assocs_proc_init()) |
| 115 | goto out_nomem; | 115 | goto out_assocs_proc_init; |
| 116 | 116 | ||
| 117 | return 0; | 117 | return 0; |
| 118 | 118 | ||
| 119 | out_assocs_proc_init: | ||
| 120 | sctp_eps_proc_exit(); | ||
| 121 | out_eps_proc_init: | ||
| 122 | sctp_snmp_proc_exit(); | ||
| 123 | out_snmp_proc_init: | ||
| 124 | if (proc_net_sctp) { | ||
| 125 | proc_net_sctp = NULL; | ||
| 126 | remove_proc_entry("sctp", init_net.proc_net); | ||
| 127 | } | ||
| 119 | out_nomem: | 128 | out_nomem: |
| 120 | return -ENOMEM; | 129 | return -ENOMEM; |
| 121 | } | 130 | } |
| @@ -470,11 +479,11 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, | |||
| 470 | /* Walk through the bind address list and look for a bind | 479 | /* Walk through the bind address list and look for a bind |
| 471 | * address that matches the source address of the returned dst. | 480 | * address that matches the source address of the returned dst. |
| 472 | */ | 481 | */ |
| 482 | sctp_v4_dst_saddr(&dst_saddr, dst, htons(bp->port)); | ||
| 473 | rcu_read_lock(); | 483 | rcu_read_lock(); |
| 474 | list_for_each_entry_rcu(laddr, &bp->address_list, list) { | 484 | list_for_each_entry_rcu(laddr, &bp->address_list, list) { |
| 475 | if (!laddr->valid || (laddr->state != SCTP_ADDR_SRC)) | 485 | if (!laddr->valid || (laddr->state != SCTP_ADDR_SRC)) |
| 476 | continue; | 486 | continue; |
| 477 | sctp_v4_dst_saddr(&dst_saddr, dst, htons(bp->port)); | ||
| 478 | if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a)) | 487 | if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a)) |
| 479 | goto out_unlock; | 488 | goto out_unlock; |
| 480 | } | 489 | } |
| @@ -519,7 +528,8 @@ out: | |||
| 519 | /* For v4, the source address is cached in the route entry(dst). So no need | 528 | /* For v4, the source address is cached in the route entry(dst). So no need |
| 520 | * to cache it separately and hence this is an empty routine. | 529 | * to cache it separately and hence this is an empty routine. |
| 521 | */ | 530 | */ |
| 522 | static void sctp_v4_get_saddr(struct sctp_association *asoc, | 531 | static void sctp_v4_get_saddr(struct sctp_sock *sk, |
| 532 | struct sctp_association *asoc, | ||
| 523 | struct dst_entry *dst, | 533 | struct dst_entry *dst, |
| 524 | union sctp_addr *daddr, | 534 | union sctp_addr *daddr, |
| 525 | union sctp_addr *saddr) | 535 | union sctp_addr *saddr) |
| @@ -616,6 +626,11 @@ static void sctp_v4_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr) | |||
| 616 | seq_printf(seq, "%d.%d.%d.%d ", NIPQUAD(addr->v4.sin_addr)); | 626 | seq_printf(seq, "%d.%d.%d.%d ", NIPQUAD(addr->v4.sin_addr)); |
| 617 | } | 627 | } |
| 618 | 628 | ||
| 629 | static void sctp_v4_ecn_capable(struct sock *sk) | ||
| 630 | { | ||
| 631 | INET_ECN_xmit(sk); | ||
| 632 | } | ||
| 633 | |||
| 619 | /* Event handler for inet address addition/deletion events. | 634 | /* Event handler for inet address addition/deletion events. |
| 620 | * The sctp_local_addr_list needs to be protocted by a spin lock since | 635 | * The sctp_local_addr_list needs to be protocted by a spin lock since |
| 621 | * multiple notifiers (say IPv4 and IPv6) may be running at the same | 636 | * multiple notifiers (say IPv4 and IPv6) may be running at the same |
| @@ -934,6 +949,7 @@ static struct sctp_af sctp_af_inet = { | |||
| 934 | .skb_iif = sctp_v4_skb_iif, | 949 | .skb_iif = sctp_v4_skb_iif, |
| 935 | .is_ce = sctp_v4_is_ce, | 950 | .is_ce = sctp_v4_is_ce, |
| 936 | .seq_dump_addr = sctp_v4_seq_dump_addr, | 951 | .seq_dump_addr = sctp_v4_seq_dump_addr, |
| 952 | .ecn_capable = sctp_v4_ecn_capable, | ||
| 937 | .net_header_len = sizeof(struct iphdr), | 953 | .net_header_len = sizeof(struct iphdr), |
| 938 | .sockaddr_len = sizeof(struct sockaddr_in), | 954 | .sockaddr_len = sizeof(struct sockaddr_in), |
| 939 | #ifdef CONFIG_COMPAT | 955 | #ifdef CONFIG_COMPAT |
