[DCCP]: Add socket option to query the current MPS
authorGerrit Renker <gerrit@erg.abdn.ac.uk>
Thu, 4 Oct 2007 21:39:22 +0000 (14:39 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:54:31 +0000 (16:54 -0700)
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>
Documentation/networking/dccp.txt
include/linux/dccp.h
net/dccp/proto.c

index 477026ae0ffb7fe9ee05f1875b372bfb1a5ee551..f9157180f7d8a1cef907719cc96612eadf9607bb 100644 (file)
@@ -41,6 +41,9 @@ the socket will fall back to 0 (which means that no meaningful service code
 is present). Connecting sockets set at most one service option; for
 listening sockets, multiple service codes can be specified.
 
+DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
+size (application payload size) in bytes, see RFC 4340, section 14.
+
 DCCP_SOCKOPT_SEND_CSCOV and DCCP_SOCKOPT_RECV_CSCOV are used for setting the
 partial checksum coverage (RFC 4340, sec. 9.2). The default is that checksums
 always cover the entire packet and that only fully covered application data is
index 4ed82e2c9f6588d1e152854068dfa46d5a1155cc..0e44a3e5208d1262b4852d4835266e6ccde2353d 100644 (file)
@@ -202,6 +202,7 @@ struct dccp_so_feat {
 #define DCCP_SOCKOPT_SERVICE           2
 #define DCCP_SOCKOPT_CHANGE_L          3
 #define DCCP_SOCKOPT_CHANGE_R          4
+#define DCCP_SOCKOPT_GET_CUR_MPS       5
 #define DCCP_SOCKOPT_SEND_CSCOV                10
 #define DCCP_SOCKOPT_RECV_CSCOV                11
 #define DCCP_SOCKOPT_CCID_RX_INFO      128
index 7e4f54a4ecaf0ce997dbe1211095569575c7905c..c0b685efe245f478dfa5cb52135bc96ff05f5e76 100644 (file)
@@ -587,6 +587,10 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
        case DCCP_SOCKOPT_SERVICE:
                return dccp_getsockopt_service(sk, len,
                                               (__be32 __user *)optval, optlen);
+       case DCCP_SOCKOPT_GET_CUR_MPS:
+               val = dp->dccps_mss_cache;
+               len = sizeof(val);
+               break;
        case DCCP_SOCKOPT_SEND_CSCOV:
                val = dp->dccps_pcslen;
                len = sizeof(val);