aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2007-10-04 17:39:22 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:54:31 -0400
commit7c559a9e44ee61faf2f339604ce708decb345a93 (patch)
tree8e0e89521445a42cf801747af20be172b6e9e582
parentbc8498721dfe3f7d537f4f75302be7dbe9c7b939 (diff)
[DCCP]: Add socket option to query the current MPS
This enables applications to query the current value of the Maximum Packet Size via a socket option, suggested as a SHOULD in (RFC 4340, p. 102). This socket option is useful to avoid the annoying bail-out via `-EMSGSIZE'. In particular, as fragmentation is not currently supported (and its use is partly discouraged in RFC 4340). With this option, it is possible to size buffers accordingly, e.g. int buflen = dccp_get_cur_mps(sockfd); /* or */ if (msgsize > dccp_get_cur_mps(sockfd)) die("message is too large for this path"); Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Signed-off-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/networking/dccp.txt3
-rw-r--r--include/linux/dccp.h1
-rw-r--r--net/dccp/proto.c4
3 files changed, 8 insertions, 0 deletions
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt
index 477026ae0ffb..f9157180f7d8 100644
--- a/Documentation/networking/dccp.txt
+++ b/Documentation/networking/dccp.txt
@@ -41,6 +41,9 @@ the socket will fall back to 0 (which means that no meaningful service code
41is present). Connecting sockets set at most one service option; for 41is present). Connecting sockets set at most one service option; for
42listening sockets, multiple service codes can be specified. 42listening sockets, multiple service codes can be specified.
43 43
44DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
45size (application payload size) in bytes, see RFC 4340, section 14.
46
44DCCP_SOCKOPT_SEND_CSCOV and DCCP_SOCKOPT_RECV_CSCOV are used for setting the 47DCCP_SOCKOPT_SEND_CSCOV and DCCP_SOCKOPT_RECV_CSCOV are used for setting the
45partial checksum coverage (RFC 4340, sec. 9.2). The default is that checksums 48partial checksum coverage (RFC 4340, sec. 9.2). The default is that checksums
46always cover the entire packet and that only fully covered application data is 49always cover the entire packet and that only fully covered application data is
diff --git a/include/linux/dccp.h b/include/linux/dccp.h
index 4ed82e2c9f65..0e44a3e5208d 100644
--- a/include/linux/dccp.h
+++ b/include/linux/dccp.h
@@ -202,6 +202,7 @@ struct dccp_so_feat {
202#define DCCP_SOCKOPT_SERVICE 2 202#define DCCP_SOCKOPT_SERVICE 2
203#define DCCP_SOCKOPT_CHANGE_L 3 203#define DCCP_SOCKOPT_CHANGE_L 3
204#define DCCP_SOCKOPT_CHANGE_R 4 204#define DCCP_SOCKOPT_CHANGE_R 4
205#define DCCP_SOCKOPT_GET_CUR_MPS 5
205#define DCCP_SOCKOPT_SEND_CSCOV 10 206#define DCCP_SOCKOPT_SEND_CSCOV 10
206#define DCCP_SOCKOPT_RECV_CSCOV 11 207#define DCCP_SOCKOPT_RECV_CSCOV 11
207#define DCCP_SOCKOPT_CCID_RX_INFO 128 208#define DCCP_SOCKOPT_CCID_RX_INFO 128
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 7e4f54a4ecaf..c0b685efe245 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -587,6 +587,10 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
587 case DCCP_SOCKOPT_SERVICE: 587 case DCCP_SOCKOPT_SERVICE:
588 return dccp_getsockopt_service(sk, len, 588 return dccp_getsockopt_service(sk, len,
589 (__be32 __user *)optval, optlen); 589 (__be32 __user *)optval, optlen);
590 case DCCP_SOCKOPT_GET_CUR_MPS:
591 val = dp->dccps_mss_cache;
592 len = sizeof(val);
593 break;
590 case DCCP_SOCKOPT_SEND_CSCOV: 594 case DCCP_SOCKOPT_SEND_CSCOV:
591 val = dp->dccps_pcslen; 595 val = dp->dccps_pcslen;
592 len = sizeof(val); 596 len = sizeof(val);