aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Denis-Courmont <remi.denis-courmont@nokia.com>2010-10-08 00:02:02 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-08 17:09:10 -0400
commit03789f26722a15ccfe6f191e9fb3d356f2f18a1e (patch)
treea55a493a1b4804d0acafad5fd1a4a3b1100f3ff4
parent6d8e74ed377dd4cbad7ccc69300f734090e15c05 (diff)
Phonet: cleanup pipe enable socket option
The current code works like this: int garbage, status; socklen_t len = sizeof(status); /* enable pipe */ setsockopt(fd, SOL_PNPIPE, PNPIPE_ENABLE, &garbage, sizeof(garbage)); /* disable pipe */ setsockopt(fd, SOL_PNPIPE, PNPIPE_DISABLE, &garbage, sizeof(garbage)); /* get status */ getsockopt(fd, SOL_PNPIPE, PNPIPE_INQ, &status, &len); ...which does not follow the usual socket option pattern. This patch merges all three "options" into a single gettable&settable option, before Linux 2.6.37 gets out: int status; socklen_t len = sizeof(status); /* enable pipe */ status = 1; setsockopt(fd, SOL_PNPIPE, PNPIPE_ENABLE, &status, sizeof(status)); /* disable pipe */ status = 0; setsockopt(fd, SOL_PNPIPE, PNPIPE_ENABLE, &status, sizeof(status)); /* get status */ getsockopt(fd, SOL_PNPIPE, PNPIPE_ENABLE, &status, &len); This also fixes the error code from EFAULT to ENOTCONN. Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com> Cc: Kumar Sanghvi <kumar.sanghvi@stericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/networking/phonet.txt15
-rw-r--r--include/linux/phonet.h3
-rw-r--r--net/phonet/pep.c72
3 files changed, 34 insertions, 56 deletions
diff --git a/Documentation/networking/phonet.txt b/Documentation/networking/phonet.txt
index cccf5ff07ec2..2d9bc2b711fc 100644
--- a/Documentation/networking/phonet.txt
+++ b/Documentation/networking/phonet.txt
@@ -213,12 +213,9 @@ The implementation adds socket options at SOL_PNPIPE level:
213 It then updates the pipe state associated with the sequenced socket to 213 It then updates the pipe state associated with the sequenced socket to
214 be PIPE_DISABLED. 214 be PIPE_DISABLED.
215 215
216 PNPIPE_ENABLE 216 PNPIPE_ENABLE accepts one integer value (int). If set to zero, the pipe
217 It follows the same sequence as above for enabling a pipe by sending 217 is disabled. If the value is non-zero, the pipe is enabled. If the pipe
218 PNS_PEP_ENABLE_REQ initially and then sending PNS_PEP_ENABLED_IND after 218 is not (yet) connected, ENOTCONN is error is returned.
219 getting responses from sequenced socket and remote-pep.
220 It will also update the pipe state associated with the sequenced socket
221 to PIPE_ENABLED.
222 219
223 PNPIPE_DESTROY 220 PNPIPE_DESTROY
224 This will send out PNS_PEP_DISCONNECT_REQ on the sequenced socket and 221 This will send out PNS_PEP_DISCONNECT_REQ on the sequenced socket and
@@ -226,12 +223,6 @@ The implementation adds socket options at SOL_PNPIPE level:
226 It will also update the pipe state associated with the sequenced socket 223 It will also update the pipe state associated with the sequenced socket
227 to PIPE_IDLE 224 to PIPE_IDLE
228 225
229 PNPIPE_INQ
230 This getsocktopt allows the user-space running on the sequenced socket
231 to examine the pipe state associated with that socket ie. whether the
232 pipe is created (PIPE_DISABLED) or enabled (PIPE_ENABLED) or disabled
233 (PIPE_DISABLED) or no pipe exists (PIPE_IDLE).
234
235After a pipe has been created and enabled successfully, the Pipe data can be 226After a pipe has been created and enabled successfully, the Pipe data can be
236exchanged between the host-pep and remote-pep (modem). 227exchanged between the host-pep and remote-pep (modem).
237 228
diff --git a/include/linux/phonet.h b/include/linux/phonet.h
index 96f5625d62fa..e27cbf931740 100644
--- a/include/linux/phonet.h
+++ b/include/linux/phonet.h
@@ -38,9 +38,8 @@
38#define PNPIPE_IFINDEX 2 38#define PNPIPE_IFINDEX 2
39#define PNPIPE_CREATE 3 39#define PNPIPE_CREATE 3
40#define PNPIPE_ENABLE 4 40#define PNPIPE_ENABLE 4
41#define PNPIPE_DISABLE 5 41/* unused slot */
42#define PNPIPE_DESTROY 6 42#define PNPIPE_DESTROY 6
43#define PNPIPE_INQ 7
44 43
45#define PNADDR_ANY 0 44#define PNADDR_ANY 0
46#define PNADDR_BROADCAST 0xFC 45#define PNADDR_BROADCAST 0xFC
diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index aa3d8700d213..f818f76d297d 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c
@@ -327,29 +327,20 @@ static int pipe_handler_send_ind(struct sock *sk, u16 dobj, u8 utid,
327 return pn_skb_send(sk, skb, &spn); 327 return pn_skb_send(sk, skb, &spn);
328} 328}
329 329
330static int pipe_handler_enable_pipe(struct sock *sk, int cmd) 330static int pipe_handler_enable_pipe(struct sock *sk, int enable)
331{ 331{
332 int ret;
333 struct pep_sock *pn = pep_sk(sk); 332 struct pep_sock *pn = pep_sk(sk);
334 333 int utid, req;
335 switch (cmd) { 334
336 case PNPIPE_ENABLE: 335 if (enable) {
337 ret = pipe_handler_send_req(sk, pn->pn_sk.sobject, 336 utid = PNS_PIPE_ENABLE_UTID;
338 PNS_PIPE_ENABLE_UTID, PNS_PEP_ENABLE_REQ, 337 req = PNS_PEP_ENABLE_REQ;
339 pn->pipe_handle, GFP_ATOMIC); 338 } else {
340 break; 339 utid = PNS_PIPE_DISABLE_UTID;
341 340 req = PNS_PEP_DISABLE_REQ;
342 case PNPIPE_DISABLE:
343 ret = pipe_handler_send_req(sk, pn->pn_sk.sobject,
344 PNS_PIPE_DISABLE_UTID, PNS_PEP_DISABLE_REQ,
345 pn->pipe_handle, GFP_ATOMIC);
346 break;
347
348 default:
349 ret = -EINVAL;
350 } 341 }
351 342 return pipe_handler_send_req(sk, pn->pn_sk.sobject, utid, req,
352 return ret; 343 pn->pipe_handle, GFP_ATOMIC);
353} 344}
354 345
355static int pipe_handler_create_pipe(struct sock *sk, int pipe_handle, int cmd) 346static int pipe_handler_create_pipe(struct sock *sk, int pipe_handle, int cmd)
@@ -1187,23 +1178,6 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,
1187 break; 1178 break;
1188 } 1179 }
1189 1180
1190 case PNPIPE_ENABLE:
1191 if (pn->pipe_state != PIPE_DISABLED) {
1192 err = -EFAULT;
1193 break;
1194 }
1195 err = pipe_handler_enable_pipe(sk, PNPIPE_ENABLE);
1196 break;
1197
1198 case PNPIPE_DISABLE:
1199 if (pn->pipe_state != PIPE_ENABLED) {
1200 err = -EFAULT;
1201 break;
1202 }
1203
1204 err = pipe_handler_enable_pipe(sk, PNPIPE_DISABLE);
1205 break;
1206
1207 case PNPIPE_DESTROY: 1181 case PNPIPE_DESTROY:
1208 if (pn->pipe_state < PIPE_DISABLED) { 1182 if (pn->pipe_state < PIPE_DISABLED) {
1209 err = -EFAULT; 1183 err = -EFAULT;
@@ -1239,6 +1213,17 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,
1239 err = 0; 1213 err = 0;
1240 } 1214 }
1241 goto out_norel; 1215 goto out_norel;
1216
1217#ifdef CONFIG_PHONET_PIPECTRLR
1218 case PNPIPE_ENABLE:
1219 if (pn->pipe_state <= PIPE_IDLE) {
1220 err = -ENOTCONN;
1221 break;
1222 }
1223 err = pipe_handler_enable_pipe(sk, val);
1224 break;
1225#endif
1226
1242 default: 1227 default:
1243 err = -ENOPROTOOPT; 1228 err = -ENOPROTOOPT;
1244 } 1229 }
@@ -1264,15 +1249,18 @@ static int pep_getsockopt(struct sock *sk, int level, int optname,
1264 val = pn->ifindex ? PNPIPE_ENCAP_IP : PNPIPE_ENCAP_NONE; 1249 val = pn->ifindex ? PNPIPE_ENCAP_IP : PNPIPE_ENCAP_NONE;
1265 break; 1250 break;
1266 1251
1252 case PNPIPE_IFINDEX:
1253 val = pn->ifindex;
1254 break;
1255
1267#ifdef CONFIG_PHONET_PIPECTRLR 1256#ifdef CONFIG_PHONET_PIPECTRLR
1268 case PNPIPE_INQ: 1257 case PNPIPE_ENABLE:
1269 val = pn->pipe_state; 1258 if (pn->pipe_state <= PIPE_IDLE)
1259 return -ENOTCONN;
1260 val = pn->pipe_state != PIPE_DISABLED;
1270 break; 1261 break;
1271#endif 1262#endif
1272 1263
1273 case PNPIPE_IFINDEX:
1274 val = pn->ifindex;
1275 break;
1276 default: 1264 default:
1277 return -ENOPROTOOPT; 1265 return -ENOPROTOOPT;
1278 } 1266 }