mirror of https://gitee.com/openkylin/linux.git
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: Jukka Rissanen <jukka.rissanen@linux.intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
0498878b18
commit
6b8d4a6a03
|
@ -145,7 +145,6 @@ enum {
|
|||
HCI_PERIODIC_INQ,
|
||||
HCI_FAST_CONNECTABLE,
|
||||
HCI_BREDR_ENABLED,
|
||||
HCI_6LOWPAN_ENABLED,
|
||||
HCI_LE_SCAN_INTERRUPTED,
|
||||
};
|
||||
|
||||
|
|
|
@ -521,7 +521,6 @@ enum {
|
|||
HCI_CONN_AES_CCM,
|
||||
HCI_CONN_POWER_SAVE,
|
||||
HCI_CONN_REMOTE_OOB,
|
||||
HCI_CONN_6LOWPAN,
|
||||
};
|
||||
|
||||
static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
|
||||
|
|
|
@ -137,7 +137,6 @@ struct l2cap_conninfo {
|
|||
#define L2CAP_FC_L2CAP 0x02
|
||||
#define L2CAP_FC_CONNLESS 0x04
|
||||
#define L2CAP_FC_A2MP 0x08
|
||||
#define L2CAP_FC_6LOWPAN 0x3e /* reserved and temporary value */
|
||||
|
||||
/* L2CAP Control Field bit masks */
|
||||
#define L2CAP_CTRL_SAR 0xC000
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
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)
|
|||
DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
|
||||
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)
|
||||
{
|
||||
struct hci_dev *hdev = sf->private;
|
||||
|
@ -1881,8 +1838,6 @@ static int __hci_init(struct hci_dev *hdev)
|
|||
hdev, &conn_max_interval_fops);
|
||||
debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
|
||||
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,
|
||||
&le_auto_conn_fops);
|
||||
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)
|
|||
conn->handle = __le16_to_cpu(ev->handle);
|
||||
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_proto_connect_cfm(conn, ev->status);
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include "smp.h"
|
||||
#include "a2mp.h"
|
||||
#include "amp.h"
|
||||
#include "6lowpan.h"
|
||||
|
||||
#define LE_FLOWCTL_MAX_CREDITS 65535
|
||||
|
||||
|
@ -205,6 +204,7 @@ int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
|
|||
write_unlock(&chan_list_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_add_psm);
|
||||
|
||||
int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
|
||||
{
|
||||
|
@ -437,6 +437,7 @@ struct l2cap_chan *l2cap_chan_create(void)
|
|||
|
||||
return chan;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_create);
|
||||
|
||||
static void l2cap_chan_destroy(struct kref *kref)
|
||||
{
|
||||
|
@ -464,6 +465,7 @@ void l2cap_chan_put(struct l2cap_chan *c)
|
|||
|
||||
kref_put(&c->kref, l2cap_chan_destroy);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_put);
|
||||
|
||||
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);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
|
||||
|
||||
static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
|
||||
{
|
||||
|
@ -614,6 +617,7 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err)
|
|||
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_del);
|
||||
|
||||
void l2cap_conn_update_id_addr(struct hci_conn *hcon)
|
||||
{
|
||||
|
@ -717,6 +721,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
|
|||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(l2cap_chan_close);
|
||||
|
||||
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)
|
|||
|
||||
BT_DBG("");
|
||||
|
||||
bt_6lowpan_add_conn(conn);
|
||||
|
||||
/* Check if we have socket listening on cid */
|
||||
pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
|
||||
&hcon->src, &hcon->dst);
|
||||
|
@ -2555,6 +2558,7 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
|
|||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_send);
|
||||
|
||||
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)
|
|||
l2cap_conn_del(conn->hcon, EACCES);
|
||||
break;
|
||||
|
||||
case L2CAP_FC_6LOWPAN:
|
||||
bt_6lowpan_recv(conn, skb);
|
||||
break;
|
||||
|
||||
default:
|
||||
l2cap_data_channel(conn, cid, skb);
|
||||
break;
|
||||
|
@ -7183,6 +7183,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
|
|||
hci_dev_put(hdev);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(l2cap_chan_connect);
|
||||
|
||||
/* ---- L2CAP interface with lower layer (HCI) ---- */
|
||||
|
||||
|
@ -7245,8 +7246,6 @@ void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
|
|||
{
|
||||
BT_DBG("hcon %p reason %d", hcon, reason);
|
||||
|
||||
bt_6lowpan_del_conn(hcon->l2cap_data);
|
||||
|
||||
l2cap_conn_del(hcon, bt_to_errno(reason));
|
||||
}
|
||||
|
||||
|
@ -7529,14 +7528,11 @@ int __init l2cap_init(void)
|
|||
debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
|
||||
&le_default_mps);
|
||||
|
||||
bt_6lowpan_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void l2cap_exit(void)
|
||||
{
|
||||
bt_6lowpan_cleanup();
|
||||
debugfs_remove(l2cap_debugfs);
|
||||
l2cap_cleanup_sockets();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue