提交 acaf7df6 编写于 作者: R Rémi Denis-Courmont 提交者: David S. Miller

Phonet: provide pipe socket option to retrieve the pipe identifier

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: NRémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 f7ae8d59
...@@ -181,6 +181,10 @@ The pipe protocol provides two socket options at the SOL_PNPIPE level: ...@@ -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, interface index of the network interface created by PNPIPE_ENCAP,
or zero if encapsulation is off. 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 Phonet Pipe-controller Implementation
------------------------------------- -------------------------------------
...@@ -199,9 +203,6 @@ between itself and a remote pipe-end point (e.g. modem). ...@@ -199,9 +203,6 @@ between itself and a remote pipe-end point (e.g. modem).
The implementation adds socket options at SOL_PNPIPE level: 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 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 disabled. If the value is non-zero, the pipe is enabled. If the pipe
is not (yet) connected, ENOTCONN is error is returned. is not (yet) connected, ENOTCONN is error is returned.
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
/* Socket options for SOL_PNPIPE level */ /* Socket options for SOL_PNPIPE level */
#define PNPIPE_ENCAP 1 #define PNPIPE_ENCAP 1
#define PNPIPE_IFINDEX 2 #define PNPIPE_IFINDEX 2
#define PNPIPE_PIPE_HANDLE 3 #define PNPIPE_HANDLE 3
#define PNPIPE_ENABLE 4 #define PNPIPE_ENABLE 4
/* unused slot */ /* unused slot */
......
...@@ -853,6 +853,7 @@ static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) ...@@ -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.dobject = pn_sockaddr_get_object(spn);
pn->pn_sk.resource = pn_sockaddr_get_resource(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, return pipe_handler_request(sk, PNS_PEP_CONNECT_REQ,
PN_PIPE_DISABLE, data, 4); PN_PIPE_DISABLE, data, 4);
} }
...@@ -909,14 +910,6 @@ static int pep_setsockopt(struct sock *sk, int level, int optname, ...@@ -909,14 +910,6 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,
lock_sock(sk); lock_sock(sk);
switch (optname) { switch (optname) {
#ifdef CONFIG_PHONET_PIPECTRLR
case PNPIPE_PIPE_HANDLE:
if (val) {
pn->pipe_handle = val;
break;
}
#endif
case PNPIPE_ENCAP: case PNPIPE_ENCAP:
if (val && val != PNPIPE_ENCAP_IP) { if (val && val != PNPIPE_ENCAP_IP) {
err = -EINVAL; err = -EINVAL;
...@@ -982,6 +975,12 @@ static int pep_getsockopt(struct sock *sk, int level, int optname, ...@@ -982,6 +975,12 @@ static int pep_getsockopt(struct sock *sk, int level, int optname,
val = pn->ifindex; val = pn->ifindex;
break; break;
case PNPIPE_HANDLE:
val = pn->pipe_handle;
if (val == PN_PIPE_INVALID_HANDLE)
return -EINVAL;
break;
#ifdef CONFIG_PHONET_PIPECTRLR #ifdef CONFIG_PHONET_PIPECTRLR
case PNPIPE_ENABLE: case PNPIPE_ENABLE:
val = sk->sk_state == TCP_ESTABLISHED; val = sk->sk_state == TCP_ESTABLISHED;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册