aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorGustavo F. Padovan <padovan@profusion.mobi>2011-02-03 23:52:55 -0500
committerGustavo F. Padovan <padovan@profusion.mobi>2011-02-07 22:43:31 -0500
commit99f4808db0c052f3c92a689ec2841618bf2ce14a (patch)
tree7cac9efa87d13303b978c091cbfd899d7085d2e4 /net/bluetooth
parent33575df7be6748292f88453f29319af6d639c5c8 (diff)
Bluetooth: move l2cap_sock_getsockopt() to l2cap_sock.c
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/l2cap_core.c145
-rw-r--r--net/bluetooth/l2cap_sock.c145
2 files changed, 145 insertions, 145 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 9d35cafe18aa..8e015d971267 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -1596,151 +1596,6 @@ int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m
1596 return bt_sock_recvmsg(iocb, sock, msg, len, flags); 1596 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
1597} 1597}
1598 1598
1599static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
1600{
1601 struct sock *sk = sock->sk;
1602 struct l2cap_options opts;
1603 struct l2cap_conninfo cinfo;
1604 int len, err = 0;
1605 u32 opt;
1606
1607 BT_DBG("sk %p", sk);
1608
1609 if (get_user(len, optlen))
1610 return -EFAULT;
1611
1612 lock_sock(sk);
1613
1614 switch (optname) {
1615 case L2CAP_OPTIONS:
1616 opts.imtu = l2cap_pi(sk)->imtu;
1617 opts.omtu = l2cap_pi(sk)->omtu;
1618 opts.flush_to = l2cap_pi(sk)->flush_to;
1619 opts.mode = l2cap_pi(sk)->mode;
1620 opts.fcs = l2cap_pi(sk)->fcs;
1621 opts.max_tx = l2cap_pi(sk)->max_tx;
1622 opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win;
1623
1624 len = min_t(unsigned int, len, sizeof(opts));
1625 if (copy_to_user(optval, (char *) &opts, len))
1626 err = -EFAULT;
1627
1628 break;
1629
1630 case L2CAP_LM:
1631 switch (l2cap_pi(sk)->sec_level) {
1632 case BT_SECURITY_LOW:
1633 opt = L2CAP_LM_AUTH;
1634 break;
1635 case BT_SECURITY_MEDIUM:
1636 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
1637 break;
1638 case BT_SECURITY_HIGH:
1639 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
1640 L2CAP_LM_SECURE;
1641 break;
1642 default:
1643 opt = 0;
1644 break;
1645 }
1646
1647 if (l2cap_pi(sk)->role_switch)
1648 opt |= L2CAP_LM_MASTER;
1649
1650 if (l2cap_pi(sk)->force_reliable)
1651 opt |= L2CAP_LM_RELIABLE;
1652
1653 if (put_user(opt, (u32 __user *) optval))
1654 err = -EFAULT;
1655 break;
1656
1657 case L2CAP_CONNINFO:
1658 if (sk->sk_state != BT_CONNECTED &&
1659 !(sk->sk_state == BT_CONNECT2 &&
1660 bt_sk(sk)->defer_setup)) {
1661 err = -ENOTCONN;
1662 break;
1663 }
1664
1665 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
1666 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
1667
1668 len = min_t(unsigned int, len, sizeof(cinfo));
1669 if (copy_to_user(optval, (char *) &cinfo, len))
1670 err = -EFAULT;
1671
1672 break;
1673
1674 default:
1675 err = -ENOPROTOOPT;
1676 break;
1677 }
1678
1679 release_sock(sk);
1680 return err;
1681}
1682
1683int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1684{
1685 struct sock *sk = sock->sk;
1686 struct bt_security sec;
1687 int len, err = 0;
1688
1689 BT_DBG("sk %p", sk);
1690
1691 if (level == SOL_L2CAP)
1692 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
1693
1694 if (level != SOL_BLUETOOTH)
1695 return -ENOPROTOOPT;
1696
1697 if (get_user(len, optlen))
1698 return -EFAULT;
1699
1700 lock_sock(sk);
1701
1702 switch (optname) {
1703 case BT_SECURITY:
1704 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
1705 && sk->sk_type != SOCK_RAW) {
1706 err = -EINVAL;
1707 break;
1708 }
1709
1710 sec.level = l2cap_pi(sk)->sec_level;
1711
1712 len = min_t(unsigned int, len, sizeof(sec));
1713 if (copy_to_user(optval, (char *) &sec, len))
1714 err = -EFAULT;
1715
1716 break;
1717
1718 case BT_DEFER_SETUP:
1719 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1720 err = -EINVAL;
1721 break;
1722 }
1723
1724 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
1725 err = -EFAULT;
1726
1727 break;
1728
1729 case BT_FLUSHABLE:
1730 if (put_user(l2cap_pi(sk)->flushable, (u32 __user *) optval))
1731 err = -EFAULT;
1732
1733 break;
1734
1735 default:
1736 err = -ENOPROTOOPT;
1737 break;
1738 }
1739
1740 release_sock(sk);
1741 return err;
1742}
1743
1744int l2cap_sock_shutdown(struct socket *sock, int how) 1599int l2cap_sock_shutdown(struct socket *sock, int how)
1745{ 1600{
1746 struct sock *sk = sock->sk; 1601 struct sock *sk = sock->sk;
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 1bbe8a06189b..b7d5ae9c6bdf 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -277,6 +277,151 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l
277 return 0; 277 return 0;
278} 278}
279 279
280static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
281{
282 struct sock *sk = sock->sk;
283 struct l2cap_options opts;
284 struct l2cap_conninfo cinfo;
285 int len, err = 0;
286 u32 opt;
287
288 BT_DBG("sk %p", sk);
289
290 if (get_user(len, optlen))
291 return -EFAULT;
292
293 lock_sock(sk);
294
295 switch (optname) {
296 case L2CAP_OPTIONS:
297 opts.imtu = l2cap_pi(sk)->imtu;
298 opts.omtu = l2cap_pi(sk)->omtu;
299 opts.flush_to = l2cap_pi(sk)->flush_to;
300 opts.mode = l2cap_pi(sk)->mode;
301 opts.fcs = l2cap_pi(sk)->fcs;
302 opts.max_tx = l2cap_pi(sk)->max_tx;
303 opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win;
304
305 len = min_t(unsigned int, len, sizeof(opts));
306 if (copy_to_user(optval, (char *) &opts, len))
307 err = -EFAULT;
308
309 break;
310
311 case L2CAP_LM:
312 switch (l2cap_pi(sk)->sec_level) {
313 case BT_SECURITY_LOW:
314 opt = L2CAP_LM_AUTH;
315 break;
316 case BT_SECURITY_MEDIUM:
317 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
318 break;
319 case BT_SECURITY_HIGH:
320 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
321 L2CAP_LM_SECURE;
322 break;
323 default:
324 opt = 0;
325 break;
326 }
327
328 if (l2cap_pi(sk)->role_switch)
329 opt |= L2CAP_LM_MASTER;
330
331 if (l2cap_pi(sk)->force_reliable)
332 opt |= L2CAP_LM_RELIABLE;
333
334 if (put_user(opt, (u32 __user *) optval))
335 err = -EFAULT;
336 break;
337
338 case L2CAP_CONNINFO:
339 if (sk->sk_state != BT_CONNECTED &&
340 !(sk->sk_state == BT_CONNECT2 &&
341 bt_sk(sk)->defer_setup)) {
342 err = -ENOTCONN;
343 break;
344 }
345
346 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
347 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
348
349 len = min_t(unsigned int, len, sizeof(cinfo));
350 if (copy_to_user(optval, (char *) &cinfo, len))
351 err = -EFAULT;
352
353 break;
354
355 default:
356 err = -ENOPROTOOPT;
357 break;
358 }
359
360 release_sock(sk);
361 return err;
362}
363
364static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
365{
366 struct sock *sk = sock->sk;
367 struct bt_security sec;
368 int len, err = 0;
369
370 BT_DBG("sk %p", sk);
371
372 if (level == SOL_L2CAP)
373 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
374
375 if (level != SOL_BLUETOOTH)
376 return -ENOPROTOOPT;
377
378 if (get_user(len, optlen))
379 return -EFAULT;
380
381 lock_sock(sk);
382
383 switch (optname) {
384 case BT_SECURITY:
385 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
386 && sk->sk_type != SOCK_RAW) {
387 err = -EINVAL;
388 break;
389 }
390
391 sec.level = l2cap_pi(sk)->sec_level;
392
393 len = min_t(unsigned int, len, sizeof(sec));
394 if (copy_to_user(optval, (char *) &sec, len))
395 err = -EFAULT;
396
397 break;
398
399 case BT_DEFER_SETUP:
400 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
401 err = -EINVAL;
402 break;
403 }
404
405 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
406 err = -EFAULT;
407
408 break;
409
410 case BT_FLUSHABLE:
411 if (put_user(l2cap_pi(sk)->flushable, (u32 __user *) optval))
412 err = -EFAULT;
413
414 break;
415
416 default:
417 err = -ENOPROTOOPT;
418 break;
419 }
420
421 release_sock(sk);
422 return err;
423}
424
280static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) 425static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
281{ 426{
282 struct sock *sk = sock->sk; 427 struct sock *sk = sock->sk;