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-04-26 Here's another set of Bluetooth & 802.15.4 patches for the 4.7 kernel: - Cleanups & refactoring of ieee802154 & 6lowpan code - Security related additions to ieee802154 and mrf24j40 driver - Memory corruption fix to Bluetooth 6lowpan code - Race condition fix in vhci driver - Enhancements to the atusb 802.15.4 driver 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:
@@ -41,24 +41,12 @@ static inline u32 ieee802154_addr_hash(const struct ieee802154_addr *a)
|
||||
return (((__force u64)a->extended_addr) >> 32) ^
|
||||
(((__force u64)a->extended_addr) & 0xffffffff);
|
||||
case IEEE802154_ADDR_SHORT:
|
||||
return (__force u32)(a->short_addr);
|
||||
return (__force u32)(a->short_addr + (a->pan_id << 16));
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* private device info */
|
||||
struct lowpan_dev_info {
|
||||
struct net_device *wdev; /* wpan device ptr */
|
||||
u16 fragment_tag;
|
||||
};
|
||||
|
||||
static inline struct
|
||||
lowpan_dev_info *lowpan_dev_info(const struct net_device *dev)
|
||||
{
|
||||
return (struct lowpan_dev_info *)lowpan_priv(dev)->priv;
|
||||
}
|
||||
|
||||
int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type);
|
||||
void lowpan_net_frag_exit(void);
|
||||
int lowpan_net_frag_init(void);
|
||||
|
@@ -148,7 +148,7 @@ static int lowpan_newlink(struct net *src_net, struct net_device *ldev,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
lowpan_dev_info(ldev)->wdev = wdev;
|
||||
lowpan_802154_dev(ldev)->wdev = wdev;
|
||||
/* Set the lowpan hardware address to the wpan hardware address. */
|
||||
memcpy(ldev->dev_addr, wdev->dev_addr, IEEE802154_ADDR_LEN);
|
||||
/* We need headroom for possible wpan_dev_hard_header call and tailroom
|
||||
@@ -173,7 +173,7 @@ static int lowpan_newlink(struct net *src_net, struct net_device *ldev,
|
||||
|
||||
static void lowpan_dellink(struct net_device *ldev, struct list_head *head)
|
||||
{
|
||||
struct net_device *wdev = lowpan_dev_info(ldev)->wdev;
|
||||
struct net_device *wdev = lowpan_802154_dev(ldev)->wdev;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
@@ -184,7 +184,7 @@ static void lowpan_dellink(struct net_device *ldev, struct list_head *head)
|
||||
|
||||
static struct rtnl_link_ops lowpan_link_ops __read_mostly = {
|
||||
.kind = "lowpan",
|
||||
.priv_size = LOWPAN_PRIV_SIZE(sizeof(struct lowpan_dev_info)),
|
||||
.priv_size = LOWPAN_PRIV_SIZE(sizeof(struct lowpan_802154_dev)),
|
||||
.setup = lowpan_setup,
|
||||
.newlink = lowpan_newlink,
|
||||
.dellink = lowpan_dellink,
|
||||
|
@@ -84,7 +84,7 @@ static struct sk_buff*
|
||||
lowpan_alloc_frag(struct sk_buff *skb, int size,
|
||||
const struct ieee802154_hdr *master_hdr, bool frag1)
|
||||
{
|
||||
struct net_device *wdev = lowpan_dev_info(skb->dev)->wdev;
|
||||
struct net_device *wdev = lowpan_802154_dev(skb->dev)->wdev;
|
||||
struct sk_buff *frag;
|
||||
int rc;
|
||||
|
||||
@@ -148,8 +148,8 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *ldev,
|
||||
int frag_cap, frag_len, payload_cap, rc;
|
||||
int skb_unprocessed, skb_offset;
|
||||
|
||||
frag_tag = htons(lowpan_dev_info(ldev)->fragment_tag);
|
||||
lowpan_dev_info(ldev)->fragment_tag++;
|
||||
frag_tag = htons(lowpan_802154_dev(ldev)->fragment_tag);
|
||||
lowpan_802154_dev(ldev)->fragment_tag++;
|
||||
|
||||
frag_hdr[0] = LOWPAN_DISPATCH_FRAG1 | ((dgram_size >> 8) & 0x07);
|
||||
frag_hdr[1] = dgram_size & 0xff;
|
||||
@@ -208,7 +208,7 @@ err:
|
||||
static int lowpan_header(struct sk_buff *skb, struct net_device *ldev,
|
||||
u16 *dgram_size, u16 *dgram_offset)
|
||||
{
|
||||
struct wpan_dev *wpan_dev = lowpan_dev_info(ldev)->wdev->ieee802154_ptr;
|
||||
struct wpan_dev *wpan_dev = lowpan_802154_dev(ldev)->wdev->ieee802154_ptr;
|
||||
struct ieee802154_addr sa, da;
|
||||
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
|
||||
struct lowpan_addr_info info;
|
||||
@@ -248,8 +248,8 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *ldev,
|
||||
cb->ackreq = wpan_dev->ackreq;
|
||||
}
|
||||
|
||||
return wpan_dev_hard_header(skb, lowpan_dev_info(ldev)->wdev, &da, &sa,
|
||||
0);
|
||||
return wpan_dev_hard_header(skb, lowpan_802154_dev(ldev)->wdev, &da,
|
||||
&sa, 0);
|
||||
}
|
||||
|
||||
netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *ldev)
|
||||
@@ -283,7 +283,7 @@ netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *ldev)
|
||||
max_single = ieee802154_max_payload(&wpan_hdr);
|
||||
|
||||
if (skb_tail_pointer(skb) - skb_network_header(skb) <= max_single) {
|
||||
skb->dev = lowpan_dev_info(ldev)->wdev;
|
||||
skb->dev = lowpan_802154_dev(ldev)->wdev;
|
||||
ldev->stats.tx_packets++;
|
||||
ldev->stats.tx_bytes += dgram_size;
|
||||
return dev_queue_xmit(skb);
|
||||
|
@@ -1078,6 +1078,11 @@ static int nl802154_set_pan_id(struct sk_buff *skb, struct genl_info *info)
|
||||
if (netif_running(dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (wpan_dev->lowpan_dev) {
|
||||
if (netif_running(wpan_dev->lowpan_dev))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* don't change address fields on monitor */
|
||||
if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR ||
|
||||
!info->attrs[NL802154_ATTR_PAN_ID])
|
||||
@@ -1109,6 +1114,11 @@ static int nl802154_set_short_addr(struct sk_buff *skb, struct genl_info *info)
|
||||
if (netif_running(dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (wpan_dev->lowpan_dev) {
|
||||
if (netif_running(wpan_dev->lowpan_dev))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* don't change address fields on monitor */
|
||||
if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR ||
|
||||
!info->attrs[NL802154_ATTR_SHORT_ADDR])
|
||||
|
Reference in New Issue
Block a user