diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
| commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
| tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /net/bluetooth/cmtp | |
| parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) | |
Patched in Tegra support.
Diffstat (limited to 'net/bluetooth/cmtp')
| -rw-r--r-- | net/bluetooth/cmtp/Kconfig | 2 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/capi.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/core.c | 25 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/sock.c | 36 |
4 files changed, 24 insertions, 41 deletions
diff --git a/net/bluetooth/cmtp/Kconfig b/net/bluetooth/cmtp/Kconfig index 94cbf42ce15..d6b0382f6f3 100644 --- a/net/bluetooth/cmtp/Kconfig +++ b/net/bluetooth/cmtp/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config BT_CMTP | 1 | config BT_CMTP |
| 2 | tristate "CMTP protocol support" | 2 | tristate "CMTP protocol support" |
| 3 | depends on BT && ISDN_CAPI | 3 | depends on BT && BT_L2CAP && ISDN_CAPI |
| 4 | help | 4 | help |
| 5 | CMTP (CAPI Message Transport Protocol) is a transport layer | 5 | CMTP (CAPI Message Transport Protocol) is a transport layer |
| 6 | for CAPI messages. CMTP is required for the Bluetooth Common | 6 | for CAPI messages. CMTP is required for the Bluetooth Common |
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c index a4a9d4b6816..50f0d135eb8 100644 --- a/net/bluetooth/cmtp/capi.c +++ b/net/bluetooth/cmtp/capi.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | SOFTWARE IS DISCLAIMED. | 20 | SOFTWARE IS DISCLAIMED. |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #include <linux/export.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/proc_fs.h> | 24 | #include <linux/proc_fs.h> |
| 25 | #include <linux/seq_file.h> | 25 | #include <linux/seq_file.h> |
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index e0a6ebf2baa..521baa4fe83 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
| @@ -53,24 +53,28 @@ static LIST_HEAD(cmtp_session_list); | |||
| 53 | static struct cmtp_session *__cmtp_get_session(bdaddr_t *bdaddr) | 53 | static struct cmtp_session *__cmtp_get_session(bdaddr_t *bdaddr) |
| 54 | { | 54 | { |
| 55 | struct cmtp_session *session; | 55 | struct cmtp_session *session; |
| 56 | struct list_head *p; | ||
| 56 | 57 | ||
| 57 | BT_DBG(""); | 58 | BT_DBG(""); |
| 58 | 59 | ||
| 59 | list_for_each_entry(session, &cmtp_session_list, list) | 60 | list_for_each(p, &cmtp_session_list) { |
| 61 | session = list_entry(p, struct cmtp_session, list); | ||
| 60 | if (!bacmp(bdaddr, &session->bdaddr)) | 62 | if (!bacmp(bdaddr, &session->bdaddr)) |
| 61 | return session; | 63 | return session; |
| 62 | 64 | } | |
| 63 | return NULL; | 65 | return NULL; |
| 64 | } | 66 | } |
| 65 | 67 | ||
| 66 | static void __cmtp_link_session(struct cmtp_session *session) | 68 | static void __cmtp_link_session(struct cmtp_session *session) |
| 67 | { | 69 | { |
| 70 | __module_get(THIS_MODULE); | ||
| 68 | list_add(&session->list, &cmtp_session_list); | 71 | list_add(&session->list, &cmtp_session_list); |
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | static void __cmtp_unlink_session(struct cmtp_session *session) | 74 | static void __cmtp_unlink_session(struct cmtp_session *session) |
| 72 | { | 75 | { |
| 73 | list_del(&session->list); | 76 | list_del(&session->list); |
| 77 | module_put(THIS_MODULE); | ||
| 74 | } | 78 | } |
| 75 | 79 | ||
| 76 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) | 80 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) |
| @@ -298,10 +302,7 @@ static int cmtp_session(void *arg) | |||
| 298 | 302 | ||
| 299 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { | 303 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { |
| 300 | skb_orphan(skb); | 304 | skb_orphan(skb); |
| 301 | if (!skb_linearize(skb)) | 305 | cmtp_recv_frame(session, skb); |
| 302 | cmtp_recv_frame(session, skb); | ||
| 303 | else | ||
| 304 | kfree_skb(skb); | ||
| 305 | } | 306 | } |
| 306 | 307 | ||
| 307 | cmtp_process_transmit(session); | 308 | cmtp_process_transmit(session); |
| @@ -323,7 +324,6 @@ static int cmtp_session(void *arg) | |||
| 323 | up_write(&cmtp_session_sem); | 324 | up_write(&cmtp_session_sem); |
| 324 | 325 | ||
| 325 | kfree(session); | 326 | kfree(session); |
| 326 | module_put_and_exit(0); | ||
| 327 | return 0; | 327 | return 0; |
| 328 | } | 328 | } |
| 329 | 329 | ||
| @@ -353,7 +353,7 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
| 353 | 353 | ||
| 354 | BT_DBG("mtu %d", session->mtu); | 354 | BT_DBG("mtu %d", session->mtu); |
| 355 | 355 | ||
| 356 | sprintf(session->name, "%pMR", &bt_sk(sock->sk)->dst); | 356 | sprintf(session->name, "%s", batostr(&bt_sk(sock->sk)->dst)); |
| 357 | 357 | ||
| 358 | session->sock = sock; | 358 | session->sock = sock; |
| 359 | session->state = BT_CONFIG; | 359 | session->state = BT_CONFIG; |
| @@ -373,11 +373,9 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
| 373 | 373 | ||
| 374 | __cmtp_link_session(session); | 374 | __cmtp_link_session(session); |
| 375 | 375 | ||
| 376 | __module_get(THIS_MODULE); | ||
| 377 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", | 376 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", |
| 378 | session->num); | 377 | session->num); |
| 379 | if (IS_ERR(session->task)) { | 378 | if (IS_ERR(session->task)) { |
| 380 | module_put(THIS_MODULE); | ||
| 381 | err = PTR_ERR(session->task); | 379 | err = PTR_ERR(session->task); |
| 382 | goto unlink; | 380 | goto unlink; |
| 383 | } | 381 | } |
| @@ -430,16 +428,19 @@ int cmtp_del_connection(struct cmtp_conndel_req *req) | |||
| 430 | 428 | ||
| 431 | int cmtp_get_connlist(struct cmtp_connlist_req *req) | 429 | int cmtp_get_connlist(struct cmtp_connlist_req *req) |
| 432 | { | 430 | { |
| 433 | struct cmtp_session *session; | 431 | struct list_head *p; |
| 434 | int err = 0, n = 0; | 432 | int err = 0, n = 0; |
| 435 | 433 | ||
| 436 | BT_DBG(""); | 434 | BT_DBG(""); |
| 437 | 435 | ||
| 438 | down_read(&cmtp_session_sem); | 436 | down_read(&cmtp_session_sem); |
| 439 | 437 | ||
| 440 | list_for_each_entry(session, &cmtp_session_list, list) { | 438 | list_for_each(p, &cmtp_session_list) { |
| 439 | struct cmtp_session *session; | ||
| 441 | struct cmtp_conninfo ci; | 440 | struct cmtp_conninfo ci; |
| 442 | 441 | ||
| 442 | session = list_entry(p, struct cmtp_session, list); | ||
| 443 | |||
| 443 | __cmtp_copy_session(session, &ci); | 444 | __cmtp_copy_session(session, &ci); |
| 444 | 445 | ||
| 445 | if (copy_to_user(req->ci, &ci, sizeof(ci))) { | 446 | if (copy_to_user(req->ci, &ci, sizeof(ci))) { |
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 1c57482112b..3f2dd5c25ae 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | SOFTWARE IS DISCLAIMED. | 20 | SOFTWARE IS DISCLAIMED. |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #include <linux/export.h> | 23 | #include <linux/module.h> |
| 24 | 24 | ||
| 25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 26 | #include <linux/capability.h> | 26 | #include <linux/capability.h> |
| @@ -39,13 +39,10 @@ | |||
| 39 | 39 | ||
| 40 | #include <linux/isdn/capilli.h> | 40 | #include <linux/isdn/capilli.h> |
| 41 | 41 | ||
| 42 | #include <asm/system.h> | ||
| 42 | 43 | ||
| 43 | #include "cmtp.h" | 44 | #include "cmtp.h" |
| 44 | 45 | ||
| 45 | static struct bt_sock_list cmtp_sk_list = { | ||
| 46 | .lock = __RW_LOCK_UNLOCKED(cmtp_sk_list.lock) | ||
| 47 | }; | ||
| 48 | |||
| 49 | static int cmtp_sock_release(struct socket *sock) | 46 | static int cmtp_sock_release(struct socket *sock) |
| 50 | { | 47 | { |
| 51 | struct sock *sk = sock->sk; | 48 | struct sock *sk = sock->sk; |
| @@ -55,8 +52,6 @@ static int cmtp_sock_release(struct socket *sock) | |||
| 55 | if (!sk) | 52 | if (!sk) |
| 56 | return 0; | 53 | return 0; |
| 57 | 54 | ||
| 58 | bt_sock_unlink(&cmtp_sk_list, sk); | ||
| 59 | |||
| 60 | sock_orphan(sk); | 55 | sock_orphan(sk); |
| 61 | sock_put(sk); | 56 | sock_put(sk); |
| 62 | 57 | ||
| @@ -78,7 +73,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 78 | switch (cmd) { | 73 | switch (cmd) { |
| 79 | case CMTPCONNADD: | 74 | case CMTPCONNADD: |
| 80 | if (!capable(CAP_NET_ADMIN)) | 75 | if (!capable(CAP_NET_ADMIN)) |
| 81 | return -EPERM; | 76 | return -EACCES; |
| 82 | 77 | ||
| 83 | if (copy_from_user(&ca, argp, sizeof(ca))) | 78 | if (copy_from_user(&ca, argp, sizeof(ca))) |
| 84 | return -EFAULT; | 79 | return -EFAULT; |
| @@ -103,7 +98,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 103 | 98 | ||
| 104 | case CMTPCONNDEL: | 99 | case CMTPCONNDEL: |
| 105 | if (!capable(CAP_NET_ADMIN)) | 100 | if (!capable(CAP_NET_ADMIN)) |
| 106 | return -EPERM; | 101 | return -EACCES; |
| 107 | 102 | ||
| 108 | if (copy_from_user(&cd, argp, sizeof(cd))) | 103 | if (copy_from_user(&cd, argp, sizeof(cd))) |
| 109 | return -EFAULT; | 104 | return -EFAULT; |
| @@ -142,10 +137,10 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne | |||
| 142 | { | 137 | { |
| 143 | if (cmd == CMTPGETCONNLIST) { | 138 | if (cmd == CMTPGETCONNLIST) { |
| 144 | struct cmtp_connlist_req cl; | 139 | struct cmtp_connlist_req cl; |
| 145 | u32 uci; | 140 | uint32_t uci; |
| 146 | int err; | 141 | int err; |
| 147 | 142 | ||
| 148 | if (get_user(cl.cnum, (u32 __user *) arg) || | 143 | if (get_user(cl.cnum, (uint32_t __user *) arg) || |
| 149 | get_user(uci, (u32 __user *) (arg + 4))) | 144 | get_user(uci, (u32 __user *) (arg + 4))) |
| 150 | return -EFAULT; | 145 | return -EFAULT; |
| 151 | 146 | ||
| @@ -156,7 +151,7 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne | |||
| 156 | 151 | ||
| 157 | err = cmtp_get_connlist(&cl); | 152 | err = cmtp_get_connlist(&cl); |
| 158 | 153 | ||
| 159 | if (!err && put_user(cl.cnum, (u32 __user *) arg)) | 154 | if (!err && put_user(cl.cnum, (uint32_t __user *) arg)) |
| 160 | err = -EFAULT; | 155 | err = -EFAULT; |
| 161 | 156 | ||
| 162 | return err; | 157 | return err; |
| @@ -220,8 +215,6 @@ static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol, | |||
| 220 | sk->sk_protocol = protocol; | 215 | sk->sk_protocol = protocol; |
| 221 | sk->sk_state = BT_OPEN; | 216 | sk->sk_state = BT_OPEN; |
| 222 | 217 | ||
| 223 | bt_sock_link(&cmtp_sk_list, sk); | ||
| 224 | |||
| 225 | return 0; | 218 | return 0; |
| 226 | } | 219 | } |
| 227 | 220 | ||
| @@ -240,30 +233,19 @@ int cmtp_init_sockets(void) | |||
| 240 | return err; | 233 | return err; |
| 241 | 234 | ||
| 242 | err = bt_sock_register(BTPROTO_CMTP, &cmtp_sock_family_ops); | 235 | err = bt_sock_register(BTPROTO_CMTP, &cmtp_sock_family_ops); |
| 243 | if (err < 0) { | 236 | if (err < 0) |
| 244 | BT_ERR("Can't register CMTP socket"); | ||
| 245 | goto error; | ||
| 246 | } | ||
| 247 | |||
| 248 | err = bt_procfs_init(THIS_MODULE, &init_net, "cmtp", &cmtp_sk_list, NULL); | ||
| 249 | if (err < 0) { | ||
| 250 | BT_ERR("Failed to create CMTP proc file"); | ||
| 251 | bt_sock_unregister(BTPROTO_HIDP); | ||
| 252 | goto error; | 237 | goto error; |
| 253 | } | ||
| 254 | |||
| 255 | BT_INFO("CMTP socket layer initialized"); | ||
| 256 | 238 | ||
| 257 | return 0; | 239 | return 0; |
| 258 | 240 | ||
| 259 | error: | 241 | error: |
| 242 | BT_ERR("Can't register CMTP socket"); | ||
| 260 | proto_unregister(&cmtp_proto); | 243 | proto_unregister(&cmtp_proto); |
| 261 | return err; | 244 | return err; |
| 262 | } | 245 | } |
| 263 | 246 | ||
| 264 | void cmtp_cleanup_sockets(void) | 247 | void cmtp_cleanup_sockets(void) |
| 265 | { | 248 | { |
| 266 | bt_procfs_cleanup(&init_net, "cmtp"); | ||
| 267 | if (bt_sock_unregister(BTPROTO_CMTP) < 0) | 249 | if (bt_sock_unregister(BTPROTO_CMTP) < 0) |
| 268 | BT_ERR("Can't unregister CMTP socket"); | 250 | BT_ERR("Can't unregister CMTP socket"); |
| 269 | 251 | ||
