Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Johan Hedberg says: ==================== pull request: bluetooth-next 2016-12-03 Here's a set of Bluetooth & 802.15.4 patches for net-next (i.e. 4.10 kernel): - Fix for a potential NULL deref in the ieee802154 netlink code - Fix for the ED values of the at86rf2xx driver - Documentation updates to ieee802154 - Cleanups to u8 vs __u8 usage - Timer API usage cleanups in HCI drivers Please let me know if there are any issues pulling. Thanks. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c3543688ab
|
@ -4,20 +4,20 @@
|
|||
|
||||
Introduction
|
||||
============
|
||||
The IEEE 802.15.4 working group focuses on standardization of bottom
|
||||
two layers: Medium Access Control (MAC) and Physical (PHY). And there
|
||||
The IEEE 802.15.4 working group focuses on standardization of the bottom
|
||||
two layers: Medium Access Control (MAC) and Physical access (PHY). And there
|
||||
are mainly two options available for upper layers:
|
||||
- ZigBee - proprietary protocol from the ZigBee Alliance
|
||||
- 6LoWPAN - IPv6 networking over low rate personal area networks
|
||||
|
||||
The linux-wpan project goal is to provide a complete implementation
|
||||
The goal of the Linux-wpan is to provide a complete implementation
|
||||
of the IEEE 802.15.4 and 6LoWPAN protocols. IEEE 802.15.4 is a stack
|
||||
of protocols for organizing Low-Rate Wireless Personal Area Networks.
|
||||
|
||||
The stack is composed of three main parts:
|
||||
- IEEE 802.15.4 layer; We have chosen to use plain Berkeley socket API,
|
||||
the generic Linux networking stack to transfer IEEE 802.15.4 messages
|
||||
and a special protocol over genetlink for configuration/management
|
||||
the generic Linux networking stack to transfer IEEE 802.15.4 data
|
||||
messages and a special protocol over netlink for configuration/management
|
||||
- MAC - provides access to shared channel and reliable data delivery
|
||||
- PHY - represents device drivers
|
||||
|
||||
|
@ -33,15 +33,13 @@ include/net/af_ieee802154.h header or in the special header
|
|||
in the userspace package (see either http://wpan.cakelab.org/ or the
|
||||
git tree at https://github.com/linux-wpan/wpan-tools).
|
||||
|
||||
One can use SOCK_RAW for passing raw data towards device xmit function. YMMV.
|
||||
|
||||
|
||||
Kernel side
|
||||
=============
|
||||
|
||||
Like with WiFi, there are several types of devices implementing IEEE 802.15.4.
|
||||
1) 'HardMAC'. The MAC layer is implemented in the device itself, the device
|
||||
exports MLME and data API.
|
||||
exports a management (e.g. MLME) and data API.
|
||||
2) 'SoftMAC' or just radio. These types of devices are just radio transceivers
|
||||
possibly with some kinds of acceleration like automatic CRC computation and
|
||||
comparation, automagic ACK handling, address matching, etc.
|
||||
|
@ -106,7 +104,7 @@ Fake drivers
|
|||
|
||||
In addition there is a driver available which simulates a real device with
|
||||
SoftMAC (fakelb - IEEE 802.15.4 loopback driver) interface. This option
|
||||
provides possibility to test and debug stack without usage of real hardware.
|
||||
provides a possibility to test and debug the stack without usage of real hardware.
|
||||
|
||||
See sources in drivers/net/ieee802154 folder for more details.
|
||||
|
||||
|
@ -125,17 +123,15 @@ to support the IPv6 minimum MTU requirement [RFC2460], and stateless header
|
|||
compression for IPv6 datagrams (LOWPAN_HC1 and LOWPAN_HC2) to reduce the
|
||||
relatively large IPv6 and UDP headers down to (in the best case) several bytes.
|
||||
|
||||
In Semptember 2011 the standard update was published - [RFC6282].
|
||||
In September 2011 the standard update was published - [RFC6282].
|
||||
It deprecates HC1 and HC2 compression and defines IPHC encoding format which is
|
||||
used in this Linux implementation.
|
||||
|
||||
All the code related to 6lowpan you may find in files: net/6lowpan/*
|
||||
and net/ieee802154/6lowpan/*
|
||||
|
||||
To setup 6lowpan interface you need (busybox release > 1.17.0):
|
||||
1. Add IEEE802.15.4 interface and initialize PANid;
|
||||
To setup a 6LoWPAN interface you need:
|
||||
1. Add IEEE802.15.4 interface and set channel and PAN ID;
|
||||
2. Add 6lowpan interface by command like:
|
||||
# ip link add link wpan0 name lowpan0 type lowpan
|
||||
3. Set MAC (if needs):
|
||||
# ip link set lowpan0 address de:ad:be:ef:ca:fe:ba:be
|
||||
4. Bring up 'lowpan0' interface
|
||||
3. Bring up 'lowpan0' interface
|
||||
|
|
|
@ -6105,6 +6105,7 @@ F: drivers/idle/i7300_idle.c
|
|||
|
||||
IEEE 802.15.4 SUBSYSTEM
|
||||
M: Alexander Aring <aar@pengutronix.de>
|
||||
M: Stefan Schmidt <stefan@osg.samsung.com>
|
||||
L: linux-wpan@vger.kernel.org
|
||||
W: http://wpan.cakelab.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
|
||||
|
|
|
@ -733,9 +733,7 @@ static int bcsp_open(struct hci_uart *hu)
|
|||
skb_queue_head_init(&bcsp->rel);
|
||||
skb_queue_head_init(&bcsp->unrel);
|
||||
|
||||
init_timer(&bcsp->tbcsp);
|
||||
bcsp->tbcsp.function = bcsp_timed_event;
|
||||
bcsp->tbcsp.data = (u_long)hu;
|
||||
setup_timer(&bcsp->tbcsp, bcsp_timed_event, (u_long)hu);
|
||||
|
||||
bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
|
||||
|
||||
|
|
|
@ -204,9 +204,7 @@ static int h5_open(struct hci_uart *hu)
|
|||
|
||||
h5_reset_rx(h5);
|
||||
|
||||
init_timer(&h5->timer);
|
||||
h5->timer.function = h5_timed_event;
|
||||
h5->timer.data = (unsigned long)hu;
|
||||
setup_timer(&h5->timer, h5_timed_event, (unsigned long)hu);
|
||||
|
||||
h5->tx_win = H5_TX_WIN_MAX;
|
||||
|
||||
|
|
|
@ -438,14 +438,11 @@ static int qca_open(struct hci_uart *hu)
|
|||
|
||||
hu->priv = qca;
|
||||
|
||||
init_timer(&qca->wake_retrans_timer);
|
||||
qca->wake_retrans_timer.function = hci_ibs_wake_retrans_timeout;
|
||||
qca->wake_retrans_timer.data = (u_long)hu;
|
||||
setup_timer(&qca->wake_retrans_timer, hci_ibs_wake_retrans_timeout,
|
||||
(u_long)hu);
|
||||
qca->wake_retrans = IBS_WAKE_RETRANS_TIMEOUT_MS;
|
||||
|
||||
init_timer(&qca->tx_idle_timer);
|
||||
qca->tx_idle_timer.function = hci_ibs_tx_idle_timeout;
|
||||
qca->tx_idle_timer.data = (u_long)hu;
|
||||
setup_timer(&qca->tx_idle_timer, hci_ibs_tx_idle_timeout, (u_long)hu);
|
||||
qca->tx_idle_delay = IBS_TX_IDLE_TIMEOUT_MS;
|
||||
|
||||
BT_DBG("HCI_UART_QCA open, tx_idle_delay=%u, wake_retrans=%u",
|
||||
|
|
|
@ -990,7 +990,12 @@ at86rf23x_set_channel(struct at86rf230_local *lp, u8 page, u8 channel)
|
|||
}
|
||||
|
||||
#define AT86RF2XX_MAX_ED_LEVELS 0xF
|
||||
static const s32 at86rf23x_ed_levels[AT86RF2XX_MAX_ED_LEVELS + 1] = {
|
||||
static const s32 at86rf233_ed_levels[AT86RF2XX_MAX_ED_LEVELS + 1] = {
|
||||
-9400, -9200, -9000, -8800, -8600, -8400, -8200, -8000, -7800, -7600,
|
||||
-7400, -7200, -7000, -6800, -6600, -6400,
|
||||
};
|
||||
|
||||
static const s32 at86rf231_ed_levels[AT86RF2XX_MAX_ED_LEVELS + 1] = {
|
||||
-9100, -8900, -8700, -8500, -8300, -8100, -7900, -7700, -7500, -7300,
|
||||
-7100, -6900, -6700, -6500, -6300, -6100,
|
||||
};
|
||||
|
@ -1343,7 +1348,7 @@ static struct at86rf2xx_chip_data at86rf233_data = {
|
|||
.t_sleep_to_off = 1000,
|
||||
.t_frame = 4096,
|
||||
.t_p_ack = 545,
|
||||
.rssi_base_val = -91,
|
||||
.rssi_base_val = -94,
|
||||
.set_channel = at86rf23x_set_channel,
|
||||
.set_txpower = at86rf23x_set_txpower,
|
||||
};
|
||||
|
@ -1557,9 +1562,6 @@ at86rf230_detect_device(struct at86rf230_local *lp)
|
|||
lp->hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND) |
|
||||
BIT(NL802154_CCA_OPT_ENERGY_CARRIER_OR);
|
||||
|
||||
lp->hw->phy->supported.cca_ed_levels = at86rf23x_ed_levels;
|
||||
lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf23x_ed_levels);
|
||||
|
||||
lp->hw->phy->cca.mode = NL802154_CCA_ENERGY;
|
||||
|
||||
switch (part) {
|
||||
|
@ -1575,6 +1577,8 @@ at86rf230_detect_device(struct at86rf230_local *lp)
|
|||
lp->hw->phy->symbol_duration = 16;
|
||||
lp->hw->phy->supported.tx_powers = at86rf231_powers;
|
||||
lp->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf231_powers);
|
||||
lp->hw->phy->supported.cca_ed_levels = at86rf231_ed_levels;
|
||||
lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf231_ed_levels);
|
||||
break;
|
||||
case 7:
|
||||
chip = "at86rf212";
|
||||
|
@ -1598,6 +1602,8 @@ at86rf230_detect_device(struct at86rf230_local *lp)
|
|||
lp->hw->phy->symbol_duration = 16;
|
||||
lp->hw->phy->supported.tx_powers = at86rf233_powers;
|
||||
lp->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf233_powers);
|
||||
lp->hw->phy->supported.cca_ed_levels = at86rf233_ed_levels;
|
||||
lp->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(at86rf233_ed_levels);
|
||||
break;
|
||||
default:
|
||||
chip = "unknown";
|
||||
|
|
|
@ -218,7 +218,7 @@ static int fakelb_probe(struct platform_device *pdev)
|
|||
goto err_slave;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "added ieee802154 hardware\n");
|
||||
dev_info(&pdev->dev, "added %i fake ieee802154 hardware devices\n", numlbs);
|
||||
return 0;
|
||||
|
||||
err_slave:
|
||||
|
|
|
@ -197,7 +197,7 @@ typedef struct {
|
|||
#define BDADDR_LE_PUBLIC 0x01
|
||||
#define BDADDR_LE_RANDOM 0x02
|
||||
|
||||
static inline bool bdaddr_type_is_valid(__u8 type)
|
||||
static inline bool bdaddr_type_is_valid(u8 type)
|
||||
{
|
||||
switch (type) {
|
||||
case BDADDR_BREDR:
|
||||
|
@ -209,7 +209,7 @@ static inline bool bdaddr_type_is_valid(__u8 type)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline bool bdaddr_type_is_le(__u8 type)
|
||||
static inline bool bdaddr_type_is_le(u8 type)
|
||||
{
|
||||
switch (type) {
|
||||
case BDADDR_LE_PUBLIC:
|
||||
|
@ -279,15 +279,16 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
|
|||
|
||||
/* Skb helpers */
|
||||
struct l2cap_ctrl {
|
||||
__u8 sframe:1,
|
||||
u8 sframe:1,
|
||||
poll:1,
|
||||
final:1,
|
||||
fcs:1,
|
||||
sar:2,
|
||||
super:2;
|
||||
__u16 reqseq;
|
||||
__u16 txseq;
|
||||
__u8 retries;
|
||||
|
||||
u16 reqseq;
|
||||
u16 txseq;
|
||||
u8 retries;
|
||||
__le16 psm;
|
||||
bdaddr_t bdaddr;
|
||||
struct l2cap_chan *chan;
|
||||
|
@ -303,7 +304,7 @@ typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status,
|
|||
#define HCI_REQ_SKB BIT(1)
|
||||
|
||||
struct hci_ctrl {
|
||||
__u16 opcode;
|
||||
u16 opcode;
|
||||
u8 req_flags;
|
||||
u8 req_event;
|
||||
union {
|
||||
|
@ -313,10 +314,10 @@ struct hci_ctrl {
|
|||
};
|
||||
|
||||
struct bt_skb_cb {
|
||||
__u8 pkt_type;
|
||||
__u8 force_active;
|
||||
__u16 expect;
|
||||
__u8 incoming:1;
|
||||
u8 pkt_type;
|
||||
u8 force_active;
|
||||
u16 expect;
|
||||
u8 incoming:1;
|
||||
union {
|
||||
struct l2cap_ctrl l2cap;
|
||||
struct hci_ctrl hci;
|
||||
|
@ -366,7 +367,7 @@ out:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int bt_to_errno(__u16 code);
|
||||
int bt_to_errno(u16 code);
|
||||
|
||||
void hci_sock_set_flag(struct sock *sk, int nr);
|
||||
void hci_sock_clear_flag(struct sock *sk, int nr);
|
||||
|
|
|
@ -286,9 +286,12 @@ int ieee802154_del_iface(struct sk_buff *skb, struct genl_info *info)
|
|||
if (name[nla_len(info->attrs[IEEE802154_ATTR_DEV_NAME]) - 1] != '\0')
|
||||
return -EINVAL; /* name should be null-terminated */
|
||||
|
||||
rc = -ENODEV;
|
||||
dev = dev_get_by_name(genl_info_net(info), name);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
return rc;
|
||||
if (dev->type != ARPHRD_IEEE802154)
|
||||
goto out;
|
||||
|
||||
phy = dev->ieee802154_ptr->wpan_phy;
|
||||
BUG_ON(!phy);
|
||||
|
@ -342,6 +345,7 @@ nla_put_failure:
|
|||
nlmsg_free(msg);
|
||||
out_dev:
|
||||
wpan_phy_put(phy);
|
||||
out:
|
||||
if (dev)
|
||||
dev_put(dev);
|
||||
|
||||
|
|
Loading…
Reference in New Issue