af_iucv: allow retrieval of maximum message size
authorUrsula Braun <ursula.braun@de.ibm.com>
Wed, 8 Feb 2012 00:19:48 +0000 (00:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Feb 2012 23:50:19 +0000 (18:50 -0500)
For HS transport the maximum message size depends on the MTU-size
of the HS-device bound to the AF_IUCV socket. This patch adds a
getsockopt option MSGSIZE returning the maximum message size that
can be handled for this AF_IUCV socket.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/iucv/af_iucv.h
net/iucv/af_iucv.c

index a1517887aeac8c0d2d0873ee5ab916172680085b..2e1d5ecc2d1b0c82a430690ac68d199613586052 100644 (file)
@@ -132,6 +132,7 @@ struct iucv_sock {
 /* iucv socket options (SOL_IUCV) */
 #define SO_IPRMDATA_MSG        0x0080          /* send/recv IPRM_DATA msgs */
 #define SO_MSGLIMIT    0x1000          /* get/set IUCV MSGLIMIT */
+#define SO_MSGSIZE     0x0800          /* get maximum msgsize */
 
 /* iucv related control messages (scm) */
 #define SCM_IUCV_TRGCLS        0x0001          /* target class control message */
index fbce4a3126de59ed4fc99e8a3b34083f02d92ffb..98d1f0ba7fe93702c709d61145c6dc7d0987a13a 100644 (file)
@@ -1633,7 +1633,8 @@ static int iucv_sock_getsockopt(struct socket *sock, int level, int optname,
 {
        struct sock *sk = sock->sk;
        struct iucv_sock *iucv = iucv_sk(sk);
-       int val, len;
+       unsigned int val;
+       int len;
 
        if (level != SOL_IUCV)
                return -ENOPROTOOPT;
@@ -1656,6 +1657,13 @@ static int iucv_sock_getsockopt(struct socket *sock, int level, int optname,
                                           : iucv->msglimit;    /* default */
                release_sock(sk);
                break;
+       case SO_MSGSIZE:
+               if (sk->sk_state == IUCV_OPEN)
+                       return -EBADFD;
+               val = (iucv->hs_dev) ? iucv->hs_dev->mtu -
+                               sizeof(struct af_iucv_trans_hdr) - ETH_HLEN :
+                               0x7fffffff;
+               break;
        default:
                return -ENOPROTOOPT;
        }