0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0039
0040 #include <crypto/hash.h>
0041 #include <linux/types.h>
0042 #include <linux/kernel.h>
0043 #include <linux/wait.h>
0044 #include <linux/time.h>
0045 #include <linux/sched/signal.h>
0046 #include <linux/ip.h>
0047 #include <linux/capability.h>
0048 #include <linux/fcntl.h>
0049 #include <linux/poll.h>
0050 #include <linux/init.h>
0051 #include <linux/slab.h>
0052 #include <linux/file.h>
0053 #include <linux/compat.h>
0054 #include <linux/rhashtable.h>
0055
0056 #include <net/ip.h>
0057 #include <net/icmp.h>
0058 #include <net/route.h>
0059 #include <net/ipv6.h>
0060 #include <net/inet_common.h>
0061 #include <net/busy_poll.h>
0062
0063 #include <linux/socket.h> /* for sa_family_t */
0064 #include <linux/export.h>
0065 #include <net/sock.h>
0066 #include <net/sctp/sctp.h>
0067 #include <net/sctp/sm.h>
0068 #include <net/sctp/stream_sched.h>
0069
0070
0071 static bool sctp_writeable(struct sock *sk);
0072 static void sctp_wfree(struct sk_buff *skb);
0073 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
0074 size_t msg_len);
0075 static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
0076 static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
0077 static int sctp_wait_for_accept(struct sock *sk, long timeo);
0078 static void sctp_wait_for_close(struct sock *sk, long timeo);
0079 static void sctp_destruct_sock(struct sock *sk);
0080 static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
0081 union sctp_addr *addr, int len);
0082 static int sctp_bindx_add(struct sock *, struct sockaddr *, int);
0083 static int sctp_bindx_rem(struct sock *, struct sockaddr *, int);
0084 static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int);
0085 static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int);
0086 static int sctp_send_asconf(struct sctp_association *asoc,
0087 struct sctp_chunk *chunk);
0088 static int sctp_do_bind(struct sock *, union sctp_addr *, int);
0089 static int sctp_autobind(struct sock *sk);
0090 static int sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
0091 struct sctp_association *assoc,
0092 enum sctp_socket_type type);
0093
0094 static unsigned long sctp_memory_pressure;
0095 static atomic_long_t sctp_memory_allocated;
0096 static DEFINE_PER_CPU(int, sctp_memory_per_cpu_fw_alloc);
0097 struct percpu_counter sctp_sockets_allocated;
0098
0099 static void sctp_enter_memory_pressure(struct sock *sk)
0100 {
0101 sctp_memory_pressure = 1;
0102 }
0103
0104
0105
0106 static inline int sctp_wspace(struct sctp_association *asoc)
0107 {
0108 struct sock *sk = asoc->base.sk;
0109
0110 return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used
0111 : sk_stream_wspace(sk);
0112 }
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123 static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
0124 {
0125 struct sctp_association *asoc = chunk->asoc;
0126 struct sock *sk = asoc->base.sk;
0127
0128
0129 sctp_association_hold(asoc);
0130
0131 if (chunk->shkey)
0132 sctp_auth_shkey_hold(chunk->shkey);
0133
0134 skb_set_owner_w(chunk->skb, sk);
0135
0136 chunk->skb->destructor = sctp_wfree;
0137
0138 skb_shinfo(chunk->skb)->destructor_arg = chunk;
0139
0140 refcount_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
0141 asoc->sndbuf_used += chunk->skb->truesize + sizeof(struct sctp_chunk);
0142 sk->sk_wmem_queued += chunk->skb->truesize + sizeof(struct sctp_chunk);
0143 sk_mem_charge(sk, chunk->skb->truesize);
0144 }
0145
0146 static void sctp_clear_owner_w(struct sctp_chunk *chunk)
0147 {
0148 skb_orphan(chunk->skb);
0149 }
0150
0151 #define traverse_and_process() \
0152 do { \
0153 msg = chunk->msg; \
0154 if (msg == prev_msg) \
0155 continue; \
0156 list_for_each_entry(c, &msg->chunks, frag_list) { \
0157 if ((clear && asoc->base.sk == c->skb->sk) || \
0158 (!clear && asoc->base.sk != c->skb->sk)) \
0159 cb(c); \
0160 } \
0161 prev_msg = msg; \
0162 } while (0)
0163
0164 static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,
0165 bool clear,
0166 void (*cb)(struct sctp_chunk *))
0167
0168 {
0169 struct sctp_datamsg *msg, *prev_msg = NULL;
0170 struct sctp_outq *q = &asoc->outqueue;
0171 struct sctp_chunk *chunk, *c;
0172 struct sctp_transport *t;
0173
0174 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports)
0175 list_for_each_entry(chunk, &t->transmitted, transmitted_list)
0176 traverse_and_process();
0177
0178 list_for_each_entry(chunk, &q->retransmit, transmitted_list)
0179 traverse_and_process();
0180
0181 list_for_each_entry(chunk, &q->sacked, transmitted_list)
0182 traverse_and_process();
0183
0184 list_for_each_entry(chunk, &q->abandoned, transmitted_list)
0185 traverse_and_process();
0186
0187 list_for_each_entry(chunk, &q->out_chunk_list, list)
0188 traverse_and_process();
0189 }
0190
0191 static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk,
0192 void (*cb)(struct sk_buff *, struct sock *))
0193
0194 {
0195 struct sk_buff *skb, *tmp;
0196
0197 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp)
0198 cb(skb, sk);
0199
0200 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp)
0201 cb(skb, sk);
0202
0203 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp)
0204 cb(skb, sk);
0205 }
0206
0207
0208 static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
0209 int len)
0210 {
0211 struct sctp_af *af;
0212
0213
0214 af = sctp_sockaddr_af(sctp_sk(sk), addr, len);
0215 if (!af)
0216 return -EINVAL;
0217
0218
0219 if (!af->addr_valid(addr, sctp_sk(sk), NULL))
0220 return -EINVAL;
0221
0222 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr)))
0223 return -EINVAL;
0224
0225 return 0;
0226 }
0227
0228
0229
0230
0231 struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id)
0232 {
0233 struct sctp_association *asoc = NULL;
0234
0235
0236 if (!sctp_style(sk, UDP)) {
0237
0238
0239
0240
0241 if (!sctp_sstate(sk, ESTABLISHED) && !sctp_sstate(sk, CLOSING))
0242 return NULL;
0243
0244
0245 if (!list_empty(&sctp_sk(sk)->ep->asocs))
0246 asoc = list_entry(sctp_sk(sk)->ep->asocs.next,
0247 struct sctp_association, asocs);
0248 return asoc;
0249 }
0250
0251
0252 if (id <= SCTP_ALL_ASSOC)
0253 return NULL;
0254
0255 spin_lock_bh(&sctp_assocs_id_lock);
0256 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
0257 if (asoc && (asoc->base.sk != sk || asoc->base.dead))
0258 asoc = NULL;
0259 spin_unlock_bh(&sctp_assocs_id_lock);
0260
0261 return asoc;
0262 }
0263
0264
0265
0266
0267
0268 static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
0269 struct sockaddr_storage *addr,
0270 sctp_assoc_t id)
0271 {
0272 struct sctp_association *addr_asoc = NULL, *id_asoc = NULL;
0273 struct sctp_af *af = sctp_get_af_specific(addr->ss_family);
0274 union sctp_addr *laddr = (union sctp_addr *)addr;
0275 struct sctp_transport *transport;
0276
0277 if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len))
0278 return NULL;
0279
0280 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep,
0281 laddr,
0282 &transport);
0283
0284 if (!addr_asoc)
0285 return NULL;
0286
0287 id_asoc = sctp_id2assoc(sk, id);
0288 if (id_asoc && (id_asoc != addr_asoc))
0289 return NULL;
0290
0291 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
0292 (union sctp_addr *)addr);
0293
0294 return transport;
0295 }
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307 static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
0308 {
0309 int retval = 0;
0310
0311 lock_sock(sk);
0312
0313 pr_debug("%s: sk:%p, addr:%p, addr_len:%d\n", __func__, sk,
0314 addr, addr_len);
0315
0316
0317 if (!sctp_sk(sk)->ep->base.bind_addr.port)
0318 retval = sctp_do_bind(sk, (union sctp_addr *)addr,
0319 addr_len);
0320 else
0321 retval = -EINVAL;
0322
0323 release_sock(sk);
0324
0325 return retval;
0326 }
0327
0328 static int sctp_get_port_local(struct sock *, union sctp_addr *);
0329
0330
0331 static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
0332 union sctp_addr *addr, int len)
0333 {
0334 struct sctp_af *af;
0335
0336
0337 if (len < sizeof (struct sockaddr))
0338 return NULL;
0339
0340 if (!opt->pf->af_supported(addr->sa.sa_family, opt))
0341 return NULL;
0342
0343 if (addr->sa.sa_family == AF_INET6) {
0344 if (len < SIN6_LEN_RFC2133)
0345 return NULL;
0346
0347 if (ipv6_addr_v4mapped(&addr->v6.sin6_addr) &&
0348 !opt->pf->af_supported(AF_INET, opt))
0349 return NULL;
0350 }
0351
0352
0353 af = sctp_get_af_specific(addr->sa.sa_family);
0354
0355 if (len < af->sockaddr_len)
0356 return NULL;
0357
0358 return af;
0359 }
0360
0361 static void sctp_auto_asconf_init(struct sctp_sock *sp)
0362 {
0363 struct net *net = sock_net(&sp->inet.sk);
0364
0365 if (net->sctp.default_auto_asconf) {
0366 spin_lock(&net->sctp.addr_wq_lock);
0367 list_add_tail(&sp->auto_asconf_list, &net->sctp.auto_asconf_splist);
0368 spin_unlock(&net->sctp.addr_wq_lock);
0369 sp->do_auto_asconf = 1;
0370 }
0371 }
0372
0373
0374 static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
0375 {
0376 struct net *net = sock_net(sk);
0377 struct sctp_sock *sp = sctp_sk(sk);
0378 struct sctp_endpoint *ep = sp->ep;
0379 struct sctp_bind_addr *bp = &ep->base.bind_addr;
0380 struct sctp_af *af;
0381 unsigned short snum;
0382 int ret = 0;
0383
0384
0385 af = sctp_sockaddr_af(sp, addr, len);
0386 if (!af) {
0387 pr_debug("%s: sk:%p, newaddr:%p, len:%d EINVAL\n",
0388 __func__, sk, addr, len);
0389 return -EINVAL;
0390 }
0391
0392 snum = ntohs(addr->v4.sin_port);
0393
0394 pr_debug("%s: sk:%p, new addr:%pISc, port:%d, new port:%d, len:%d\n",
0395 __func__, sk, &addr->sa, bp->port, snum, len);
0396
0397
0398 if (!sp->pf->bind_verify(sp, addr))
0399 return -EADDRNOTAVAIL;
0400
0401
0402
0403
0404
0405 if (bp->port) {
0406 if (!snum)
0407 snum = bp->port;
0408 else if (snum != bp->port) {
0409 pr_debug("%s: new port %d doesn't match existing port "
0410 "%d\n", __func__, snum, bp->port);
0411 return -EINVAL;
0412 }
0413 }
0414
0415 if (snum && inet_port_requires_bind_service(net, snum) &&
0416 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
0417 return -EACCES;
0418
0419
0420
0421
0422 if (sctp_bind_addr_match(bp, addr, sp))
0423 return -EINVAL;
0424
0425
0426
0427
0428
0429 addr->v4.sin_port = htons(snum);
0430 if (sctp_get_port_local(sk, addr))
0431 return -EADDRINUSE;
0432
0433
0434 if (!bp->port) {
0435 bp->port = inet_sk(sk)->inet_num;
0436 sctp_auto_asconf_init(sp);
0437 }
0438
0439
0440
0441
0442 ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len,
0443 SCTP_ADDR_SRC, GFP_ATOMIC);
0444
0445 if (ret) {
0446 sctp_put_port(sk);
0447 return ret;
0448 }
0449
0450 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
0451 sp->pf->to_sk_saddr(addr, sk);
0452
0453 return ret;
0454 }
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466 static int sctp_send_asconf(struct sctp_association *asoc,
0467 struct sctp_chunk *chunk)
0468 {
0469 int retval = 0;
0470
0471
0472
0473
0474 if (asoc->addip_last_asconf) {
0475 list_add_tail(&chunk->list, &asoc->addip_chunk_list);
0476 goto out;
0477 }
0478
0479
0480 sctp_chunk_hold(chunk);
0481 retval = sctp_primitive_ASCONF(asoc->base.net, asoc, chunk);
0482 if (retval)
0483 sctp_chunk_free(chunk);
0484 else
0485 asoc->addip_last_asconf = chunk;
0486
0487 out:
0488 return retval;
0489 }
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503 static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt)
0504 {
0505 int cnt;
0506 int retval = 0;
0507 void *addr_buf;
0508 struct sockaddr *sa_addr;
0509 struct sctp_af *af;
0510
0511 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", __func__, sk,
0512 addrs, addrcnt);
0513
0514 addr_buf = addrs;
0515 for (cnt = 0; cnt < addrcnt; cnt++) {
0516
0517
0518
0519 sa_addr = addr_buf;
0520 af = sctp_get_af_specific(sa_addr->sa_family);
0521 if (!af) {
0522 retval = -EINVAL;
0523 goto err_bindx_add;
0524 }
0525
0526 retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr,
0527 af->sockaddr_len);
0528
0529 addr_buf += af->sockaddr_len;
0530
0531 err_bindx_add:
0532 if (retval < 0) {
0533
0534 if (cnt > 0)
0535 sctp_bindx_rem(sk, addrs, cnt);
0536 return retval;
0537 }
0538 }
0539
0540 return retval;
0541 }
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553 static int sctp_send_asconf_add_ip(struct sock *sk,
0554 struct sockaddr *addrs,
0555 int addrcnt)
0556 {
0557 struct sctp_sock *sp;
0558 struct sctp_endpoint *ep;
0559 struct sctp_association *asoc;
0560 struct sctp_bind_addr *bp;
0561 struct sctp_chunk *chunk;
0562 struct sctp_sockaddr_entry *laddr;
0563 union sctp_addr *addr;
0564 union sctp_addr saveaddr;
0565 void *addr_buf;
0566 struct sctp_af *af;
0567 struct list_head *p;
0568 int i;
0569 int retval = 0;
0570
0571 sp = sctp_sk(sk);
0572 ep = sp->ep;
0573
0574 if (!ep->asconf_enable)
0575 return retval;
0576
0577 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
0578 __func__, sk, addrs, addrcnt);
0579
0580 list_for_each_entry(asoc, &ep->asocs, asocs) {
0581 if (!asoc->peer.asconf_capable)
0582 continue;
0583
0584 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP)
0585 continue;
0586
0587 if (!sctp_state(asoc, ESTABLISHED))
0588 continue;
0589
0590
0591
0592
0593
0594
0595 addr_buf = addrs;
0596 for (i = 0; i < addrcnt; i++) {
0597 addr = addr_buf;
0598 af = sctp_get_af_specific(addr->v4.sin_family);
0599 if (!af) {
0600 retval = -EINVAL;
0601 goto out;
0602 }
0603
0604 if (sctp_assoc_lookup_laddr(asoc, addr))
0605 break;
0606
0607 addr_buf += af->sockaddr_len;
0608 }
0609 if (i < addrcnt)
0610 continue;
0611
0612
0613
0614
0615 bp = &asoc->base.bind_addr;
0616 p = bp->address_list.next;
0617 laddr = list_entry(p, struct sctp_sockaddr_entry, list);
0618 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs,
0619 addrcnt, SCTP_PARAM_ADD_IP);
0620 if (!chunk) {
0621 retval = -ENOMEM;
0622 goto out;
0623 }
0624
0625
0626
0627
0628 addr_buf = addrs;
0629 for (i = 0; i < addrcnt; i++) {
0630 addr = addr_buf;
0631 af = sctp_get_af_specific(addr->v4.sin_family);
0632 memcpy(&saveaddr, addr, af->sockaddr_len);
0633 retval = sctp_add_bind_addr(bp, &saveaddr,
0634 sizeof(saveaddr),
0635 SCTP_ADDR_NEW, GFP_ATOMIC);
0636 addr_buf += af->sockaddr_len;
0637 }
0638 if (asoc->src_out_of_asoc_ok) {
0639 struct sctp_transport *trans;
0640
0641 list_for_each_entry(trans,
0642 &asoc->peer.transport_addr_list, transports) {
0643 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
0644 2*asoc->pathmtu, 4380));
0645 trans->ssthresh = asoc->peer.i.a_rwnd;
0646 trans->rto = asoc->rto_initial;
0647 sctp_max_rto(asoc, trans);
0648 trans->rtt = trans->srtt = trans->rttvar = 0;
0649
0650 sctp_transport_route(trans, NULL,
0651 sctp_sk(asoc->base.sk));
0652 }
0653 }
0654 retval = sctp_send_asconf(asoc, chunk);
0655 }
0656
0657 out:
0658 return retval;
0659 }
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676 static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt)
0677 {
0678 struct sctp_sock *sp = sctp_sk(sk);
0679 struct sctp_endpoint *ep = sp->ep;
0680 int cnt;
0681 struct sctp_bind_addr *bp = &ep->base.bind_addr;
0682 int retval = 0;
0683 void *addr_buf;
0684 union sctp_addr *sa_addr;
0685 struct sctp_af *af;
0686
0687 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
0688 __func__, sk, addrs, addrcnt);
0689
0690 addr_buf = addrs;
0691 for (cnt = 0; cnt < addrcnt; cnt++) {
0692
0693
0694
0695
0696 if (list_empty(&bp->address_list) ||
0697 (sctp_list_single_entry(&bp->address_list))) {
0698 retval = -EBUSY;
0699 goto err_bindx_rem;
0700 }
0701
0702 sa_addr = addr_buf;
0703 af = sctp_get_af_specific(sa_addr->sa.sa_family);
0704 if (!af) {
0705 retval = -EINVAL;
0706 goto err_bindx_rem;
0707 }
0708
0709 if (!af->addr_valid(sa_addr, sp, NULL)) {
0710 retval = -EADDRNOTAVAIL;
0711 goto err_bindx_rem;
0712 }
0713
0714 if (sa_addr->v4.sin_port &&
0715 sa_addr->v4.sin_port != htons(bp->port)) {
0716 retval = -EINVAL;
0717 goto err_bindx_rem;
0718 }
0719
0720 if (!sa_addr->v4.sin_port)
0721 sa_addr->v4.sin_port = htons(bp->port);
0722
0723
0724
0725
0726
0727
0728
0729
0730 retval = sctp_del_bind_addr(bp, sa_addr);
0731
0732 addr_buf += af->sockaddr_len;
0733 err_bindx_rem:
0734 if (retval < 0) {
0735
0736 if (cnt > 0)
0737 sctp_bindx_add(sk, addrs, cnt);
0738 return retval;
0739 }
0740 }
0741
0742 return retval;
0743 }
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755 static int sctp_send_asconf_del_ip(struct sock *sk,
0756 struct sockaddr *addrs,
0757 int addrcnt)
0758 {
0759 struct sctp_sock *sp;
0760 struct sctp_endpoint *ep;
0761 struct sctp_association *asoc;
0762 struct sctp_transport *transport;
0763 struct sctp_bind_addr *bp;
0764 struct sctp_chunk *chunk;
0765 union sctp_addr *laddr;
0766 void *addr_buf;
0767 struct sctp_af *af;
0768 struct sctp_sockaddr_entry *saddr;
0769 int i;
0770 int retval = 0;
0771 int stored = 0;
0772
0773 chunk = NULL;
0774 sp = sctp_sk(sk);
0775 ep = sp->ep;
0776
0777 if (!ep->asconf_enable)
0778 return retval;
0779
0780 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
0781 __func__, sk, addrs, addrcnt);
0782
0783 list_for_each_entry(asoc, &ep->asocs, asocs) {
0784
0785 if (!asoc->peer.asconf_capable)
0786 continue;
0787
0788 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP)
0789 continue;
0790
0791 if (!sctp_state(asoc, ESTABLISHED))
0792 continue;
0793
0794
0795
0796
0797
0798
0799 addr_buf = addrs;
0800 for (i = 0; i < addrcnt; i++) {
0801 laddr = addr_buf;
0802 af = sctp_get_af_specific(laddr->v4.sin_family);
0803 if (!af) {
0804 retval = -EINVAL;
0805 goto out;
0806 }
0807
0808 if (!sctp_assoc_lookup_laddr(asoc, laddr))
0809 break;
0810
0811 addr_buf += af->sockaddr_len;
0812 }
0813 if (i < addrcnt)
0814 continue;
0815
0816
0817
0818
0819
0820
0821 bp = &asoc->base.bind_addr;
0822 laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs,
0823 addrcnt, sp);
0824 if ((laddr == NULL) && (addrcnt == 1)) {
0825 if (asoc->asconf_addr_del_pending)
0826 continue;
0827 asoc->asconf_addr_del_pending =
0828 kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
0829 if (asoc->asconf_addr_del_pending == NULL) {
0830 retval = -ENOMEM;
0831 goto out;
0832 }
0833 asoc->asconf_addr_del_pending->sa.sa_family =
0834 addrs->sa_family;
0835 asoc->asconf_addr_del_pending->v4.sin_port =
0836 htons(bp->port);
0837 if (addrs->sa_family == AF_INET) {
0838 struct sockaddr_in *sin;
0839
0840 sin = (struct sockaddr_in *)addrs;
0841 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr;
0842 } else if (addrs->sa_family == AF_INET6) {
0843 struct sockaddr_in6 *sin6;
0844
0845 sin6 = (struct sockaddr_in6 *)addrs;
0846 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr;
0847 }
0848
0849 pr_debug("%s: keep the last address asoc:%p %pISc at %p\n",
0850 __func__, asoc, &asoc->asconf_addr_del_pending->sa,
0851 asoc->asconf_addr_del_pending);
0852
0853 asoc->src_out_of_asoc_ok = 1;
0854 stored = 1;
0855 goto skip_mkasconf;
0856 }
0857
0858 if (laddr == NULL)
0859 return -EINVAL;
0860
0861
0862
0863
0864
0865 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt,
0866 SCTP_PARAM_DEL_IP);
0867 if (!chunk) {
0868 retval = -ENOMEM;
0869 goto out;
0870 }
0871
0872 skip_mkasconf:
0873
0874
0875
0876 addr_buf = addrs;
0877 for (i = 0; i < addrcnt; i++) {
0878 laddr = addr_buf;
0879 af = sctp_get_af_specific(laddr->v4.sin_family);
0880 list_for_each_entry(saddr, &bp->address_list, list) {
0881 if (sctp_cmp_addr_exact(&saddr->a, laddr))
0882 saddr->state = SCTP_ADDR_DEL;
0883 }
0884 addr_buf += af->sockaddr_len;
0885 }
0886
0887
0888
0889
0890
0891 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
0892 transports) {
0893 sctp_transport_route(transport, NULL,
0894 sctp_sk(asoc->base.sk));
0895 }
0896
0897 if (stored)
0898
0899 continue;
0900 retval = sctp_send_asconf(asoc, chunk);
0901 }
0902 out:
0903 return retval;
0904 }
0905
0906
0907 int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw)
0908 {
0909 struct sock *sk = sctp_opt2sk(sp);
0910 union sctp_addr *addr;
0911 struct sctp_af *af;
0912
0913
0914 addr = &addrw->a;
0915 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port);
0916 af = sctp_get_af_specific(addr->sa.sa_family);
0917 if (!af)
0918 return -EINVAL;
0919 if (sctp_verify_addr(sk, addr, af->sockaddr_len))
0920 return -EINVAL;
0921
0922 if (addrw->state == SCTP_ADDR_NEW)
0923 return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1);
0924 else
0925 return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1);
0926 }
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997 static int sctp_setsockopt_bindx(struct sock *sk, struct sockaddr *addrs,
0998 int addrs_size, int op)
0999 {
1000 int err;
1001 int addrcnt = 0;
1002 int walk_size = 0;
1003 struct sockaddr *sa_addr;
1004 void *addr_buf = addrs;
1005 struct sctp_af *af;
1006
1007 pr_debug("%s: sk:%p addrs:%p addrs_size:%d opt:%d\n",
1008 __func__, sk, addr_buf, addrs_size, op);
1009
1010 if (unlikely(addrs_size <= 0))
1011 return -EINVAL;
1012
1013
1014 while (walk_size < addrs_size) {
1015 if (walk_size + sizeof(sa_family_t) > addrs_size)
1016 return -EINVAL;
1017
1018 sa_addr = addr_buf;
1019 af = sctp_get_af_specific(sa_addr->sa_family);
1020
1021
1022
1023
1024 if (!af || (walk_size + af->sockaddr_len) > addrs_size)
1025 return -EINVAL;
1026 addrcnt++;
1027 addr_buf += af->sockaddr_len;
1028 walk_size += af->sockaddr_len;
1029 }
1030
1031
1032 switch (op) {
1033 case SCTP_BINDX_ADD_ADDR:
1034
1035 err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_BINDX_ADD,
1036 addrs, addrs_size);
1037 if (err)
1038 return err;
1039 err = sctp_bindx_add(sk, addrs, addrcnt);
1040 if (err)
1041 return err;
1042 return sctp_send_asconf_add_ip(sk, addrs, addrcnt);
1043 case SCTP_BINDX_REM_ADDR:
1044 err = sctp_bindx_rem(sk, addrs, addrcnt);
1045 if (err)
1046 return err;
1047 return sctp_send_asconf_del_ip(sk, addrs, addrcnt);
1048
1049 default:
1050 return -EINVAL;
1051 }
1052 }
1053
1054 static int sctp_bind_add(struct sock *sk, struct sockaddr *addrs,
1055 int addrlen)
1056 {
1057 int err;
1058
1059 lock_sock(sk);
1060 err = sctp_setsockopt_bindx(sk, addrs, addrlen, SCTP_BINDX_ADD_ADDR);
1061 release_sock(sk);
1062 return err;
1063 }
1064
1065 static int sctp_connect_new_asoc(struct sctp_endpoint *ep,
1066 const union sctp_addr *daddr,
1067 const struct sctp_initmsg *init,
1068 struct sctp_transport **tp)
1069 {
1070 struct sctp_association *asoc;
1071 struct sock *sk = ep->base.sk;
1072 struct net *net = sock_net(sk);
1073 enum sctp_scope scope;
1074 int err;
1075
1076 if (sctp_endpoint_is_peeled_off(ep, daddr))
1077 return -EADDRNOTAVAIL;
1078
1079 if (!ep->base.bind_addr.port) {
1080 if (sctp_autobind(sk))
1081 return -EAGAIN;
1082 } else {
1083 if (inet_port_requires_bind_service(net, ep->base.bind_addr.port) &&
1084 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
1085 return -EACCES;
1086 }
1087
1088 scope = sctp_scope(daddr);
1089 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1090 if (!asoc)
1091 return -ENOMEM;
1092
1093 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL);
1094 if (err < 0)
1095 goto free;
1096
1097 *tp = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN);
1098 if (!*tp) {
1099 err = -ENOMEM;
1100 goto free;
1101 }
1102
1103 if (!init)
1104 return 0;
1105
1106 if (init->sinit_num_ostreams) {
1107 __u16 outcnt = init->sinit_num_ostreams;
1108
1109 asoc->c.sinit_num_ostreams = outcnt;
1110
1111 err = sctp_stream_init(&asoc->stream, outcnt, 0, GFP_KERNEL);
1112 if (err)
1113 goto free;
1114 }
1115
1116 if (init->sinit_max_instreams)
1117 asoc->c.sinit_max_instreams = init->sinit_max_instreams;
1118
1119 if (init->sinit_max_attempts)
1120 asoc->max_init_attempts = init->sinit_max_attempts;
1121
1122 if (init->sinit_max_init_timeo)
1123 asoc->max_init_timeo =
1124 msecs_to_jiffies(init->sinit_max_init_timeo);
1125
1126 return 0;
1127 free:
1128 sctp_association_free(asoc);
1129 return err;
1130 }
1131
1132 static int sctp_connect_add_peer(struct sctp_association *asoc,
1133 union sctp_addr *daddr, int addr_len)
1134 {
1135 struct sctp_endpoint *ep = asoc->ep;
1136 struct sctp_association *old;
1137 struct sctp_transport *t;
1138 int err;
1139
1140 err = sctp_verify_addr(ep->base.sk, daddr, addr_len);
1141 if (err)
1142 return err;
1143
1144 old = sctp_endpoint_lookup_assoc(ep, daddr, &t);
1145 if (old && old != asoc)
1146 return old->state >= SCTP_STATE_ESTABLISHED ? -EISCONN
1147 : -EALREADY;
1148
1149 if (sctp_endpoint_is_peeled_off(ep, daddr))
1150 return -EADDRNOTAVAIL;
1151
1152 t = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN);
1153 if (!t)
1154 return -ENOMEM;
1155
1156 return 0;
1157 }
1158
1159
1160
1161
1162
1163
1164 static int __sctp_connect(struct sock *sk, struct sockaddr *kaddrs,
1165 int addrs_size, int flags, sctp_assoc_t *assoc_id)
1166 {
1167 struct sctp_sock *sp = sctp_sk(sk);
1168 struct sctp_endpoint *ep = sp->ep;
1169 struct sctp_transport *transport;
1170 struct sctp_association *asoc;
1171 void *addr_buf = kaddrs;
1172 union sctp_addr *daddr;
1173 struct sctp_af *af;
1174 int walk_size, err;
1175 long timeo;
1176
1177 if (sctp_sstate(sk, ESTABLISHED) || sctp_sstate(sk, CLOSING) ||
1178 (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)))
1179 return -EISCONN;
1180
1181 daddr = addr_buf;
1182 af = sctp_get_af_specific(daddr->sa.sa_family);
1183 if (!af || af->sockaddr_len > addrs_size)
1184 return -EINVAL;
1185
1186 err = sctp_verify_addr(sk, daddr, af->sockaddr_len);
1187 if (err)
1188 return err;
1189
1190 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport);
1191 if (asoc)
1192 return asoc->state >= SCTP_STATE_ESTABLISHED ? -EISCONN
1193 : -EALREADY;
1194
1195 err = sctp_connect_new_asoc(ep, daddr, NULL, &transport);
1196 if (err)
1197 return err;
1198 asoc = transport->asoc;
1199
1200 addr_buf += af->sockaddr_len;
1201 walk_size = af->sockaddr_len;
1202 while (walk_size < addrs_size) {
1203 err = -EINVAL;
1204 if (walk_size + sizeof(sa_family_t) > addrs_size)
1205 goto out_free;
1206
1207 daddr = addr_buf;
1208 af = sctp_get_af_specific(daddr->sa.sa_family);
1209 if (!af || af->sockaddr_len + walk_size > addrs_size)
1210 goto out_free;
1211
1212 if (asoc->peer.port != ntohs(daddr->v4.sin_port))
1213 goto out_free;
1214
1215 err = sctp_connect_add_peer(asoc, daddr, af->sockaddr_len);
1216 if (err)
1217 goto out_free;
1218
1219 addr_buf += af->sockaddr_len;
1220 walk_size += af->sockaddr_len;
1221 }
1222
1223
1224
1225
1226 if (assoc_id) {
1227 err = sctp_assoc_set_id(asoc, GFP_KERNEL);
1228 if (err < 0)
1229 goto out_free;
1230 }
1231
1232 err = sctp_primitive_ASSOCIATE(sock_net(sk), asoc, NULL);
1233 if (err < 0)
1234 goto out_free;
1235
1236
1237 inet_sk(sk)->inet_dport = htons(asoc->peer.port);
1238 sp->pf->to_sk_daddr(daddr, sk);
1239 sk->sk_err = 0;
1240
1241 if (assoc_id)
1242 *assoc_id = asoc->assoc_id;
1243
1244 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
1245 return sctp_wait_for_connect(asoc, &timeo);
1246
1247 out_free:
1248 pr_debug("%s: took out_free path with asoc:%p kaddrs:%p err:%d\n",
1249 __func__, asoc, kaddrs, err);
1250 sctp_association_free(asoc);
1251 return err;
1252 }
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309 static int __sctp_setsockopt_connectx(struct sock *sk, struct sockaddr *kaddrs,
1310 int addrs_size, sctp_assoc_t *assoc_id)
1311 {
1312 int err = 0, flags = 0;
1313
1314 pr_debug("%s: sk:%p addrs:%p addrs_size:%d\n",
1315 __func__, sk, kaddrs, addrs_size);
1316
1317
1318 if (unlikely(addrs_size < sizeof(sa_family_t)))
1319 return -EINVAL;
1320
1321
1322 err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_CONNECTX,
1323 (struct sockaddr *)kaddrs,
1324 addrs_size);
1325 if (err)
1326 return err;
1327
1328
1329
1330
1331 if (sk->sk_socket->file)
1332 flags = sk->sk_socket->file->f_flags;
1333
1334 return __sctp_connect(sk, kaddrs, addrs_size, flags, assoc_id);
1335 }
1336
1337
1338
1339
1340
1341 static int sctp_setsockopt_connectx_old(struct sock *sk,
1342 struct sockaddr *kaddrs,
1343 int addrs_size)
1344 {
1345 return __sctp_setsockopt_connectx(sk, kaddrs, addrs_size, NULL);
1346 }
1347
1348
1349
1350
1351
1352
1353
1354 static int sctp_setsockopt_connectx(struct sock *sk,
1355 struct sockaddr *kaddrs,
1356 int addrs_size)
1357 {
1358 sctp_assoc_t assoc_id = 0;
1359 int err = 0;
1360
1361 err = __sctp_setsockopt_connectx(sk, kaddrs, addrs_size, &assoc_id);
1362
1363 if (err)
1364 return err;
1365 else
1366 return assoc_id;
1367 }
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377 #ifdef CONFIG_COMPAT
1378 struct compat_sctp_getaddrs_old {
1379 sctp_assoc_t assoc_id;
1380 s32 addr_num;
1381 compat_uptr_t addrs;
1382 };
1383 #endif
1384
1385 static int sctp_getsockopt_connectx3(struct sock *sk, int len,
1386 char __user *optval,
1387 int __user *optlen)
1388 {
1389 struct sctp_getaddrs_old param;
1390 sctp_assoc_t assoc_id = 0;
1391 struct sockaddr *kaddrs;
1392 int err = 0;
1393
1394 #ifdef CONFIG_COMPAT
1395 if (in_compat_syscall()) {
1396 struct compat_sctp_getaddrs_old param32;
1397
1398 if (len < sizeof(param32))
1399 return -EINVAL;
1400 if (copy_from_user(¶m32, optval, sizeof(param32)))
1401 return -EFAULT;
1402
1403 param.assoc_id = param32.assoc_id;
1404 param.addr_num = param32.addr_num;
1405 param.addrs = compat_ptr(param32.addrs);
1406 } else
1407 #endif
1408 {
1409 if (len < sizeof(param))
1410 return -EINVAL;
1411 if (copy_from_user(¶m, optval, sizeof(param)))
1412 return -EFAULT;
1413 }
1414
1415 kaddrs = memdup_user(param.addrs, param.addr_num);
1416 if (IS_ERR(kaddrs))
1417 return PTR_ERR(kaddrs);
1418
1419 err = __sctp_setsockopt_connectx(sk, kaddrs, param.addr_num, &assoc_id);
1420 kfree(kaddrs);
1421 if (err == 0 || err == -EINPROGRESS) {
1422 if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
1423 return -EFAULT;
1424 if (put_user(sizeof(assoc_id), optlen))
1425 return -EFAULT;
1426 }
1427
1428 return err;
1429 }
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481 static void sctp_close(struct sock *sk, long timeout)
1482 {
1483 struct net *net = sock_net(sk);
1484 struct sctp_endpoint *ep;
1485 struct sctp_association *asoc;
1486 struct list_head *pos, *temp;
1487 unsigned int data_was_unread;
1488
1489 pr_debug("%s: sk:%p, timeout:%ld\n", __func__, sk, timeout);
1490
1491 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
1492 sk->sk_shutdown = SHUTDOWN_MASK;
1493 inet_sk_set_state(sk, SCTP_SS_CLOSING);
1494
1495 ep = sctp_sk(sk)->ep;
1496
1497
1498 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue);
1499 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby);
1500
1501
1502 list_for_each_safe(pos, temp, &ep->asocs) {
1503 asoc = list_entry(pos, struct sctp_association, asocs);
1504
1505 if (sctp_style(sk, TCP)) {
1506
1507
1508
1509
1510
1511 if (sctp_state(asoc, CLOSED)) {
1512 sctp_association_free(asoc);
1513 continue;
1514 }
1515 }
1516
1517 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
1518 !skb_queue_empty(&asoc->ulpq.reasm) ||
1519 !skb_queue_empty(&asoc->ulpq.reasm_uo) ||
1520 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
1521 struct sctp_chunk *chunk;
1522
1523 chunk = sctp_make_abort_user(asoc, NULL, 0);
1524 sctp_primitive_ABORT(net, asoc, chunk);
1525 } else
1526 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1527 }
1528
1529
1530 if (sctp_style(sk, TCP) && timeout)
1531 sctp_wait_for_close(sk, timeout);
1532
1533
1534 release_sock(sk);
1535
1536
1537
1538
1539
1540
1541 spin_lock_bh(&net->sctp.addr_wq_lock);
1542 bh_lock_sock_nested(sk);
1543
1544
1545
1546
1547 sock_hold(sk);
1548 sk_common_release(sk);
1549
1550 bh_unlock_sock(sk);
1551 spin_unlock_bh(&net->sctp.addr_wq_lock);
1552
1553 sock_put(sk);
1554
1555 SCTP_DBG_OBJCNT_DEC(sock);
1556 }
1557
1558
1559 static int sctp_error(struct sock *sk, int flags, int err)
1560 {
1561 if (err == -EPIPE)
1562 err = sock_error(sk) ? : -EPIPE;
1563 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
1564 send_sig(SIGPIPE, current, 0);
1565 return err;
1566 }
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591 static int sctp_msghdr_parse(const struct msghdr *msg,
1592 struct sctp_cmsgs *cmsgs);
1593
1594 static int sctp_sendmsg_parse(struct sock *sk, struct sctp_cmsgs *cmsgs,
1595 struct sctp_sndrcvinfo *srinfo,
1596 const struct msghdr *msg, size_t msg_len)
1597 {
1598 __u16 sflags;
1599 int err;
1600
1601 if (sctp_sstate(sk, LISTENING) && sctp_style(sk, TCP))
1602 return -EPIPE;
1603
1604 if (msg_len > sk->sk_sndbuf)
1605 return -EMSGSIZE;
1606
1607 memset(cmsgs, 0, sizeof(*cmsgs));
1608 err = sctp_msghdr_parse(msg, cmsgs);
1609 if (err) {
1610 pr_debug("%s: msghdr parse err:%x\n", __func__, err);
1611 return err;
1612 }
1613
1614 memset(srinfo, 0, sizeof(*srinfo));
1615 if (cmsgs->srinfo) {
1616 srinfo->sinfo_stream = cmsgs->srinfo->sinfo_stream;
1617 srinfo->sinfo_flags = cmsgs->srinfo->sinfo_flags;
1618 srinfo->sinfo_ppid = cmsgs->srinfo->sinfo_ppid;
1619 srinfo->sinfo_context = cmsgs->srinfo->sinfo_context;
1620 srinfo->sinfo_assoc_id = cmsgs->srinfo->sinfo_assoc_id;
1621 srinfo->sinfo_timetolive = cmsgs->srinfo->sinfo_timetolive;
1622 }
1623
1624 if (cmsgs->sinfo) {
1625 srinfo->sinfo_stream = cmsgs->sinfo->snd_sid;
1626 srinfo->sinfo_flags = cmsgs->sinfo->snd_flags;
1627 srinfo->sinfo_ppid = cmsgs->sinfo->snd_ppid;
1628 srinfo->sinfo_context = cmsgs->sinfo->snd_context;
1629 srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id;
1630 }
1631
1632 if (cmsgs->prinfo) {
1633 srinfo->sinfo_timetolive = cmsgs->prinfo->pr_value;
1634 SCTP_PR_SET_POLICY(srinfo->sinfo_flags,
1635 cmsgs->prinfo->pr_policy);
1636 }
1637
1638 sflags = srinfo->sinfo_flags;
1639 if (!sflags && msg_len)
1640 return 0;
1641
1642 if (sctp_style(sk, TCP) && (sflags & (SCTP_EOF | SCTP_ABORT)))
1643 return -EINVAL;
1644
1645 if (((sflags & SCTP_EOF) && msg_len > 0) ||
1646 (!(sflags & (SCTP_EOF | SCTP_ABORT)) && msg_len == 0))
1647 return -EINVAL;
1648
1649 if ((sflags & SCTP_ADDR_OVER) && !msg->msg_name)
1650 return -EINVAL;
1651
1652 return 0;
1653 }
1654
1655 static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags,
1656 struct sctp_cmsgs *cmsgs,
1657 union sctp_addr *daddr,
1658 struct sctp_transport **tp)
1659 {
1660 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
1661 struct sctp_association *asoc;
1662 struct cmsghdr *cmsg;
1663 __be32 flowinfo = 0;
1664 struct sctp_af *af;
1665 int err;
1666
1667 *tp = NULL;
1668
1669 if (sflags & (SCTP_EOF | SCTP_ABORT))
1670 return -EINVAL;
1671
1672 if (sctp_style(sk, TCP) && (sctp_sstate(sk, ESTABLISHED) ||
1673 sctp_sstate(sk, CLOSING)))
1674 return -EADDRNOTAVAIL;
1675
1676
1677
1678
1679
1680
1681
1682 af = sctp_get_af_specific(daddr->sa.sa_family);
1683 if (!af)
1684 return -EINVAL;
1685 err = security_sctp_bind_connect(sk, SCTP_SENDMSG_CONNECT,
1686 (struct sockaddr *)daddr,
1687 af->sockaddr_len);
1688 if (err < 0)
1689 return err;
1690
1691 err = sctp_connect_new_asoc(ep, daddr, cmsgs->init, tp);
1692 if (err)
1693 return err;
1694 asoc = (*tp)->asoc;
1695
1696 if (!cmsgs->addrs_msg)
1697 return 0;
1698
1699 if (daddr->sa.sa_family == AF_INET6)
1700 flowinfo = daddr->v6.sin6_flowinfo;
1701
1702
1703 for_each_cmsghdr(cmsg, cmsgs->addrs_msg) {
1704 union sctp_addr _daddr;
1705 int dlen;
1706
1707 if (cmsg->cmsg_level != IPPROTO_SCTP ||
1708 (cmsg->cmsg_type != SCTP_DSTADDRV4 &&
1709 cmsg->cmsg_type != SCTP_DSTADDRV6))
1710 continue;
1711
1712 daddr = &_daddr;
1713 memset(daddr, 0, sizeof(*daddr));
1714 dlen = cmsg->cmsg_len - sizeof(struct cmsghdr);
1715 if (cmsg->cmsg_type == SCTP_DSTADDRV4) {
1716 if (dlen < sizeof(struct in_addr)) {
1717 err = -EINVAL;
1718 goto free;
1719 }
1720
1721 dlen = sizeof(struct in_addr);
1722 daddr->v4.sin_family = AF_INET;
1723 daddr->v4.sin_port = htons(asoc->peer.port);
1724 memcpy(&daddr->v4.sin_addr, CMSG_DATA(cmsg), dlen);
1725 } else {
1726 if (dlen < sizeof(struct in6_addr)) {
1727 err = -EINVAL;
1728 goto free;
1729 }
1730
1731 dlen = sizeof(struct in6_addr);
1732 daddr->v6.sin6_flowinfo = flowinfo;
1733 daddr->v6.sin6_family = AF_INET6;
1734 daddr->v6.sin6_port = htons(asoc->peer.port);
1735 memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen);
1736 }
1737
1738 err = sctp_connect_add_peer(asoc, daddr, sizeof(*daddr));
1739 if (err)
1740 goto free;
1741 }
1742
1743 return 0;
1744
1745 free:
1746 sctp_association_free(asoc);
1747 return err;
1748 }
1749
1750 static int sctp_sendmsg_check_sflags(struct sctp_association *asoc,
1751 __u16 sflags, struct msghdr *msg,
1752 size_t msg_len)
1753 {
1754 struct sock *sk = asoc->base.sk;
1755 struct net *net = sock_net(sk);
1756
1757 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP))
1758 return -EPIPE;
1759
1760 if ((sflags & SCTP_SENDALL) && sctp_style(sk, UDP) &&
1761 !sctp_state(asoc, ESTABLISHED))
1762 return 0;
1763
1764 if (sflags & SCTP_EOF) {
1765 pr_debug("%s: shutting down association:%p\n", __func__, asoc);
1766 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1767
1768 return 0;
1769 }
1770
1771 if (sflags & SCTP_ABORT) {
1772 struct sctp_chunk *chunk;
1773
1774 chunk = sctp_make_abort_user(asoc, msg, msg_len);
1775 if (!chunk)
1776 return -ENOMEM;
1777
1778 pr_debug("%s: aborting association:%p\n", __func__, asoc);
1779 sctp_primitive_ABORT(net, asoc, chunk);
1780 iov_iter_revert(&msg->msg_iter, msg_len);
1781
1782 return 0;
1783 }
1784
1785 return 1;
1786 }
1787
1788 static int sctp_sendmsg_to_asoc(struct sctp_association *asoc,
1789 struct msghdr *msg, size_t msg_len,
1790 struct sctp_transport *transport,
1791 struct sctp_sndrcvinfo *sinfo)
1792 {
1793 struct sock *sk = asoc->base.sk;
1794 struct sctp_sock *sp = sctp_sk(sk);
1795 struct net *net = sock_net(sk);
1796 struct sctp_datamsg *datamsg;
1797 bool wait_connect = false;
1798 struct sctp_chunk *chunk;
1799 long timeo;
1800 int err;
1801
1802 if (sinfo->sinfo_stream >= asoc->stream.outcnt) {
1803 err = -EINVAL;
1804 goto err;
1805 }
1806
1807 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) {
1808 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream);
1809 if (err)
1810 goto err;
1811 }
1812
1813 if (sp->disable_fragments && msg_len > asoc->frag_point) {
1814 err = -EMSGSIZE;
1815 goto err;
1816 }
1817
1818 if (asoc->pmtu_pending) {
1819 if (sp->param_flags & SPP_PMTUD_ENABLE)
1820 sctp_assoc_sync_pmtu(asoc);
1821 asoc->pmtu_pending = 0;
1822 }
1823
1824 if (sctp_wspace(asoc) < (int)msg_len)
1825 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc));
1826
1827 if (sctp_wspace(asoc) <= 0 || !sk_wmem_schedule(sk, msg_len)) {
1828 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1829 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
1830 if (err)
1831 goto err;
1832 }
1833
1834 if (sctp_state(asoc, CLOSED)) {
1835 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
1836 if (err)
1837 goto err;
1838
1839 if (asoc->ep->intl_enable) {
1840 timeo = sock_sndtimeo(sk, 0);
1841 err = sctp_wait_for_connect(asoc, &timeo);
1842 if (err) {
1843 err = -ESRCH;
1844 goto err;
1845 }
1846 } else {
1847 wait_connect = true;
1848 }
1849
1850 pr_debug("%s: we associated primitively\n", __func__);
1851 }
1852
1853 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter);
1854 if (IS_ERR(datamsg)) {
1855 err = PTR_ERR(datamsg);
1856 goto err;
1857 }
1858
1859 asoc->force_delay = !!(msg->msg_flags & MSG_MORE);
1860
1861 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
1862 sctp_chunk_hold(chunk);
1863 sctp_set_owner_w(chunk);
1864 chunk->transport = transport;
1865 }
1866
1867 err = sctp_primitive_SEND(net, asoc, datamsg);
1868 if (err) {
1869 sctp_datamsg_free(datamsg);
1870 goto err;
1871 }
1872
1873 pr_debug("%s: we sent primitively\n", __func__);
1874
1875 sctp_datamsg_put(datamsg);
1876
1877 if (unlikely(wait_connect)) {
1878 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1879 sctp_wait_for_connect(asoc, &timeo);
1880 }
1881
1882 err = msg_len;
1883
1884 err:
1885 return err;
1886 }
1887
1888 static union sctp_addr *sctp_sendmsg_get_daddr(struct sock *sk,
1889 const struct msghdr *msg,
1890 struct sctp_cmsgs *cmsgs)
1891 {
1892 union sctp_addr *daddr = NULL;
1893 int err;
1894
1895 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) {
1896 int len = msg->msg_namelen;
1897
1898 if (len > sizeof(*daddr))
1899 len = sizeof(*daddr);
1900
1901 daddr = (union sctp_addr *)msg->msg_name;
1902
1903 err = sctp_verify_addr(sk, daddr, len);
1904 if (err)
1905 return ERR_PTR(err);
1906 }
1907
1908 return daddr;
1909 }
1910
1911 static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc,
1912 struct sctp_sndrcvinfo *sinfo,
1913 struct sctp_cmsgs *cmsgs)
1914 {
1915 if (!cmsgs->srinfo && !cmsgs->sinfo) {
1916 sinfo->sinfo_stream = asoc->default_stream;
1917 sinfo->sinfo_ppid = asoc->default_ppid;
1918 sinfo->sinfo_context = asoc->default_context;
1919 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc);
1920
1921 if (!cmsgs->prinfo)
1922 sinfo->sinfo_flags = asoc->default_flags;
1923 }
1924
1925 if (!cmsgs->srinfo && !cmsgs->prinfo)
1926 sinfo->sinfo_timetolive = asoc->default_timetolive;
1927
1928 if (cmsgs->authinfo) {
1929
1930
1931
1932 sinfo->sinfo_tsn = 1;
1933 sinfo->sinfo_ssn = cmsgs->authinfo->auth_keynumber;
1934 }
1935 }
1936
1937 static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
1938 {
1939 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
1940 struct sctp_transport *transport = NULL;
1941 struct sctp_sndrcvinfo _sinfo, *sinfo;
1942 struct sctp_association *asoc, *tmp;
1943 struct sctp_cmsgs cmsgs;
1944 union sctp_addr *daddr;
1945 bool new = false;
1946 __u16 sflags;
1947 int err;
1948
1949
1950 err = sctp_sendmsg_parse(sk, &cmsgs, &_sinfo, msg, msg_len);
1951 if (err)
1952 goto out;
1953
1954 sinfo = &_sinfo;
1955 sflags = sinfo->sinfo_flags;
1956
1957
1958 daddr = sctp_sendmsg_get_daddr(sk, msg, &cmsgs);
1959 if (IS_ERR(daddr)) {
1960 err = PTR_ERR(daddr);
1961 goto out;
1962 }
1963
1964 lock_sock(sk);
1965
1966
1967 if ((sflags & SCTP_SENDALL) && sctp_style(sk, UDP)) {
1968 list_for_each_entry_safe(asoc, tmp, &ep->asocs, asocs) {
1969 err = sctp_sendmsg_check_sflags(asoc, sflags, msg,
1970 msg_len);
1971 if (err == 0)
1972 continue;
1973 if (err < 0)
1974 goto out_unlock;
1975
1976 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);
1977
1978 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len,
1979 NULL, sinfo);
1980 if (err < 0)
1981 goto out_unlock;
1982
1983 iov_iter_revert(&msg->msg_iter, err);
1984 }
1985
1986 goto out_unlock;
1987 }
1988
1989
1990 if (daddr) {
1991 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport);
1992 if (asoc) {
1993 err = sctp_sendmsg_check_sflags(asoc, sflags, msg,
1994 msg_len);
1995 if (err <= 0)
1996 goto out_unlock;
1997 } else {
1998 err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr,
1999 &transport);
2000 if (err)
2001 goto out_unlock;
2002
2003 asoc = transport->asoc;
2004 new = true;
2005 }
2006
2007 if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER))
2008 transport = NULL;
2009 } else {
2010 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id);
2011 if (!asoc) {
2012 err = -EPIPE;
2013 goto out_unlock;
2014 }
2015
2016 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len);
2017 if (err <= 0)
2018 goto out_unlock;
2019 }
2020
2021
2022 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);
2023
2024
2025 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo);
2026 if (err < 0 && err != -ESRCH && new)
2027 sctp_association_free(asoc);
2028
2029 out_unlock:
2030 release_sock(sk);
2031 out:
2032 return sctp_error(sk, msg->msg_flags, err);
2033 }
2034
2035
2036
2037
2038
2039
2040
2041
2042 static int sctp_skb_pull(struct sk_buff *skb, int len)
2043 {
2044 struct sk_buff *list;
2045 int skb_len = skb_headlen(skb);
2046 int rlen;
2047
2048 if (len <= skb_len) {
2049 __skb_pull(skb, len);
2050 return 0;
2051 }
2052 len -= skb_len;
2053 __skb_pull(skb, skb_len);
2054
2055 skb_walk_frags(skb, list) {
2056 rlen = sctp_skb_pull(list, len);
2057 skb->len -= (len-rlen);
2058 skb->data_len -= (len-rlen);
2059
2060 if (!rlen)
2061 return 0;
2062
2063 len = rlen;
2064 }
2065
2066 return len;
2067 }
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084 static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
2085 int flags, int *addr_len)
2086 {
2087 struct sctp_ulpevent *event = NULL;
2088 struct sctp_sock *sp = sctp_sk(sk);
2089 struct sk_buff *skb, *head_skb;
2090 int copied;
2091 int err = 0;
2092 int skb_len;
2093
2094 pr_debug("%s: sk:%p, msghdr:%p, len:%zd, flags:0x%x, addr_len:%p)\n",
2095 __func__, sk, msg, len, flags, addr_len);
2096
2097 lock_sock(sk);
2098
2099 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED) &&
2100 !sctp_sstate(sk, CLOSING) && !sctp_sstate(sk, CLOSED)) {
2101 err = -ENOTCONN;
2102 goto out;
2103 }
2104
2105 skb = sctp_skb_recv_datagram(sk, flags, &err);
2106 if (!skb)
2107 goto out;
2108
2109
2110
2111
2112 skb_len = skb->len;
2113
2114 copied = skb_len;
2115 if (copied > len)
2116 copied = len;
2117
2118 err = skb_copy_datagram_msg(skb, 0, msg, copied);
2119
2120 event = sctp_skb2event(skb);
2121
2122 if (err)
2123 goto out_free;
2124
2125 if (event->chunk && event->chunk->head_skb)
2126 head_skb = event->chunk->head_skb;
2127 else
2128 head_skb = skb;
2129 sock_recv_cmsgs(msg, sk, head_skb);
2130 if (sctp_ulpevent_is_notification(event)) {
2131 msg->msg_flags |= MSG_NOTIFICATION;
2132 sp->pf->event_msgname(event, msg->msg_name, addr_len);
2133 } else {
2134 sp->pf->skb_msgname(head_skb, msg->msg_name, addr_len);
2135 }
2136
2137
2138 if (sp->recvnxtinfo)
2139 sctp_ulpevent_read_nxtinfo(event, msg, sk);
2140
2141 if (sp->recvrcvinfo)
2142 sctp_ulpevent_read_rcvinfo(event, msg);
2143
2144 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_DATA_IO_EVENT))
2145 sctp_ulpevent_read_sndrcvinfo(event, msg);
2146
2147 err = copied;
2148
2149
2150
2151
2152
2153 if (skb_len > copied) {
2154 msg->msg_flags &= ~MSG_EOR;
2155 if (flags & MSG_PEEK)
2156 goto out_free;
2157 sctp_skb_pull(skb, copied);
2158 skb_queue_head(&sk->sk_receive_queue, skb);
2159
2160
2161
2162
2163
2164 if (!sctp_ulpevent_is_notification(event))
2165 sctp_assoc_rwnd_increase(event->asoc, copied);
2166 goto out;
2167 } else if ((event->msg_flags & MSG_NOTIFICATION) ||
2168 (event->msg_flags & MSG_EOR))
2169 msg->msg_flags |= MSG_EOR;
2170 else
2171 msg->msg_flags &= ~MSG_EOR;
2172
2173 out_free:
2174 if (flags & MSG_PEEK) {
2175
2176
2177
2178 kfree_skb(skb);
2179 } else {
2180
2181
2182
2183
2184 sctp_ulpevent_free(event);
2185 }
2186 out:
2187 release_sock(sk);
2188 return err;
2189 }
2190
2191
2192
2193
2194
2195
2196
2197
2198 static int sctp_setsockopt_disable_fragments(struct sock *sk, int *val,
2199 unsigned int optlen)
2200 {
2201 if (optlen < sizeof(int))
2202 return -EINVAL;
2203 sctp_sk(sk)->disable_fragments = (*val == 0) ? 0 : 1;
2204 return 0;
2205 }
2206
2207 static int sctp_setsockopt_events(struct sock *sk, __u8 *sn_type,
2208 unsigned int optlen)
2209 {
2210 struct sctp_sock *sp = sctp_sk(sk);
2211 struct sctp_association *asoc;
2212 int i;
2213
2214 if (optlen > sizeof(struct sctp_event_subscribe))
2215 return -EINVAL;
2216
2217 for (i = 0; i < optlen; i++)
2218 sctp_ulpevent_type_set(&sp->subscribe, SCTP_SN_TYPE_BASE + i,
2219 sn_type[i]);
2220
2221 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
2222 asoc->subscribe = sctp_sk(sk)->subscribe;
2223
2224
2225
2226
2227
2228 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_SENDER_DRY_EVENT)) {
2229 struct sctp_ulpevent *event;
2230
2231 asoc = sctp_id2assoc(sk, 0);
2232 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
2233 event = sctp_ulpevent_make_sender_dry_event(asoc,
2234 GFP_USER | __GFP_NOWARN);
2235 if (!event)
2236 return -ENOMEM;
2237
2238 asoc->stream.si->enqueue_event(&asoc->ulpq, event);
2239 }
2240 }
2241
2242 return 0;
2243 }
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256 static int sctp_setsockopt_autoclose(struct sock *sk, u32 *optval,
2257 unsigned int optlen)
2258 {
2259 struct sctp_sock *sp = sctp_sk(sk);
2260 struct net *net = sock_net(sk);
2261
2262
2263 if (sctp_style(sk, TCP))
2264 return -EOPNOTSUPP;
2265 if (optlen != sizeof(int))
2266 return -EINVAL;
2267
2268 sp->autoclose = *optval;
2269 if (sp->autoclose > net->sctp.max_autoclose)
2270 sp->autoclose = net->sctp.max_autoclose;
2271
2272 return 0;
2273 }
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413 static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
2414 struct sctp_transport *trans,
2415 struct sctp_association *asoc,
2416 struct sctp_sock *sp,
2417 int hb_change,
2418 int pmtud_change,
2419 int sackdelay_change)
2420 {
2421 int error;
2422
2423 if (params->spp_flags & SPP_HB_DEMAND && trans) {
2424 error = sctp_primitive_REQUESTHEARTBEAT(trans->asoc->base.net,
2425 trans->asoc, trans);
2426 if (error)
2427 return error;
2428 }
2429
2430
2431
2432
2433
2434 if (params->spp_flags & SPP_HB_ENABLE) {
2435
2436
2437
2438
2439
2440 if (params->spp_flags & SPP_HB_TIME_IS_ZERO)
2441 params->spp_hbinterval = 0;
2442
2443 if (params->spp_hbinterval ||
2444 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) {
2445 if (trans) {
2446 trans->hbinterval =
2447 msecs_to_jiffies(params->spp_hbinterval);
2448 } else if (asoc) {
2449 asoc->hbinterval =
2450 msecs_to_jiffies(params->spp_hbinterval);
2451 } else {
2452 sp->hbinterval = params->spp_hbinterval;
2453 }
2454 }
2455 }
2456
2457 if (hb_change) {
2458 if (trans) {
2459 trans->param_flags =
2460 (trans->param_flags & ~SPP_HB) | hb_change;
2461 } else if (asoc) {
2462 asoc->param_flags =
2463 (asoc->param_flags & ~SPP_HB) | hb_change;
2464 } else {
2465 sp->param_flags =
2466 (sp->param_flags & ~SPP_HB) | hb_change;
2467 }
2468 }
2469
2470
2471
2472
2473
2474
2475 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) {
2476 if (trans) {
2477 trans->pathmtu = params->spp_pathmtu;
2478 sctp_assoc_sync_pmtu(asoc);
2479 } else if (asoc) {
2480 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu);
2481 } else {
2482 sp->pathmtu = params->spp_pathmtu;
2483 }
2484 }
2485
2486 if (pmtud_change) {
2487 if (trans) {
2488 int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
2489 (params->spp_flags & SPP_PMTUD_ENABLE);
2490 trans->param_flags =
2491 (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
2492 if (update) {
2493 sctp_transport_pmtu(trans, sctp_opt2sk(sp));
2494 sctp_assoc_sync_pmtu(asoc);
2495 }
2496 sctp_transport_pl_reset(trans);
2497 } else if (asoc) {
2498 asoc->param_flags =
2499 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
2500 } else {
2501 sp->param_flags =
2502 (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
2503 }
2504 }
2505
2506
2507
2508
2509
2510 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) {
2511 if (trans) {
2512 trans->sackdelay =
2513 msecs_to_jiffies(params->spp_sackdelay);
2514 } else if (asoc) {
2515 asoc->sackdelay =
2516 msecs_to_jiffies(params->spp_sackdelay);
2517 } else {
2518 sp->sackdelay = params->spp_sackdelay;
2519 }
2520 }
2521
2522 if (sackdelay_change) {
2523 if (trans) {
2524 trans->param_flags =
2525 (trans->param_flags & ~SPP_SACKDELAY) |
2526 sackdelay_change;
2527 } else if (asoc) {
2528 asoc->param_flags =
2529 (asoc->param_flags & ~SPP_SACKDELAY) |
2530 sackdelay_change;
2531 } else {
2532 sp->param_flags =
2533 (sp->param_flags & ~SPP_SACKDELAY) |
2534 sackdelay_change;
2535 }
2536 }
2537
2538
2539
2540
2541 if (params->spp_pathmaxrxt) {
2542 if (trans) {
2543 trans->pathmaxrxt = params->spp_pathmaxrxt;
2544 } else if (asoc) {
2545 asoc->pathmaxrxt = params->spp_pathmaxrxt;
2546 } else {
2547 sp->pathmaxrxt = params->spp_pathmaxrxt;
2548 }
2549 }
2550
2551 if (params->spp_flags & SPP_IPV6_FLOWLABEL) {
2552 if (trans) {
2553 if (trans->ipaddr.sa.sa_family == AF_INET6) {
2554 trans->flowlabel = params->spp_ipv6_flowlabel &
2555 SCTP_FLOWLABEL_VAL_MASK;
2556 trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2557 }
2558 } else if (asoc) {
2559 struct sctp_transport *t;
2560
2561 list_for_each_entry(t, &asoc->peer.transport_addr_list,
2562 transports) {
2563 if (t->ipaddr.sa.sa_family != AF_INET6)
2564 continue;
2565 t->flowlabel = params->spp_ipv6_flowlabel &
2566 SCTP_FLOWLABEL_VAL_MASK;
2567 t->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2568 }
2569 asoc->flowlabel = params->spp_ipv6_flowlabel &
2570 SCTP_FLOWLABEL_VAL_MASK;
2571 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2572 } else if (sctp_opt2sk(sp)->sk_family == AF_INET6) {
2573 sp->flowlabel = params->spp_ipv6_flowlabel &
2574 SCTP_FLOWLABEL_VAL_MASK;
2575 sp->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2576 }
2577 }
2578
2579 if (params->spp_flags & SPP_DSCP) {
2580 if (trans) {
2581 trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2582 trans->dscp |= SCTP_DSCP_SET_MASK;
2583 } else if (asoc) {
2584 struct sctp_transport *t;
2585
2586 list_for_each_entry(t, &asoc->peer.transport_addr_list,
2587 transports) {
2588 t->dscp = params->spp_dscp &
2589 SCTP_DSCP_VAL_MASK;
2590 t->dscp |= SCTP_DSCP_SET_MASK;
2591 }
2592 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2593 asoc->dscp |= SCTP_DSCP_SET_MASK;
2594 } else {
2595 sp->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2596 sp->dscp |= SCTP_DSCP_SET_MASK;
2597 }
2598 }
2599
2600 return 0;
2601 }
2602
2603 static int sctp_setsockopt_peer_addr_params(struct sock *sk,
2604 struct sctp_paddrparams *params,
2605 unsigned int optlen)
2606 {
2607 struct sctp_transport *trans = NULL;
2608 struct sctp_association *asoc = NULL;
2609 struct sctp_sock *sp = sctp_sk(sk);
2610 int error;
2611 int hb_change, pmtud_change, sackdelay_change;
2612
2613 if (optlen == ALIGN(offsetof(struct sctp_paddrparams,
2614 spp_ipv6_flowlabel), 4)) {
2615 if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL))
2616 return -EINVAL;
2617 } else if (optlen != sizeof(*params)) {
2618 return -EINVAL;
2619 }
2620
2621
2622 hb_change = params->spp_flags & SPP_HB;
2623 pmtud_change = params->spp_flags & SPP_PMTUD;
2624 sackdelay_change = params->spp_flags & SPP_SACKDELAY;
2625
2626 if (hb_change == SPP_HB ||
2627 pmtud_change == SPP_PMTUD ||
2628 sackdelay_change == SPP_SACKDELAY ||
2629 params->spp_sackdelay > 500 ||
2630 (params->spp_pathmtu &&
2631 params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
2632 return -EINVAL;
2633
2634
2635
2636
2637 if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spp_address)) {
2638 trans = sctp_addr_id2transport(sk, ¶ms->spp_address,
2639 params->spp_assoc_id);
2640 if (!trans)
2641 return -EINVAL;
2642 }
2643
2644
2645
2646
2647
2648 asoc = sctp_id2assoc(sk, params->spp_assoc_id);
2649 if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC &&
2650 sctp_style(sk, UDP))
2651 return -EINVAL;
2652
2653
2654
2655
2656 if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc)
2657 return -EINVAL;
2658
2659
2660 error = sctp_apply_peer_addr_params(params, trans, asoc, sp,
2661 hb_change, pmtud_change,
2662 sackdelay_change);
2663
2664 if (error)
2665 return error;
2666
2667
2668
2669
2670 if (!trans && asoc) {
2671 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2672 transports) {
2673 sctp_apply_peer_addr_params(params, trans, asoc, sp,
2674 hb_change, pmtud_change,
2675 sackdelay_change);
2676 }
2677 }
2678
2679 return 0;
2680 }
2681
2682 static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags)
2683 {
2684 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_ENABLE;
2685 }
2686
2687 static inline __u32 sctp_spp_sackdelay_disable(__u32 param_flags)
2688 {
2689 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_DISABLE;
2690 }
2691
2692 static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params,
2693 struct sctp_association *asoc)
2694 {
2695 struct sctp_transport *trans;
2696
2697 if (params->sack_delay) {
2698 asoc->sackdelay = msecs_to_jiffies(params->sack_delay);
2699 asoc->param_flags =
2700 sctp_spp_sackdelay_enable(asoc->param_flags);
2701 }
2702 if (params->sack_freq == 1) {
2703 asoc->param_flags =
2704 sctp_spp_sackdelay_disable(asoc->param_flags);
2705 } else if (params->sack_freq > 1) {
2706 asoc->sackfreq = params->sack_freq;
2707 asoc->param_flags =
2708 sctp_spp_sackdelay_enable(asoc->param_flags);
2709 }
2710
2711 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2712 transports) {
2713 if (params->sack_delay) {
2714 trans->sackdelay = msecs_to_jiffies(params->sack_delay);
2715 trans->param_flags =
2716 sctp_spp_sackdelay_enable(trans->param_flags);
2717 }
2718 if (params->sack_freq == 1) {
2719 trans->param_flags =
2720 sctp_spp_sackdelay_disable(trans->param_flags);
2721 } else if (params->sack_freq > 1) {
2722 trans->sackfreq = params->sack_freq;
2723 trans->param_flags =
2724 sctp_spp_sackdelay_enable(trans->param_flags);
2725 }
2726 }
2727 }
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764 static int __sctp_setsockopt_delayed_ack(struct sock *sk,
2765 struct sctp_sack_info *params)
2766 {
2767 struct sctp_sock *sp = sctp_sk(sk);
2768 struct sctp_association *asoc;
2769
2770
2771 if (params->sack_delay > 500)
2772 return -EINVAL;
2773
2774
2775
2776
2777
2778 asoc = sctp_id2assoc(sk, params->sack_assoc_id);
2779 if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC &&
2780 sctp_style(sk, UDP))
2781 return -EINVAL;
2782
2783 if (asoc) {
2784 sctp_apply_asoc_delayed_ack(params, asoc);
2785
2786 return 0;
2787 }
2788
2789 if (sctp_style(sk, TCP))
2790 params->sack_assoc_id = SCTP_FUTURE_ASSOC;
2791
2792 if (params->sack_assoc_id == SCTP_FUTURE_ASSOC ||
2793 params->sack_assoc_id == SCTP_ALL_ASSOC) {
2794 if (params->sack_delay) {
2795 sp->sackdelay = params->sack_delay;
2796 sp->param_flags =
2797 sctp_spp_sackdelay_enable(sp->param_flags);
2798 }
2799 if (params->sack_freq == 1) {
2800 sp->param_flags =
2801 sctp_spp_sackdelay_disable(sp->param_flags);
2802 } else if (params->sack_freq > 1) {
2803 sp->sackfreq = params->sack_freq;
2804 sp->param_flags =
2805 sctp_spp_sackdelay_enable(sp->param_flags);
2806 }
2807 }
2808
2809 if (params->sack_assoc_id == SCTP_CURRENT_ASSOC ||
2810 params->sack_assoc_id == SCTP_ALL_ASSOC)
2811 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
2812 sctp_apply_asoc_delayed_ack(params, asoc);
2813
2814 return 0;
2815 }
2816
2817 static int sctp_setsockopt_delayed_ack(struct sock *sk,
2818 struct sctp_sack_info *params,
2819 unsigned int optlen)
2820 {
2821 if (optlen == sizeof(struct sctp_assoc_value)) {
2822 struct sctp_assoc_value *v = (struct sctp_assoc_value *)params;
2823 struct sctp_sack_info p;
2824
2825 pr_warn_ratelimited(DEPRECATED
2826 "%s (pid %d) "
2827 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
2828 "Use struct sctp_sack_info instead\n",
2829 current->comm, task_pid_nr(current));
2830
2831 p.sack_assoc_id = v->assoc_id;
2832 p.sack_delay = v->assoc_value;
2833 p.sack_freq = v->assoc_value ? 0 : 1;
2834 return __sctp_setsockopt_delayed_ack(sk, &p);
2835 }
2836
2837 if (optlen != sizeof(struct sctp_sack_info))
2838 return -EINVAL;
2839 if (params->sack_delay == 0 && params->sack_freq == 0)
2840 return 0;
2841 return __sctp_setsockopt_delayed_ack(sk, params);
2842 }
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855 static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg *sinit,
2856 unsigned int optlen)
2857 {
2858 struct sctp_sock *sp = sctp_sk(sk);
2859
2860 if (optlen != sizeof(struct sctp_initmsg))
2861 return -EINVAL;
2862
2863 if (sinit->sinit_num_ostreams)
2864 sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams;
2865 if (sinit->sinit_max_instreams)
2866 sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams;
2867 if (sinit->sinit_max_attempts)
2868 sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts;
2869 if (sinit->sinit_max_init_timeo)
2870 sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo;
2871
2872 return 0;
2873 }
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889 static int sctp_setsockopt_default_send_param(struct sock *sk,
2890 struct sctp_sndrcvinfo *info,
2891 unsigned int optlen)
2892 {
2893 struct sctp_sock *sp = sctp_sk(sk);
2894 struct sctp_association *asoc;
2895
2896 if (optlen != sizeof(*info))
2897 return -EINVAL;
2898 if (info->sinfo_flags &
2899 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2900 SCTP_ABORT | SCTP_EOF))
2901 return -EINVAL;
2902
2903 asoc = sctp_id2assoc(sk, info->sinfo_assoc_id);
2904 if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC &&
2905 sctp_style(sk, UDP))
2906 return -EINVAL;
2907
2908 if (asoc) {
2909 asoc->default_stream = info->sinfo_stream;
2910 asoc->default_flags = info->sinfo_flags;
2911 asoc->default_ppid = info->sinfo_ppid;
2912 asoc->default_context = info->sinfo_context;
2913 asoc->default_timetolive = info->sinfo_timetolive;
2914
2915 return 0;
2916 }
2917
2918 if (sctp_style(sk, TCP))
2919 info->sinfo_assoc_id = SCTP_FUTURE_ASSOC;
2920
2921 if (info->sinfo_assoc_id == SCTP_FUTURE_ASSOC ||
2922 info->sinfo_assoc_id == SCTP_ALL_ASSOC) {
2923 sp->default_stream = info->sinfo_stream;
2924 sp->default_flags = info->sinfo_flags;
2925 sp->default_ppid = info->sinfo_ppid;
2926 sp->default_context = info->sinfo_context;
2927 sp->default_timetolive = info->sinfo_timetolive;
2928 }
2929
2930 if (info->sinfo_assoc_id == SCTP_CURRENT_ASSOC ||
2931 info->sinfo_assoc_id == SCTP_ALL_ASSOC) {
2932 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
2933 asoc->default_stream = info->sinfo_stream;
2934 asoc->default_flags = info->sinfo_flags;
2935 asoc->default_ppid = info->sinfo_ppid;
2936 asoc->default_context = info->sinfo_context;
2937 asoc->default_timetolive = info->sinfo_timetolive;
2938 }
2939 }
2940
2941 return 0;
2942 }
2943
2944
2945
2946
2947 static int sctp_setsockopt_default_sndinfo(struct sock *sk,
2948 struct sctp_sndinfo *info,
2949 unsigned int optlen)
2950 {
2951 struct sctp_sock *sp = sctp_sk(sk);
2952 struct sctp_association *asoc;
2953
2954 if (optlen != sizeof(*info))
2955 return -EINVAL;
2956 if (info->snd_flags &
2957 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2958 SCTP_ABORT | SCTP_EOF))
2959 return -EINVAL;
2960
2961 asoc = sctp_id2assoc(sk, info->snd_assoc_id);
2962 if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC &&
2963 sctp_style(sk, UDP))
2964 return -EINVAL;
2965
2966 if (asoc) {
2967 asoc->default_stream = info->snd_sid;
2968 asoc->default_flags = info->snd_flags;
2969 asoc->default_ppid = info->snd_ppid;
2970 asoc->default_context = info->snd_context;
2971
2972 return 0;
2973 }
2974
2975 if (sctp_style(sk, TCP))
2976 info->snd_assoc_id = SCTP_FUTURE_ASSOC;
2977
2978 if (info->snd_assoc_id == SCTP_FUTURE_ASSOC ||
2979 info->snd_assoc_id == SCTP_ALL_ASSOC) {
2980 sp->default_stream = info->snd_sid;
2981 sp->default_flags = info->snd_flags;
2982 sp->default_ppid = info->snd_ppid;
2983 sp->default_context = info->snd_context;
2984 }
2985
2986 if (info->snd_assoc_id == SCTP_CURRENT_ASSOC ||
2987 info->snd_assoc_id == SCTP_ALL_ASSOC) {
2988 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
2989 asoc->default_stream = info->snd_sid;
2990 asoc->default_flags = info->snd_flags;
2991 asoc->default_ppid = info->snd_ppid;
2992 asoc->default_context = info->snd_context;
2993 }
2994 }
2995
2996 return 0;
2997 }
2998
2999
3000
3001
3002
3003
3004
3005 static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim *prim,
3006 unsigned int optlen)
3007 {
3008 struct sctp_transport *trans;
3009 struct sctp_af *af;
3010 int err;
3011
3012 if (optlen != sizeof(struct sctp_prim))
3013 return -EINVAL;
3014
3015
3016 af = sctp_get_af_specific(prim->ssp_addr.ss_family);
3017 if (!af)
3018 return -EINVAL;
3019
3020 err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR,
3021 (struct sockaddr *)&prim->ssp_addr,
3022 af->sockaddr_len);
3023 if (err)
3024 return err;
3025
3026 trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id);
3027 if (!trans)
3028 return -EINVAL;
3029
3030 sctp_assoc_set_primary(trans->asoc, trans);
3031
3032 return 0;
3033 }
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043 static int sctp_setsockopt_nodelay(struct sock *sk, int *val,
3044 unsigned int optlen)
3045 {
3046 if (optlen < sizeof(int))
3047 return -EINVAL;
3048 sctp_sk(sk)->nodelay = (*val == 0) ? 0 : 1;
3049 return 0;
3050 }
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064 static int sctp_setsockopt_rtoinfo(struct sock *sk,
3065 struct sctp_rtoinfo *rtoinfo,
3066 unsigned int optlen)
3067 {
3068 struct sctp_association *asoc;
3069 unsigned long rto_min, rto_max;
3070 struct sctp_sock *sp = sctp_sk(sk);
3071
3072 if (optlen != sizeof (struct sctp_rtoinfo))
3073 return -EINVAL;
3074
3075 asoc = sctp_id2assoc(sk, rtoinfo->srto_assoc_id);
3076
3077
3078 if (!asoc && rtoinfo->srto_assoc_id != SCTP_FUTURE_ASSOC &&
3079 sctp_style(sk, UDP))
3080 return -EINVAL;
3081
3082 rto_max = rtoinfo->srto_max;
3083 rto_min = rtoinfo->srto_min;
3084
3085 if (rto_max)
3086 rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
3087 else
3088 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max;
3089
3090 if (rto_min)
3091 rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min;
3092 else
3093 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min;
3094
3095 if (rto_min > rto_max)
3096 return -EINVAL;
3097
3098 if (asoc) {
3099 if (rtoinfo->srto_initial != 0)
3100 asoc->rto_initial =
3101 msecs_to_jiffies(rtoinfo->srto_initial);
3102 asoc->rto_max = rto_max;
3103 asoc->rto_min = rto_min;
3104 } else {
3105
3106
3107
3108 if (rtoinfo->srto_initial != 0)
3109 sp->rtoinfo.srto_initial = rtoinfo->srto_initial;
3110 sp->rtoinfo.srto_max = rto_max;
3111 sp->rtoinfo.srto_min = rto_min;
3112 }
3113
3114 return 0;
3115 }
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128 static int sctp_setsockopt_associnfo(struct sock *sk,
3129 struct sctp_assocparams *assocparams,
3130 unsigned int optlen)
3131 {
3132
3133 struct sctp_association *asoc;
3134
3135 if (optlen != sizeof(struct sctp_assocparams))
3136 return -EINVAL;
3137
3138 asoc = sctp_id2assoc(sk, assocparams->sasoc_assoc_id);
3139
3140 if (!asoc && assocparams->sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
3141 sctp_style(sk, UDP))
3142 return -EINVAL;
3143
3144
3145 if (asoc) {
3146 if (assocparams->sasoc_asocmaxrxt != 0) {
3147 __u32 path_sum = 0;
3148 int paths = 0;
3149 struct sctp_transport *peer_addr;
3150
3151 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
3152 transports) {
3153 path_sum += peer_addr->pathmaxrxt;
3154 paths++;
3155 }
3156
3157
3158
3159
3160
3161
3162 if (paths > 1 &&
3163 assocparams->sasoc_asocmaxrxt > path_sum)
3164 return -EINVAL;
3165
3166 asoc->max_retrans = assocparams->sasoc_asocmaxrxt;
3167 }
3168
3169 if (assocparams->sasoc_cookie_life != 0)
3170 asoc->cookie_life =
3171 ms_to_ktime(assocparams->sasoc_cookie_life);
3172 } else {
3173
3174 struct sctp_sock *sp = sctp_sk(sk);
3175
3176 if (assocparams->sasoc_asocmaxrxt != 0)
3177 sp->assocparams.sasoc_asocmaxrxt =
3178 assocparams->sasoc_asocmaxrxt;
3179 if (assocparams->sasoc_cookie_life != 0)
3180 sp->assocparams.sasoc_cookie_life =
3181 assocparams->sasoc_cookie_life;
3182 }
3183 return 0;
3184 }
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196 static int sctp_setsockopt_mappedv4(struct sock *sk, int *val,
3197 unsigned int optlen)
3198 {
3199 struct sctp_sock *sp = sctp_sk(sk);
3200
3201 if (optlen < sizeof(int))
3202 return -EINVAL;
3203 if (*val)
3204 sp->v4mapped = 1;
3205 else
3206 sp->v4mapped = 0;
3207
3208 return 0;
3209 }
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238 static int sctp_setsockopt_maxseg(struct sock *sk,
3239 struct sctp_assoc_value *params,
3240 unsigned int optlen)
3241 {
3242 struct sctp_sock *sp = sctp_sk(sk);
3243 struct sctp_association *asoc;
3244 sctp_assoc_t assoc_id;
3245 int val;
3246
3247 if (optlen == sizeof(int)) {
3248 pr_warn_ratelimited(DEPRECATED
3249 "%s (pid %d) "
3250 "Use of int in maxseg socket option.\n"
3251 "Use struct sctp_assoc_value instead\n",
3252 current->comm, task_pid_nr(current));
3253 assoc_id = SCTP_FUTURE_ASSOC;
3254 val = *(int *)params;
3255 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3256 assoc_id = params->assoc_id;
3257 val = params->assoc_value;
3258 } else {
3259 return -EINVAL;
3260 }
3261
3262 asoc = sctp_id2assoc(sk, assoc_id);
3263 if (!asoc && assoc_id != SCTP_FUTURE_ASSOC &&
3264 sctp_style(sk, UDP))
3265 return -EINVAL;
3266
3267 if (val) {
3268 int min_len, max_len;
3269 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) :
3270 sizeof(struct sctp_data_chunk);
3271
3272 min_len = sctp_min_frag_point(sp, datasize);
3273 max_len = SCTP_MAX_CHUNK_LEN - datasize;
3274
3275 if (val < min_len || val > max_len)
3276 return -EINVAL;
3277 }
3278
3279 if (asoc) {
3280 asoc->user_frag = val;
3281 sctp_assoc_update_frag_point(asoc);
3282 } else {
3283 sp->user_frag = val;
3284 }
3285
3286 return 0;
3287 }
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298 static int sctp_setsockopt_peer_primary_addr(struct sock *sk,
3299 struct sctp_setpeerprim *prim,
3300 unsigned int optlen)
3301 {
3302 struct sctp_sock *sp;
3303 struct sctp_association *asoc = NULL;
3304 struct sctp_chunk *chunk;
3305 struct sctp_af *af;
3306 int err;
3307
3308 sp = sctp_sk(sk);
3309
3310 if (!sp->ep->asconf_enable)
3311 return -EPERM;
3312
3313 if (optlen != sizeof(struct sctp_setpeerprim))
3314 return -EINVAL;
3315
3316 asoc = sctp_id2assoc(sk, prim->sspp_assoc_id);
3317 if (!asoc)
3318 return -EINVAL;
3319
3320 if (!asoc->peer.asconf_capable)
3321 return -EPERM;
3322
3323 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY)
3324 return -EPERM;
3325
3326 if (!sctp_state(asoc, ESTABLISHED))
3327 return -ENOTCONN;
3328
3329 af = sctp_get_af_specific(prim->sspp_addr.ss_family);
3330 if (!af)
3331 return -EINVAL;
3332
3333 if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL))
3334 return -EADDRNOTAVAIL;
3335
3336 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr))
3337 return -EADDRNOTAVAIL;
3338
3339
3340 err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR,
3341 (struct sockaddr *)&prim->sspp_addr,
3342 af->sockaddr_len);
3343 if (err)
3344 return err;
3345
3346
3347 chunk = sctp_make_asconf_set_prim(asoc,
3348 (union sctp_addr *)&prim->sspp_addr);
3349 if (!chunk)
3350 return -ENOMEM;
3351
3352 err = sctp_send_asconf(asoc, chunk);
3353
3354 pr_debug("%s: we set peer primary addr primitively\n", __func__);
3355
3356 return err;
3357 }
3358
3359 static int sctp_setsockopt_adaptation_layer(struct sock *sk,
3360 struct sctp_setadaptation *adapt,
3361 unsigned int optlen)
3362 {
3363 if (optlen != sizeof(struct sctp_setadaptation))
3364 return -EINVAL;
3365
3366 sctp_sk(sk)->adaptation_ind = adapt->ssb_adaptation_ind;
3367
3368 return 0;
3369 }
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385 static int sctp_setsockopt_context(struct sock *sk,
3386 struct sctp_assoc_value *params,
3387 unsigned int optlen)
3388 {
3389 struct sctp_sock *sp = sctp_sk(sk);
3390 struct sctp_association *asoc;
3391
3392 if (optlen != sizeof(struct sctp_assoc_value))
3393 return -EINVAL;
3394
3395 asoc = sctp_id2assoc(sk, params->assoc_id);
3396 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
3397 sctp_style(sk, UDP))
3398 return -EINVAL;
3399
3400 if (asoc) {
3401 asoc->default_rcv_context = params->assoc_value;
3402
3403 return 0;
3404 }
3405
3406 if (sctp_style(sk, TCP))
3407 params->assoc_id = SCTP_FUTURE_ASSOC;
3408
3409 if (params->assoc_id == SCTP_FUTURE_ASSOC ||
3410 params->assoc_id == SCTP_ALL_ASSOC)
3411 sp->default_rcv_context = params->assoc_value;
3412
3413 if (params->assoc_id == SCTP_CURRENT_ASSOC ||
3414 params->assoc_id == SCTP_ALL_ASSOC)
3415 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
3416 asoc->default_rcv_context = params->assoc_value;
3417
3418 return 0;
3419 }
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445 static int sctp_setsockopt_fragment_interleave(struct sock *sk, int *val,
3446 unsigned int optlen)
3447 {
3448 if (optlen != sizeof(int))
3449 return -EINVAL;
3450
3451 sctp_sk(sk)->frag_interleave = !!*val;
3452
3453 if (!sctp_sk(sk)->frag_interleave)
3454 sctp_sk(sk)->ep->intl_enable = 0;
3455
3456 return 0;
3457 }
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476 static int sctp_setsockopt_partial_delivery_point(struct sock *sk, u32 *val,
3477 unsigned int optlen)
3478 {
3479 if (optlen != sizeof(u32))
3480 return -EINVAL;
3481
3482
3483
3484
3485 if (*val > (sk->sk_rcvbuf >> 1))
3486 return -EINVAL;
3487
3488 sctp_sk(sk)->pd_point = *val;
3489
3490 return 0;
3491 }
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504 static int sctp_setsockopt_maxburst(struct sock *sk,
3505 struct sctp_assoc_value *params,
3506 unsigned int optlen)
3507 {
3508 struct sctp_sock *sp = sctp_sk(sk);
3509 struct sctp_association *asoc;
3510 sctp_assoc_t assoc_id;
3511 u32 assoc_value;
3512
3513 if (optlen == sizeof(int)) {
3514 pr_warn_ratelimited(DEPRECATED
3515 "%s (pid %d) "
3516 "Use of int in max_burst socket option deprecated.\n"
3517 "Use struct sctp_assoc_value instead\n",
3518 current->comm, task_pid_nr(current));
3519 assoc_id = SCTP_FUTURE_ASSOC;
3520 assoc_value = *((int *)params);
3521 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3522 assoc_id = params->assoc_id;
3523 assoc_value = params->assoc_value;
3524 } else
3525 return -EINVAL;
3526
3527 asoc = sctp_id2assoc(sk, assoc_id);
3528 if (!asoc && assoc_id > SCTP_ALL_ASSOC && sctp_style(sk, UDP))
3529 return -EINVAL;
3530
3531 if (asoc) {
3532 asoc->max_burst = assoc_value;
3533
3534 return 0;
3535 }
3536
3537 if (sctp_style(sk, TCP))
3538 assoc_id = SCTP_FUTURE_ASSOC;
3539
3540 if (assoc_id == SCTP_FUTURE_ASSOC || assoc_id == SCTP_ALL_ASSOC)
3541 sp->max_burst = assoc_value;
3542
3543 if (assoc_id == SCTP_CURRENT_ASSOC || assoc_id == SCTP_ALL_ASSOC)
3544 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
3545 asoc->max_burst = assoc_value;
3546
3547 return 0;
3548 }
3549
3550
3551
3552
3553
3554
3555
3556
3557 static int sctp_setsockopt_auth_chunk(struct sock *sk,
3558 struct sctp_authchunk *val,
3559 unsigned int optlen)
3560 {
3561 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3562
3563 if (!ep->auth_enable)
3564 return -EACCES;
3565
3566 if (optlen != sizeof(struct sctp_authchunk))
3567 return -EINVAL;
3568
3569 switch (val->sauth_chunk) {
3570 case SCTP_CID_INIT:
3571 case SCTP_CID_INIT_ACK:
3572 case SCTP_CID_SHUTDOWN_COMPLETE:
3573 case SCTP_CID_AUTH:
3574 return -EINVAL;
3575 }
3576
3577
3578 return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk);
3579 }
3580
3581
3582
3583
3584
3585
3586
3587 static int sctp_setsockopt_hmac_ident(struct sock *sk,
3588 struct sctp_hmacalgo *hmacs,
3589 unsigned int optlen)
3590 {
3591 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3592 u32 idents;
3593
3594 if (!ep->auth_enable)
3595 return -EACCES;
3596
3597 if (optlen < sizeof(struct sctp_hmacalgo))
3598 return -EINVAL;
3599 optlen = min_t(unsigned int, optlen, sizeof(struct sctp_hmacalgo) +
3600 SCTP_AUTH_NUM_HMACS * sizeof(u16));
3601
3602 idents = hmacs->shmac_num_idents;
3603 if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS ||
3604 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo)))
3605 return -EINVAL;
3606
3607 return sctp_auth_ep_set_hmacs(ep, hmacs);
3608 }
3609
3610
3611
3612
3613
3614
3615
3616 static int sctp_setsockopt_auth_key(struct sock *sk,
3617 struct sctp_authkey *authkey,
3618 unsigned int optlen)
3619 {
3620 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3621 struct sctp_association *asoc;
3622 int ret = -EINVAL;
3623
3624 if (optlen <= sizeof(struct sctp_authkey))
3625 return -EINVAL;
3626
3627
3628
3629 optlen = min_t(unsigned int, optlen, USHRT_MAX + sizeof(*authkey));
3630
3631 if (authkey->sca_keylength > optlen - sizeof(*authkey))
3632 goto out;
3633
3634 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id);
3635 if (!asoc && authkey->sca_assoc_id > SCTP_ALL_ASSOC &&
3636 sctp_style(sk, UDP))
3637 goto out;
3638
3639 if (asoc) {
3640 ret = sctp_auth_set_key(ep, asoc, authkey);
3641 goto out;
3642 }
3643
3644 if (sctp_style(sk, TCP))
3645 authkey->sca_assoc_id = SCTP_FUTURE_ASSOC;
3646
3647 if (authkey->sca_assoc_id == SCTP_FUTURE_ASSOC ||
3648 authkey->sca_assoc_id == SCTP_ALL_ASSOC) {
3649 ret = sctp_auth_set_key(ep, asoc, authkey);
3650 if (ret)
3651 goto out;
3652 }
3653
3654 ret = 0;
3655
3656 if (authkey->sca_assoc_id == SCTP_CURRENT_ASSOC ||
3657 authkey->sca_assoc_id == SCTP_ALL_ASSOC) {
3658 list_for_each_entry(asoc, &ep->asocs, asocs) {
3659 int res = sctp_auth_set_key(ep, asoc, authkey);
3660
3661 if (res && !ret)
3662 ret = res;
3663 }
3664 }
3665
3666 out:
3667 memzero_explicit(authkey, optlen);
3668 return ret;
3669 }
3670
3671
3672
3673
3674
3675
3676
3677 static int sctp_setsockopt_active_key(struct sock *sk,
3678 struct sctp_authkeyid *val,
3679 unsigned int optlen)
3680 {
3681 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3682 struct sctp_association *asoc;
3683 int ret = 0;
3684
3685 if (optlen != sizeof(struct sctp_authkeyid))
3686 return -EINVAL;
3687
3688 asoc = sctp_id2assoc(sk, val->scact_assoc_id);
3689 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
3690 sctp_style(sk, UDP))
3691 return -EINVAL;
3692
3693 if (asoc)
3694 return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber);
3695
3696 if (sctp_style(sk, TCP))
3697 val->scact_assoc_id = SCTP_FUTURE_ASSOC;
3698
3699 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC ||
3700 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3701 ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber);
3702 if (ret)
3703 return ret;
3704 }
3705
3706 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC ||
3707 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3708 list_for_each_entry(asoc, &ep->asocs, asocs) {
3709 int res = sctp_auth_set_active_key(ep, asoc,
3710 val->scact_keynumber);
3711
3712 if (res && !ret)
3713 ret = res;
3714 }
3715 }
3716
3717 return ret;
3718 }
3719
3720
3721
3722
3723
3724
3725 static int sctp_setsockopt_del_key(struct sock *sk,
3726 struct sctp_authkeyid *val,
3727 unsigned int optlen)
3728 {
3729 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3730 struct sctp_association *asoc;
3731 int ret = 0;
3732
3733 if (optlen != sizeof(struct sctp_authkeyid))
3734 return -EINVAL;
3735
3736 asoc = sctp_id2assoc(sk, val->scact_assoc_id);
3737 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
3738 sctp_style(sk, UDP))
3739 return -EINVAL;
3740
3741 if (asoc)
3742 return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber);
3743
3744 if (sctp_style(sk, TCP))
3745 val->scact_assoc_id = SCTP_FUTURE_ASSOC;
3746
3747 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC ||
3748 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3749 ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber);
3750 if (ret)
3751 return ret;
3752 }
3753
3754 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC ||
3755 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3756 list_for_each_entry(asoc, &ep->asocs, asocs) {
3757 int res = sctp_auth_del_key_id(ep, asoc,
3758 val->scact_keynumber);
3759
3760 if (res && !ret)
3761 ret = res;
3762 }
3763 }
3764
3765 return ret;
3766 }
3767
3768
3769
3770
3771
3772
3773 static int sctp_setsockopt_deactivate_key(struct sock *sk,
3774 struct sctp_authkeyid *val,
3775 unsigned int optlen)
3776 {
3777 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3778 struct sctp_association *asoc;
3779 int ret = 0;
3780
3781 if (optlen != sizeof(struct sctp_authkeyid))
3782 return -EINVAL;
3783
3784 asoc = sctp_id2assoc(sk, val->scact_assoc_id);
3785 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
3786 sctp_style(sk, UDP))
3787 return -EINVAL;
3788
3789 if (asoc)
3790 return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber);
3791
3792 if (sctp_style(sk, TCP))
3793 val->scact_assoc_id = SCTP_FUTURE_ASSOC;
3794
3795 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC ||
3796 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3797 ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber);
3798 if (ret)
3799 return ret;
3800 }
3801
3802 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC ||
3803 val->scact_assoc_id == SCTP_ALL_ASSOC) {
3804 list_for_each_entry(asoc, &ep->asocs, asocs) {
3805 int res = sctp_auth_deact_key_id(ep, asoc,
3806 val->scact_keynumber);
3807
3808 if (res && !ret)
3809 ret = res;
3810 }
3811 }
3812
3813 return ret;
3814 }
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830 static int sctp_setsockopt_auto_asconf(struct sock *sk, int *val,
3831 unsigned int optlen)
3832 {
3833 struct sctp_sock *sp = sctp_sk(sk);
3834
3835 if (optlen < sizeof(int))
3836 return -EINVAL;
3837 if (!sctp_is_ep_boundall(sk) && *val)
3838 return -EINVAL;
3839 if ((*val && sp->do_auto_asconf) || (!*val && !sp->do_auto_asconf))
3840 return 0;
3841
3842 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock);
3843 if (*val == 0 && sp->do_auto_asconf) {
3844 list_del(&sp->auto_asconf_list);
3845 sp->do_auto_asconf = 0;
3846 } else if (*val && !sp->do_auto_asconf) {
3847 list_add_tail(&sp->auto_asconf_list,
3848 &sock_net(sk)->sctp.auto_asconf_splist);
3849 sp->do_auto_asconf = 1;
3850 }
3851 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock);
3852 return 0;
3853 }
3854
3855
3856
3857
3858
3859
3860
3861
3862 static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
3863 struct sctp_paddrthlds_v2 *val,
3864 unsigned int optlen, bool v2)
3865 {
3866 struct sctp_transport *trans;
3867 struct sctp_association *asoc;
3868 int len;
3869
3870 len = v2 ? sizeof(*val) : sizeof(struct sctp_paddrthlds);
3871 if (optlen < len)
3872 return -EINVAL;
3873
3874 if (v2 && val->spt_pathpfthld > val->spt_pathcpthld)
3875 return -EINVAL;
3876
3877 if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) {
3878 trans = sctp_addr_id2transport(sk, &val->spt_address,
3879 val->spt_assoc_id);
3880 if (!trans)
3881 return -ENOENT;
3882
3883 if (val->spt_pathmaxrxt)
3884 trans->pathmaxrxt = val->spt_pathmaxrxt;
3885 if (v2)
3886 trans->ps_retrans = val->spt_pathcpthld;
3887 trans->pf_retrans = val->spt_pathpfthld;
3888
3889 return 0;
3890 }
3891
3892 asoc = sctp_id2assoc(sk, val->spt_assoc_id);
3893 if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC &&
3894 sctp_style(sk, UDP))
3895 return -EINVAL;
3896
3897 if (asoc) {
3898 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
3899 transports) {
3900 if (val->spt_pathmaxrxt)
3901 trans->pathmaxrxt = val->spt_pathmaxrxt;
3902 if (v2)
3903 trans->ps_retrans = val->spt_pathcpthld;
3904 trans->pf_retrans = val->spt_pathpfthld;
3905 }
3906
3907 if (val->spt_pathmaxrxt)
3908 asoc->pathmaxrxt = val->spt_pathmaxrxt;
3909 if (v2)
3910 asoc->ps_retrans = val->spt_pathcpthld;
3911 asoc->pf_retrans = val->spt_pathpfthld;
3912 } else {
3913 struct sctp_sock *sp = sctp_sk(sk);
3914
3915 if (val->spt_pathmaxrxt)
3916 sp->pathmaxrxt = val->spt_pathmaxrxt;
3917 if (v2)
3918 sp->ps_retrans = val->spt_pathcpthld;
3919 sp->pf_retrans = val->spt_pathpfthld;
3920 }
3921
3922 return 0;
3923 }
3924
3925 static int sctp_setsockopt_recvrcvinfo(struct sock *sk, int *val,
3926 unsigned int optlen)
3927 {
3928 if (optlen < sizeof(int))
3929 return -EINVAL;
3930
3931 sctp_sk(sk)->recvrcvinfo = (*val == 0) ? 0 : 1;
3932
3933 return 0;
3934 }
3935
3936 static int sctp_setsockopt_recvnxtinfo(struct sock *sk, int *val,
3937 unsigned int optlen)
3938 {
3939 if (optlen < sizeof(int))
3940 return -EINVAL;
3941
3942 sctp_sk(sk)->recvnxtinfo = (*val == 0) ? 0 : 1;
3943
3944 return 0;
3945 }
3946
3947 static int sctp_setsockopt_pr_supported(struct sock *sk,
3948 struct sctp_assoc_value *params,
3949 unsigned int optlen)
3950 {
3951 struct sctp_association *asoc;
3952
3953 if (optlen != sizeof(*params))
3954 return -EINVAL;
3955
3956 asoc = sctp_id2assoc(sk, params->assoc_id);
3957 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
3958 sctp_style(sk, UDP))
3959 return -EINVAL;
3960
3961 sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value;
3962
3963 return 0;
3964 }
3965
3966 static int sctp_setsockopt_default_prinfo(struct sock *sk,
3967 struct sctp_default_prinfo *info,
3968 unsigned int optlen)
3969 {
3970 struct sctp_sock *sp = sctp_sk(sk);
3971 struct sctp_association *asoc;
3972 int retval = -EINVAL;
3973
3974 if (optlen != sizeof(*info))
3975 goto out;
3976
3977 if (info->pr_policy & ~SCTP_PR_SCTP_MASK)
3978 goto out;
3979
3980 if (info->pr_policy == SCTP_PR_SCTP_NONE)
3981 info->pr_value = 0;
3982
3983 asoc = sctp_id2assoc(sk, info->pr_assoc_id);
3984 if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC &&
3985 sctp_style(sk, UDP))
3986 goto out;
3987
3988 retval = 0;
3989
3990 if (asoc) {
3991 SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy);
3992 asoc->default_timetolive = info->pr_value;
3993 goto out;
3994 }
3995
3996 if (sctp_style(sk, TCP))
3997 info->pr_assoc_id = SCTP_FUTURE_ASSOC;
3998
3999 if (info->pr_assoc_id == SCTP_FUTURE_ASSOC ||
4000 info->pr_assoc_id == SCTP_ALL_ASSOC) {
4001 SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy);
4002 sp->default_timetolive = info->pr_value;
4003 }
4004
4005 if (info->pr_assoc_id == SCTP_CURRENT_ASSOC ||
4006 info->pr_assoc_id == SCTP_ALL_ASSOC) {
4007 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4008 SCTP_PR_SET_POLICY(asoc->default_flags,
4009 info->pr_policy);
4010 asoc->default_timetolive = info->pr_value;
4011 }
4012 }
4013
4014 out:
4015 return retval;
4016 }
4017
4018 static int sctp_setsockopt_reconfig_supported(struct sock *sk,
4019 struct sctp_assoc_value *params,
4020 unsigned int optlen)
4021 {
4022 struct sctp_association *asoc;
4023 int retval = -EINVAL;
4024
4025 if (optlen != sizeof(*params))
4026 goto out;
4027
4028 asoc = sctp_id2assoc(sk, params->assoc_id);
4029 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
4030 sctp_style(sk, UDP))
4031 goto out;
4032
4033 sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value;
4034
4035 retval = 0;
4036
4037 out:
4038 return retval;
4039 }
4040
4041 static int sctp_setsockopt_enable_strreset(struct sock *sk,
4042 struct sctp_assoc_value *params,
4043 unsigned int optlen)
4044 {
4045 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
4046 struct sctp_association *asoc;
4047 int retval = -EINVAL;
4048
4049 if (optlen != sizeof(*params))
4050 goto out;
4051
4052 if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK))
4053 goto out;
4054
4055 asoc = sctp_id2assoc(sk, params->assoc_id);
4056 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
4057 sctp_style(sk, UDP))
4058 goto out;
4059
4060 retval = 0;
4061
4062 if (asoc) {
4063 asoc->strreset_enable = params->assoc_value;
4064 goto out;
4065 }
4066
4067 if (sctp_style(sk, TCP))
4068 params->assoc_id = SCTP_FUTURE_ASSOC;
4069
4070 if (params->assoc_id == SCTP_FUTURE_ASSOC ||
4071 params->assoc_id == SCTP_ALL_ASSOC)
4072 ep->strreset_enable = params->assoc_value;
4073
4074 if (params->assoc_id == SCTP_CURRENT_ASSOC ||
4075 params->assoc_id == SCTP_ALL_ASSOC)
4076 list_for_each_entry(asoc, &ep->asocs, asocs)
4077 asoc->strreset_enable = params->assoc_value;
4078
4079 out:
4080 return retval;
4081 }
4082
4083 static int sctp_setsockopt_reset_streams(struct sock *sk,
4084 struct sctp_reset_streams *params,
4085 unsigned int optlen)
4086 {
4087 struct sctp_association *asoc;
4088
4089 if (optlen < sizeof(*params))
4090 return -EINVAL;
4091
4092 optlen = min_t(unsigned int, optlen, USHRT_MAX +
4093 sizeof(__u16) * sizeof(*params));
4094
4095 if (params->srs_number_streams * sizeof(__u16) >
4096 optlen - sizeof(*params))
4097 return -EINVAL;
4098
4099 asoc = sctp_id2assoc(sk, params->srs_assoc_id);
4100 if (!asoc)
4101 return -EINVAL;
4102
4103 return sctp_send_reset_streams(asoc, params);
4104 }
4105
4106 static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t *associd,
4107 unsigned int optlen)
4108 {
4109 struct sctp_association *asoc;
4110
4111 if (optlen != sizeof(*associd))
4112 return -EINVAL;
4113
4114 asoc = sctp_id2assoc(sk, *associd);
4115 if (!asoc)
4116 return -EINVAL;
4117
4118 return sctp_send_reset_assoc(asoc);
4119 }
4120
4121 static int sctp_setsockopt_add_streams(struct sock *sk,
4122 struct sctp_add_streams *params,
4123 unsigned int optlen)
4124 {
4125 struct sctp_association *asoc;
4126
4127 if (optlen != sizeof(*params))
4128 return -EINVAL;
4129
4130 asoc = sctp_id2assoc(sk, params->sas_assoc_id);
4131 if (!asoc)
4132 return -EINVAL;
4133
4134 return sctp_send_add_streams(asoc, params);
4135 }
4136
4137 static int sctp_setsockopt_scheduler(struct sock *sk,
4138 struct sctp_assoc_value *params,
4139 unsigned int optlen)
4140 {
4141 struct sctp_sock *sp = sctp_sk(sk);
4142 struct sctp_association *asoc;
4143 int retval = 0;
4144
4145 if (optlen < sizeof(*params))
4146 return -EINVAL;
4147
4148 if (params->assoc_value > SCTP_SS_MAX)
4149 return -EINVAL;
4150
4151 asoc = sctp_id2assoc(sk, params->assoc_id);
4152 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
4153 sctp_style(sk, UDP))
4154 return -EINVAL;
4155
4156 if (asoc)
4157 return sctp_sched_set_sched(asoc, params->assoc_value);
4158
4159 if (sctp_style(sk, TCP))
4160 params->assoc_id = SCTP_FUTURE_ASSOC;
4161
4162 if (params->assoc_id == SCTP_FUTURE_ASSOC ||
4163 params->assoc_id == SCTP_ALL_ASSOC)
4164 sp->default_ss = params->assoc_value;
4165
4166 if (params->assoc_id == SCTP_CURRENT_ASSOC ||
4167 params->assoc_id == SCTP_ALL_ASSOC) {
4168 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4169 int ret = sctp_sched_set_sched(asoc,
4170 params->assoc_value);
4171
4172 if (ret && !retval)
4173 retval = ret;
4174 }
4175 }
4176
4177 return retval;
4178 }
4179
4180 static int sctp_setsockopt_scheduler_value(struct sock *sk,
4181 struct sctp_stream_value *params,
4182 unsigned int optlen)
4183 {
4184 struct sctp_association *asoc;
4185 int retval = -EINVAL;
4186
4187 if (optlen < sizeof(*params))
4188 goto out;
4189
4190 asoc = sctp_id2assoc(sk, params->assoc_id);
4191 if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC &&
4192 sctp_style(sk, UDP))
4193 goto out;
4194
4195 if (asoc) {
4196 retval = sctp_sched_set_value(asoc, params->stream_id,
4197 params->stream_value, GFP_KERNEL);
4198 goto out;
4199 }
4200
4201 retval = 0;
4202
4203 list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) {
4204 int ret = sctp_sched_set_value(asoc, params->stream_id,
4205 params->stream_value,
4206 GFP_KERNEL);
4207 if (ret && !retval)
4208 retval = ret;
4209 }
4210
4211 out:
4212 return retval;
4213 }
4214
4215 static int sctp_setsockopt_interleaving_supported(struct sock *sk,
4216 struct sctp_assoc_value *p,
4217 unsigned int optlen)
4218 {
4219 struct sctp_sock *sp = sctp_sk(sk);
4220 struct sctp_association *asoc;
4221
4222 if (optlen < sizeof(*p))
4223 return -EINVAL;
4224
4225 asoc = sctp_id2assoc(sk, p->assoc_id);
4226 if (!asoc && p->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP))
4227 return -EINVAL;
4228
4229 if (!sock_net(sk)->sctp.intl_enable || !sp->frag_interleave) {
4230 return -EPERM;
4231 }
4232
4233 sp->ep->intl_enable = !!p->assoc_value;
4234 return 0;
4235 }
4236
4237 static int sctp_setsockopt_reuse_port(struct sock *sk, int *val,
4238 unsigned int optlen)
4239 {
4240 if (!sctp_style(sk, TCP))
4241 return -EOPNOTSUPP;
4242
4243 if (sctp_sk(sk)->ep->base.bind_addr.port)
4244 return -EFAULT;
4245
4246 if (optlen < sizeof(int))
4247 return -EINVAL;
4248
4249 sctp_sk(sk)->reuse = !!*val;
4250
4251 return 0;
4252 }
4253
4254 static int sctp_assoc_ulpevent_type_set(struct sctp_event *param,
4255 struct sctp_association *asoc)
4256 {
4257 struct sctp_ulpevent *event;
4258
4259 sctp_ulpevent_type_set(&asoc->subscribe, param->se_type, param->se_on);
4260
4261 if (param->se_type == SCTP_SENDER_DRY_EVENT && param->se_on) {
4262 if (sctp_outq_is_empty(&asoc->outqueue)) {
4263 event = sctp_ulpevent_make_sender_dry_event(asoc,
4264 GFP_USER | __GFP_NOWARN);
4265 if (!event)
4266 return -ENOMEM;
4267
4268 asoc->stream.si->enqueue_event(&asoc->ulpq, event);
4269 }
4270 }
4271
4272 return 0;
4273 }
4274
4275 static int sctp_setsockopt_event(struct sock *sk, struct sctp_event *param,
4276 unsigned int optlen)
4277 {
4278 struct sctp_sock *sp = sctp_sk(sk);
4279 struct sctp_association *asoc;
4280 int retval = 0;
4281
4282 if (optlen < sizeof(*param))
4283 return -EINVAL;
4284
4285 if (param->se_type < SCTP_SN_TYPE_BASE ||
4286 param->se_type > SCTP_SN_TYPE_MAX)
4287 return -EINVAL;
4288
4289 asoc = sctp_id2assoc(sk, param->se_assoc_id);
4290 if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC &&
4291 sctp_style(sk, UDP))
4292 return -EINVAL;
4293
4294 if (asoc)
4295 return sctp_assoc_ulpevent_type_set(param, asoc);
4296
4297 if (sctp_style(sk, TCP))
4298 param->se_assoc_id = SCTP_FUTURE_ASSOC;
4299
4300 if (param->se_assoc_id == SCTP_FUTURE_ASSOC ||
4301 param->se_assoc_id == SCTP_ALL_ASSOC)
4302 sctp_ulpevent_type_set(&sp->subscribe,
4303 param->se_type, param->se_on);
4304
4305 if (param->se_assoc_id == SCTP_CURRENT_ASSOC ||
4306 param->se_assoc_id == SCTP_ALL_ASSOC) {
4307 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4308 int ret = sctp_assoc_ulpevent_type_set(param, asoc);
4309
4310 if (ret && !retval)
4311 retval = ret;
4312 }
4313 }
4314
4315 return retval;
4316 }
4317
4318 static int sctp_setsockopt_asconf_supported(struct sock *sk,
4319 struct sctp_assoc_value *params,
4320 unsigned int optlen)
4321 {
4322 struct sctp_association *asoc;
4323 struct sctp_endpoint *ep;
4324 int retval = -EINVAL;
4325
4326 if (optlen != sizeof(*params))
4327 goto out;
4328
4329 asoc = sctp_id2assoc(sk, params->assoc_id);
4330 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
4331 sctp_style(sk, UDP))
4332 goto out;
4333
4334 ep = sctp_sk(sk)->ep;
4335 ep->asconf_enable = !!params->assoc_value;
4336
4337 if (ep->asconf_enable && ep->auth_enable) {
4338 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF);
4339 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF_ACK);
4340 }
4341
4342 retval = 0;
4343
4344 out:
4345 return retval;
4346 }
4347
4348 static int sctp_setsockopt_auth_supported(struct sock *sk,
4349 struct sctp_assoc_value *params,
4350 unsigned int optlen)
4351 {
4352 struct sctp_association *asoc;
4353 struct sctp_endpoint *ep;
4354 int retval = -EINVAL;
4355
4356 if (optlen != sizeof(*params))
4357 goto out;
4358
4359 asoc = sctp_id2assoc(sk, params->assoc_id);
4360 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
4361 sctp_style(sk, UDP))
4362 goto out;
4363
4364 ep = sctp_sk(sk)->ep;
4365 if (params->assoc_value) {
4366 retval = sctp_auth_init(ep, GFP_KERNEL);
4367 if (retval)
4368 goto out;
4369 if (ep->asconf_enable) {
4370 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF);
4371 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF_ACK);
4372 }
4373 }
4374
4375 ep->auth_enable = !!params->assoc_value;
4376 retval = 0;
4377
4378 out:
4379 return retval;
4380 }
4381
4382 static int sctp_setsockopt_ecn_supported(struct sock *sk,
4383 struct sctp_assoc_value *params,
4384 unsigned int optlen)
4385 {
4386 struct sctp_association *asoc;
4387 int retval = -EINVAL;
4388
4389 if (optlen != sizeof(*params))
4390 goto out;
4391
4392 asoc = sctp_id2assoc(sk, params->assoc_id);
4393 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
4394 sctp_style(sk, UDP))
4395 goto out;
4396
4397 sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value;
4398 retval = 0;
4399
4400 out:
4401 return retval;
4402 }
4403
4404 static int sctp_setsockopt_pf_expose(struct sock *sk,
4405 struct sctp_assoc_value *params,
4406 unsigned int optlen)
4407 {
4408 struct sctp_association *asoc;
4409 int retval = -EINVAL;
4410
4411 if (optlen != sizeof(*params))
4412 goto out;
4413
4414 if (params->assoc_value > SCTP_PF_EXPOSE_MAX)
4415 goto out;
4416
4417 asoc = sctp_id2assoc(sk, params->assoc_id);
4418 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
4419 sctp_style(sk, UDP))
4420 goto out;
4421
4422 if (asoc)
4423 asoc->pf_expose = params->assoc_value;
4424 else
4425 sctp_sk(sk)->pf_expose = params->assoc_value;
4426 retval = 0;
4427
4428 out:
4429 return retval;
4430 }
4431
4432 static int sctp_setsockopt_encap_port(struct sock *sk,
4433 struct sctp_udpencaps *encap,
4434 unsigned int optlen)
4435 {
4436 struct sctp_association *asoc;
4437 struct sctp_transport *t;
4438 __be16 encap_port;
4439
4440 if (optlen != sizeof(*encap))
4441 return -EINVAL;
4442
4443
4444
4445
4446 encap_port = (__force __be16)encap->sue_port;
4447 if (!sctp_is_any(sk, (union sctp_addr *)&encap->sue_address)) {
4448 t = sctp_addr_id2transport(sk, &encap->sue_address,
4449 encap->sue_assoc_id);
4450 if (!t)
4451 return -EINVAL;
4452
4453 t->encap_port = encap_port;
4454 return 0;
4455 }
4456
4457
4458
4459
4460
4461 asoc = sctp_id2assoc(sk, encap->sue_assoc_id);
4462 if (!asoc && encap->sue_assoc_id != SCTP_FUTURE_ASSOC &&
4463 sctp_style(sk, UDP))
4464 return -EINVAL;
4465
4466
4467
4468
4469 if (asoc) {
4470 list_for_each_entry(t, &asoc->peer.transport_addr_list,
4471 transports)
4472 t->encap_port = encap_port;
4473
4474 asoc->encap_port = encap_port;
4475 return 0;
4476 }
4477
4478 sctp_sk(sk)->encap_port = encap_port;
4479 return 0;
4480 }
4481
4482 static int sctp_setsockopt_probe_interval(struct sock *sk,
4483 struct sctp_probeinterval *params,
4484 unsigned int optlen)
4485 {
4486 struct sctp_association *asoc;
4487 struct sctp_transport *t;
4488 __u32 probe_interval;
4489
4490 if (optlen != sizeof(*params))
4491 return -EINVAL;
4492
4493 probe_interval = params->spi_interval;
4494 if (probe_interval && probe_interval < SCTP_PROBE_TIMER_MIN)
4495 return -EINVAL;
4496
4497
4498
4499
4500 if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spi_address)) {
4501 t = sctp_addr_id2transport(sk, ¶ms->spi_address,
4502 params->spi_assoc_id);
4503 if (!t)
4504 return -EINVAL;
4505
4506 t->probe_interval = msecs_to_jiffies(probe_interval);
4507 sctp_transport_pl_reset(t);
4508 return 0;
4509 }
4510
4511
4512
4513
4514
4515 asoc = sctp_id2assoc(sk, params->spi_assoc_id);
4516 if (!asoc && params->spi_assoc_id != SCTP_FUTURE_ASSOC &&
4517 sctp_style(sk, UDP))
4518 return -EINVAL;
4519
4520
4521
4522
4523 if (asoc) {
4524 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) {
4525 t->probe_interval = msecs_to_jiffies(probe_interval);
4526 sctp_transport_pl_reset(t);
4527 }
4528
4529 asoc->probe_interval = msecs_to_jiffies(probe_interval);
4530 return 0;
4531 }
4532
4533 sctp_sk(sk)->probe_interval = probe_interval;
4534 return 0;
4535 }
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556 static int sctp_setsockopt(struct sock *sk, int level, int optname,
4557 sockptr_t optval, unsigned int optlen)
4558 {
4559 void *kopt = NULL;
4560 int retval = 0;
4561
4562 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
4563
4564
4565
4566
4567
4568
4569
4570 if (level != SOL_SCTP) {
4571 struct sctp_af *af = sctp_sk(sk)->pf->af;
4572
4573 return af->setsockopt(sk, level, optname, optval, optlen);
4574 }
4575
4576 if (optlen > 0) {
4577
4578 optlen = min_t(unsigned int, optlen,
4579 PAGE_ALIGN(USHRT_MAX +
4580 sizeof(__u16) * sizeof(struct sctp_reset_streams)));
4581 kopt = memdup_sockptr(optval, optlen);
4582 if (IS_ERR(kopt))
4583 return PTR_ERR(kopt);
4584 }
4585
4586 lock_sock(sk);
4587
4588 switch (optname) {
4589 case SCTP_SOCKOPT_BINDX_ADD:
4590
4591 retval = sctp_setsockopt_bindx(sk, kopt, optlen,
4592 SCTP_BINDX_ADD_ADDR);
4593 break;
4594
4595 case SCTP_SOCKOPT_BINDX_REM:
4596
4597 retval = sctp_setsockopt_bindx(sk, kopt, optlen,
4598 SCTP_BINDX_REM_ADDR);
4599 break;
4600
4601 case SCTP_SOCKOPT_CONNECTX_OLD:
4602
4603 retval = sctp_setsockopt_connectx_old(sk, kopt, optlen);
4604 break;
4605
4606 case SCTP_SOCKOPT_CONNECTX:
4607
4608 retval = sctp_setsockopt_connectx(sk, kopt, optlen);
4609 break;
4610
4611 case SCTP_DISABLE_FRAGMENTS:
4612 retval = sctp_setsockopt_disable_fragments(sk, kopt, optlen);
4613 break;
4614
4615 case SCTP_EVENTS:
4616 retval = sctp_setsockopt_events(sk, kopt, optlen);
4617 break;
4618
4619 case SCTP_AUTOCLOSE:
4620 retval = sctp_setsockopt_autoclose(sk, kopt, optlen);
4621 break;
4622
4623 case SCTP_PEER_ADDR_PARAMS:
4624 retval = sctp_setsockopt_peer_addr_params(sk, kopt, optlen);
4625 break;
4626
4627 case SCTP_DELAYED_SACK:
4628 retval = sctp_setsockopt_delayed_ack(sk, kopt, optlen);
4629 break;
4630 case SCTP_PARTIAL_DELIVERY_POINT:
4631 retval = sctp_setsockopt_partial_delivery_point(sk, kopt, optlen);
4632 break;
4633
4634 case SCTP_INITMSG:
4635 retval = sctp_setsockopt_initmsg(sk, kopt, optlen);
4636 break;
4637 case SCTP_DEFAULT_SEND_PARAM:
4638 retval = sctp_setsockopt_default_send_param(sk, kopt, optlen);
4639 break;
4640 case SCTP_DEFAULT_SNDINFO:
4641 retval = sctp_setsockopt_default_sndinfo(sk, kopt, optlen);
4642 break;
4643 case SCTP_PRIMARY_ADDR:
4644 retval = sctp_setsockopt_primary_addr(sk, kopt, optlen);
4645 break;
4646 case SCTP_SET_PEER_PRIMARY_ADDR:
4647 retval = sctp_setsockopt_peer_primary_addr(sk, kopt, optlen);
4648 break;
4649 case SCTP_NODELAY:
4650 retval = sctp_setsockopt_nodelay(sk, kopt, optlen);
4651 break;
4652 case SCTP_RTOINFO:
4653 retval = sctp_setsockopt_rtoinfo(sk, kopt, optlen);
4654 break;
4655 case SCTP_ASSOCINFO:
4656 retval = sctp_setsockopt_associnfo(sk, kopt, optlen);
4657 break;
4658 case SCTP_I_WANT_MAPPED_V4_ADDR:
4659 retval = sctp_setsockopt_mappedv4(sk, kopt, optlen);
4660 break;
4661 case SCTP_MAXSEG:
4662 retval = sctp_setsockopt_maxseg(sk, kopt, optlen);
4663 break;
4664 case SCTP_ADAPTATION_LAYER:
4665 retval = sctp_setsockopt_adaptation_layer(sk, kopt, optlen);
4666 break;
4667 case SCTP_CONTEXT:
4668 retval = sctp_setsockopt_context(sk, kopt, optlen);
4669 break;
4670 case SCTP_FRAGMENT_INTERLEAVE:
4671 retval = sctp_setsockopt_fragment_interleave(sk, kopt, optlen);
4672 break;
4673 case SCTP_MAX_BURST:
4674 retval = sctp_setsockopt_maxburst(sk, kopt, optlen);
4675 break;
4676 case SCTP_AUTH_CHUNK:
4677 retval = sctp_setsockopt_auth_chunk(sk, kopt, optlen);
4678 break;
4679 case SCTP_HMAC_IDENT:
4680 retval = sctp_setsockopt_hmac_ident(sk, kopt, optlen);
4681 break;
4682 case SCTP_AUTH_KEY:
4683 retval = sctp_setsockopt_auth_key(sk, kopt, optlen);
4684 break;
4685 case SCTP_AUTH_ACTIVE_KEY:
4686 retval = sctp_setsockopt_active_key(sk, kopt, optlen);
4687 break;
4688 case SCTP_AUTH_DELETE_KEY:
4689 retval = sctp_setsockopt_del_key(sk, kopt, optlen);
4690 break;
4691 case SCTP_AUTH_DEACTIVATE_KEY:
4692 retval = sctp_setsockopt_deactivate_key(sk, kopt, optlen);
4693 break;
4694 case SCTP_AUTO_ASCONF:
4695 retval = sctp_setsockopt_auto_asconf(sk, kopt, optlen);
4696 break;
4697 case SCTP_PEER_ADDR_THLDS:
4698 retval = sctp_setsockopt_paddr_thresholds(sk, kopt, optlen,
4699 false);
4700 break;
4701 case SCTP_PEER_ADDR_THLDS_V2:
4702 retval = sctp_setsockopt_paddr_thresholds(sk, kopt, optlen,
4703 true);
4704 break;
4705 case SCTP_RECVRCVINFO:
4706 retval = sctp_setsockopt_recvrcvinfo(sk, kopt, optlen);
4707 break;
4708 case SCTP_RECVNXTINFO:
4709 retval = sctp_setsockopt_recvnxtinfo(sk, kopt, optlen);
4710 break;
4711 case SCTP_PR_SUPPORTED:
4712 retval = sctp_setsockopt_pr_supported(sk, kopt, optlen);
4713 break;
4714 case SCTP_DEFAULT_PRINFO:
4715 retval = sctp_setsockopt_default_prinfo(sk, kopt, optlen);
4716 break;
4717 case SCTP_RECONFIG_SUPPORTED:
4718 retval = sctp_setsockopt_reconfig_supported(sk, kopt, optlen);
4719 break;
4720 case SCTP_ENABLE_STREAM_RESET:
4721 retval = sctp_setsockopt_enable_strreset(sk, kopt, optlen);
4722 break;
4723 case SCTP_RESET_STREAMS:
4724 retval = sctp_setsockopt_reset_streams(sk, kopt, optlen);
4725 break;
4726 case SCTP_RESET_ASSOC:
4727 retval = sctp_setsockopt_reset_assoc(sk, kopt, optlen);
4728 break;
4729 case SCTP_ADD_STREAMS:
4730 retval = sctp_setsockopt_add_streams(sk, kopt, optlen);
4731 break;
4732 case SCTP_STREAM_SCHEDULER:
4733 retval = sctp_setsockopt_scheduler(sk, kopt, optlen);
4734 break;
4735 case SCTP_STREAM_SCHEDULER_VALUE:
4736 retval = sctp_setsockopt_scheduler_value(sk, kopt, optlen);
4737 break;
4738 case SCTP_INTERLEAVING_SUPPORTED:
4739 retval = sctp_setsockopt_interleaving_supported(sk, kopt,
4740 optlen);
4741 break;
4742 case SCTP_REUSE_PORT:
4743 retval = sctp_setsockopt_reuse_port(sk, kopt, optlen);
4744 break;
4745 case SCTP_EVENT:
4746 retval = sctp_setsockopt_event(sk, kopt, optlen);
4747 break;
4748 case SCTP_ASCONF_SUPPORTED:
4749 retval = sctp_setsockopt_asconf_supported(sk, kopt, optlen);
4750 break;
4751 case SCTP_AUTH_SUPPORTED:
4752 retval = sctp_setsockopt_auth_supported(sk, kopt, optlen);
4753 break;
4754 case SCTP_ECN_SUPPORTED:
4755 retval = sctp_setsockopt_ecn_supported(sk, kopt, optlen);
4756 break;
4757 case SCTP_EXPOSE_POTENTIALLY_FAILED_STATE:
4758 retval = sctp_setsockopt_pf_expose(sk, kopt, optlen);
4759 break;
4760 case SCTP_REMOTE_UDP_ENCAPS_PORT:
4761 retval = sctp_setsockopt_encap_port(sk, kopt, optlen);
4762 break;
4763 case SCTP_PLPMTUD_PROBE_INTERVAL:
4764 retval = sctp_setsockopt_probe_interval(sk, kopt, optlen);
4765 break;
4766 default:
4767 retval = -ENOPROTOOPT;
4768 break;
4769 }
4770
4771 release_sock(sk);
4772 kfree(kopt);
4773 return retval;
4774 }
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792 static int sctp_connect(struct sock *sk, struct sockaddr *addr,
4793 int addr_len, int flags)
4794 {
4795 struct sctp_af *af;
4796 int err = -EINVAL;
4797
4798 lock_sock(sk);
4799 pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk,
4800 addr, addr_len);
4801
4802
4803 af = sctp_get_af_specific(addr->sa_family);
4804 if (af && addr_len >= af->sockaddr_len)
4805 err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL);
4806
4807 release_sock(sk);
4808 return err;
4809 }
4810
4811 int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
4812 int addr_len, int flags)
4813 {
4814 if (addr_len < sizeof(uaddr->sa_family))
4815 return -EINVAL;
4816
4817 if (uaddr->sa_family == AF_UNSPEC)
4818 return -EOPNOTSUPP;
4819
4820 return sctp_connect(sock->sk, uaddr, addr_len, flags);
4821 }
4822
4823
4824 static int sctp_disconnect(struct sock *sk, int flags)
4825 {
4826 return -EOPNOTSUPP;
4827 }
4828
4829
4830
4831
4832
4833
4834
4835
4836 static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
4837 {
4838 struct sctp_sock *sp;
4839 struct sctp_endpoint *ep;
4840 struct sock *newsk = NULL;
4841 struct sctp_association *asoc;
4842 long timeo;
4843 int error = 0;
4844
4845 lock_sock(sk);
4846
4847 sp = sctp_sk(sk);
4848 ep = sp->ep;
4849
4850 if (!sctp_style(sk, TCP)) {
4851 error = -EOPNOTSUPP;
4852 goto out;
4853 }
4854
4855 if (!sctp_sstate(sk, LISTENING)) {
4856 error = -EINVAL;
4857 goto out;
4858 }
4859
4860 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
4861
4862 error = sctp_wait_for_accept(sk, timeo);
4863 if (error)
4864 goto out;
4865
4866
4867
4868
4869 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
4870
4871 newsk = sp->pf->create_accept_sk(sk, asoc, kern);
4872 if (!newsk) {
4873 error = -ENOMEM;
4874 goto out;
4875 }
4876
4877
4878
4879
4880 error = sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP);
4881 if (error) {
4882 sk_common_release(newsk);
4883 newsk = NULL;
4884 }
4885
4886 out:
4887 release_sock(sk);
4888 *err = error;
4889 return newsk;
4890 }
4891
4892
4893 static int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg)
4894 {
4895 int rc = -ENOTCONN;
4896
4897 lock_sock(sk);
4898
4899
4900
4901
4902
4903 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
4904 goto out;
4905
4906 switch (cmd) {
4907 case SIOCINQ: {
4908 struct sk_buff *skb;
4909 unsigned int amount = 0;
4910
4911 skb = skb_peek(&sk->sk_receive_queue);
4912 if (skb != NULL) {
4913
4914
4915
4916
4917 amount = skb->len;
4918 }
4919 rc = put_user(amount, (int __user *)arg);
4920 break;
4921 }
4922 default:
4923 rc = -ENOIOCTLCMD;
4924 break;
4925 }
4926 out:
4927 release_sock(sk);
4928 return rc;
4929 }
4930
4931
4932
4933
4934
4935 static int sctp_init_sock(struct sock *sk)
4936 {
4937 struct net *net = sock_net(sk);
4938 struct sctp_sock *sp;
4939
4940 pr_debug("%s: sk:%p\n", __func__, sk);
4941
4942 sp = sctp_sk(sk);
4943
4944
4945 switch (sk->sk_type) {
4946 case SOCK_SEQPACKET:
4947 sp->type = SCTP_SOCKET_UDP;
4948 break;
4949 case SOCK_STREAM:
4950 sp->type = SCTP_SOCKET_TCP;
4951 break;
4952 default:
4953 return -ESOCKTNOSUPPORT;
4954 }
4955
4956 sk->sk_gso_type = SKB_GSO_SCTP;
4957
4958
4959
4960
4961 sp->default_stream = 0;
4962 sp->default_ppid = 0;
4963 sp->default_flags = 0;
4964 sp->default_context = 0;
4965 sp->default_timetolive = 0;
4966
4967 sp->default_rcv_context = 0;
4968 sp->max_burst = net->sctp.max_burst;
4969
4970 sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg;
4971
4972
4973
4974
4975
4976 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
4977 sp->initmsg.sinit_max_instreams = sctp_max_instreams;
4978 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init;
4979 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max;
4980
4981
4982
4983
4984 sp->rtoinfo.srto_initial = net->sctp.rto_initial;
4985 sp->rtoinfo.srto_max = net->sctp.rto_max;
4986 sp->rtoinfo.srto_min = net->sctp.rto_min;
4987
4988
4989
4990
4991 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association;
4992 sp->assocparams.sasoc_number_peer_destinations = 0;
4993 sp->assocparams.sasoc_peer_rwnd = 0;
4994 sp->assocparams.sasoc_local_rwnd = 0;
4995 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life;
4996
4997
4998
4999
5000 sp->subscribe = 0;
5001
5002
5003
5004
5005 sp->hbinterval = net->sctp.hb_interval;
5006 sp->udp_port = htons(net->sctp.udp_port);
5007 sp->encap_port = htons(net->sctp.encap_port);
5008 sp->pathmaxrxt = net->sctp.max_retrans_path;
5009 sp->pf_retrans = net->sctp.pf_retrans;
5010 sp->ps_retrans = net->sctp.ps_retrans;
5011 sp->pf_expose = net->sctp.pf_expose;
5012 sp->pathmtu = 0;
5013 sp->sackdelay = net->sctp.sack_timeout;
5014 sp->sackfreq = 2;
5015 sp->param_flags = SPP_HB_ENABLE |
5016 SPP_PMTUD_ENABLE |
5017 SPP_SACKDELAY_ENABLE;
5018 sp->default_ss = SCTP_SS_DEFAULT;
5019
5020
5021
5022
5023 sp->disable_fragments = 0;
5024
5025
5026 sp->nodelay = 0;
5027
5028 sp->recvrcvinfo = 0;
5029 sp->recvnxtinfo = 0;
5030
5031
5032 sp->v4mapped = 1;
5033
5034
5035
5036
5037
5038
5039 sp->autoclose = 0;
5040
5041
5042 sp->user_frag = 0;
5043
5044 sp->adaptation_ind = 0;
5045
5046 sp->pf = sctp_get_pf_specific(sk->sk_family);
5047
5048
5049 atomic_set(&sp->pd_mode, 0);
5050 skb_queue_head_init(&sp->pd_lobby);
5051 sp->frag_interleave = 0;
5052 sp->probe_interval = net->sctp.probe_interval;
5053
5054
5055
5056
5057
5058 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL);
5059 if (!sp->ep)
5060 return -ENOMEM;
5061
5062 sp->hmac = NULL;
5063
5064 sk->sk_destruct = sctp_destruct_sock;
5065
5066 SCTP_DBG_OBJCNT_INC(sock);
5067
5068 sk_sockets_allocated_inc(sk);
5069 sock_prot_inuse_add(net, sk->sk_prot, 1);
5070
5071 return 0;
5072 }
5073
5074
5075
5076
5077 static void sctp_destroy_sock(struct sock *sk)
5078 {
5079 struct sctp_sock *sp;
5080
5081 pr_debug("%s: sk:%p\n", __func__, sk);
5082
5083
5084 sp = sctp_sk(sk);
5085
5086
5087
5088 if (sp->ep == NULL)
5089 return;
5090
5091 if (sp->do_auto_asconf) {
5092 sp->do_auto_asconf = 0;
5093 list_del(&sp->auto_asconf_list);
5094 }
5095 sctp_endpoint_free(sp->ep);
5096 sk_sockets_allocated_dec(sk);
5097 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
5098 }
5099
5100
5101 static void sctp_destruct_sock(struct sock *sk)
5102 {
5103 struct sctp_sock *sp = sctp_sk(sk);
5104
5105
5106 crypto_free_shash(sp->hmac);
5107
5108 inet_sock_destruct(sk);
5109 }
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127 static void sctp_shutdown(struct sock *sk, int how)
5128 {
5129 struct net *net = sock_net(sk);
5130 struct sctp_endpoint *ep;
5131
5132 if (!sctp_style(sk, TCP))
5133 return;
5134
5135 ep = sctp_sk(sk)->ep;
5136 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) {
5137 struct sctp_association *asoc;
5138
5139 inet_sk_set_state(sk, SCTP_SS_CLOSING);
5140 asoc = list_entry(ep->asocs.next,
5141 struct sctp_association, asocs);
5142 sctp_primitive_SHUTDOWN(net, asoc, NULL);
5143 }
5144 }
5145
5146 int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
5147 struct sctp_info *info)
5148 {
5149 struct sctp_transport *prim;
5150 struct list_head *pos;
5151 int mask;
5152
5153 memset(info, 0, sizeof(*info));
5154 if (!asoc) {
5155 struct sctp_sock *sp = sctp_sk(sk);
5156
5157 info->sctpi_s_autoclose = sp->autoclose;
5158 info->sctpi_s_adaptation_ind = sp->adaptation_ind;
5159 info->sctpi_s_pd_point = sp->pd_point;
5160 info->sctpi_s_nodelay = sp->nodelay;
5161 info->sctpi_s_disable_fragments = sp->disable_fragments;
5162 info->sctpi_s_v4mapped = sp->v4mapped;
5163 info->sctpi_s_frag_interleave = sp->frag_interleave;
5164 info->sctpi_s_type = sp->type;
5165
5166 return 0;
5167 }
5168
5169 info->sctpi_tag = asoc->c.my_vtag;
5170 info->sctpi_state = asoc->state;
5171 info->sctpi_rwnd = asoc->a_rwnd;
5172 info->sctpi_unackdata = asoc->unack_data;
5173 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
5174 info->sctpi_instrms = asoc->stream.incnt;
5175 info->sctpi_outstrms = asoc->stream.outcnt;
5176 list_for_each(pos, &asoc->base.inqueue.in_chunk_list)
5177 info->sctpi_inqueue++;
5178 list_for_each(pos, &asoc->outqueue.out_chunk_list)
5179 info->sctpi_outqueue++;
5180 info->sctpi_overall_error = asoc->overall_error_count;
5181 info->sctpi_max_burst = asoc->max_burst;
5182 info->sctpi_maxseg = asoc->frag_point;
5183 info->sctpi_peer_rwnd = asoc->peer.rwnd;
5184 info->sctpi_peer_tag = asoc->c.peer_vtag;
5185
5186 mask = asoc->peer.ecn_capable << 1;
5187 mask = (mask | asoc->peer.ipv4_address) << 1;
5188 mask = (mask | asoc->peer.ipv6_address) << 1;
5189 mask = (mask | asoc->peer.hostname_address) << 1;
5190 mask = (mask | asoc->peer.asconf_capable) << 1;
5191 mask = (mask | asoc->peer.prsctp_capable) << 1;
5192 mask = (mask | asoc->peer.auth_capable);
5193 info->sctpi_peer_capable = mask;
5194 mask = asoc->peer.sack_needed << 1;
5195 mask = (mask | asoc->peer.sack_generation) << 1;
5196 mask = (mask | asoc->peer.zero_window_announced);
5197 info->sctpi_peer_sack = mask;
5198
5199 info->sctpi_isacks = asoc->stats.isacks;
5200 info->sctpi_osacks = asoc->stats.osacks;
5201 info->sctpi_opackets = asoc->stats.opackets;
5202 info->sctpi_ipackets = asoc->stats.ipackets;
5203 info->sctpi_rtxchunks = asoc->stats.rtxchunks;
5204 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns;
5205 info->sctpi_idupchunks = asoc->stats.idupchunks;
5206 info->sctpi_gapcnt = asoc->stats.gapcnt;
5207 info->sctpi_ouodchunks = asoc->stats.ouodchunks;
5208 info->sctpi_iuodchunks = asoc->stats.iuodchunks;
5209 info->sctpi_oodchunks = asoc->stats.oodchunks;
5210 info->sctpi_iodchunks = asoc->stats.iodchunks;
5211 info->sctpi_octrlchunks = asoc->stats.octrlchunks;
5212 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks;
5213
5214 prim = asoc->peer.primary_path;
5215 memcpy(&info->sctpi_p_address, &prim->ipaddr, sizeof(prim->ipaddr));
5216 info->sctpi_p_state = prim->state;
5217 info->sctpi_p_cwnd = prim->cwnd;
5218 info->sctpi_p_srtt = prim->srtt;
5219 info->sctpi_p_rto = jiffies_to_msecs(prim->rto);
5220 info->sctpi_p_hbinterval = prim->hbinterval;
5221 info->sctpi_p_pathmaxrxt = prim->pathmaxrxt;
5222 info->sctpi_p_sackdelay = jiffies_to_msecs(prim->sackdelay);
5223 info->sctpi_p_ssthresh = prim->ssthresh;
5224 info->sctpi_p_partial_bytes_acked = prim->partial_bytes_acked;
5225 info->sctpi_p_flight_size = prim->flight_size;
5226 info->sctpi_p_error = prim->error_count;
5227
5228 return 0;
5229 }
5230 EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
5231
5232
5233 void sctp_transport_walk_start(struct rhashtable_iter *iter) __acquires(RCU)
5234 {
5235 rhltable_walk_enter(&sctp_transport_hashtable, iter);
5236
5237 rhashtable_walk_start(iter);
5238 }
5239
5240 void sctp_transport_walk_stop(struct rhashtable_iter *iter) __releases(RCU)
5241 {
5242 rhashtable_walk_stop(iter);
5243 rhashtable_walk_exit(iter);
5244 }
5245
5246 struct sctp_transport *sctp_transport_get_next(struct net *net,
5247 struct rhashtable_iter *iter)
5248 {
5249 struct sctp_transport *t;
5250
5251 t = rhashtable_walk_next(iter);
5252 for (; t; t = rhashtable_walk_next(iter)) {
5253 if (IS_ERR(t)) {
5254 if (PTR_ERR(t) == -EAGAIN)
5255 continue;
5256 break;
5257 }
5258
5259 if (!sctp_transport_hold(t))
5260 continue;
5261
5262 if (net_eq(t->asoc->base.net, net) &&
5263 t->asoc->peer.primary_path == t)
5264 break;
5265
5266 sctp_transport_put(t);
5267 }
5268
5269 return t;
5270 }
5271
5272 struct sctp_transport *sctp_transport_get_idx(struct net *net,
5273 struct rhashtable_iter *iter,
5274 int pos)
5275 {
5276 struct sctp_transport *t;
5277
5278 if (!pos)
5279 return SEQ_START_TOKEN;
5280
5281 while ((t = sctp_transport_get_next(net, iter)) && !IS_ERR(t)) {
5282 if (!--pos)
5283 break;
5284 sctp_transport_put(t);
5285 }
5286
5287 return t;
5288 }
5289
5290 int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *),
5291 void *p) {
5292 int err = 0;
5293 int hash = 0;
5294 struct sctp_endpoint *ep;
5295 struct sctp_hashbucket *head;
5296
5297 for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize;
5298 hash++, head++) {
5299 read_lock_bh(&head->lock);
5300 sctp_for_each_hentry(ep, &head->chain) {
5301 err = cb(ep, p);
5302 if (err)
5303 break;
5304 }
5305 read_unlock_bh(&head->lock);
5306 }
5307
5308 return err;
5309 }
5310 EXPORT_SYMBOL_GPL(sctp_for_each_endpoint);
5311
5312 int sctp_transport_lookup_process(sctp_callback_t cb, struct net *net,
5313 const union sctp_addr *laddr,
5314 const union sctp_addr *paddr, void *p)
5315 {
5316 struct sctp_transport *transport;
5317 struct sctp_endpoint *ep;
5318 int err = -ENOENT;
5319
5320 rcu_read_lock();
5321 transport = sctp_addrs_lookup_transport(net, laddr, paddr);
5322 if (!transport) {
5323 rcu_read_unlock();
5324 return err;
5325 }
5326 ep = transport->asoc->ep;
5327 if (!sctp_endpoint_hold(ep)) {
5328 sctp_transport_put(transport);
5329 rcu_read_unlock();
5330 return err;
5331 }
5332 rcu_read_unlock();
5333
5334 err = cb(ep, transport, p);
5335 sctp_endpoint_put(ep);
5336 sctp_transport_put(transport);
5337 return err;
5338 }
5339 EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
5340
5341 int sctp_transport_traverse_process(sctp_callback_t cb, sctp_callback_t cb_done,
5342 struct net *net, int *pos, void *p)
5343 {
5344 struct rhashtable_iter hti;
5345 struct sctp_transport *tsp;
5346 struct sctp_endpoint *ep;
5347 int ret;
5348
5349 again:
5350 ret = 0;
5351 sctp_transport_walk_start(&hti);
5352
5353 tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
5354 for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
5355 ep = tsp->asoc->ep;
5356 if (sctp_endpoint_hold(ep)) {
5357 ret = cb(ep, tsp, p);
5358 if (ret)
5359 break;
5360 sctp_endpoint_put(ep);
5361 }
5362 (*pos)++;
5363 sctp_transport_put(tsp);
5364 }
5365 sctp_transport_walk_stop(&hti);
5366
5367 if (ret) {
5368 if (cb_done && !cb_done(ep, tsp, p)) {
5369 (*pos)++;
5370 sctp_endpoint_put(ep);
5371 sctp_transport_put(tsp);
5372 goto again;
5373 }
5374 sctp_endpoint_put(ep);
5375 sctp_transport_put(tsp);
5376 }
5377
5378 return ret;
5379 }
5380 EXPORT_SYMBOL_GPL(sctp_transport_traverse_process);
5381
5382
5383
5384
5385
5386
5387
5388
5389 static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
5390 char __user *optval,
5391 int __user *optlen)
5392 {
5393 struct sctp_status status;
5394 struct sctp_association *asoc = NULL;
5395 struct sctp_transport *transport;
5396 sctp_assoc_t associd;
5397 int retval = 0;
5398
5399 if (len < sizeof(status)) {
5400 retval = -EINVAL;
5401 goto out;
5402 }
5403
5404 len = sizeof(status);
5405 if (copy_from_user(&status, optval, len)) {
5406 retval = -EFAULT;
5407 goto out;
5408 }
5409
5410 associd = status.sstat_assoc_id;
5411 asoc = sctp_id2assoc(sk, associd);
5412 if (!asoc) {
5413 retval = -EINVAL;
5414 goto out;
5415 }
5416
5417 transport = asoc->peer.primary_path;
5418
5419 status.sstat_assoc_id = sctp_assoc2id(asoc);
5420 status.sstat_state = sctp_assoc_to_state(asoc);
5421 status.sstat_rwnd = asoc->peer.rwnd;
5422 status.sstat_unackdata = asoc->unack_data;
5423
5424 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
5425 status.sstat_instrms = asoc->stream.incnt;
5426 status.sstat_outstrms = asoc->stream.outcnt;
5427 status.sstat_fragmentation_point = asoc->frag_point;
5428 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
5429 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr,
5430 transport->af_specific->sockaddr_len);
5431
5432 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
5433 (union sctp_addr *)&status.sstat_primary.spinfo_address);
5434 status.sstat_primary.spinfo_state = transport->state;
5435 status.sstat_primary.spinfo_cwnd = transport->cwnd;
5436 status.sstat_primary.spinfo_srtt = transport->srtt;
5437 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
5438 status.sstat_primary.spinfo_mtu = transport->pathmtu;
5439
5440 if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
5441 status.sstat_primary.spinfo_state = SCTP_ACTIVE;
5442
5443 if (put_user(len, optlen)) {
5444 retval = -EFAULT;
5445 goto out;
5446 }
5447
5448 pr_debug("%s: len:%d, state:%d, rwnd:%d, assoc_id:%d\n",
5449 __func__, len, status.sstat_state, status.sstat_rwnd,
5450 status.sstat_assoc_id);
5451
5452 if (copy_to_user(optval, &status, len)) {
5453 retval = -EFAULT;
5454 goto out;
5455 }
5456
5457 out:
5458 return retval;
5459 }
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469 static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
5470 char __user *optval,
5471 int __user *optlen)
5472 {
5473 struct sctp_paddrinfo pinfo;
5474 struct sctp_transport *transport;
5475 int retval = 0;
5476
5477 if (len < sizeof(pinfo)) {
5478 retval = -EINVAL;
5479 goto out;
5480 }
5481
5482 len = sizeof(pinfo);
5483 if (copy_from_user(&pinfo, optval, len)) {
5484 retval = -EFAULT;
5485 goto out;
5486 }
5487
5488 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address,
5489 pinfo.spinfo_assoc_id);
5490 if (!transport) {
5491 retval = -EINVAL;
5492 goto out;
5493 }
5494
5495 if (transport->state == SCTP_PF &&
5496 transport->asoc->pf_expose == SCTP_PF_EXPOSE_DISABLE) {
5497 retval = -EACCES;
5498 goto out;
5499 }
5500
5501 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
5502 pinfo.spinfo_state = transport->state;
5503 pinfo.spinfo_cwnd = transport->cwnd;
5504 pinfo.spinfo_srtt = transport->srtt;
5505 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
5506 pinfo.spinfo_mtu = transport->pathmtu;
5507
5508 if (pinfo.spinfo_state == SCTP_UNKNOWN)
5509 pinfo.spinfo_state = SCTP_ACTIVE;
5510
5511 if (put_user(len, optlen)) {
5512 retval = -EFAULT;
5513 goto out;
5514 }
5515
5516 if (copy_to_user(optval, &pinfo, len)) {
5517 retval = -EFAULT;
5518 goto out;
5519 }
5520
5521 out:
5522 return retval;
5523 }
5524
5525
5526
5527
5528
5529
5530
5531
5532 static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
5533 char __user *optval, int __user *optlen)
5534 {
5535 int val;
5536
5537 if (len < sizeof(int))
5538 return -EINVAL;
5539
5540 len = sizeof(int);
5541 val = (sctp_sk(sk)->disable_fragments == 1);
5542 if (put_user(len, optlen))
5543 return -EFAULT;
5544 if (copy_to_user(optval, &val, len))
5545 return -EFAULT;
5546 return 0;
5547 }
5548
5549
5550
5551
5552
5553
5554 static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
5555 int __user *optlen)
5556 {
5557 struct sctp_event_subscribe subscribe;
5558 __u8 *sn_type = (__u8 *)&subscribe;
5559 int i;
5560
5561 if (len == 0)
5562 return -EINVAL;
5563 if (len > sizeof(struct sctp_event_subscribe))
5564 len = sizeof(struct sctp_event_subscribe);
5565 if (put_user(len, optlen))
5566 return -EFAULT;
5567
5568 for (i = 0; i < len; i++)
5569 sn_type[i] = sctp_ulpevent_type_enabled(sctp_sk(sk)->subscribe,
5570 SCTP_SN_TYPE_BASE + i);
5571
5572 if (copy_to_user(optval, &subscribe, len))
5573 return -EFAULT;
5574
5575 return 0;
5576 }
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589 static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen)
5590 {
5591
5592 if (sctp_style(sk, TCP))
5593 return -EOPNOTSUPP;
5594 if (len < sizeof(int))
5595 return -EINVAL;
5596 len = sizeof(int);
5597 if (put_user(len, optlen))
5598 return -EFAULT;
5599 if (put_user(sctp_sk(sk)->autoclose, (int __user *)optval))
5600 return -EFAULT;
5601 return 0;
5602 }
5603
5604
5605 int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
5606 {
5607 struct sctp_association *asoc = sctp_id2assoc(sk, id);
5608 struct sctp_sock *sp = sctp_sk(sk);
5609 struct socket *sock;
5610 int err = 0;
5611
5612
5613 if (!net_eq(current->nsproxy->net_ns, sock_net(sk)))
5614 return -EINVAL;
5615
5616 if (!asoc)
5617 return -EINVAL;
5618
5619
5620
5621
5622 if (!sctp_style(sk, UDP))
5623 return -EINVAL;
5624
5625
5626 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock);
5627 if (err < 0)
5628 return err;
5629
5630 sctp_copy_sock(sock->sk, sk, asoc);
5631
5632
5633
5634
5635
5636 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sock->sk);
5637 sp->pf->copy_ip_options(sk, sock->sk);
5638
5639
5640
5641
5642 err = sctp_sock_migrate(sk, sock->sk, asoc,
5643 SCTP_SOCKET_UDP_HIGH_BANDWIDTH);
5644 if (err) {
5645 sock_release(sock);
5646 sock = NULL;
5647 }
5648
5649 *sockp = sock;
5650
5651 return err;
5652 }
5653 EXPORT_SYMBOL(sctp_do_peeloff);
5654
5655 static int sctp_getsockopt_peeloff_common(struct sock *sk, sctp_peeloff_arg_t *peeloff,
5656 struct file **newfile, unsigned flags)
5657 {
5658 struct socket *newsock;
5659 int retval;
5660
5661 retval = sctp_do_peeloff(sk, peeloff->associd, &newsock);
5662 if (retval < 0)
5663 goto out;
5664
5665
5666 retval = get_unused_fd_flags(flags & SOCK_CLOEXEC);
5667 if (retval < 0) {
5668 sock_release(newsock);
5669 goto out;
5670 }
5671
5672 *newfile = sock_alloc_file(newsock, 0, NULL);
5673 if (IS_ERR(*newfile)) {
5674 put_unused_fd(retval);
5675 retval = PTR_ERR(*newfile);
5676 *newfile = NULL;
5677 return retval;
5678 }
5679
5680 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk,
5681 retval);
5682
5683 peeloff->sd = retval;
5684
5685 if (flags & SOCK_NONBLOCK)
5686 (*newfile)->f_flags |= O_NONBLOCK;
5687 out:
5688 return retval;
5689 }
5690
5691 static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen)
5692 {
5693 sctp_peeloff_arg_t peeloff;
5694 struct file *newfile = NULL;
5695 int retval = 0;
5696
5697 if (len < sizeof(sctp_peeloff_arg_t))
5698 return -EINVAL;
5699 len = sizeof(sctp_peeloff_arg_t);
5700 if (copy_from_user(&peeloff, optval, len))
5701 return -EFAULT;
5702
5703 retval = sctp_getsockopt_peeloff_common(sk, &peeloff, &newfile, 0);
5704 if (retval < 0)
5705 goto out;
5706
5707
5708 if (put_user(len, optlen)) {
5709 fput(newfile);
5710 put_unused_fd(retval);
5711 return -EFAULT;
5712 }
5713
5714 if (copy_to_user(optval, &peeloff, len)) {
5715 fput(newfile);
5716 put_unused_fd(retval);
5717 return -EFAULT;
5718 }
5719 fd_install(retval, newfile);
5720 out:
5721 return retval;
5722 }
5723
5724 static int sctp_getsockopt_peeloff_flags(struct sock *sk, int len,
5725 char __user *optval, int __user *optlen)
5726 {
5727 sctp_peeloff_flags_arg_t peeloff;
5728 struct file *newfile = NULL;
5729 int retval = 0;
5730
5731 if (len < sizeof(sctp_peeloff_flags_arg_t))
5732 return -EINVAL;
5733 len = sizeof(sctp_peeloff_flags_arg_t);
5734 if (copy_from_user(&peeloff, optval, len))
5735 return -EFAULT;
5736
5737 retval = sctp_getsockopt_peeloff_common(sk, &peeloff.p_arg,
5738 &newfile, peeloff.flags);
5739 if (retval < 0)
5740 goto out;
5741
5742
5743 if (put_user(len, optlen)) {
5744 fput(newfile);
5745 put_unused_fd(retval);
5746 return -EFAULT;
5747 }
5748
5749 if (copy_to_user(optval, &peeloff, len)) {
5750 fput(newfile);
5751 put_unused_fd(retval);
5752 return -EFAULT;
5753 }
5754 fd_install(retval, newfile);
5755 out:
5756 return retval;
5757 }
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891 static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
5892 char __user *optval, int __user *optlen)
5893 {
5894 struct sctp_paddrparams params;
5895 struct sctp_transport *trans = NULL;
5896 struct sctp_association *asoc = NULL;
5897 struct sctp_sock *sp = sctp_sk(sk);
5898
5899 if (len >= sizeof(params))
5900 len = sizeof(params);
5901 else if (len >= ALIGN(offsetof(struct sctp_paddrparams,
5902 spp_ipv6_flowlabel), 4))
5903 len = ALIGN(offsetof(struct sctp_paddrparams,
5904 spp_ipv6_flowlabel), 4);
5905 else
5906 return -EINVAL;
5907
5908 if (copy_from_user(¶ms, optval, len))
5909 return -EFAULT;
5910
5911
5912
5913
5914 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) {
5915 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
5916 params.spp_assoc_id);
5917 if (!trans) {
5918 pr_debug("%s: failed no transport\n", __func__);
5919 return -EINVAL;
5920 }
5921 }
5922
5923
5924
5925
5926
5927 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
5928 if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC &&
5929 sctp_style(sk, UDP)) {
5930 pr_debug("%s: failed no association\n", __func__);
5931 return -EINVAL;
5932 }
5933
5934 if (trans) {
5935
5936 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
5937 params.spp_pathmtu = trans->pathmtu;
5938 params.spp_pathmaxrxt = trans->pathmaxrxt;
5939 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay);
5940
5941
5942 params.spp_flags = trans->param_flags;
5943 if (trans->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
5944 params.spp_ipv6_flowlabel = trans->flowlabel &
5945 SCTP_FLOWLABEL_VAL_MASK;
5946 params.spp_flags |= SPP_IPV6_FLOWLABEL;
5947 }
5948 if (trans->dscp & SCTP_DSCP_SET_MASK) {
5949 params.spp_dscp = trans->dscp & SCTP_DSCP_VAL_MASK;
5950 params.spp_flags |= SPP_DSCP;
5951 }
5952 } else if (asoc) {
5953
5954 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
5955 params.spp_pathmtu = asoc->pathmtu;
5956 params.spp_pathmaxrxt = asoc->pathmaxrxt;
5957 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay);
5958
5959
5960 params.spp_flags = asoc->param_flags;
5961 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
5962 params.spp_ipv6_flowlabel = asoc->flowlabel &
5963 SCTP_FLOWLABEL_VAL_MASK;
5964 params.spp_flags |= SPP_IPV6_FLOWLABEL;
5965 }
5966 if (asoc->dscp & SCTP_DSCP_SET_MASK) {
5967 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK;
5968 params.spp_flags |= SPP_DSCP;
5969 }
5970 } else {
5971
5972 params.spp_hbinterval = sp->hbinterval;
5973 params.spp_pathmtu = sp->pathmtu;
5974 params.spp_sackdelay = sp->sackdelay;
5975 params.spp_pathmaxrxt = sp->pathmaxrxt;
5976
5977
5978 params.spp_flags = sp->param_flags;
5979 if (sp->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
5980 params.spp_ipv6_flowlabel = sp->flowlabel &
5981 SCTP_FLOWLABEL_VAL_MASK;
5982 params.spp_flags |= SPP_IPV6_FLOWLABEL;
5983 }
5984 if (sp->dscp & SCTP_DSCP_SET_MASK) {
5985 params.spp_dscp = sp->dscp & SCTP_DSCP_VAL_MASK;
5986 params.spp_flags |= SPP_DSCP;
5987 }
5988 }
5989
5990 if (copy_to_user(optval, ¶ms, len))
5991 return -EFAULT;
5992
5993 if (put_user(len, optlen))
5994 return -EFAULT;
5995
5996 return 0;
5997 }
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034 static int sctp_getsockopt_delayed_ack(struct sock *sk, int len,
6035 char __user *optval,
6036 int __user *optlen)
6037 {
6038 struct sctp_sack_info params;
6039 struct sctp_association *asoc = NULL;
6040 struct sctp_sock *sp = sctp_sk(sk);
6041
6042 if (len >= sizeof(struct sctp_sack_info)) {
6043 len = sizeof(struct sctp_sack_info);
6044
6045 if (copy_from_user(¶ms, optval, len))
6046 return -EFAULT;
6047 } else if (len == sizeof(struct sctp_assoc_value)) {
6048 pr_warn_ratelimited(DEPRECATED
6049 "%s (pid %d) "
6050 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
6051 "Use struct sctp_sack_info instead\n",
6052 current->comm, task_pid_nr(current));
6053 if (copy_from_user(¶ms, optval, len))
6054 return -EFAULT;
6055 } else
6056 return -EINVAL;
6057
6058
6059
6060
6061
6062 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
6063 if (!asoc && params.sack_assoc_id != SCTP_FUTURE_ASSOC &&
6064 sctp_style(sk, UDP))
6065 return -EINVAL;
6066
6067 if (asoc) {
6068
6069 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) {
6070 params.sack_delay = jiffies_to_msecs(asoc->sackdelay);
6071 params.sack_freq = asoc->sackfreq;
6072
6073 } else {
6074 params.sack_delay = 0;
6075 params.sack_freq = 1;
6076 }
6077 } else {
6078
6079 if (sp->param_flags & SPP_SACKDELAY_ENABLE) {
6080 params.sack_delay = sp->sackdelay;
6081 params.sack_freq = sp->sackfreq;
6082 } else {
6083 params.sack_delay = 0;
6084 params.sack_freq = 1;
6085 }
6086 }
6087
6088 if (copy_to_user(optval, ¶ms, len))
6089 return -EFAULT;
6090
6091 if (put_user(len, optlen))
6092 return -EFAULT;
6093
6094 return 0;
6095 }
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108 static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
6109 {
6110 if (len < sizeof(struct sctp_initmsg))
6111 return -EINVAL;
6112 len = sizeof(struct sctp_initmsg);
6113 if (put_user(len, optlen))
6114 return -EFAULT;
6115 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
6116 return -EFAULT;
6117 return 0;
6118 }
6119
6120
6121 static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
6122 char __user *optval, int __user *optlen)
6123 {
6124 struct sctp_association *asoc;
6125 int cnt = 0;
6126 struct sctp_getaddrs getaddrs;
6127 struct sctp_transport *from;
6128 void __user *to;
6129 union sctp_addr temp;
6130 struct sctp_sock *sp = sctp_sk(sk);
6131 int addrlen;
6132 size_t space_left;
6133 int bytes_copied;
6134
6135 if (len < sizeof(struct sctp_getaddrs))
6136 return -EINVAL;
6137
6138 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
6139 return -EFAULT;
6140
6141
6142 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
6143 if (!asoc)
6144 return -EINVAL;
6145
6146 to = optval + offsetof(struct sctp_getaddrs, addrs);
6147 space_left = len - offsetof(struct sctp_getaddrs, addrs);
6148
6149 list_for_each_entry(from, &asoc->peer.transport_addr_list,
6150 transports) {
6151 memcpy(&temp, &from->ipaddr, sizeof(temp));
6152 addrlen = sctp_get_pf_specific(sk->sk_family)
6153 ->addr_to_user(sp, &temp);
6154 if (space_left < addrlen)
6155 return -ENOMEM;
6156 if (copy_to_user(to, &temp, addrlen))
6157 return -EFAULT;
6158 to += addrlen;
6159 cnt++;
6160 space_left -= addrlen;
6161 }
6162
6163 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num))
6164 return -EFAULT;
6165 bytes_copied = ((char __user *)to) - optval;
6166 if (put_user(bytes_copied, optlen))
6167 return -EFAULT;
6168
6169 return 0;
6170 }
6171
6172 static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
6173 size_t space_left, int *bytes_copied)
6174 {
6175 struct sctp_sockaddr_entry *addr;
6176 union sctp_addr temp;
6177 int cnt = 0;
6178 int addrlen;
6179 struct net *net = sock_net(sk);
6180
6181 rcu_read_lock();
6182 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
6183 if (!addr->valid)
6184 continue;
6185
6186 if ((PF_INET == sk->sk_family) &&
6187 (AF_INET6 == addr->a.sa.sa_family))
6188 continue;
6189 if ((PF_INET6 == sk->sk_family) &&
6190 inet_v6_ipv6only(sk) &&
6191 (AF_INET == addr->a.sa.sa_family))
6192 continue;
6193 memcpy(&temp, &addr->a, sizeof(temp));
6194 if (!temp.v4.sin_port)
6195 temp.v4.sin_port = htons(port);
6196
6197 addrlen = sctp_get_pf_specific(sk->sk_family)
6198 ->addr_to_user(sctp_sk(sk), &temp);
6199
6200 if (space_left < addrlen) {
6201 cnt = -ENOMEM;
6202 break;
6203 }
6204 memcpy(to, &temp, addrlen);
6205
6206 to += addrlen;
6207 cnt++;
6208 space_left -= addrlen;
6209 *bytes_copied += addrlen;
6210 }
6211 rcu_read_unlock();
6212
6213 return cnt;
6214 }
6215
6216
6217 static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
6218 char __user *optval, int __user *optlen)
6219 {
6220 struct sctp_bind_addr *bp;
6221 struct sctp_association *asoc;
6222 int cnt = 0;
6223 struct sctp_getaddrs getaddrs;
6224 struct sctp_sockaddr_entry *addr;
6225 void __user *to;
6226 union sctp_addr temp;
6227 struct sctp_sock *sp = sctp_sk(sk);
6228 int addrlen;
6229 int err = 0;
6230 size_t space_left;
6231 int bytes_copied = 0;
6232 void *addrs;
6233 void *buf;
6234
6235 if (len < sizeof(struct sctp_getaddrs))
6236 return -EINVAL;
6237
6238 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
6239 return -EFAULT;
6240
6241
6242
6243
6244
6245
6246
6247 if (0 == getaddrs.assoc_id) {
6248 bp = &sctp_sk(sk)->ep->base.bind_addr;
6249 } else {
6250 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
6251 if (!asoc)
6252 return -EINVAL;
6253 bp = &asoc->base.bind_addr;
6254 }
6255
6256 to = optval + offsetof(struct sctp_getaddrs, addrs);
6257 space_left = len - offsetof(struct sctp_getaddrs, addrs);
6258
6259 addrs = kmalloc(space_left, GFP_USER | __GFP_NOWARN);
6260 if (!addrs)
6261 return -ENOMEM;
6262
6263
6264
6265
6266 if (sctp_list_single_entry(&bp->address_list)) {
6267 addr = list_entry(bp->address_list.next,
6268 struct sctp_sockaddr_entry, list);
6269 if (sctp_is_any(sk, &addr->a)) {
6270 cnt = sctp_copy_laddrs(sk, bp->port, addrs,
6271 space_left, &bytes_copied);
6272 if (cnt < 0) {
6273 err = cnt;
6274 goto out;
6275 }
6276 goto copy_getaddrs;
6277 }
6278 }
6279
6280 buf = addrs;
6281
6282
6283
6284
6285 list_for_each_entry(addr, &bp->address_list, list) {
6286 memcpy(&temp, &addr->a, sizeof(temp));
6287 addrlen = sctp_get_pf_specific(sk->sk_family)
6288 ->addr_to_user(sp, &temp);
6289 if (space_left < addrlen) {
6290 err = -ENOMEM;
6291 goto out;
6292 }
6293 memcpy(buf, &temp, addrlen);
6294 buf += addrlen;
6295 bytes_copied += addrlen;
6296 cnt++;
6297 space_left -= addrlen;
6298 }
6299
6300 copy_getaddrs:
6301 if (copy_to_user(to, addrs, bytes_copied)) {
6302 err = -EFAULT;
6303 goto out;
6304 }
6305 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) {
6306 err = -EFAULT;
6307 goto out;
6308 }
6309
6310
6311
6312 if (put_user(bytes_copied, optlen))
6313 err = -EFAULT;
6314 out:
6315 kfree(addrs);
6316 return err;
6317 }
6318
6319
6320
6321
6322
6323
6324
6325 static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
6326 char __user *optval, int __user *optlen)
6327 {
6328 struct sctp_prim prim;
6329 struct sctp_association *asoc;
6330 struct sctp_sock *sp = sctp_sk(sk);
6331
6332 if (len < sizeof(struct sctp_prim))
6333 return -EINVAL;
6334
6335 len = sizeof(struct sctp_prim);
6336
6337 if (copy_from_user(&prim, optval, len))
6338 return -EFAULT;
6339
6340 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
6341 if (!asoc)
6342 return -EINVAL;
6343
6344 if (!asoc->peer.primary_path)
6345 return -ENOTCONN;
6346
6347 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
6348 asoc->peer.primary_path->af_specific->sockaddr_len);
6349
6350 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp,
6351 (union sctp_addr *)&prim.ssp_addr);
6352
6353 if (put_user(len, optlen))
6354 return -EFAULT;
6355 if (copy_to_user(optval, &prim, len))
6356 return -EFAULT;
6357
6358 return 0;
6359 }
6360
6361
6362
6363
6364
6365
6366
6367 static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
6368 char __user *optval, int __user *optlen)
6369 {
6370 struct sctp_setadaptation adaptation;
6371
6372 if (len < sizeof(struct sctp_setadaptation))
6373 return -EINVAL;
6374
6375 len = sizeof(struct sctp_setadaptation);
6376
6377 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
6378
6379 if (put_user(len, optlen))
6380 return -EFAULT;
6381 if (copy_to_user(optval, &adaptation, len))
6382 return -EFAULT;
6383
6384 return 0;
6385 }
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406 static int sctp_getsockopt_default_send_param(struct sock *sk,
6407 int len, char __user *optval,
6408 int __user *optlen)
6409 {
6410 struct sctp_sock *sp = sctp_sk(sk);
6411 struct sctp_association *asoc;
6412 struct sctp_sndrcvinfo info;
6413
6414 if (len < sizeof(info))
6415 return -EINVAL;
6416
6417 len = sizeof(info);
6418
6419 if (copy_from_user(&info, optval, len))
6420 return -EFAULT;
6421
6422 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
6423 if (!asoc && info.sinfo_assoc_id != SCTP_FUTURE_ASSOC &&
6424 sctp_style(sk, UDP))
6425 return -EINVAL;
6426
6427 if (asoc) {
6428 info.sinfo_stream = asoc->default_stream;
6429 info.sinfo_flags = asoc->default_flags;
6430 info.sinfo_ppid = asoc->default_ppid;
6431 info.sinfo_context = asoc->default_context;
6432 info.sinfo_timetolive = asoc->default_timetolive;
6433 } else {
6434 info.sinfo_stream = sp->default_stream;
6435 info.sinfo_flags = sp->default_flags;
6436 info.sinfo_ppid = sp->default_ppid;
6437 info.sinfo_context = sp->default_context;
6438 info.sinfo_timetolive = sp->default_timetolive;
6439 }
6440
6441 if (put_user(len, optlen))
6442 return -EFAULT;
6443 if (copy_to_user(optval, &info, len))
6444 return -EFAULT;
6445
6446 return 0;
6447 }
6448
6449
6450
6451
6452 static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len,
6453 char __user *optval,
6454 int __user *optlen)
6455 {
6456 struct sctp_sock *sp = sctp_sk(sk);
6457 struct sctp_association *asoc;
6458 struct sctp_sndinfo info;
6459
6460 if (len < sizeof(info))
6461 return -EINVAL;
6462
6463 len = sizeof(info);
6464
6465 if (copy_from_user(&info, optval, len))
6466 return -EFAULT;
6467
6468 asoc = sctp_id2assoc(sk, info.snd_assoc_id);
6469 if (!asoc && info.snd_assoc_id != SCTP_FUTURE_ASSOC &&
6470 sctp_style(sk, UDP))
6471 return -EINVAL;
6472
6473 if (asoc) {
6474 info.snd_sid = asoc->default_stream;
6475 info.snd_flags = asoc->default_flags;
6476 info.snd_ppid = asoc->default_ppid;
6477 info.snd_context = asoc->default_context;
6478 } else {
6479 info.snd_sid = sp->default_stream;
6480 info.snd_flags = sp->default_flags;
6481 info.snd_ppid = sp->default_ppid;
6482 info.snd_context = sp->default_context;
6483 }
6484
6485 if (put_user(len, optlen))
6486 return -EFAULT;
6487 if (copy_to_user(optval, &info, len))
6488 return -EFAULT;
6489
6490 return 0;
6491 }
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503 static int sctp_getsockopt_nodelay(struct sock *sk, int len,
6504 char __user *optval, int __user *optlen)
6505 {
6506 int val;
6507
6508 if (len < sizeof(int))
6509 return -EINVAL;
6510
6511 len = sizeof(int);
6512 val = (sctp_sk(sk)->nodelay == 1);
6513 if (put_user(len, optlen))
6514 return -EFAULT;
6515 if (copy_to_user(optval, &val, len))
6516 return -EFAULT;
6517 return 0;
6518 }
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532 static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
6533 char __user *optval,
6534 int __user *optlen) {
6535 struct sctp_rtoinfo rtoinfo;
6536 struct sctp_association *asoc;
6537
6538 if (len < sizeof (struct sctp_rtoinfo))
6539 return -EINVAL;
6540
6541 len = sizeof(struct sctp_rtoinfo);
6542
6543 if (copy_from_user(&rtoinfo, optval, len))
6544 return -EFAULT;
6545
6546 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
6547
6548 if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC &&
6549 sctp_style(sk, UDP))
6550 return -EINVAL;
6551
6552
6553 if (asoc) {
6554 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial);
6555 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max);
6556 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min);
6557 } else {
6558
6559 struct sctp_sock *sp = sctp_sk(sk);
6560
6561 rtoinfo.srto_initial = sp->rtoinfo.srto_initial;
6562 rtoinfo.srto_max = sp->rtoinfo.srto_max;
6563 rtoinfo.srto_min = sp->rtoinfo.srto_min;
6564 }
6565
6566 if (put_user(len, optlen))
6567 return -EFAULT;
6568
6569 if (copy_to_user(optval, &rtoinfo, len))
6570 return -EFAULT;
6571
6572 return 0;
6573 }
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586 static int sctp_getsockopt_associnfo(struct sock *sk, int len,
6587 char __user *optval,
6588 int __user *optlen)
6589 {
6590
6591 struct sctp_assocparams assocparams;
6592 struct sctp_association *asoc;
6593 struct list_head *pos;
6594 int cnt = 0;
6595
6596 if (len < sizeof (struct sctp_assocparams))
6597 return -EINVAL;
6598
6599 len = sizeof(struct sctp_assocparams);
6600
6601 if (copy_from_user(&assocparams, optval, len))
6602 return -EFAULT;
6603
6604 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
6605
6606 if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
6607 sctp_style(sk, UDP))
6608 return -EINVAL;
6609
6610
6611 if (asoc) {
6612 assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
6613 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
6614 assocparams.sasoc_local_rwnd = asoc->a_rwnd;
6615 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life);
6616
6617 list_for_each(pos, &asoc->peer.transport_addr_list) {
6618 cnt++;
6619 }
6620
6621 assocparams.sasoc_number_peer_destinations = cnt;
6622 } else {
6623
6624 struct sctp_sock *sp = sctp_sk(sk);
6625
6626 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt;
6627 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd;
6628 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd;
6629 assocparams.sasoc_cookie_life =
6630 sp->assocparams.sasoc_cookie_life;
6631 assocparams.sasoc_number_peer_destinations =
6632 sp->assocparams.
6633 sasoc_number_peer_destinations;
6634 }
6635
6636 if (put_user(len, optlen))
6637 return -EFAULT;
6638
6639 if (copy_to_user(optval, &assocparams, len))
6640 return -EFAULT;
6641
6642 return 0;
6643 }
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655 static int sctp_getsockopt_mappedv4(struct sock *sk, int len,
6656 char __user *optval, int __user *optlen)
6657 {
6658 int val;
6659 struct sctp_sock *sp = sctp_sk(sk);
6660
6661 if (len < sizeof(int))
6662 return -EINVAL;
6663
6664 len = sizeof(int);
6665 val = sp->v4mapped;
6666 if (put_user(len, optlen))
6667 return -EFAULT;
6668 if (copy_to_user(optval, &val, len))
6669 return -EFAULT;
6670
6671 return 0;
6672 }
6673
6674
6675
6676
6677
6678 static int sctp_getsockopt_context(struct sock *sk, int len,
6679 char __user *optval, int __user *optlen)
6680 {
6681 struct sctp_assoc_value params;
6682 struct sctp_association *asoc;
6683
6684 if (len < sizeof(struct sctp_assoc_value))
6685 return -EINVAL;
6686
6687 len = sizeof(struct sctp_assoc_value);
6688
6689 if (copy_from_user(¶ms, optval, len))
6690 return -EFAULT;
6691
6692 asoc = sctp_id2assoc(sk, params.assoc_id);
6693 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6694 sctp_style(sk, UDP))
6695 return -EINVAL;
6696
6697 params.assoc_value = asoc ? asoc->default_rcv_context
6698 : sctp_sk(sk)->default_rcv_context;
6699
6700 if (put_user(len, optlen))
6701 return -EFAULT;
6702 if (copy_to_user(optval, ¶ms, len))
6703 return -EFAULT;
6704
6705 return 0;
6706 }
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735 static int sctp_getsockopt_maxseg(struct sock *sk, int len,
6736 char __user *optval, int __user *optlen)
6737 {
6738 struct sctp_assoc_value params;
6739 struct sctp_association *asoc;
6740
6741 if (len == sizeof(int)) {
6742 pr_warn_ratelimited(DEPRECATED
6743 "%s (pid %d) "
6744 "Use of int in maxseg socket option.\n"
6745 "Use struct sctp_assoc_value instead\n",
6746 current->comm, task_pid_nr(current));
6747 params.assoc_id = SCTP_FUTURE_ASSOC;
6748 } else if (len >= sizeof(struct sctp_assoc_value)) {
6749 len = sizeof(struct sctp_assoc_value);
6750 if (copy_from_user(¶ms, optval, len))
6751 return -EFAULT;
6752 } else
6753 return -EINVAL;
6754
6755 asoc = sctp_id2assoc(sk, params.assoc_id);
6756 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6757 sctp_style(sk, UDP))
6758 return -EINVAL;
6759
6760 if (asoc)
6761 params.assoc_value = asoc->frag_point;
6762 else
6763 params.assoc_value = sctp_sk(sk)->user_frag;
6764
6765 if (put_user(len, optlen))
6766 return -EFAULT;
6767 if (len == sizeof(int)) {
6768 if (copy_to_user(optval, ¶ms.assoc_value, len))
6769 return -EFAULT;
6770 } else {
6771 if (copy_to_user(optval, ¶ms, len))
6772 return -EFAULT;
6773 }
6774
6775 return 0;
6776 }
6777
6778
6779
6780
6781
6782 static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len,
6783 char __user *optval, int __user *optlen)
6784 {
6785 int val;
6786
6787 if (len < sizeof(int))
6788 return -EINVAL;
6789
6790 len = sizeof(int);
6791
6792 val = sctp_sk(sk)->frag_interleave;
6793 if (put_user(len, optlen))
6794 return -EFAULT;
6795 if (copy_to_user(optval, &val, len))
6796 return -EFAULT;
6797
6798 return 0;
6799 }
6800
6801
6802
6803
6804
6805 static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
6806 char __user *optval,
6807 int __user *optlen)
6808 {
6809 u32 val;
6810
6811 if (len < sizeof(u32))
6812 return -EINVAL;
6813
6814 len = sizeof(u32);
6815
6816 val = sctp_sk(sk)->pd_point;
6817 if (put_user(len, optlen))
6818 return -EFAULT;
6819 if (copy_to_user(optval, &val, len))
6820 return -EFAULT;
6821
6822 return 0;
6823 }
6824
6825
6826
6827
6828
6829 static int sctp_getsockopt_maxburst(struct sock *sk, int len,
6830 char __user *optval,
6831 int __user *optlen)
6832 {
6833 struct sctp_assoc_value params;
6834 struct sctp_association *asoc;
6835
6836 if (len == sizeof(int)) {
6837 pr_warn_ratelimited(DEPRECATED
6838 "%s (pid %d) "
6839 "Use of int in max_burst socket option.\n"
6840 "Use struct sctp_assoc_value instead\n",
6841 current->comm, task_pid_nr(current));
6842 params.assoc_id = SCTP_FUTURE_ASSOC;
6843 } else if (len >= sizeof(struct sctp_assoc_value)) {
6844 len = sizeof(struct sctp_assoc_value);
6845 if (copy_from_user(¶ms, optval, len))
6846 return -EFAULT;
6847 } else
6848 return -EINVAL;
6849
6850 asoc = sctp_id2assoc(sk, params.assoc_id);
6851 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6852 sctp_style(sk, UDP))
6853 return -EINVAL;
6854
6855 params.assoc_value = asoc ? asoc->max_burst : sctp_sk(sk)->max_burst;
6856
6857 if (len == sizeof(int)) {
6858 if (copy_to_user(optval, ¶ms.assoc_value, len))
6859 return -EFAULT;
6860 } else {
6861 if (copy_to_user(optval, ¶ms, len))
6862 return -EFAULT;
6863 }
6864
6865 return 0;
6866
6867 }
6868
6869 static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
6870 char __user *optval, int __user *optlen)
6871 {
6872 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6873 struct sctp_hmacalgo __user *p = (void __user *)optval;
6874 struct sctp_hmac_algo_param *hmacs;
6875 __u16 data_len = 0;
6876 u32 num_idents;
6877 int i;
6878
6879 if (!ep->auth_enable)
6880 return -EACCES;
6881
6882 hmacs = ep->auth_hmacs_list;
6883 data_len = ntohs(hmacs->param_hdr.length) -
6884 sizeof(struct sctp_paramhdr);
6885
6886 if (len < sizeof(struct sctp_hmacalgo) + data_len)
6887 return -EINVAL;
6888
6889 len = sizeof(struct sctp_hmacalgo) + data_len;
6890 num_idents = data_len / sizeof(u16);
6891
6892 if (put_user(len, optlen))
6893 return -EFAULT;
6894 if (put_user(num_idents, &p->shmac_num_idents))
6895 return -EFAULT;
6896 for (i = 0; i < num_idents; i++) {
6897 __u16 hmacid = ntohs(hmacs->hmac_ids[i]);
6898
6899 if (copy_to_user(&p->shmac_idents[i], &hmacid, sizeof(__u16)))
6900 return -EFAULT;
6901 }
6902 return 0;
6903 }
6904
6905 static int sctp_getsockopt_active_key(struct sock *sk, int len,
6906 char __user *optval, int __user *optlen)
6907 {
6908 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6909 struct sctp_authkeyid val;
6910 struct sctp_association *asoc;
6911
6912 if (len < sizeof(struct sctp_authkeyid))
6913 return -EINVAL;
6914
6915 len = sizeof(struct sctp_authkeyid);
6916 if (copy_from_user(&val, optval, len))
6917 return -EFAULT;
6918
6919 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
6920 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
6921 return -EINVAL;
6922
6923 if (asoc) {
6924 if (!asoc->peer.auth_capable)
6925 return -EACCES;
6926 val.scact_keynumber = asoc->active_key_id;
6927 } else {
6928 if (!ep->auth_enable)
6929 return -EACCES;
6930 val.scact_keynumber = ep->active_key_id;
6931 }
6932
6933 if (put_user(len, optlen))
6934 return -EFAULT;
6935 if (copy_to_user(optval, &val, len))
6936 return -EFAULT;
6937
6938 return 0;
6939 }
6940
6941 static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
6942 char __user *optval, int __user *optlen)
6943 {
6944 struct sctp_authchunks __user *p = (void __user *)optval;
6945 struct sctp_authchunks val;
6946 struct sctp_association *asoc;
6947 struct sctp_chunks_param *ch;
6948 u32 num_chunks = 0;
6949 char __user *to;
6950
6951 if (len < sizeof(struct sctp_authchunks))
6952 return -EINVAL;
6953
6954 if (copy_from_user(&val, optval, sizeof(val)))
6955 return -EFAULT;
6956
6957 to = p->gauth_chunks;
6958 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
6959 if (!asoc)
6960 return -EINVAL;
6961
6962 if (!asoc->peer.auth_capable)
6963 return -EACCES;
6964
6965 ch = asoc->peer.peer_chunks;
6966 if (!ch)
6967 goto num;
6968
6969
6970 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
6971 if (len < num_chunks)
6972 return -EINVAL;
6973
6974 if (copy_to_user(to, ch->chunks, num_chunks))
6975 return -EFAULT;
6976 num:
6977 len = sizeof(struct sctp_authchunks) + num_chunks;
6978 if (put_user(len, optlen))
6979 return -EFAULT;
6980 if (put_user(num_chunks, &p->gauth_number_of_chunks))
6981 return -EFAULT;
6982 return 0;
6983 }
6984
6985 static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
6986 char __user *optval, int __user *optlen)
6987 {
6988 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6989 struct sctp_authchunks __user *p = (void __user *)optval;
6990 struct sctp_authchunks val;
6991 struct sctp_association *asoc;
6992 struct sctp_chunks_param *ch;
6993 u32 num_chunks = 0;
6994 char __user *to;
6995
6996 if (len < sizeof(struct sctp_authchunks))
6997 return -EINVAL;
6998
6999 if (copy_from_user(&val, optval, sizeof(val)))
7000 return -EFAULT;
7001
7002 to = p->gauth_chunks;
7003 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
7004 if (!asoc && val.gauth_assoc_id != SCTP_FUTURE_ASSOC &&
7005 sctp_style(sk, UDP))
7006 return -EINVAL;
7007
7008 if (asoc) {
7009 if (!asoc->peer.auth_capable)
7010 return -EACCES;
7011 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks;
7012 } else {
7013 if (!ep->auth_enable)
7014 return -EACCES;
7015 ch = ep->auth_chunk_list;
7016 }
7017 if (!ch)
7018 goto num;
7019
7020 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
7021 if (len < sizeof(struct sctp_authchunks) + num_chunks)
7022 return -EINVAL;
7023
7024 if (copy_to_user(to, ch->chunks, num_chunks))
7025 return -EFAULT;
7026 num:
7027 len = sizeof(struct sctp_authchunks) + num_chunks;
7028 if (put_user(len, optlen))
7029 return -EFAULT;
7030 if (put_user(num_chunks, &p->gauth_number_of_chunks))
7031 return -EFAULT;
7032
7033 return 0;
7034 }
7035
7036
7037
7038
7039
7040
7041 static int sctp_getsockopt_assoc_number(struct sock *sk, int len,
7042 char __user *optval, int __user *optlen)
7043 {
7044 struct sctp_sock *sp = sctp_sk(sk);
7045 struct sctp_association *asoc;
7046 u32 val = 0;
7047
7048 if (sctp_style(sk, TCP))
7049 return -EOPNOTSUPP;
7050
7051 if (len < sizeof(u32))
7052 return -EINVAL;
7053
7054 len = sizeof(u32);
7055
7056 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7057 val++;
7058 }
7059
7060 if (put_user(len, optlen))
7061 return -EFAULT;
7062 if (copy_to_user(optval, &val, len))
7063 return -EFAULT;
7064
7065 return 0;
7066 }
7067
7068
7069
7070
7071
7072 static int sctp_getsockopt_auto_asconf(struct sock *sk, int len,
7073 char __user *optval, int __user *optlen)
7074 {
7075 int val = 0;
7076
7077 if (len < sizeof(int))
7078 return -EINVAL;
7079
7080 len = sizeof(int);
7081 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk))
7082 val = 1;
7083 if (put_user(len, optlen))
7084 return -EFAULT;
7085 if (copy_to_user(optval, &val, len))
7086 return -EFAULT;
7087 return 0;
7088 }
7089
7090
7091
7092
7093
7094
7095
7096
7097 static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
7098 char __user *optval, int __user *optlen)
7099 {
7100 struct sctp_sock *sp = sctp_sk(sk);
7101 struct sctp_association *asoc;
7102 struct sctp_assoc_ids *ids;
7103 u32 num = 0;
7104
7105 if (sctp_style(sk, TCP))
7106 return -EOPNOTSUPP;
7107
7108 if (len < sizeof(struct sctp_assoc_ids))
7109 return -EINVAL;
7110
7111 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7112 num++;
7113 }
7114
7115 if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num)
7116 return -EINVAL;
7117
7118 len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
7119
7120 ids = kmalloc(len, GFP_USER | __GFP_NOWARN);
7121 if (unlikely(!ids))
7122 return -ENOMEM;
7123
7124 ids->gaids_number_of_ids = num;
7125 num = 0;
7126 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7127 ids->gaids_assoc_id[num++] = asoc->assoc_id;
7128 }
7129
7130 if (put_user(len, optlen) || copy_to_user(optval, ids, len)) {
7131 kfree(ids);
7132 return -EFAULT;
7133 }
7134
7135 kfree(ids);
7136 return 0;
7137 }
7138
7139
7140
7141
7142
7143
7144
7145
7146 static int sctp_getsockopt_paddr_thresholds(struct sock *sk,
7147 char __user *optval, int len,
7148 int __user *optlen, bool v2)
7149 {
7150 struct sctp_paddrthlds_v2 val;
7151 struct sctp_transport *trans;
7152 struct sctp_association *asoc;
7153 int min;
7154
7155 min = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds);
7156 if (len < min)
7157 return -EINVAL;
7158 len = min;
7159 if (copy_from_user(&val, optval, len))
7160 return -EFAULT;
7161
7162 if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
7163 trans = sctp_addr_id2transport(sk, &val.spt_address,
7164 val.spt_assoc_id);
7165 if (!trans)
7166 return -ENOENT;
7167
7168 val.spt_pathmaxrxt = trans->pathmaxrxt;
7169 val.spt_pathpfthld = trans->pf_retrans;
7170 val.spt_pathcpthld = trans->ps_retrans;
7171
7172 goto out;
7173 }
7174
7175 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
7176 if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC &&
7177 sctp_style(sk, UDP))
7178 return -EINVAL;
7179
7180 if (asoc) {
7181 val.spt_pathpfthld = asoc->pf_retrans;
7182 val.spt_pathmaxrxt = asoc->pathmaxrxt;
7183 val.spt_pathcpthld = asoc->ps_retrans;
7184 } else {
7185 struct sctp_sock *sp = sctp_sk(sk);
7186
7187 val.spt_pathpfthld = sp->pf_retrans;
7188 val.spt_pathmaxrxt = sp->pathmaxrxt;
7189 val.spt_pathcpthld = sp->ps_retrans;
7190 }
7191
7192 out:
7193 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
7194 return -EFAULT;
7195
7196 return 0;
7197 }
7198
7199
7200
7201
7202
7203
7204
7205 static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
7206 char __user *optval,
7207 int __user *optlen)
7208 {
7209 struct sctp_assoc_stats sas;
7210 struct sctp_association *asoc = NULL;
7211
7212
7213 if (len < sizeof(sctp_assoc_t))
7214 return -EINVAL;
7215
7216
7217 len = min_t(size_t, len, sizeof(sas));
7218
7219 if (copy_from_user(&sas, optval, len))
7220 return -EFAULT;
7221
7222 asoc = sctp_id2assoc(sk, sas.sas_assoc_id);
7223 if (!asoc)
7224 return -EINVAL;
7225
7226 sas.sas_rtxchunks = asoc->stats.rtxchunks;
7227 sas.sas_gapcnt = asoc->stats.gapcnt;
7228 sas.sas_outofseqtsns = asoc->stats.outofseqtsns;
7229 sas.sas_osacks = asoc->stats.osacks;
7230 sas.sas_isacks = asoc->stats.isacks;
7231 sas.sas_octrlchunks = asoc->stats.octrlchunks;
7232 sas.sas_ictrlchunks = asoc->stats.ictrlchunks;
7233 sas.sas_oodchunks = asoc->stats.oodchunks;
7234 sas.sas_iodchunks = asoc->stats.iodchunks;
7235 sas.sas_ouodchunks = asoc->stats.ouodchunks;
7236 sas.sas_iuodchunks = asoc->stats.iuodchunks;
7237 sas.sas_idupchunks = asoc->stats.idupchunks;
7238 sas.sas_opackets = asoc->stats.opackets;
7239 sas.sas_ipackets = asoc->stats.ipackets;
7240
7241
7242
7243
7244
7245 sas.sas_maxrto = asoc->stats.max_obs_rto;
7246 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr,
7247 sizeof(struct sockaddr_storage));
7248
7249
7250 asoc->stats.max_obs_rto = asoc->rto_min;
7251
7252 if (put_user(len, optlen))
7253 return -EFAULT;
7254
7255 pr_debug("%s: len:%d, assoc_id:%d\n", __func__, len, sas.sas_assoc_id);
7256
7257 if (copy_to_user(optval, &sas, len))
7258 return -EFAULT;
7259
7260 return 0;
7261 }
7262
7263 static int sctp_getsockopt_recvrcvinfo(struct sock *sk, int len,
7264 char __user *optval,
7265 int __user *optlen)
7266 {
7267 int val = 0;
7268
7269 if (len < sizeof(int))
7270 return -EINVAL;
7271
7272 len = sizeof(int);
7273 if (sctp_sk(sk)->recvrcvinfo)
7274 val = 1;
7275 if (put_user(len, optlen))
7276 return -EFAULT;
7277 if (copy_to_user(optval, &val, len))
7278 return -EFAULT;
7279
7280 return 0;
7281 }
7282
7283 static int sctp_getsockopt_recvnxtinfo(struct sock *sk, int len,
7284 char __user *optval,
7285 int __user *optlen)
7286 {
7287 int val = 0;
7288
7289 if (len < sizeof(int))
7290 return -EINVAL;
7291
7292 len = sizeof(int);
7293 if (sctp_sk(sk)->recvnxtinfo)
7294 val = 1;
7295 if (put_user(len, optlen))
7296 return -EFAULT;
7297 if (copy_to_user(optval, &val, len))
7298 return -EFAULT;
7299
7300 return 0;
7301 }
7302
7303 static int sctp_getsockopt_pr_supported(struct sock *sk, int len,
7304 char __user *optval,
7305 int __user *optlen)
7306 {
7307 struct sctp_assoc_value params;
7308 struct sctp_association *asoc;
7309 int retval = -EFAULT;
7310
7311 if (len < sizeof(params)) {
7312 retval = -EINVAL;
7313 goto out;
7314 }
7315
7316 len = sizeof(params);
7317 if (copy_from_user(¶ms, optval, len))
7318 goto out;
7319
7320 asoc = sctp_id2assoc(sk, params.assoc_id);
7321 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7322 sctp_style(sk, UDP)) {
7323 retval = -EINVAL;
7324 goto out;
7325 }
7326
7327 params.assoc_value = asoc ? asoc->peer.prsctp_capable
7328 : sctp_sk(sk)->ep->prsctp_enable;
7329
7330 if (put_user(len, optlen))
7331 goto out;
7332
7333 if (copy_to_user(optval, ¶ms, len))
7334 goto out;
7335
7336 retval = 0;
7337
7338 out:
7339 return retval;
7340 }
7341
7342 static int sctp_getsockopt_default_prinfo(struct sock *sk, int len,
7343 char __user *optval,
7344 int __user *optlen)
7345 {
7346 struct sctp_default_prinfo info;
7347 struct sctp_association *asoc;
7348 int retval = -EFAULT;
7349
7350 if (len < sizeof(info)) {
7351 retval = -EINVAL;
7352 goto out;
7353 }
7354
7355 len = sizeof(info);
7356 if (copy_from_user(&info, optval, len))
7357 goto out;
7358
7359 asoc = sctp_id2assoc(sk, info.pr_assoc_id);
7360 if (!asoc && info.pr_assoc_id != SCTP_FUTURE_ASSOC &&
7361 sctp_style(sk, UDP)) {
7362 retval = -EINVAL;
7363 goto out;
7364 }
7365
7366 if (asoc) {
7367 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags);
7368 info.pr_value = asoc->default_timetolive;
7369 } else {
7370 struct sctp_sock *sp = sctp_sk(sk);
7371
7372 info.pr_policy = SCTP_PR_POLICY(sp->default_flags);
7373 info.pr_value = sp->default_timetolive;
7374 }
7375
7376 if (put_user(len, optlen))
7377 goto out;
7378
7379 if (copy_to_user(optval, &info, len))
7380 goto out;
7381
7382 retval = 0;
7383
7384 out:
7385 return retval;
7386 }
7387
7388 static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len,
7389 char __user *optval,
7390 int __user *optlen)
7391 {
7392 struct sctp_prstatus params;
7393 struct sctp_association *asoc;
7394 int policy;
7395 int retval = -EINVAL;
7396
7397 if (len < sizeof(params))
7398 goto out;
7399
7400 len = sizeof(params);
7401 if (copy_from_user(¶ms, optval, len)) {
7402 retval = -EFAULT;
7403 goto out;
7404 }
7405
7406 policy = params.sprstat_policy;
7407 if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) ||
7408 ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK)))
7409 goto out;
7410
7411 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
7412 if (!asoc)
7413 goto out;
7414
7415 if (policy == SCTP_PR_SCTP_ALL) {
7416 params.sprstat_abandoned_unsent = 0;
7417 params.sprstat_abandoned_sent = 0;
7418 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
7419 params.sprstat_abandoned_unsent +=
7420 asoc->abandoned_unsent[policy];
7421 params.sprstat_abandoned_sent +=
7422 asoc->abandoned_sent[policy];
7423 }
7424 } else {
7425 params.sprstat_abandoned_unsent =
7426 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)];
7427 params.sprstat_abandoned_sent =
7428 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)];
7429 }
7430
7431 if (put_user(len, optlen)) {
7432 retval = -EFAULT;
7433 goto out;
7434 }
7435
7436 if (copy_to_user(optval, ¶ms, len)) {
7437 retval = -EFAULT;
7438 goto out;
7439 }
7440
7441 retval = 0;
7442
7443 out:
7444 return retval;
7445 }
7446
7447 static int sctp_getsockopt_pr_streamstatus(struct sock *sk, int len,
7448 char __user *optval,
7449 int __user *optlen)
7450 {
7451 struct sctp_stream_out_ext *streamoute;
7452 struct sctp_association *asoc;
7453 struct sctp_prstatus params;
7454 int retval = -EINVAL;
7455 int policy;
7456
7457 if (len < sizeof(params))
7458 goto out;
7459
7460 len = sizeof(params);
7461 if (copy_from_user(¶ms, optval, len)) {
7462 retval = -EFAULT;
7463 goto out;
7464 }
7465
7466 policy = params.sprstat_policy;
7467 if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) ||
7468 ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK)))
7469 goto out;
7470
7471 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
7472 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt)
7473 goto out;
7474
7475 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext;
7476 if (!streamoute) {
7477
7478 params.sprstat_abandoned_unsent = 0;
7479 params.sprstat_abandoned_sent = 0;
7480 retval = 0;
7481 goto out;
7482 }
7483
7484 if (policy == SCTP_PR_SCTP_ALL) {
7485 params.sprstat_abandoned_unsent = 0;
7486 params.sprstat_abandoned_sent = 0;
7487 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
7488 params.sprstat_abandoned_unsent +=
7489 streamoute->abandoned_unsent[policy];
7490 params.sprstat_abandoned_sent +=
7491 streamoute->abandoned_sent[policy];
7492 }
7493 } else {
7494 params.sprstat_abandoned_unsent =
7495 streamoute->abandoned_unsent[__SCTP_PR_INDEX(policy)];
7496 params.sprstat_abandoned_sent =
7497 streamoute->abandoned_sent[__SCTP_PR_INDEX(policy)];
7498 }
7499
7500 if (put_user(len, optlen) || copy_to_user(optval, ¶ms, len)) {
7501 retval = -EFAULT;
7502 goto out;
7503 }
7504
7505 retval = 0;
7506
7507 out:
7508 return retval;
7509 }
7510
7511 static int sctp_getsockopt_reconfig_supported(struct sock *sk, int len,
7512 char __user *optval,
7513 int __user *optlen)
7514 {
7515 struct sctp_assoc_value params;
7516 struct sctp_association *asoc;
7517 int retval = -EFAULT;
7518
7519 if (len < sizeof(params)) {
7520 retval = -EINVAL;
7521 goto out;
7522 }
7523
7524 len = sizeof(params);
7525 if (copy_from_user(¶ms, optval, len))
7526 goto out;
7527
7528 asoc = sctp_id2assoc(sk, params.assoc_id);
7529 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7530 sctp_style(sk, UDP)) {
7531 retval = -EINVAL;
7532 goto out;
7533 }
7534
7535 params.assoc_value = asoc ? asoc->peer.reconf_capable
7536 : sctp_sk(sk)->ep->reconf_enable;
7537
7538 if (put_user(len, optlen))
7539 goto out;
7540
7541 if (copy_to_user(optval, ¶ms, len))
7542 goto out;
7543
7544 retval = 0;
7545
7546 out:
7547 return retval;
7548 }
7549
7550 static int sctp_getsockopt_enable_strreset(struct sock *sk, int len,
7551 char __user *optval,
7552 int __user *optlen)
7553 {
7554 struct sctp_assoc_value params;
7555 struct sctp_association *asoc;
7556 int retval = -EFAULT;
7557
7558 if (len < sizeof(params)) {
7559 retval = -EINVAL;
7560 goto out;
7561 }
7562
7563 len = sizeof(params);
7564 if (copy_from_user(¶ms, optval, len))
7565 goto out;
7566
7567 asoc = sctp_id2assoc(sk, params.assoc_id);
7568 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7569 sctp_style(sk, UDP)) {
7570 retval = -EINVAL;
7571 goto out;
7572 }
7573
7574 params.assoc_value = asoc ? asoc->strreset_enable
7575 : sctp_sk(sk)->ep->strreset_enable;
7576
7577 if (put_user(len, optlen))
7578 goto out;
7579
7580 if (copy_to_user(optval, ¶ms, len))
7581 goto out;
7582
7583 retval = 0;
7584
7585 out:
7586 return retval;
7587 }
7588
7589 static int sctp_getsockopt_scheduler(struct sock *sk, int len,
7590 char __user *optval,
7591 int __user *optlen)
7592 {
7593 struct sctp_assoc_value params;
7594 struct sctp_association *asoc;
7595 int retval = -EFAULT;
7596
7597 if (len < sizeof(params)) {
7598 retval = -EINVAL;
7599 goto out;
7600 }
7601
7602 len = sizeof(params);
7603 if (copy_from_user(¶ms, optval, len))
7604 goto out;
7605
7606 asoc = sctp_id2assoc(sk, params.assoc_id);
7607 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7608 sctp_style(sk, UDP)) {
7609 retval = -EINVAL;
7610 goto out;
7611 }
7612
7613 params.assoc_value = asoc ? sctp_sched_get_sched(asoc)
7614 : sctp_sk(sk)->default_ss;
7615
7616 if (put_user(len, optlen))
7617 goto out;
7618
7619 if (copy_to_user(optval, ¶ms, len))
7620 goto out;
7621
7622 retval = 0;
7623
7624 out:
7625 return retval;
7626 }
7627
7628 static int sctp_getsockopt_scheduler_value(struct sock *sk, int len,
7629 char __user *optval,
7630 int __user *optlen)
7631 {
7632 struct sctp_stream_value params;
7633 struct sctp_association *asoc;
7634 int retval = -EFAULT;
7635
7636 if (len < sizeof(params)) {
7637 retval = -EINVAL;
7638 goto out;
7639 }
7640
7641 len = sizeof(params);
7642 if (copy_from_user(¶ms, optval, len))
7643 goto out;
7644
7645 asoc = sctp_id2assoc(sk, params.assoc_id);
7646 if (!asoc) {
7647 retval = -EINVAL;
7648 goto out;
7649 }
7650
7651 retval = sctp_sched_get_value(asoc, params.stream_id,
7652 ¶ms.stream_value);
7653 if (retval)
7654 goto out;
7655
7656 if (put_user(len, optlen)) {
7657 retval = -EFAULT;
7658 goto out;
7659 }
7660
7661 if (copy_to_user(optval, ¶ms, len)) {
7662 retval = -EFAULT;
7663 goto out;
7664 }
7665
7666 out:
7667 return retval;
7668 }
7669
7670 static int sctp_getsockopt_interleaving_supported(struct sock *sk, int len,
7671 char __user *optval,
7672 int __user *optlen)
7673 {
7674 struct sctp_assoc_value params;
7675 struct sctp_association *asoc;
7676 int retval = -EFAULT;
7677
7678 if (len < sizeof(params)) {
7679 retval = -EINVAL;
7680 goto out;
7681 }
7682
7683 len = sizeof(params);
7684 if (copy_from_user(¶ms, optval, len))
7685 goto out;
7686
7687 asoc = sctp_id2assoc(sk, params.assoc_id);
7688 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7689 sctp_style(sk, UDP)) {
7690 retval = -EINVAL;
7691 goto out;
7692 }
7693
7694 params.assoc_value = asoc ? asoc->peer.intl_capable
7695 : sctp_sk(sk)->ep->intl_enable;
7696
7697 if (put_user(len, optlen))
7698 goto out;
7699
7700 if (copy_to_user(optval, ¶ms, len))
7701 goto out;
7702
7703 retval = 0;
7704
7705 out:
7706 return retval;
7707 }
7708
7709 static int sctp_getsockopt_reuse_port(struct sock *sk, int len,
7710 char __user *optval,
7711 int __user *optlen)
7712 {
7713 int val;
7714
7715 if (len < sizeof(int))
7716 return -EINVAL;
7717
7718 len = sizeof(int);
7719 val = sctp_sk(sk)->reuse;
7720 if (put_user(len, optlen))
7721 return -EFAULT;
7722
7723 if (copy_to_user(optval, &val, len))
7724 return -EFAULT;
7725
7726 return 0;
7727 }
7728
7729 static int sctp_getsockopt_event(struct sock *sk, int len, char __user *optval,
7730 int __user *optlen)
7731 {
7732 struct sctp_association *asoc;
7733 struct sctp_event param;
7734 __u16 subscribe;
7735
7736 if (len < sizeof(param))
7737 return -EINVAL;
7738
7739 len = sizeof(param);
7740 if (copy_from_user(¶m, optval, len))
7741 return -EFAULT;
7742
7743 if (param.se_type < SCTP_SN_TYPE_BASE ||
7744 param.se_type > SCTP_SN_TYPE_MAX)
7745 return -EINVAL;
7746
7747 asoc = sctp_id2assoc(sk, param.se_assoc_id);
7748 if (!asoc && param.se_assoc_id != SCTP_FUTURE_ASSOC &&
7749 sctp_style(sk, UDP))
7750 return -EINVAL;
7751
7752 subscribe = asoc ? asoc->subscribe : sctp_sk(sk)->subscribe;
7753 param.se_on = sctp_ulpevent_type_enabled(subscribe, param.se_type);
7754
7755 if (put_user(len, optlen))
7756 return -EFAULT;
7757
7758 if (copy_to_user(optval, ¶m, len))
7759 return -EFAULT;
7760
7761 return 0;
7762 }
7763
7764 static int sctp_getsockopt_asconf_supported(struct sock *sk, int len,
7765 char __user *optval,
7766 int __user *optlen)
7767 {
7768 struct sctp_assoc_value params;
7769 struct sctp_association *asoc;
7770 int retval = -EFAULT;
7771
7772 if (len < sizeof(params)) {
7773 retval = -EINVAL;
7774 goto out;
7775 }
7776
7777 len = sizeof(params);
7778 if (copy_from_user(¶ms, optval, len))
7779 goto out;
7780
7781 asoc = sctp_id2assoc(sk, params.assoc_id);
7782 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7783 sctp_style(sk, UDP)) {
7784 retval = -EINVAL;
7785 goto out;
7786 }
7787
7788 params.assoc_value = asoc ? asoc->peer.asconf_capable
7789 : sctp_sk(sk)->ep->asconf_enable;
7790
7791 if (put_user(len, optlen))
7792 goto out;
7793
7794 if (copy_to_user(optval, ¶ms, len))
7795 goto out;
7796
7797 retval = 0;
7798
7799 out:
7800 return retval;
7801 }
7802
7803 static int sctp_getsockopt_auth_supported(struct sock *sk, int len,
7804 char __user *optval,
7805 int __user *optlen)
7806 {
7807 struct sctp_assoc_value params;
7808 struct sctp_association *asoc;
7809 int retval = -EFAULT;
7810
7811 if (len < sizeof(params)) {
7812 retval = -EINVAL;
7813 goto out;
7814 }
7815
7816 len = sizeof(params);
7817 if (copy_from_user(¶ms, optval, len))
7818 goto out;
7819
7820 asoc = sctp_id2assoc(sk, params.assoc_id);
7821 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7822 sctp_style(sk, UDP)) {
7823 retval = -EINVAL;
7824 goto out;
7825 }
7826
7827 params.assoc_value = asoc ? asoc->peer.auth_capable
7828 : sctp_sk(sk)->ep->auth_enable;
7829
7830 if (put_user(len, optlen))
7831 goto out;
7832
7833 if (copy_to_user(optval, ¶ms, len))
7834 goto out;
7835
7836 retval = 0;
7837
7838 out:
7839 return retval;
7840 }
7841
7842 static int sctp_getsockopt_ecn_supported(struct sock *sk, int len,
7843 char __user *optval,
7844 int __user *optlen)
7845 {
7846 struct sctp_assoc_value params;
7847 struct sctp_association *asoc;
7848 int retval = -EFAULT;
7849
7850 if (len < sizeof(params)) {
7851 retval = -EINVAL;
7852 goto out;
7853 }
7854
7855 len = sizeof(params);
7856 if (copy_from_user(¶ms, optval, len))
7857 goto out;
7858
7859 asoc = sctp_id2assoc(sk, params.assoc_id);
7860 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7861 sctp_style(sk, UDP)) {
7862 retval = -EINVAL;
7863 goto out;
7864 }
7865
7866 params.assoc_value = asoc ? asoc->peer.ecn_capable
7867 : sctp_sk(sk)->ep->ecn_enable;
7868
7869 if (put_user(len, optlen))
7870 goto out;
7871
7872 if (copy_to_user(optval, ¶ms, len))
7873 goto out;
7874
7875 retval = 0;
7876
7877 out:
7878 return retval;
7879 }
7880
7881 static int sctp_getsockopt_pf_expose(struct sock *sk, int len,
7882 char __user *optval,
7883 int __user *optlen)
7884 {
7885 struct sctp_assoc_value params;
7886 struct sctp_association *asoc;
7887 int retval = -EFAULT;
7888
7889 if (len < sizeof(params)) {
7890 retval = -EINVAL;
7891 goto out;
7892 }
7893
7894 len = sizeof(params);
7895 if (copy_from_user(¶ms, optval, len))
7896 goto out;
7897
7898 asoc = sctp_id2assoc(sk, params.assoc_id);
7899 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7900 sctp_style(sk, UDP)) {
7901 retval = -EINVAL;
7902 goto out;
7903 }
7904
7905 params.assoc_value = asoc ? asoc->pf_expose
7906 : sctp_sk(sk)->pf_expose;
7907
7908 if (put_user(len, optlen))
7909 goto out;
7910
7911 if (copy_to_user(optval, ¶ms, len))
7912 goto out;
7913
7914 retval = 0;
7915
7916 out:
7917 return retval;
7918 }
7919
7920 static int sctp_getsockopt_encap_port(struct sock *sk, int len,
7921 char __user *optval, int __user *optlen)
7922 {
7923 struct sctp_association *asoc;
7924 struct sctp_udpencaps encap;
7925 struct sctp_transport *t;
7926 __be16 encap_port;
7927
7928 if (len < sizeof(encap))
7929 return -EINVAL;
7930
7931 len = sizeof(encap);
7932 if (copy_from_user(&encap, optval, len))
7933 return -EFAULT;
7934
7935
7936
7937
7938 if (!sctp_is_any(sk, (union sctp_addr *)&encap.sue_address)) {
7939 t = sctp_addr_id2transport(sk, &encap.sue_address,
7940 encap.sue_assoc_id);
7941 if (!t) {
7942 pr_debug("%s: failed no transport\n", __func__);
7943 return -EINVAL;
7944 }
7945
7946 encap_port = t->encap_port;
7947 goto out;
7948 }
7949
7950
7951
7952
7953
7954 asoc = sctp_id2assoc(sk, encap.sue_assoc_id);
7955 if (!asoc && encap.sue_assoc_id != SCTP_FUTURE_ASSOC &&
7956 sctp_style(sk, UDP)) {
7957 pr_debug("%s: failed no association\n", __func__);
7958 return -EINVAL;
7959 }
7960
7961 if (asoc) {
7962 encap_port = asoc->encap_port;
7963 goto out;
7964 }
7965
7966 encap_port = sctp_sk(sk)->encap_port;
7967
7968 out:
7969 encap.sue_port = (__force uint16_t)encap_port;
7970 if (copy_to_user(optval, &encap, len))
7971 return -EFAULT;
7972
7973 if (put_user(len, optlen))
7974 return -EFAULT;
7975
7976 return 0;
7977 }
7978
7979 static int sctp_getsockopt_probe_interval(struct sock *sk, int len,
7980 char __user *optval,
7981 int __user *optlen)
7982 {
7983 struct sctp_probeinterval params;
7984 struct sctp_association *asoc;
7985 struct sctp_transport *t;
7986 __u32 probe_interval;
7987
7988 if (len < sizeof(params))
7989 return -EINVAL;
7990
7991 len = sizeof(params);
7992 if (copy_from_user(¶ms, optval, len))
7993 return -EFAULT;
7994
7995
7996
7997
7998 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spi_address)) {
7999 t = sctp_addr_id2transport(sk, ¶ms.spi_address,
8000 params.spi_assoc_id);
8001 if (!t) {
8002 pr_debug("%s: failed no transport\n", __func__);
8003 return -EINVAL;
8004 }
8005
8006 probe_interval = jiffies_to_msecs(t->probe_interval);
8007 goto out;
8008 }
8009
8010
8011
8012
8013
8014 asoc = sctp_id2assoc(sk, params.spi_assoc_id);
8015 if (!asoc && params.spi_assoc_id != SCTP_FUTURE_ASSOC &&
8016 sctp_style(sk, UDP)) {
8017 pr_debug("%s: failed no association\n", __func__);
8018 return -EINVAL;
8019 }
8020
8021 if (asoc) {
8022 probe_interval = jiffies_to_msecs(asoc->probe_interval);
8023 goto out;
8024 }
8025
8026 probe_interval = sctp_sk(sk)->probe_interval;
8027
8028 out:
8029 params.spi_interval = probe_interval;
8030 if (copy_to_user(optval, ¶ms, len))
8031 return -EFAULT;
8032
8033 if (put_user(len, optlen))
8034 return -EFAULT;
8035
8036 return 0;
8037 }
8038
8039 static int sctp_getsockopt(struct sock *sk, int level, int optname,
8040 char __user *optval, int __user *optlen)
8041 {
8042 int retval = 0;
8043 int len;
8044
8045 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
8046
8047
8048
8049
8050
8051
8052
8053 if (level != SOL_SCTP) {
8054 struct sctp_af *af = sctp_sk(sk)->pf->af;
8055
8056 retval = af->getsockopt(sk, level, optname, optval, optlen);
8057 return retval;
8058 }
8059
8060 if (get_user(len, optlen))
8061 return -EFAULT;
8062
8063 if (len < 0)
8064 return -EINVAL;
8065
8066 lock_sock(sk);
8067
8068 switch (optname) {
8069 case SCTP_STATUS:
8070 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen);
8071 break;
8072 case SCTP_DISABLE_FRAGMENTS:
8073 retval = sctp_getsockopt_disable_fragments(sk, len, optval,
8074 optlen);
8075 break;
8076 case SCTP_EVENTS:
8077 retval = sctp_getsockopt_events(sk, len, optval, optlen);
8078 break;
8079 case SCTP_AUTOCLOSE:
8080 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen);
8081 break;
8082 case SCTP_SOCKOPT_PEELOFF:
8083 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen);
8084 break;
8085 case SCTP_SOCKOPT_PEELOFF_FLAGS:
8086 retval = sctp_getsockopt_peeloff_flags(sk, len, optval, optlen);
8087 break;
8088 case SCTP_PEER_ADDR_PARAMS:
8089 retval = sctp_getsockopt_peer_addr_params(sk, len, optval,
8090 optlen);
8091 break;
8092 case SCTP_DELAYED_SACK:
8093 retval = sctp_getsockopt_delayed_ack(sk, len, optval,
8094 optlen);
8095 break;
8096 case SCTP_INITMSG:
8097 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen);
8098 break;
8099 case SCTP_GET_PEER_ADDRS:
8100 retval = sctp_getsockopt_peer_addrs(sk, len, optval,
8101 optlen);
8102 break;
8103 case SCTP_GET_LOCAL_ADDRS:
8104 retval = sctp_getsockopt_local_addrs(sk, len, optval,
8105 optlen);
8106 break;
8107 case SCTP_SOCKOPT_CONNECTX3:
8108 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen);
8109 break;
8110 case SCTP_DEFAULT_SEND_PARAM:
8111 retval = sctp_getsockopt_default_send_param(sk, len,
8112 optval, optlen);
8113 break;
8114 case SCTP_DEFAULT_SNDINFO:
8115 retval = sctp_getsockopt_default_sndinfo(sk, len,
8116 optval, optlen);
8117 break;
8118 case SCTP_PRIMARY_ADDR:
8119 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen);
8120 break;
8121 case SCTP_NODELAY:
8122 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen);
8123 break;
8124 case SCTP_RTOINFO:
8125 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen);
8126 break;
8127 case SCTP_ASSOCINFO:
8128 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen);
8129 break;
8130 case SCTP_I_WANT_MAPPED_V4_ADDR:
8131 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen);
8132 break;
8133 case SCTP_MAXSEG:
8134 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen);
8135 break;
8136 case SCTP_GET_PEER_ADDR_INFO:
8137 retval = sctp_getsockopt_peer_addr_info(sk, len, optval,
8138 optlen);
8139 break;
8140 case SCTP_ADAPTATION_LAYER:
8141 retval = sctp_getsockopt_adaptation_layer(sk, len, optval,
8142 optlen);
8143 break;
8144 case SCTP_CONTEXT:
8145 retval = sctp_getsockopt_context(sk, len, optval, optlen);
8146 break;
8147 case SCTP_FRAGMENT_INTERLEAVE:
8148 retval = sctp_getsockopt_fragment_interleave(sk, len, optval,
8149 optlen);
8150 break;
8151 case SCTP_PARTIAL_DELIVERY_POINT:
8152 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval,
8153 optlen);
8154 break;
8155 case SCTP_MAX_BURST:
8156 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen);
8157 break;
8158 case SCTP_AUTH_KEY:
8159 case SCTP_AUTH_CHUNK:
8160 case SCTP_AUTH_DELETE_KEY:
8161 case SCTP_AUTH_DEACTIVATE_KEY:
8162 retval = -EOPNOTSUPP;
8163 break;
8164 case SCTP_HMAC_IDENT:
8165 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen);
8166 break;
8167 case SCTP_AUTH_ACTIVE_KEY:
8168 retval = sctp_getsockopt_active_key(sk, len, optval, optlen);
8169 break;
8170 case SCTP_PEER_AUTH_CHUNKS:
8171 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval,
8172 optlen);
8173 break;
8174 case SCTP_LOCAL_AUTH_CHUNKS:
8175 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval,
8176 optlen);
8177 break;
8178 case SCTP_GET_ASSOC_NUMBER:
8179 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen);
8180 break;
8181 case SCTP_GET_ASSOC_ID_LIST:
8182 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen);
8183 break;
8184 case SCTP_AUTO_ASCONF:
8185 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen);
8186 break;
8187 case SCTP_PEER_ADDR_THLDS:
8188 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len,
8189 optlen, false);
8190 break;
8191 case SCTP_PEER_ADDR_THLDS_V2:
8192 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len,
8193 optlen, true);
8194 break;
8195 case SCTP_GET_ASSOC_STATS:
8196 retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen);
8197 break;
8198 case SCTP_RECVRCVINFO:
8199 retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen);
8200 break;
8201 case SCTP_RECVNXTINFO:
8202 retval = sctp_getsockopt_recvnxtinfo(sk, len, optval, optlen);
8203 break;
8204 case SCTP_PR_SUPPORTED:
8205 retval = sctp_getsockopt_pr_supported(sk, len, optval, optlen);
8206 break;
8207 case SCTP_DEFAULT_PRINFO:
8208 retval = sctp_getsockopt_default_prinfo(sk, len, optval,
8209 optlen);
8210 break;
8211 case SCTP_PR_ASSOC_STATUS:
8212 retval = sctp_getsockopt_pr_assocstatus(sk, len, optval,
8213 optlen);
8214 break;
8215 case SCTP_PR_STREAM_STATUS:
8216 retval = sctp_getsockopt_pr_streamstatus(sk, len, optval,
8217 optlen);
8218 break;
8219 case SCTP_RECONFIG_SUPPORTED:
8220 retval = sctp_getsockopt_reconfig_supported(sk, len, optval,
8221 optlen);
8222 break;
8223 case SCTP_ENABLE_STREAM_RESET:
8224 retval = sctp_getsockopt_enable_strreset(sk, len, optval,
8225 optlen);
8226 break;
8227 case SCTP_STREAM_SCHEDULER:
8228 retval = sctp_getsockopt_scheduler(sk, len, optval,
8229 optlen);
8230 break;
8231 case SCTP_STREAM_SCHEDULER_VALUE:
8232 retval = sctp_getsockopt_scheduler_value(sk, len, optval,
8233 optlen);
8234 break;
8235 case SCTP_INTERLEAVING_SUPPORTED:
8236 retval = sctp_getsockopt_interleaving_supported(sk, len, optval,
8237 optlen);
8238 break;
8239 case SCTP_REUSE_PORT:
8240 retval = sctp_getsockopt_reuse_port(sk, len, optval, optlen);
8241 break;
8242 case SCTP_EVENT:
8243 retval = sctp_getsockopt_event(sk, len, optval, optlen);
8244 break;
8245 case SCTP_ASCONF_SUPPORTED:
8246 retval = sctp_getsockopt_asconf_supported(sk, len, optval,
8247 optlen);
8248 break;
8249 case SCTP_AUTH_SUPPORTED:
8250 retval = sctp_getsockopt_auth_supported(sk, len, optval,
8251 optlen);
8252 break;
8253 case SCTP_ECN_SUPPORTED:
8254 retval = sctp_getsockopt_ecn_supported(sk, len, optval, optlen);
8255 break;
8256 case SCTP_EXPOSE_POTENTIALLY_FAILED_STATE:
8257 retval = sctp_getsockopt_pf_expose(sk, len, optval, optlen);
8258 break;
8259 case SCTP_REMOTE_UDP_ENCAPS_PORT:
8260 retval = sctp_getsockopt_encap_port(sk, len, optval, optlen);
8261 break;
8262 case SCTP_PLPMTUD_PROBE_INTERVAL:
8263 retval = sctp_getsockopt_probe_interval(sk, len, optval, optlen);
8264 break;
8265 default:
8266 retval = -ENOPROTOOPT;
8267 break;
8268 }
8269
8270 release_sock(sk);
8271 return retval;
8272 }
8273
8274 static int sctp_hash(struct sock *sk)
8275 {
8276
8277 return 0;
8278 }
8279
8280 static void sctp_unhash(struct sock *sk)
8281 {
8282
8283 }
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297 static struct sctp_bind_bucket *sctp_bucket_create(
8298 struct sctp_bind_hashbucket *head, struct net *, unsigned short snum);
8299
8300 static int sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
8301 {
8302 struct sctp_sock *sp = sctp_sk(sk);
8303 bool reuse = (sk->sk_reuse || sp->reuse);
8304 struct sctp_bind_hashbucket *head;
8305 struct net *net = sock_net(sk);
8306 kuid_t uid = sock_i_uid(sk);
8307 struct sctp_bind_bucket *pp;
8308 unsigned short snum;
8309 int ret;
8310
8311 snum = ntohs(addr->v4.sin_port);
8312
8313 pr_debug("%s: begins, snum:%d\n", __func__, snum);
8314
8315 if (snum == 0) {
8316
8317 int low, high, remaining, index;
8318 unsigned int rover;
8319
8320 inet_get_local_port_range(net, &low, &high);
8321 remaining = (high - low) + 1;
8322 rover = prandom_u32() % remaining + low;
8323
8324 do {
8325 rover++;
8326 if ((rover < low) || (rover > high))
8327 rover = low;
8328 if (inet_is_local_reserved_port(net, rover))
8329 continue;
8330 index = sctp_phashfn(net, rover);
8331 head = &sctp_port_hashtable[index];
8332 spin_lock_bh(&head->lock);
8333 sctp_for_each_hentry(pp, &head->chain)
8334 if ((pp->port == rover) &&
8335 net_eq(net, pp->net))
8336 goto next;
8337 break;
8338 next:
8339 spin_unlock_bh(&head->lock);
8340 cond_resched();
8341 } while (--remaining > 0);
8342
8343
8344 ret = 1;
8345 if (remaining <= 0)
8346 return ret;
8347
8348
8349
8350
8351
8352 snum = rover;
8353 } else {
8354
8355
8356
8357
8358
8359
8360 head = &sctp_port_hashtable[sctp_phashfn(net, snum)];
8361 spin_lock_bh(&head->lock);
8362 sctp_for_each_hentry(pp, &head->chain) {
8363 if ((pp->port == snum) && net_eq(pp->net, net))
8364 goto pp_found;
8365 }
8366 }
8367 pp = NULL;
8368 goto pp_not_found;
8369 pp_found:
8370 if (!hlist_empty(&pp->owner)) {
8371
8372
8373
8374
8375
8376 struct sock *sk2;
8377
8378 pr_debug("%s: found a possible match\n", __func__);
8379
8380 if ((pp->fastreuse && reuse &&
8381 sk->sk_state != SCTP_SS_LISTENING) ||
8382 (pp->fastreuseport && sk->sk_reuseport &&
8383 uid_eq(pp->fastuid, uid)))
8384 goto success;
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396 sk_for_each_bound(sk2, &pp->owner) {
8397 struct sctp_sock *sp2 = sctp_sk(sk2);
8398 struct sctp_endpoint *ep2 = sp2->ep;
8399
8400 if (sk == sk2 ||
8401 (reuse && (sk2->sk_reuse || sp2->reuse) &&
8402 sk2->sk_state != SCTP_SS_LISTENING) ||
8403 (sk->sk_reuseport && sk2->sk_reuseport &&
8404 uid_eq(uid, sock_i_uid(sk2))))
8405 continue;
8406
8407 if (sctp_bind_addr_conflict(&ep2->base.bind_addr,
8408 addr, sp2, sp)) {
8409 ret = 1;
8410 goto fail_unlock;
8411 }
8412 }
8413
8414 pr_debug("%s: found a match\n", __func__);
8415 }
8416 pp_not_found:
8417
8418 ret = 1;
8419 if (!pp && !(pp = sctp_bucket_create(head, net, snum)))
8420 goto fail_unlock;
8421
8422
8423
8424
8425
8426 if (hlist_empty(&pp->owner)) {
8427 if (reuse && sk->sk_state != SCTP_SS_LISTENING)
8428 pp->fastreuse = 1;
8429 else
8430 pp->fastreuse = 0;
8431
8432 if (sk->sk_reuseport) {
8433 pp->fastreuseport = 1;
8434 pp->fastuid = uid;
8435 } else {
8436 pp->fastreuseport = 0;
8437 }
8438 } else {
8439 if (pp->fastreuse &&
8440 (!reuse || sk->sk_state == SCTP_SS_LISTENING))
8441 pp->fastreuse = 0;
8442
8443 if (pp->fastreuseport &&
8444 (!sk->sk_reuseport || !uid_eq(pp->fastuid, uid)))
8445 pp->fastreuseport = 0;
8446 }
8447
8448
8449
8450
8451
8452 success:
8453 if (!sp->bind_hash) {
8454 inet_sk(sk)->inet_num = snum;
8455 sk_add_bind_node(sk, &pp->owner);
8456 sp->bind_hash = pp;
8457 }
8458 ret = 0;
8459
8460 fail_unlock:
8461 spin_unlock_bh(&head->lock);
8462 return ret;
8463 }
8464
8465
8466
8467
8468 static int sctp_get_port(struct sock *sk, unsigned short snum)
8469 {
8470 union sctp_addr addr;
8471 struct sctp_af *af = sctp_sk(sk)->pf->af;
8472
8473
8474 af->from_sk(&addr, sk);
8475 addr.v4.sin_port = htons(snum);
8476
8477
8478 return sctp_get_port_local(sk, &addr);
8479 }
8480
8481
8482
8483
8484 static int sctp_listen_start(struct sock *sk, int backlog)
8485 {
8486 struct sctp_sock *sp = sctp_sk(sk);
8487 struct sctp_endpoint *ep = sp->ep;
8488 struct crypto_shash *tfm = NULL;
8489 char alg[32];
8490
8491
8492 if (!sp->hmac && sp->sctp_hmac_alg) {
8493 sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg);
8494 tfm = crypto_alloc_shash(alg, 0, 0);
8495 if (IS_ERR(tfm)) {
8496 net_info_ratelimited("failed to load transform for %s: %ld\n",
8497 sp->sctp_hmac_alg, PTR_ERR(tfm));
8498 return -ENOSYS;
8499 }
8500 sctp_sk(sk)->hmac = tfm;
8501 }
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514 inet_sk_set_state(sk, SCTP_SS_LISTENING);
8515 if (!ep->base.bind_addr.port) {
8516 if (sctp_autobind(sk))
8517 return -EAGAIN;
8518 } else {
8519 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) {
8520 inet_sk_set_state(sk, SCTP_SS_CLOSED);
8521 return -EADDRINUSE;
8522 }
8523 }
8524
8525 WRITE_ONCE(sk->sk_max_ack_backlog, backlog);
8526 return sctp_hash_endpoint(ep);
8527 }
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543 int sctp_inet_listen(struct socket *sock, int backlog)
8544 {
8545 struct sock *sk = sock->sk;
8546 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
8547 int err = -EINVAL;
8548
8549 if (unlikely(backlog < 0))
8550 return err;
8551
8552 lock_sock(sk);
8553
8554
8555 if (sctp_style(sk, UDP_HIGH_BANDWIDTH))
8556 goto out;
8557
8558 if (sock->state != SS_UNCONNECTED)
8559 goto out;
8560
8561 if (!sctp_sstate(sk, LISTENING) && !sctp_sstate(sk, CLOSED))
8562 goto out;
8563
8564
8565 if (!backlog) {
8566 if (sctp_sstate(sk, CLOSED))
8567 goto out;
8568
8569 err = 0;
8570 sctp_unhash_endpoint(ep);
8571 sk->sk_state = SCTP_SS_CLOSED;
8572 if (sk->sk_reuse || sctp_sk(sk)->reuse)
8573 sctp_sk(sk)->bind_hash->fastreuse = 1;
8574 goto out;
8575 }
8576
8577
8578 if (sctp_sstate(sk, LISTENING))
8579 WRITE_ONCE(sk->sk_max_ack_backlog, backlog);
8580 else {
8581 err = sctp_listen_start(sk, backlog);
8582 if (err)
8583 goto out;
8584 }
8585
8586 err = 0;
8587 out:
8588 release_sock(sk);
8589 return err;
8590 }
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605 __poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
8606 {
8607 struct sock *sk = sock->sk;
8608 struct sctp_sock *sp = sctp_sk(sk);
8609 __poll_t mask;
8610
8611 poll_wait(file, sk_sleep(sk), wait);
8612
8613 sock_rps_record_flow(sk);
8614
8615
8616
8617
8618 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
8619 return (!list_empty(&sp->ep->asocs)) ?
8620 (EPOLLIN | EPOLLRDNORM) : 0;
8621
8622 mask = 0;
8623
8624
8625 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
8626 mask |= EPOLLERR |
8627 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
8628 if (sk->sk_shutdown & RCV_SHUTDOWN)
8629 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
8630 if (sk->sk_shutdown == SHUTDOWN_MASK)
8631 mask |= EPOLLHUP;
8632
8633
8634 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
8635 mask |= EPOLLIN | EPOLLRDNORM;
8636
8637
8638 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED))
8639 return mask;
8640
8641
8642 if (sctp_writeable(sk)) {
8643 mask |= EPOLLOUT | EPOLLWRNORM;
8644 } else {
8645 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
8646
8647
8648
8649
8650
8651
8652
8653
8654 if (sctp_writeable(sk))
8655 mask |= EPOLLOUT | EPOLLWRNORM;
8656 }
8657 return mask;
8658 }
8659
8660
8661
8662
8663
8664 static struct sctp_bind_bucket *sctp_bucket_create(
8665 struct sctp_bind_hashbucket *head, struct net *net, unsigned short snum)
8666 {
8667 struct sctp_bind_bucket *pp;
8668
8669 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
8670 if (pp) {
8671 SCTP_DBG_OBJCNT_INC(bind_bucket);
8672 pp->port = snum;
8673 pp->fastreuse = 0;
8674 INIT_HLIST_HEAD(&pp->owner);
8675 pp->net = net;
8676 hlist_add_head(&pp->node, &head->chain);
8677 }
8678 return pp;
8679 }
8680
8681
8682 static void sctp_bucket_destroy(struct sctp_bind_bucket *pp)
8683 {
8684 if (pp && hlist_empty(&pp->owner)) {
8685 __hlist_del(&pp->node);
8686 kmem_cache_free(sctp_bucket_cachep, pp);
8687 SCTP_DBG_OBJCNT_DEC(bind_bucket);
8688 }
8689 }
8690
8691
8692 static inline void __sctp_put_port(struct sock *sk)
8693 {
8694 struct sctp_bind_hashbucket *head =
8695 &sctp_port_hashtable[sctp_phashfn(sock_net(sk),
8696 inet_sk(sk)->inet_num)];
8697 struct sctp_bind_bucket *pp;
8698
8699 spin_lock(&head->lock);
8700 pp = sctp_sk(sk)->bind_hash;
8701 __sk_del_bind_node(sk);
8702 sctp_sk(sk)->bind_hash = NULL;
8703 inet_sk(sk)->inet_num = 0;
8704 sctp_bucket_destroy(pp);
8705 spin_unlock(&head->lock);
8706 }
8707
8708 void sctp_put_port(struct sock *sk)
8709 {
8710 local_bh_disable();
8711 __sctp_put_port(sk);
8712 local_bh_enable();
8713 }
8714
8715
8716
8717
8718
8719
8720
8721 static int sctp_autobind(struct sock *sk)
8722 {
8723 union sctp_addr autoaddr;
8724 struct sctp_af *af;
8725 __be16 port;
8726
8727
8728 af = sctp_sk(sk)->pf->af;
8729
8730 port = htons(inet_sk(sk)->inet_num);
8731 af->inaddr_any(&autoaddr, port);
8732
8733 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len);
8734 }
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775 static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs)
8776 {
8777 struct msghdr *my_msg = (struct msghdr *)msg;
8778 struct cmsghdr *cmsg;
8779
8780 for_each_cmsghdr(cmsg, my_msg) {
8781 if (!CMSG_OK(my_msg, cmsg))
8782 return -EINVAL;
8783
8784
8785 if (cmsg->cmsg_level != IPPROTO_SCTP)
8786 continue;
8787
8788
8789 switch (cmsg->cmsg_type) {
8790 case SCTP_INIT:
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_initmsg)))
8805 return -EINVAL;
8806
8807 cmsgs->init = CMSG_DATA(cmsg);
8808 break;
8809
8810 case SCTP_SNDRCV:
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndrcvinfo)))
8823 return -EINVAL;
8824
8825 cmsgs->srinfo = CMSG_DATA(cmsg);
8826
8827 if (cmsgs->srinfo->sinfo_flags &
8828 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
8829 SCTP_SACK_IMMEDIATELY | SCTP_SENDALL |
8830 SCTP_PR_SCTP_MASK | SCTP_ABORT | SCTP_EOF))
8831 return -EINVAL;
8832 break;
8833
8834 case SCTP_SNDINFO:
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndinfo)))
8847 return -EINVAL;
8848
8849 cmsgs->sinfo = CMSG_DATA(cmsg);
8850
8851 if (cmsgs->sinfo->snd_flags &
8852 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
8853 SCTP_SACK_IMMEDIATELY | SCTP_SENDALL |
8854 SCTP_PR_SCTP_MASK | SCTP_ABORT | SCTP_EOF))
8855 return -EINVAL;
8856 break;
8857 case SCTP_PRINFO:
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_prinfo)))
8868 return -EINVAL;
8869
8870 cmsgs->prinfo = CMSG_DATA(cmsg);
8871 if (cmsgs->prinfo->pr_policy & ~SCTP_PR_SCTP_MASK)
8872 return -EINVAL;
8873
8874 if (cmsgs->prinfo->pr_policy == SCTP_PR_SCTP_NONE)
8875 cmsgs->prinfo->pr_value = 0;
8876 break;
8877 case SCTP_AUTHINFO:
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_authinfo)))
8888 return -EINVAL;
8889
8890 cmsgs->authinfo = CMSG_DATA(cmsg);
8891 break;
8892 case SCTP_DSTADDRV4:
8893 case SCTP_DSTADDRV6:
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905 cmsgs->addrs_msg = my_msg;
8906 break;
8907 default:
8908 return -EINVAL;
8909 }
8910 }
8911
8912 return 0;
8913 }
8914
8915
8916
8917
8918
8919
8920 static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p)
8921 {
8922 int error;
8923 DEFINE_WAIT(wait);
8924
8925 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
8926
8927
8928 error = sock_error(sk);
8929 if (error)
8930 goto out;
8931
8932 if (!skb_queue_empty(&sk->sk_receive_queue))
8933 goto ready;
8934
8935
8936 if (sk->sk_shutdown & RCV_SHUTDOWN)
8937 goto out;
8938
8939
8940
8941
8942 error = -ENOTCONN;
8943
8944
8945 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING))
8946 goto out;
8947
8948
8949 if (signal_pending(current))
8950 goto interrupted;
8951
8952
8953
8954
8955
8956
8957 release_sock(sk);
8958 *timeo_p = schedule_timeout(*timeo_p);
8959 lock_sock(sk);
8960
8961 ready:
8962 finish_wait(sk_sleep(sk), &wait);
8963 return 0;
8964
8965 interrupted:
8966 error = sock_intr_errno(*timeo_p);
8967
8968 out:
8969 finish_wait(sk_sleep(sk), &wait);
8970 *err = error;
8971 return error;
8972 }
8973
8974
8975
8976
8977
8978 struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, int *err)
8979 {
8980 int error;
8981 struct sk_buff *skb;
8982 long timeo;
8983
8984 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
8985
8986 pr_debug("%s: timeo:%ld, max:%ld\n", __func__, timeo,
8987 MAX_SCHEDULE_TIMEOUT);
8988
8989 do {
8990
8991
8992
8993
8994
8995
8996
8997 if (flags & MSG_PEEK) {
8998 skb = skb_peek(&sk->sk_receive_queue);
8999 if (skb)
9000 refcount_inc(&skb->users);
9001 } else {
9002 skb = __skb_dequeue(&sk->sk_receive_queue);
9003 }
9004
9005 if (skb)
9006 return skb;
9007
9008
9009 error = sock_error(sk);
9010 if (error)
9011 goto no_packet;
9012
9013 if (sk->sk_shutdown & RCV_SHUTDOWN)
9014 break;
9015
9016 if (sk_can_busy_loop(sk)) {
9017 sk_busy_loop(sk, flags & MSG_DONTWAIT);
9018
9019 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
9020 continue;
9021 }
9022
9023
9024 error = -EAGAIN;
9025 if (!timeo)
9026 goto no_packet;
9027 } while (sctp_wait_for_packet(sk, err, &timeo) == 0);
9028
9029 return NULL;
9030
9031 no_packet:
9032 *err = error;
9033 return NULL;
9034 }
9035
9036
9037 static void __sctp_write_space(struct sctp_association *asoc)
9038 {
9039 struct sock *sk = asoc->base.sk;
9040
9041 if (sctp_wspace(asoc) <= 0)
9042 return;
9043
9044 if (waitqueue_active(&asoc->wait))
9045 wake_up_interruptible(&asoc->wait);
9046
9047 if (sctp_writeable(sk)) {
9048 struct socket_wq *wq;
9049
9050 rcu_read_lock();
9051 wq = rcu_dereference(sk->sk_wq);
9052 if (wq) {
9053 if (waitqueue_active(&wq->wait))
9054 wake_up_interruptible(&wq->wait);
9055
9056
9057
9058
9059
9060 if (!(sk->sk_shutdown & SEND_SHUTDOWN))
9061 sock_wake_async(wq, SOCK_WAKE_SPACE, POLL_OUT);
9062 }
9063 rcu_read_unlock();
9064 }
9065 }
9066
9067 static void sctp_wake_up_waiters(struct sock *sk,
9068 struct sctp_association *asoc)
9069 {
9070 struct sctp_association *tmp = asoc;
9071
9072
9073
9074
9075 if (asoc->ep->sndbuf_policy)
9076 return __sctp_write_space(asoc);
9077
9078
9079
9080
9081 if (asoc->base.dead)
9082 return sctp_write_space(sk);
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094 for (tmp = list_next_entry(tmp, asocs); 1;
9095 tmp = list_next_entry(tmp, asocs)) {
9096
9097 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs))
9098 continue;
9099
9100 __sctp_write_space(tmp);
9101
9102 if (tmp == asoc)
9103 break;
9104 }
9105 }
9106
9107
9108
9109
9110
9111 static void sctp_wfree(struct sk_buff *skb)
9112 {
9113 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg;
9114 struct sctp_association *asoc = chunk->asoc;
9115 struct sock *sk = asoc->base.sk;
9116
9117 sk_mem_uncharge(sk, skb->truesize);
9118 sk->sk_wmem_queued -= skb->truesize + sizeof(struct sctp_chunk);
9119 asoc->sndbuf_used -= skb->truesize + sizeof(struct sctp_chunk);
9120 WARN_ON(refcount_sub_and_test(sizeof(struct sctp_chunk),
9121 &sk->sk_wmem_alloc));
9122
9123 if (chunk->shkey) {
9124 struct sctp_shared_key *shkey = chunk->shkey;
9125
9126
9127
9128
9129
9130 if (shkey->deactivated && !list_empty(&shkey->key_list) &&
9131 refcount_read(&shkey->refcnt) == 2) {
9132 struct sctp_ulpevent *ev;
9133
9134 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id,
9135 SCTP_AUTH_FREE_KEY,
9136 GFP_KERNEL);
9137 if (ev)
9138 asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
9139 }
9140 sctp_auth_shkey_release(chunk->shkey);
9141 }
9142
9143 sock_wfree(skb);
9144 sctp_wake_up_waiters(sk, asoc);
9145
9146 sctp_association_put(asoc);
9147 }
9148
9149
9150
9151
9152
9153
9154 void sctp_sock_rfree(struct sk_buff *skb)
9155 {
9156 struct sock *sk = skb->sk;
9157 struct sctp_ulpevent *event = sctp_skb2event(skb);
9158
9159 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc);
9160
9161
9162
9163
9164 sk_mem_uncharge(sk, event->rmem_len);
9165 }
9166
9167
9168
9169 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
9170 size_t msg_len)
9171 {
9172 struct sock *sk = asoc->base.sk;
9173 long current_timeo = *timeo_p;
9174 DEFINE_WAIT(wait);
9175 int err = 0;
9176
9177 pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc,
9178 *timeo_p, msg_len);
9179
9180
9181 sctp_association_hold(asoc);
9182
9183
9184 for (;;) {
9185 prepare_to_wait_exclusive(&asoc->wait, &wait,
9186 TASK_INTERRUPTIBLE);
9187 if (asoc->base.dead)
9188 goto do_dead;
9189 if (!*timeo_p)
9190 goto do_nonblock;
9191 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING)
9192 goto do_error;
9193 if (signal_pending(current))
9194 goto do_interrupted;
9195 if ((int)msg_len <= sctp_wspace(asoc) &&
9196 sk_wmem_schedule(sk, msg_len))
9197 break;
9198
9199
9200
9201
9202 release_sock(sk);
9203 current_timeo = schedule_timeout(current_timeo);
9204 lock_sock(sk);
9205 if (sk != asoc->base.sk)
9206 goto do_error;
9207
9208 *timeo_p = current_timeo;
9209 }
9210
9211 out:
9212 finish_wait(&asoc->wait, &wait);
9213
9214
9215 sctp_association_put(asoc);
9216
9217 return err;
9218
9219 do_dead:
9220 err = -ESRCH;
9221 goto out;
9222
9223 do_error:
9224 err = -EPIPE;
9225 goto out;
9226
9227 do_interrupted:
9228 err = sock_intr_errno(*timeo_p);
9229 goto out;
9230
9231 do_nonblock:
9232 err = -EAGAIN;
9233 goto out;
9234 }
9235
9236 void sctp_data_ready(struct sock *sk)
9237 {
9238 struct socket_wq *wq;
9239
9240 rcu_read_lock();
9241 wq = rcu_dereference(sk->sk_wq);
9242 if (skwq_has_sleeper(wq))
9243 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN |
9244 EPOLLRDNORM | EPOLLRDBAND);
9245 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
9246 rcu_read_unlock();
9247 }
9248
9249
9250 void sctp_write_space(struct sock *sk)
9251 {
9252 struct sctp_association *asoc;
9253
9254
9255 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) {
9256 __sctp_write_space(asoc);
9257 }
9258 }
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271 static bool sctp_writeable(struct sock *sk)
9272 {
9273 return sk->sk_sndbuf > sk->sk_wmem_queued;
9274 }
9275
9276
9277
9278
9279 static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p)
9280 {
9281 struct sock *sk = asoc->base.sk;
9282 int err = 0;
9283 long current_timeo = *timeo_p;
9284 DEFINE_WAIT(wait);
9285
9286 pr_debug("%s: asoc:%p, timeo:%ld\n", __func__, asoc, *timeo_p);
9287
9288
9289 sctp_association_hold(asoc);
9290
9291 for (;;) {
9292 prepare_to_wait_exclusive(&asoc->wait, &wait,
9293 TASK_INTERRUPTIBLE);
9294 if (!*timeo_p)
9295 goto do_nonblock;
9296 if (sk->sk_shutdown & RCV_SHUTDOWN)
9297 break;
9298 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING ||
9299 asoc->base.dead)
9300 goto do_error;
9301 if (signal_pending(current))
9302 goto do_interrupted;
9303
9304 if (sctp_state(asoc, ESTABLISHED))
9305 break;
9306
9307
9308
9309
9310 release_sock(sk);
9311 current_timeo = schedule_timeout(current_timeo);
9312 lock_sock(sk);
9313
9314 *timeo_p = current_timeo;
9315 }
9316
9317 out:
9318 finish_wait(&asoc->wait, &wait);
9319
9320
9321 sctp_association_put(asoc);
9322
9323 return err;
9324
9325 do_error:
9326 if (asoc->init_err_counter + 1 > asoc->max_init_attempts)
9327 err = -ETIMEDOUT;
9328 else
9329 err = -ECONNREFUSED;
9330 goto out;
9331
9332 do_interrupted:
9333 err = sock_intr_errno(*timeo_p);
9334 goto out;
9335
9336 do_nonblock:
9337 err = -EINPROGRESS;
9338 goto out;
9339 }
9340
9341 static int sctp_wait_for_accept(struct sock *sk, long timeo)
9342 {
9343 struct sctp_endpoint *ep;
9344 int err = 0;
9345 DEFINE_WAIT(wait);
9346
9347 ep = sctp_sk(sk)->ep;
9348
9349
9350 for (;;) {
9351 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
9352 TASK_INTERRUPTIBLE);
9353
9354 if (list_empty(&ep->asocs)) {
9355 release_sock(sk);
9356 timeo = schedule_timeout(timeo);
9357 lock_sock(sk);
9358 }
9359
9360 err = -EINVAL;
9361 if (!sctp_sstate(sk, LISTENING))
9362 break;
9363
9364 err = 0;
9365 if (!list_empty(&ep->asocs))
9366 break;
9367
9368 err = sock_intr_errno(timeo);
9369 if (signal_pending(current))
9370 break;
9371
9372 err = -EAGAIN;
9373 if (!timeo)
9374 break;
9375 }
9376
9377 finish_wait(sk_sleep(sk), &wait);
9378
9379 return err;
9380 }
9381
9382 static void sctp_wait_for_close(struct sock *sk, long timeout)
9383 {
9384 DEFINE_WAIT(wait);
9385
9386 do {
9387 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
9388 if (list_empty(&sctp_sk(sk)->ep->asocs))
9389 break;
9390 release_sock(sk);
9391 timeout = schedule_timeout(timeout);
9392 lock_sock(sk);
9393 } while (!signal_pending(current) && timeout);
9394
9395 finish_wait(sk_sleep(sk), &wait);
9396 }
9397
9398 static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk)
9399 {
9400 struct sk_buff *frag;
9401
9402 if (!skb->data_len)
9403 goto done;
9404
9405
9406 skb_walk_frags(skb, frag)
9407 sctp_skb_set_owner_r_frag(frag, sk);
9408
9409 done:
9410 sctp_skb_set_owner_r(skb, sk);
9411 }
9412
9413 void sctp_copy_sock(struct sock *newsk, struct sock *sk,
9414 struct sctp_association *asoc)
9415 {
9416 struct inet_sock *inet = inet_sk(sk);
9417 struct inet_sock *newinet;
9418 struct sctp_sock *sp = sctp_sk(sk);
9419
9420 newsk->sk_type = sk->sk_type;
9421 newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
9422 newsk->sk_flags = sk->sk_flags;
9423 newsk->sk_tsflags = sk->sk_tsflags;
9424 newsk->sk_no_check_tx = sk->sk_no_check_tx;
9425 newsk->sk_no_check_rx = sk->sk_no_check_rx;
9426 newsk->sk_reuse = sk->sk_reuse;
9427 sctp_sk(newsk)->reuse = sp->reuse;
9428
9429 newsk->sk_shutdown = sk->sk_shutdown;
9430 newsk->sk_destruct = sctp_destruct_sock;
9431 newsk->sk_family = sk->sk_family;
9432 newsk->sk_protocol = IPPROTO_SCTP;
9433 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;
9434 newsk->sk_sndbuf = sk->sk_sndbuf;
9435 newsk->sk_rcvbuf = sk->sk_rcvbuf;
9436 newsk->sk_lingertime = sk->sk_lingertime;
9437 newsk->sk_rcvtimeo = sk->sk_rcvtimeo;
9438 newsk->sk_sndtimeo = sk->sk_sndtimeo;
9439 newsk->sk_rxhash = sk->sk_rxhash;
9440
9441 newinet = inet_sk(newsk);
9442
9443
9444
9445
9446 newinet->inet_sport = inet->inet_sport;
9447 newinet->inet_saddr = inet->inet_saddr;
9448 newinet->inet_rcv_saddr = inet->inet_rcv_saddr;
9449 newinet->inet_dport = htons(asoc->peer.port);
9450 newinet->pmtudisc = inet->pmtudisc;
9451 newinet->inet_id = prandom_u32();
9452
9453 newinet->uc_ttl = inet->uc_ttl;
9454 newinet->mc_loop = 1;
9455 newinet->mc_ttl = 1;
9456 newinet->mc_index = 0;
9457 newinet->mc_list = NULL;
9458
9459 if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
9460 net_enable_timestamp();
9461
9462
9463
9464
9465 security_sctp_sk_clone(asoc, sk, newsk);
9466 }
9467
9468 static inline void sctp_copy_descendant(struct sock *sk_to,
9469 const struct sock *sk_from)
9470 {
9471 size_t ancestor_size = sizeof(struct inet_sock);
9472
9473 ancestor_size += sk_from->sk_prot->obj_size;
9474 ancestor_size -= offsetof(struct sctp_sock, pd_lobby);
9475 __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
9476 }
9477
9478
9479
9480
9481 static int sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
9482 struct sctp_association *assoc,
9483 enum sctp_socket_type type)
9484 {
9485 struct sctp_sock *oldsp = sctp_sk(oldsk);
9486 struct sctp_sock *newsp = sctp_sk(newsk);
9487 struct sctp_bind_bucket *pp;
9488 struct sctp_endpoint *newep = newsp->ep;
9489 struct sk_buff *skb, *tmp;
9490 struct sctp_ulpevent *event;
9491 struct sctp_bind_hashbucket *head;
9492 int err;
9493
9494
9495
9496
9497 newsk->sk_sndbuf = oldsk->sk_sndbuf;
9498 newsk->sk_rcvbuf = oldsk->sk_rcvbuf;
9499
9500 sctp_copy_descendant(newsk, oldsk);
9501
9502
9503
9504
9505 newsp->ep = newep;
9506 newsp->hmac = NULL;
9507
9508
9509 head = &sctp_port_hashtable[sctp_phashfn(sock_net(oldsk),
9510 inet_sk(oldsk)->inet_num)];
9511 spin_lock_bh(&head->lock);
9512 pp = sctp_sk(oldsk)->bind_hash;
9513 sk_add_bind_node(newsk, &pp->owner);
9514 sctp_sk(newsk)->bind_hash = pp;
9515 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num;
9516 spin_unlock_bh(&head->lock);
9517
9518
9519
9520
9521 err = sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
9522 &oldsp->ep->base.bind_addr, GFP_KERNEL);
9523 if (err)
9524 return err;
9525
9526
9527
9528
9529
9530 if (oldsp->ep->auth_hmacs) {
9531 err = sctp_auth_init_hmacs(newsp->ep, GFP_KERNEL);
9532 if (err)
9533 return err;
9534 }
9535
9536 sctp_auto_asconf_init(newsp);
9537
9538
9539
9540
9541 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
9542 event = sctp_skb2event(skb);
9543 if (event->asoc == assoc) {
9544 __skb_unlink(skb, &oldsk->sk_receive_queue);
9545 __skb_queue_tail(&newsk->sk_receive_queue, skb);
9546 sctp_skb_set_owner_r_frag(skb, newsk);
9547 }
9548 }
9549
9550
9551
9552
9553
9554
9555
9556 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode);
9557
9558 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) {
9559 struct sk_buff_head *queue;
9560
9561
9562 if (assoc->ulpq.pd_mode) {
9563 queue = &newsp->pd_lobby;
9564 } else
9565 queue = &newsk->sk_receive_queue;
9566
9567
9568
9569
9570 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
9571 event = sctp_skb2event(skb);
9572 if (event->asoc == assoc) {
9573 __skb_unlink(skb, &oldsp->pd_lobby);
9574 __skb_queue_tail(queue, skb);
9575 sctp_skb_set_owner_r_frag(skb, newsk);
9576 }
9577 }
9578
9579
9580
9581
9582 if (assoc->ulpq.pd_mode)
9583 sctp_clear_pd(oldsk, NULL);
9584
9585 }
9586
9587 sctp_for_each_rx_skb(assoc, newsk, sctp_skb_set_owner_r_frag);
9588
9589
9590
9591
9592
9593 newsp->type = type;
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604 lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
9605 sctp_for_each_tx_datachunk(assoc, true, sctp_clear_owner_w);
9606 sctp_assoc_migrate(assoc, newsk);
9607 sctp_for_each_tx_datachunk(assoc, false, sctp_set_owner_w);
9608
9609
9610
9611
9612 if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) {
9613 inet_sk_set_state(newsk, SCTP_SS_CLOSED);
9614 newsk->sk_shutdown |= RCV_SHUTDOWN;
9615 } else {
9616 inet_sk_set_state(newsk, SCTP_SS_ESTABLISHED);
9617 }
9618
9619 release_sock(newsk);
9620
9621 return 0;
9622 }
9623
9624
9625
9626 struct proto sctp_prot = {
9627 .name = "SCTP",
9628 .owner = THIS_MODULE,
9629 .close = sctp_close,
9630 .disconnect = sctp_disconnect,
9631 .accept = sctp_accept,
9632 .ioctl = sctp_ioctl,
9633 .init = sctp_init_sock,
9634 .destroy = sctp_destroy_sock,
9635 .shutdown = sctp_shutdown,
9636 .setsockopt = sctp_setsockopt,
9637 .getsockopt = sctp_getsockopt,
9638 .sendmsg = sctp_sendmsg,
9639 .recvmsg = sctp_recvmsg,
9640 .bind = sctp_bind,
9641 .bind_add = sctp_bind_add,
9642 .backlog_rcv = sctp_backlog_rcv,
9643 .hash = sctp_hash,
9644 .unhash = sctp_unhash,
9645 .no_autobind = true,
9646 .obj_size = sizeof(struct sctp_sock),
9647 .useroffset = offsetof(struct sctp_sock, subscribe),
9648 .usersize = offsetof(struct sctp_sock, initmsg) -
9649 offsetof(struct sctp_sock, subscribe) +
9650 sizeof_field(struct sctp_sock, initmsg),
9651 .sysctl_mem = sysctl_sctp_mem,
9652 .sysctl_rmem = sysctl_sctp_rmem,
9653 .sysctl_wmem = sysctl_sctp_wmem,
9654 .memory_pressure = &sctp_memory_pressure,
9655 .enter_memory_pressure = sctp_enter_memory_pressure,
9656
9657 .memory_allocated = &sctp_memory_allocated,
9658 .per_cpu_fw_alloc = &sctp_memory_per_cpu_fw_alloc,
9659
9660 .sockets_allocated = &sctp_sockets_allocated,
9661 };
9662
9663 #if IS_ENABLED(CONFIG_IPV6)
9664
9665 #include <net/transp_v6.h>
9666 static void sctp_v6_destroy_sock(struct sock *sk)
9667 {
9668 sctp_destroy_sock(sk);
9669 inet6_destroy_sock(sk);
9670 }
9671
9672 struct proto sctpv6_prot = {
9673 .name = "SCTPv6",
9674 .owner = THIS_MODULE,
9675 .close = sctp_close,
9676 .disconnect = sctp_disconnect,
9677 .accept = sctp_accept,
9678 .ioctl = sctp_ioctl,
9679 .init = sctp_init_sock,
9680 .destroy = sctp_v6_destroy_sock,
9681 .shutdown = sctp_shutdown,
9682 .setsockopt = sctp_setsockopt,
9683 .getsockopt = sctp_getsockopt,
9684 .sendmsg = sctp_sendmsg,
9685 .recvmsg = sctp_recvmsg,
9686 .bind = sctp_bind,
9687 .bind_add = sctp_bind_add,
9688 .backlog_rcv = sctp_backlog_rcv,
9689 .hash = sctp_hash,
9690 .unhash = sctp_unhash,
9691 .no_autobind = true,
9692 .obj_size = sizeof(struct sctp6_sock),
9693 .useroffset = offsetof(struct sctp6_sock, sctp.subscribe),
9694 .usersize = offsetof(struct sctp6_sock, sctp.initmsg) -
9695 offsetof(struct sctp6_sock, sctp.subscribe) +
9696 sizeof_field(struct sctp6_sock, sctp.initmsg),
9697 .sysctl_mem = sysctl_sctp_mem,
9698 .sysctl_rmem = sysctl_sctp_rmem,
9699 .sysctl_wmem = sysctl_sctp_wmem,
9700 .memory_pressure = &sctp_memory_pressure,
9701 .enter_memory_pressure = sctp_enter_memory_pressure,
9702
9703 .memory_allocated = &sctp_memory_allocated,
9704 .per_cpu_fw_alloc = &sctp_memory_per_cpu_fw_alloc,
9705
9706 .sockets_allocated = &sctp_sockets_allocated,
9707 };
9708 #endif