patch-2.4.6 linux/net/bluetooth/af_bluetooth.c
Next file: linux/net/bluetooth/hci_core.c
Previous file: linux/net/bluetooth/Makefile
Back to the patch index
Back to the overall index
- Lines: 165
- Date:
Mon Jun 11 19:15:27 2001
- Orig file:
v2.4.5/linux/net/bluetooth/af_bluetooth.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/af_bluetooth.c linux/net/bluetooth/af_bluetooth.c
@@ -0,0 +1,164 @@
+/*
+ BlueZ - Bluetooth protocol stack for Linux
+ Copyright (C) 2000-2001 Qualcomm Incorporated
+
+ Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation;
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * BlueZ Bluetooth address family and sockets.
+ *
+ * $Id: af_bluetooth.c,v 1.1 2001/06/01 08:12:11 davem Exp $
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/major.h>
+#include <linux/sched.h>
+#include <linux/malloc.h>
+#include <linux/skbuff.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <net/sock.h>
+
+#if defined(CONFIG_KMOD)
+#include <linux/kmod.h>
+#endif
+
+#include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/bluez.h>
+
+/* Bluetooth sockets */
+static struct net_proto_family *bluez_sock[BLUEZ_MAX_PROTO];
+
+int bluez_sock_register(int proto, struct net_proto_family *ops)
+{
+ if (proto > BLUEZ_MAX_PROTO)
+ return -EINVAL;
+
+ if (bluez_sock[proto])
+ return -EEXIST;
+
+ bluez_sock[proto] = ops;
+ return 0;
+}
+
+int bluez_sock_unregister(int proto)
+{
+ if (proto > BLUEZ_MAX_PROTO)
+ return -EINVAL;
+
+ if (!bluez_sock[proto])
+ return -ENOENT;
+
+ bluez_sock[proto] = NULL;
+ return 0;
+}
+
+static int bluez_sock_create(struct socket *sock, int proto)
+{
+ if (proto > BLUEZ_MAX_PROTO)
+ return -EINVAL;
+
+#if defined(CONFIG_KMOD)
+ if (!bluez_sock[proto]) {
+ char module_name[30];
+ sprintf(module_name, "bt-proto-%d", proto);
+ request_module(module_name);
+ }
+#endif
+
+ if (!bluez_sock[proto])
+ return -ENOENT;
+
+ return bluez_sock[proto]->create(sock, proto);
+}
+
+void bluez_sock_link(struct bluez_sock_list *l, struct sock *sk)
+{
+ write_lock(&l->lock);
+
+ sk->next = l->head;
+ l->head = sk;
+ sock_hold(sk);
+
+ write_unlock(&l->lock);
+}
+
+void bluez_sock_unlink(struct bluez_sock_list *l, struct sock *sk)
+{
+ struct sock **skp;
+
+ write_lock(&l->lock);
+ for (skp = &l->head; *skp; skp = &((*skp)->next)) {
+ if (*skp == sk) {
+ *skp = sk->next;
+ __sock_put(sk);
+ break;
+ }
+ }
+ write_unlock(&l->lock);
+}
+
+struct net_proto_family bluez_sock_family_ops =
+{
+ PF_BLUETOOTH, bluez_sock_create
+};
+
+int bluez_init(void)
+{
+ INF("BlueZ HCI Core ver %s Copyright (C) 2000,2001 Qualcomm Inc",
+ BLUEZ_VER);
+ INF("Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>");
+
+ proc_mkdir("bluetooth", NULL);
+
+ sock_register(&bluez_sock_family_ops);
+
+ /* Init HCI Core */
+ hci_core_init();
+
+ /* Init sockets */
+ hci_sock_init();
+
+ return 0;
+}
+
+void bluez_cleanup(void)
+{
+ /* Release socket */
+ hci_sock_cleanup();
+
+ /* Release core */
+ hci_core_cleanup();
+
+ sock_unregister(PF_BLUETOOTH);
+
+ remove_proc_entry("bluetooth", NULL);
+}
+
+#ifdef MODULE
+module_init(bluez_init);
+module_exit(bluez_cleanup);
+#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)