Phonet: provide pipe socket option to retrieve the pipe identifier
Rémi Denis-Courmont [Tue, 8 Mar 2011 22:44:11 +0000 (22:44 +0000)]
User-space sometimes needs this information. In particular, the GPRS
context or the AT commands pipe setups may use the pipe handle as a
reference.

This removes the settable pipe handle with CONFIG_PHONET_PIPECTRLR.
It did not handle error cases correctly. Furthermore, the kernel
*could* implement a smart scheme for allocating handles (if ever
needed), but userspace really cannot.

Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Documentation/networking/phonet.txt
include/linux/phonet.h
net/phonet/pep.c

index 24ad2ad..cacac96 100644 (file)
@@ -181,6 +181,10 @@ The pipe protocol provides two socket options at the SOL_PNPIPE level:
     interface index of the network interface created by PNPIPE_ENCAP,
     or zero if encapsulation is off.
 
+  PNPIPE_HANDLE is a read-only integer value. It contains the underlying
+    identifier ("pipe handle") of the pipe. This is only defined for
+    socket descriptors that are already connected or being connected.
+
 
 Phonet Pipe-controller Implementation
 -------------------------------------
@@ -199,9 +203,6 @@ between itself and a remote pipe-end point (e.g. modem).
 
 The implementation adds socket options at SOL_PNPIPE level:
 
- PNPIPE_PIPE_HANDLE
-       It accepts an integer argument for setting value of pipe handle.
-
   PNPIPE_ENABLE accepts one integer value (int). If set to zero, the pipe
     is disabled. If the value is non-zero, the pipe is enabled. If the pipe
     is not (yet) connected, ENOTCONN is error is returned.
index 26c8df7..32a0965 100644 (file)
@@ -36,7 +36,7 @@
 /* Socket options for SOL_PNPIPE level */
 #define PNPIPE_ENCAP           1
 #define PNPIPE_IFINDEX         2
-#define PNPIPE_PIPE_HANDLE     3
+#define PNPIPE_HANDLE          3
 #define PNPIPE_ENABLE           4
 /* unused slot */
 
index c0fab4c..abfb795 100644 (file)
@@ -853,6 +853,7 @@ static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len)
 
        pn->pn_sk.dobject = pn_sockaddr_get_object(spn);
        pn->pn_sk.resource = pn_sockaddr_get_resource(spn);
+       pn->pipe_handle = 1; /* anything but INVALID_HANDLE */
        return pipe_handler_request(sk, PNS_PEP_CONNECT_REQ,
                                        PN_PIPE_DISABLE, data, 4);
 }
@@ -909,14 +910,6 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,
 
        lock_sock(sk);
        switch (optname) {
-#ifdef CONFIG_PHONET_PIPECTRLR
-       case PNPIPE_PIPE_HANDLE:
-               if (val) {
-                       pn->pipe_handle = val;
-                       break;
-               }
-#endif
-
        case PNPIPE_ENCAP:
                if (val && val != PNPIPE_ENCAP_IP) {
                        err = -EINVAL;
@@ -982,6 +975,12 @@ static int pep_getsockopt(struct sock *sk, int level, int optname,
                val = pn->ifindex;
                break;
 
+       case PNPIPE_HANDLE:
+               val = pn->pipe_handle;
+               if (val == PN_PIPE_INVALID_HANDLE)
+                       return -EINVAL;
+               break;
+
 #ifdef CONFIG_PHONET_PIPECTRLR
        case PNPIPE_ENABLE:
                val = sk->sk_state == TCP_ESTABLISHED;