diff options
Diffstat (limited to 'net/dccp/proto.c')
-rw-r--r-- | net/dccp/proto.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 047d170a363a..db54e557eff1 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -472,7 +472,6 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname, | |||
472 | case DCCP_SOCKOPT_PACKET_SIZE: | 472 | case DCCP_SOCKOPT_PACKET_SIZE: |
473 | dp->dccps_packet_size = val; | 473 | dp->dccps_packet_size = val; |
474 | break; | 474 | break; |
475 | |||
476 | case DCCP_SOCKOPT_CHANGE_L: | 475 | case DCCP_SOCKOPT_CHANGE_L: |
477 | if (optlen != sizeof(struct dccp_so_feat)) | 476 | if (optlen != sizeof(struct dccp_so_feat)) |
478 | err = -EINVAL; | 477 | err = -EINVAL; |
@@ -481,7 +480,6 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname, | |||
481 | (struct dccp_so_feat __user *) | 480 | (struct dccp_so_feat __user *) |
482 | optval); | 481 | optval); |
483 | break; | 482 | break; |
484 | |||
485 | case DCCP_SOCKOPT_CHANGE_R: | 483 | case DCCP_SOCKOPT_CHANGE_R: |
486 | if (optlen != sizeof(struct dccp_so_feat)) | 484 | if (optlen != sizeof(struct dccp_so_feat)) |
487 | err = -EINVAL; | 485 | err = -EINVAL; |
@@ -490,12 +488,26 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname, | |||
490 | (struct dccp_so_feat __user *) | 488 | (struct dccp_so_feat __user *) |
491 | optval); | 489 | optval); |
492 | break; | 490 | break; |
493 | 491 | case DCCP_SOCKOPT_SEND_CSCOV: /* sender side, RFC 4340, sec. 9.2 */ | |
492 | if (val < 0 || val > 15) | ||
493 | err = -EINVAL; | ||
494 | else | ||
495 | dp->dccps_pcslen = val; | ||
496 | break; | ||
497 | case DCCP_SOCKOPT_RECV_CSCOV: /* receiver side, RFC 4340 sec. 9.2.1 */ | ||
498 | if (val < 0 || val > 15) | ||
499 | err = -EINVAL; | ||
500 | else { | ||
501 | dp->dccps_pcrlen = val; | ||
502 | /* FIXME: add feature negotiation, | ||
503 | * ChangeL(MinimumChecksumCoverage, val) */ | ||
504 | } | ||
505 | break; | ||
494 | default: | 506 | default: |
495 | err = -ENOPROTOOPT; | 507 | err = -ENOPROTOOPT; |
496 | break; | 508 | break; |
497 | } | 509 | } |
498 | 510 | ||
499 | release_sock(sk); | 511 | release_sock(sk); |
500 | return err; | 512 | return err; |
501 | } | 513 | } |
@@ -575,6 +587,12 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname, | |||
575 | case DCCP_SOCKOPT_SERVICE: | 587 | case DCCP_SOCKOPT_SERVICE: |
576 | return dccp_getsockopt_service(sk, len, | 588 | return dccp_getsockopt_service(sk, len, |
577 | (__be32 __user *)optval, optlen); | 589 | (__be32 __user *)optval, optlen); |
590 | case DCCP_SOCKOPT_SEND_CSCOV: | ||
591 | val = dp->dccps_pcslen; | ||
592 | break; | ||
593 | case DCCP_SOCKOPT_RECV_CSCOV: | ||
594 | val = dp->dccps_pcrlen; | ||
595 | break; | ||
578 | case 128 ... 191: | 596 | case 128 ... 191: |
579 | return ccid_hc_rx_getsockopt(dp->dccps_hc_rx_ccid, sk, optname, | 597 | return ccid_hc_rx_getsockopt(dp->dccps_hc_rx_ccid, sk, optname, |
580 | len, (u32 __user *)optval, optlen); | 598 | len, (u32 __user *)optval, optlen); |