Commit 6b8d4a6a authored by Jukka Rissanen's avatar Jukka Rissanen Committed by Marcel Holtmann

Bluetooth: 6LoWPAN: Use connected oriented channel instead of fixed one

Create a CoC dynamically instead of one fixed channel for communication
to peer devices.
Signed-off-by: default avatarJukka Rissanen <jukka.rissanen@linux.intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 0498878b
...@@ -145,7 +145,6 @@ enum { ...@@ -145,7 +145,6 @@ enum {
HCI_PERIODIC_INQ, HCI_PERIODIC_INQ,
HCI_FAST_CONNECTABLE, HCI_FAST_CONNECTABLE,
HCI_BREDR_ENABLED, HCI_BREDR_ENABLED,
HCI_6LOWPAN_ENABLED,
HCI_LE_SCAN_INTERRUPTED, HCI_LE_SCAN_INTERRUPTED,
}; };
......
...@@ -521,7 +521,6 @@ enum { ...@@ -521,7 +521,6 @@ enum {
HCI_CONN_AES_CCM, HCI_CONN_AES_CCM,
HCI_CONN_POWER_SAVE, HCI_CONN_POWER_SAVE,
HCI_CONN_REMOTE_OOB, HCI_CONN_REMOTE_OOB,
HCI_CONN_6LOWPAN,
}; };
static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
......
...@@ -137,7 +137,6 @@ struct l2cap_conninfo { ...@@ -137,7 +137,6 @@ struct l2cap_conninfo {
#define L2CAP_FC_L2CAP 0x02 #define L2CAP_FC_L2CAP 0x02
#define L2CAP_FC_CONNLESS 0x04 #define L2CAP_FC_CONNLESS 0x04
#define L2CAP_FC_A2MP 0x08 #define L2CAP_FC_A2MP 0x08
#define L2CAP_FC_6LOWPAN 0x3e /* reserved and temporary value */
/* L2CAP Control Field bit masks */ /* L2CAP Control Field bit masks */
#define L2CAP_CTRL_SAR 0xC000 #define L2CAP_CTRL_SAR 0xC000
......
This diff is collapsed.
/*
Copyright (c) 2013 Intel Corp.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 and
only version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#ifndef __6LOWPAN_H
#define __6LOWPAN_H
#include <linux/errno.h>
#include <linux/skbuff.h>
#include <net/bluetooth/l2cap.h>
#if IS_ENABLED(CONFIG_BT_6LOWPAN)
int bt_6lowpan_recv(struct l2cap_conn *conn, struct sk_buff *skb);
int bt_6lowpan_add_conn(struct l2cap_conn *conn);
int bt_6lowpan_del_conn(struct l2cap_conn *conn);
int bt_6lowpan_init(void);
void bt_6lowpan_cleanup(void);
#else
static int bt_6lowpan_recv(struct l2cap_conn *conn, struct sk_buff *skb)
{
return -EOPNOTSUPP;
}
static int bt_6lowpan_add_conn(struct l2cap_conn *conn)
{
return -EOPNOTSUPP;
}
int bt_6lowpan_del_conn(struct l2cap_conn *conn)
{
return -EOPNOTSUPP;
}
static int bt_6lowpan_init(void)
{
return -EOPNOTSUPP;
}
static void bt_6lowpan_cleanup(void) { }
#endif
#endif /* __6LOWPAN_H */
...@@ -928,49 +928,6 @@ static int adv_channel_map_get(void *data, u64 *val) ...@@ -928,49 +928,6 @@ static int adv_channel_map_get(void *data, u64 *val)
DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get, DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
adv_channel_map_set, "%llu\n"); adv_channel_map_set, "%llu\n");
static ssize_t lowpan_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos)
{
struct hci_dev *hdev = file->private_data;
char buf[3];
buf[0] = test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags) ? 'Y' : 'N';
buf[1] = '\n';
buf[2] = '\0';
return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
}
static ssize_t lowpan_write(struct file *fp, const char __user *user_buffer,
size_t count, loff_t *position)
{
struct hci_dev *hdev = fp->private_data;
bool enable;
char buf[32];
size_t buf_size = min(count, (sizeof(buf)-1));
if (copy_from_user(buf, user_buffer, buf_size))
return -EFAULT;
buf[buf_size] = '\0';
if (strtobool(buf, &enable) < 0)
return -EINVAL;
if (enable == test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags))
return -EALREADY;
change_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags);
return count;
}
static const struct file_operations lowpan_debugfs_fops = {
.open = simple_open,
.read = lowpan_read,
.write = lowpan_write,
.llseek = default_llseek,
};
static int le_auto_conn_show(struct seq_file *sf, void *ptr) static int le_auto_conn_show(struct seq_file *sf, void *ptr)
{ {
struct hci_dev *hdev = sf->private; struct hci_dev *hdev = sf->private;
...@@ -1881,8 +1838,6 @@ static int __hci_init(struct hci_dev *hdev) ...@@ -1881,8 +1838,6 @@ static int __hci_init(struct hci_dev *hdev)
hdev, &conn_max_interval_fops); hdev, &conn_max_interval_fops);
debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
hdev, &adv_channel_map_fops); hdev, &adv_channel_map_fops);
debugfs_create_file("6lowpan", 0644, hdev->debugfs, hdev,
&lowpan_debugfs_fops);
debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev, debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev,
&le_auto_conn_fops); &le_auto_conn_fops);
debugfs_create_u16("discov_interleaved_timeout", 0644, debugfs_create_u16("discov_interleaved_timeout", 0644,
......
...@@ -4056,9 +4056,6 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -4056,9 +4056,6 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
conn->handle = __le16_to_cpu(ev->handle); conn->handle = __le16_to_cpu(ev->handle);
conn->state = BT_CONNECTED; conn->state = BT_CONNECTED;
if (test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags))
set_bit(HCI_CONN_6LOWPAN, &conn->flags);
hci_conn_add_sysfs(conn); hci_conn_add_sysfs(conn);
hci_proto_connect_cfm(conn, ev->status); hci_proto_connect_cfm(conn, ev->status);
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include "smp.h" #include "smp.h"
#include "a2mp.h" #include "a2mp.h"
#include "amp.h" #include "amp.h"
#include "6lowpan.h"
#define LE_FLOWCTL_MAX_CREDITS 65535 #define LE_FLOWCTL_MAX_CREDITS 65535
...@@ -205,6 +204,7 @@ int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm) ...@@ -205,6 +204,7 @@ int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
write_unlock(&chan_list_lock); write_unlock(&chan_list_lock);
return err; return err;
} }
EXPORT_SYMBOL_GPL(l2cap_add_psm);
int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid) int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
{ {
...@@ -437,6 +437,7 @@ struct l2cap_chan *l2cap_chan_create(void) ...@@ -437,6 +437,7 @@ struct l2cap_chan *l2cap_chan_create(void)
return chan; return chan;
} }
EXPORT_SYMBOL_GPL(l2cap_chan_create);
static void l2cap_chan_destroy(struct kref *kref) static void l2cap_chan_destroy(struct kref *kref)
{ {
...@@ -464,6 +465,7 @@ void l2cap_chan_put(struct l2cap_chan *c) ...@@ -464,6 +465,7 @@ void l2cap_chan_put(struct l2cap_chan *c)
kref_put(&c->kref, l2cap_chan_destroy); kref_put(&c->kref, l2cap_chan_destroy);
} }
EXPORT_SYMBOL_GPL(l2cap_chan_put);
void l2cap_chan_set_defaults(struct l2cap_chan *chan) void l2cap_chan_set_defaults(struct l2cap_chan *chan)
{ {
...@@ -482,6 +484,7 @@ void l2cap_chan_set_defaults(struct l2cap_chan *chan) ...@@ -482,6 +484,7 @@ void l2cap_chan_set_defaults(struct l2cap_chan *chan)
set_bit(FLAG_FORCE_ACTIVE, &chan->flags); set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
} }
EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
static void l2cap_le_flowctl_init(struct l2cap_chan *chan) static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
{ {
...@@ -614,6 +617,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err) ...@@ -614,6 +617,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
return; return;
} }
EXPORT_SYMBOL_GPL(l2cap_chan_del);
void l2cap_conn_update_id_addr(struct hci_conn *hcon) void l2cap_conn_update_id_addr(struct hci_conn *hcon)
{ {
...@@ -717,6 +721,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) ...@@ -717,6 +721,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
break; break;
} }
} }
EXPORT_SYMBOL(l2cap_chan_close);
static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
{ {
...@@ -1460,8 +1465,6 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) ...@@ -1460,8 +1465,6 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
BT_DBG(""); BT_DBG("");
bt_6lowpan_add_conn(conn);
/* Check if we have socket listening on cid */ /* Check if we have socket listening on cid */
pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT, pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
&hcon->src, &hcon->dst); &hcon->src, &hcon->dst);
...@@ -2555,6 +2558,7 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) ...@@ -2555,6 +2558,7 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
return err; return err;
} }
EXPORT_SYMBOL_GPL(l2cap_chan_send);
static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq) static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
{ {
...@@ -6933,10 +6937,6 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) ...@@ -6933,10 +6937,6 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
l2cap_conn_del(conn->hcon, EACCES); l2cap_conn_del(conn->hcon, EACCES);
break; break;
case L2CAP_FC_6LOWPAN:
bt_6lowpan_recv(conn, skb);
break;
default: default:
l2cap_data_channel(conn, cid, skb); l2cap_data_channel(conn, cid, skb);
break; break;
...@@ -7183,6 +7183,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, ...@@ -7183,6 +7183,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
hci_dev_put(hdev); hci_dev_put(hdev);
return err; return err;
} }
EXPORT_SYMBOL_GPL(l2cap_chan_connect);
/* ---- L2CAP interface with lower layer (HCI) ---- */ /* ---- L2CAP interface with lower layer (HCI) ---- */
...@@ -7245,8 +7246,6 @@ void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason) ...@@ -7245,8 +7246,6 @@ void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
{ {
BT_DBG("hcon %p reason %d", hcon, reason); BT_DBG("hcon %p reason %d", hcon, reason);
bt_6lowpan_del_conn(hcon->l2cap_data);
l2cap_conn_del(hcon, bt_to_errno(reason)); l2cap_conn_del(hcon, bt_to_errno(reason));
} }
...@@ -7529,14 +7528,11 @@ int __init l2cap_init(void) ...@@ -7529,14 +7528,11 @@ int __init l2cap_init(void)
debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs, debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
&le_default_mps); &le_default_mps);
bt_6lowpan_init();
return 0; return 0;
} }
void l2cap_exit(void) void l2cap_exit(void)
{ {
bt_6lowpan_cleanup();
debugfs_remove(l2cap_debugfs); debugfs_remove(l2cap_debugfs);
l2cap_cleanup_sockets(); l2cap_cleanup_sockets();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment