aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r--net/sctp/socket.c81
1 files changed, 27 insertions, 54 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 998e63a31311..e7e3baf7009e 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -513,7 +513,6 @@ static int sctp_send_asconf_add_ip(struct sock *sk,
513 union sctp_addr saveaddr; 513 union sctp_addr saveaddr;
514 void *addr_buf; 514 void *addr_buf;
515 struct sctp_af *af; 515 struct sctp_af *af;
516 struct list_head *pos;
517 struct list_head *p; 516 struct list_head *p;
518 int i; 517 int i;
519 int retval = 0; 518 int retval = 0;
@@ -525,10 +524,9 @@ static int sctp_send_asconf_add_ip(struct sock *sk,
525 ep = sp->ep; 524 ep = sp->ep;
526 525
527 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", 526 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n",
528 __FUNCTION__, sk, addrs, addrcnt); 527 __func__, sk, addrs, addrcnt);
529 528
530 list_for_each(pos, &ep->asocs) { 529 list_for_each_entry(asoc, &ep->asocs, asocs) {
531 asoc = list_entry(pos, struct sctp_association, asocs);
532 530
533 if (!asoc->peer.asconf_capable) 531 if (!asoc->peer.asconf_capable)
534 continue; 532 continue;
@@ -699,7 +697,6 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
699 union sctp_addr *laddr; 697 union sctp_addr *laddr;
700 void *addr_buf; 698 void *addr_buf;
701 struct sctp_af *af; 699 struct sctp_af *af;
702 struct list_head *pos, *pos1;
703 struct sctp_sockaddr_entry *saddr; 700 struct sctp_sockaddr_entry *saddr;
704 int i; 701 int i;
705 int retval = 0; 702 int retval = 0;
@@ -711,10 +708,9 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
711 ep = sp->ep; 708 ep = sp->ep;
712 709
713 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", 710 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n",
714 __FUNCTION__, sk, addrs, addrcnt); 711 __func__, sk, addrs, addrcnt);
715 712
716 list_for_each(pos, &ep->asocs) { 713 list_for_each_entry(asoc, &ep->asocs, asocs) {
717 asoc = list_entry(pos, struct sctp_association, asocs);
718 714
719 if (!asoc->peer.asconf_capable) 715 if (!asoc->peer.asconf_capable)
720 continue; 716 continue;
@@ -787,9 +783,8 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
787 * as some of the addresses in the bind address list are 783 * as some of the addresses in the bind address list are
788 * about to be deleted and cannot be used as source addresses. 784 * about to be deleted and cannot be used as source addresses.
789 */ 785 */
790 list_for_each(pos1, &asoc->peer.transport_addr_list) { 786 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
791 transport = list_entry(pos1, struct sctp_transport, 787 transports) {
792 transports);
793 dst_release(transport->dst); 788 dst_release(transport->dst);
794 sctp_transport_route(transport, NULL, 789 sctp_transport_route(transport, NULL,
795 sctp_sk(asoc->base.sk)); 790 sctp_sk(asoc->base.sk));
@@ -1197,7 +1192,7 @@ SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
1197 struct sockaddr *kaddrs; 1192 struct sockaddr *kaddrs;
1198 1193
1199 SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n", 1194 SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n",
1200 __FUNCTION__, sk, addrs, addrs_size); 1195 __func__, sk, addrs, addrs_size);
1201 1196
1202 if (unlikely(addrs_size <= 0)) 1197 if (unlikely(addrs_size <= 0))
1203 return -EINVAL; 1198 return -EINVAL;
@@ -1397,7 +1392,6 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1397 long timeo; 1392 long timeo;
1398 __u16 sinfo_flags = 0; 1393 __u16 sinfo_flags = 0;
1399 struct sctp_datamsg *datamsg; 1394 struct sctp_datamsg *datamsg;
1400 struct list_head *pos;
1401 int msg_flags = msg->msg_flags; 1395 int msg_flags = msg->msg_flags;
1402 1396
1403 SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n", 1397 SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n",
@@ -1727,9 +1721,8 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1727 } 1721 }
1728 1722
1729 /* Now send the (possibly) fragmented message. */ 1723 /* Now send the (possibly) fragmented message. */
1730 list_for_each(pos, &datamsg->chunks) { 1724 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
1731 chunk = list_entry(pos, struct sctp_chunk, frag_list); 1725 sctp_chunk_hold(chunk);
1732 sctp_datamsg_track(chunk);
1733 1726
1734 /* Do accounting for the write space. */ 1727 /* Do accounting for the write space. */
1735 sctp_set_owner_w(chunk); 1728 sctp_set_owner_w(chunk);
@@ -1748,7 +1741,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1748 SCTP_DEBUG_PRINTK("We sent primitively.\n"); 1741 SCTP_DEBUG_PRINTK("We sent primitively.\n");
1749 } 1742 }
1750 1743
1751 sctp_datamsg_free(datamsg); 1744 sctp_datamsg_put(datamsg);
1752 if (err) 1745 if (err)
1753 goto out_free; 1746 goto out_free;
1754 else 1747 else
@@ -2301,11 +2294,8 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk,
2301 * transport. 2294 * transport.
2302 */ 2295 */
2303 if (!trans && asoc) { 2296 if (!trans && asoc) {
2304 struct list_head *pos; 2297 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2305 2298 transports) {
2306 list_for_each(pos, &asoc->peer.transport_addr_list) {
2307 trans = list_entry(pos, struct sctp_transport,
2308 transports);
2309 sctp_apply_peer_addr_params(&params, trans, asoc, sp, 2299 sctp_apply_peer_addr_params(&params, trans, asoc, sp,
2310 hb_change, pmtud_change, 2300 hb_change, pmtud_change,
2311 sackdelay_change); 2301 sackdelay_change);
@@ -2396,11 +2386,8 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk,
2396 2386
2397 /* If change is for association, also apply to each transport. */ 2387 /* If change is for association, also apply to each transport. */
2398 if (asoc) { 2388 if (asoc) {
2399 struct list_head *pos; 2389 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2400 2390 transports) {
2401 list_for_each(pos, &asoc->peer.transport_addr_list) {
2402 trans = list_entry(pos, struct sctp_transport,
2403 transports);
2404 if (params.assoc_value) { 2391 if (params.assoc_value) {
2405 trans->sackdelay = 2392 trans->sackdelay =
2406 msecs_to_jiffies(params.assoc_value); 2393 msecs_to_jiffies(params.assoc_value);
@@ -2632,13 +2619,10 @@ static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, int o
2632 if (assocparams.sasoc_asocmaxrxt != 0) { 2619 if (assocparams.sasoc_asocmaxrxt != 0) {
2633 __u32 path_sum = 0; 2620 __u32 path_sum = 0;
2634 int paths = 0; 2621 int paths = 0;
2635 struct list_head *pos;
2636 struct sctp_transport *peer_addr; 2622 struct sctp_transport *peer_addr;
2637 2623
2638 list_for_each(pos, &asoc->peer.transport_addr_list) { 2624 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
2639 peer_addr = list_entry(pos, 2625 transports) {
2640 struct sctp_transport,
2641 transports);
2642 path_sum += peer_addr->pathmaxrxt; 2626 path_sum += peer_addr->pathmaxrxt;
2643 paths++; 2627 paths++;
2644 } 2628 }
@@ -2716,7 +2700,6 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, int op
2716static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optlen) 2700static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optlen)
2717{ 2701{
2718 struct sctp_association *asoc; 2702 struct sctp_association *asoc;
2719 struct list_head *pos;
2720 struct sctp_sock *sp = sctp_sk(sk); 2703 struct sctp_sock *sp = sctp_sk(sk);
2721 int val; 2704 int val;
2722 2705
@@ -2729,8 +2712,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optl
2729 sp->user_frag = val; 2712 sp->user_frag = val;
2730 2713
2731 /* Update the frag_point of the existing associations. */ 2714 /* Update the frag_point of the existing associations. */
2732 list_for_each(pos, &(sp->ep->asocs)) { 2715 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
2733 asoc = list_entry(pos, struct sctp_association, asocs);
2734 asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu); 2716 asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu);
2735 } 2717 }
2736 2718
@@ -3302,7 +3284,7 @@ SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr,
3302 sctp_lock_sock(sk); 3284 sctp_lock_sock(sk);
3303 3285
3304 SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n", 3286 SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n",
3305 __FUNCTION__, sk, addr, addr_len); 3287 __func__, sk, addr, addr_len);
3306 3288
3307 /* Validate addr_len before calling common connect/connectx routine. */ 3289 /* Validate addr_len before calling common connect/connectx routine. */
3308 af = sctp_get_af_specific(addr->sa_family); 3290 af = sctp_get_af_specific(addr->sa_family);
@@ -3823,7 +3805,7 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
3823 goto out; 3805 goto out;
3824 } 3806 }
3825 3807
3826 SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p\n", __FUNCTION__, sk, asoc); 3808 SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p\n", __func__, sk, asoc);
3827 3809
3828 retval = sctp_do_peeloff(asoc, &newsock); 3810 retval = sctp_do_peeloff(asoc, &newsock);
3829 if (retval < 0) 3811 if (retval < 0)
@@ -3837,7 +3819,7 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
3837 } 3819 }
3838 3820
3839 SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p newsk: %p sd: %d\n", 3821 SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p newsk: %p sd: %d\n",
3840 __FUNCTION__, sk, asoc, newsock->sk, retval); 3822 __func__, sk, asoc, newsock->sk, retval);
3841 3823
3842 /* Return the fd mapped to the new socket. */ 3824 /* Return the fd mapped to the new socket. */
3843 peeloff.sd = retval; 3825 peeloff.sd = retval;
@@ -4151,7 +4133,6 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
4151 int __user *optlen) 4133 int __user *optlen)
4152{ 4134{
4153 struct sctp_association *asoc; 4135 struct sctp_association *asoc;
4154 struct list_head *pos;
4155 int cnt = 0; 4136 int cnt = 0;
4156 struct sctp_getaddrs_old getaddrs; 4137 struct sctp_getaddrs_old getaddrs;
4157 struct sctp_transport *from; 4138 struct sctp_transport *from;
@@ -4176,8 +4157,8 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
4176 return -EINVAL; 4157 return -EINVAL;
4177 4158
4178 to = (void __user *)getaddrs.addrs; 4159 to = (void __user *)getaddrs.addrs;
4179 list_for_each(pos, &asoc->peer.transport_addr_list) { 4160 list_for_each_entry(from, &asoc->peer.transport_addr_list,
4180 from = list_entry(pos, struct sctp_transport, transports); 4161 transports) {
4181 memcpy(&temp, &from->ipaddr, sizeof(temp)); 4162 memcpy(&temp, &from->ipaddr, sizeof(temp));
4182 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); 4163 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4183 addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len; 4164 addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len;
@@ -4200,7 +4181,6 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
4200 char __user *optval, int __user *optlen) 4181 char __user *optval, int __user *optlen)
4201{ 4182{
4202 struct sctp_association *asoc; 4183 struct sctp_association *asoc;
4203 struct list_head *pos;
4204 int cnt = 0; 4184 int cnt = 0;
4205 struct sctp_getaddrs getaddrs; 4185 struct sctp_getaddrs getaddrs;
4206 struct sctp_transport *from; 4186 struct sctp_transport *from;
@@ -4225,8 +4205,8 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
4225 to = optval + offsetof(struct sctp_getaddrs,addrs); 4205 to = optval + offsetof(struct sctp_getaddrs,addrs);
4226 space_left = len - offsetof(struct sctp_getaddrs,addrs); 4206 space_left = len - offsetof(struct sctp_getaddrs,addrs);
4227 4207
4228 list_for_each(pos, &asoc->peer.transport_addr_list) { 4208 list_for_each_entry(from, &asoc->peer.transport_addr_list,
4229 from = list_entry(pos, struct sctp_transport, transports); 4209 transports) {
4230 memcpy(&temp, &from->ipaddr, sizeof(temp)); 4210 memcpy(&temp, &from->ipaddr, sizeof(temp));
4231 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); 4211 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4232 addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len; 4212 addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len;
@@ -5761,8 +5741,8 @@ static struct sctp_bind_bucket *sctp_bucket_create(
5761 struct sctp_bind_bucket *pp; 5741 struct sctp_bind_bucket *pp;
5762 5742
5763 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC); 5743 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
5764 SCTP_DBG_OBJCNT_INC(bind_bucket);
5765 if (pp) { 5744 if (pp) {
5745 SCTP_DBG_OBJCNT_INC(bind_bucket);
5766 pp->port = snum; 5746 pp->port = snum;
5767 pp->fastreuse = 0; 5747 pp->fastreuse = 0;
5768 INIT_HLIST_HEAD(&pp->owner); 5748 INIT_HLIST_HEAD(&pp->owner);
@@ -6194,11 +6174,9 @@ do_nonblock:
6194void sctp_write_space(struct sock *sk) 6174void sctp_write_space(struct sock *sk)
6195{ 6175{
6196 struct sctp_association *asoc; 6176 struct sctp_association *asoc;
6197 struct list_head *pos;
6198 6177
6199 /* Wake up the tasks in each wait queue. */ 6178 /* Wake up the tasks in each wait queue. */
6200 list_for_each(pos, &((sctp_sk(sk))->ep->asocs)) { 6179 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) {
6201 asoc = list_entry(pos, struct sctp_association, asocs);
6202 __sctp_write_space(asoc); 6180 __sctp_write_space(asoc);
6203 } 6181 }
6204} 6182}
@@ -6234,7 +6212,7 @@ static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p)
6234 long current_timeo = *timeo_p; 6212 long current_timeo = *timeo_p;
6235 DEFINE_WAIT(wait); 6213 DEFINE_WAIT(wait);
6236 6214
6237 SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __FUNCTION__, asoc, 6215 SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __func__, asoc,
6238 (long)(*timeo_p)); 6216 (long)(*timeo_p));
6239 6217
6240 /* Increment the association's refcnt. */ 6218 /* Increment the association's refcnt. */
@@ -6514,8 +6492,6 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
6514} 6492}
6515 6493
6516 6494
6517DEFINE_PROTO_INUSE(sctp)
6518
6519/* This proto struct describes the ULP interface for SCTP. */ 6495/* This proto struct describes the ULP interface for SCTP. */
6520struct proto sctp_prot = { 6496struct proto sctp_prot = {
6521 .name = "SCTP", 6497 .name = "SCTP",
@@ -6545,11 +6521,9 @@ struct proto sctp_prot = {
6545 .enter_memory_pressure = sctp_enter_memory_pressure, 6521 .enter_memory_pressure = sctp_enter_memory_pressure,
6546 .memory_allocated = &sctp_memory_allocated, 6522 .memory_allocated = &sctp_memory_allocated,
6547 .sockets_allocated = &sctp_sockets_allocated, 6523 .sockets_allocated = &sctp_sockets_allocated,
6548 REF_PROTO_INUSE(sctp)
6549}; 6524};
6550 6525
6551#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 6526#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
6552DEFINE_PROTO_INUSE(sctpv6)
6553 6527
6554struct proto sctpv6_prot = { 6528struct proto sctpv6_prot = {
6555 .name = "SCTPv6", 6529 .name = "SCTPv6",
@@ -6579,6 +6553,5 @@ struct proto sctpv6_prot = {
6579 .enter_memory_pressure = sctp_enter_memory_pressure, 6553 .enter_memory_pressure = sctp_enter_memory_pressure,
6580 .memory_allocated = &sctp_memory_allocated, 6554 .memory_allocated = &sctp_memory_allocated,
6581 .sockets_allocated = &sctp_sockets_allocated, 6555 .sockets_allocated = &sctp_sockets_allocated,
6582 REF_PROTO_INUSE(sctpv6)
6583}; 6556};
6584#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ 6557#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */