|
@@ -68,7 +68,7 @@ struct lowpan_peer {
|
|
struct in6_addr peer_addr;
|
|
struct in6_addr peer_addr;
|
|
};
|
|
};
|
|
|
|
|
|
-struct lowpan_dev {
|
|
|
|
|
|
+struct lowpan_btle_dev {
|
|
struct list_head list;
|
|
struct list_head list;
|
|
|
|
|
|
struct hci_dev *hdev;
|
|
struct hci_dev *hdev;
|
|
@@ -80,18 +80,21 @@ struct lowpan_dev {
|
|
struct delayed_work notify_peers;
|
|
struct delayed_work notify_peers;
|
|
};
|
|
};
|
|
|
|
|
|
-static inline struct lowpan_dev *lowpan_dev(const struct net_device *netdev)
|
|
|
|
|
|
+static inline struct lowpan_btle_dev *
|
|
|
|
+lowpan_btle_dev(const struct net_device *netdev)
|
|
{
|
|
{
|
|
- return (struct lowpan_dev *)lowpan_priv(netdev)->priv;
|
|
|
|
|
|
+ return (struct lowpan_btle_dev *)lowpan_dev(netdev)->priv;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void peer_add(struct lowpan_dev *dev, struct lowpan_peer *peer)
|
|
|
|
|
|
+static inline void peer_add(struct lowpan_btle_dev *dev,
|
|
|
|
+ struct lowpan_peer *peer)
|
|
{
|
|
{
|
|
list_add_rcu(&peer->list, &dev->peers);
|
|
list_add_rcu(&peer->list, &dev->peers);
|
|
atomic_inc(&dev->peer_count);
|
|
atomic_inc(&dev->peer_count);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline bool peer_del(struct lowpan_dev *dev, struct lowpan_peer *peer)
|
|
|
|
|
|
+static inline bool peer_del(struct lowpan_btle_dev *dev,
|
|
|
|
+ struct lowpan_peer *peer)
|
|
{
|
|
{
|
|
list_del_rcu(&peer->list);
|
|
list_del_rcu(&peer->list);
|
|
kfree_rcu(peer, rcu);
|
|
kfree_rcu(peer, rcu);
|
|
@@ -106,7 +109,7 @@ static inline bool peer_del(struct lowpan_dev *dev, struct lowpan_peer *peer)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline struct lowpan_peer *peer_lookup_ba(struct lowpan_dev *dev,
|
|
|
|
|
|
+static inline struct lowpan_peer *peer_lookup_ba(struct lowpan_btle_dev *dev,
|
|
bdaddr_t *ba, __u8 type)
|
|
bdaddr_t *ba, __u8 type)
|
|
{
|
|
{
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
@@ -134,8 +137,8 @@ static inline struct lowpan_peer *peer_lookup_ba(struct lowpan_dev *dev,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline struct lowpan_peer *__peer_lookup_chan(struct lowpan_dev *dev,
|
|
|
|
- struct l2cap_chan *chan)
|
|
|
|
|
|
+static inline struct lowpan_peer *
|
|
|
|
+__peer_lookup_chan(struct lowpan_btle_dev *dev, struct l2cap_chan *chan)
|
|
{
|
|
{
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
|
|
|
|
@@ -147,8 +150,8 @@ static inline struct lowpan_peer *__peer_lookup_chan(struct lowpan_dev *dev,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline struct lowpan_peer *__peer_lookup_conn(struct lowpan_dev *dev,
|
|
|
|
- struct l2cap_conn *conn)
|
|
|
|
|
|
+static inline struct lowpan_peer *
|
|
|
|
+__peer_lookup_conn(struct lowpan_btle_dev *dev, struct l2cap_conn *conn)
|
|
{
|
|
{
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
|
|
|
|
@@ -160,7 +163,7 @@ static inline struct lowpan_peer *__peer_lookup_conn(struct lowpan_dev *dev,
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_dev *dev,
|
|
|
|
|
|
+static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,
|
|
struct in6_addr *daddr,
|
|
struct in6_addr *daddr,
|
|
struct sk_buff *skb)
|
|
struct sk_buff *skb)
|
|
{
|
|
{
|
|
@@ -220,7 +223,7 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_dev *dev,
|
|
|
|
|
|
static struct lowpan_peer *lookup_peer(struct l2cap_conn *conn)
|
|
static struct lowpan_peer *lookup_peer(struct l2cap_conn *conn)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
struct lowpan_peer *peer = NULL;
|
|
struct lowpan_peer *peer = NULL;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
@@ -236,10 +239,10 @@ static struct lowpan_peer *lookup_peer(struct l2cap_conn *conn)
|
|
return peer;
|
|
return peer;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct lowpan_dev *lookup_dev(struct l2cap_conn *conn)
|
|
|
|
|
|
+static struct lowpan_btle_dev *lookup_dev(struct l2cap_conn *conn)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry;
|
|
|
|
- struct lowpan_dev *dev = NULL;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
|
|
+ struct lowpan_btle_dev *dev = NULL;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
|
|
@@ -270,10 +273,10 @@ static int iphc_decompress(struct sk_buff *skb, struct net_device *netdev,
|
|
struct l2cap_chan *chan)
|
|
struct l2cap_chan *chan)
|
|
{
|
|
{
|
|
const u8 *saddr, *daddr;
|
|
const u8 *saddr, *daddr;
|
|
- struct lowpan_dev *dev;
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev;
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
|
|
|
|
- dev = lowpan_dev(netdev);
|
|
|
|
|
|
+ dev = lowpan_btle_dev(netdev);
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
peer = __peer_lookup_chan(dev, chan);
|
|
peer = __peer_lookup_chan(dev, chan);
|
|
@@ -375,7 +378,7 @@ drop:
|
|
/* Packet from BT LE device */
|
|
/* Packet from BT LE device */
|
|
static int chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
|
|
static int chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
|
|
{
|
|
{
|
|
- struct lowpan_dev *dev;
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev;
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
@@ -431,15 +434,18 @@ static int setup_header(struct sk_buff *skb, struct net_device *netdev,
|
|
bdaddr_t *peer_addr, u8 *peer_addr_type)
|
|
bdaddr_t *peer_addr, u8 *peer_addr_type)
|
|
{
|
|
{
|
|
struct in6_addr ipv6_daddr;
|
|
struct in6_addr ipv6_daddr;
|
|
- struct lowpan_dev *dev;
|
|
|
|
|
|
+ struct ipv6hdr *hdr;
|
|
|
|
+ struct lowpan_btle_dev *dev;
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
bdaddr_t addr, *any = BDADDR_ANY;
|
|
bdaddr_t addr, *any = BDADDR_ANY;
|
|
u8 *daddr = any->b;
|
|
u8 *daddr = any->b;
|
|
int err, status = 0;
|
|
int err, status = 0;
|
|
|
|
|
|
- dev = lowpan_dev(netdev);
|
|
|
|
|
|
+ hdr = ipv6_hdr(skb);
|
|
|
|
+
|
|
|
|
+ dev = lowpan_btle_dev(netdev);
|
|
|
|
|
|
- memcpy(&ipv6_daddr, &lowpan_cb(skb)->addr, sizeof(ipv6_daddr));
|
|
|
|
|
|
+ memcpy(&ipv6_daddr, &hdr->daddr, sizeof(ipv6_daddr));
|
|
|
|
|
|
if (ipv6_addr_is_multicast(&ipv6_daddr)) {
|
|
if (ipv6_addr_is_multicast(&ipv6_daddr)) {
|
|
lowpan_cb(skb)->chan = NULL;
|
|
lowpan_cb(skb)->chan = NULL;
|
|
@@ -489,15 +495,9 @@ static int header_create(struct sk_buff *skb, struct net_device *netdev,
|
|
unsigned short type, const void *_daddr,
|
|
unsigned short type, const void *_daddr,
|
|
const void *_saddr, unsigned int len)
|
|
const void *_saddr, unsigned int len)
|
|
{
|
|
{
|
|
- struct ipv6hdr *hdr;
|
|
|
|
-
|
|
|
|
if (type != ETH_P_IPV6)
|
|
if (type != ETH_P_IPV6)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- hdr = ipv6_hdr(skb);
|
|
|
|
-
|
|
|
|
- memcpy(&lowpan_cb(skb)->addr, &hdr->daddr, sizeof(struct in6_addr));
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -543,19 +543,19 @@ static int send_pkt(struct l2cap_chan *chan, struct sk_buff *skb,
|
|
static int send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
|
|
static int send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
|
|
{
|
|
{
|
|
struct sk_buff *local_skb;
|
|
struct sk_buff *local_skb;
|
|
- struct lowpan_dev *entry;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
|
|
list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) {
|
|
list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) {
|
|
struct lowpan_peer *pentry;
|
|
struct lowpan_peer *pentry;
|
|
- struct lowpan_dev *dev;
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev;
|
|
|
|
|
|
if (entry->netdev != netdev)
|
|
if (entry->netdev != netdev)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- dev = lowpan_dev(entry->netdev);
|
|
|
|
|
|
+ dev = lowpan_btle_dev(entry->netdev);
|
|
|
|
|
|
list_for_each_entry_rcu(pentry, &dev->peers, list) {
|
|
list_for_each_entry_rcu(pentry, &dev->peers, list) {
|
|
int ret;
|
|
int ret;
|
|
@@ -723,8 +723,8 @@ static void ifdown(struct net_device *netdev)
|
|
|
|
|
|
static void do_notify_peers(struct work_struct *work)
|
|
static void do_notify_peers(struct work_struct *work)
|
|
{
|
|
{
|
|
- struct lowpan_dev *dev = container_of(work, struct lowpan_dev,
|
|
|
|
- notify_peers.work);
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev = container_of(work, struct lowpan_btle_dev,
|
|
|
|
+ notify_peers.work);
|
|
|
|
|
|
netdev_notify_peers(dev->netdev); /* send neighbour adv at startup */
|
|
netdev_notify_peers(dev->netdev); /* send neighbour adv at startup */
|
|
}
|
|
}
|
|
@@ -766,7 +766,7 @@ static void set_ip_addr_bits(u8 addr_type, u8 *addr)
|
|
}
|
|
}
|
|
|
|
|
|
static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
|
static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
|
- struct lowpan_dev *dev)
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev)
|
|
{
|
|
{
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
|
|
|
|
@@ -803,12 +803,12 @@ static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
|
return peer->chan;
|
|
return peer->chan;
|
|
}
|
|
}
|
|
|
|
|
|
-static int setup_netdev(struct l2cap_chan *chan, struct lowpan_dev **dev)
|
|
|
|
|
|
+static int setup_netdev(struct l2cap_chan *chan, struct lowpan_btle_dev **dev)
|
|
{
|
|
{
|
|
struct net_device *netdev;
|
|
struct net_device *netdev;
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
|
|
- netdev = alloc_netdev(LOWPAN_PRIV_SIZE(sizeof(struct lowpan_dev)),
|
|
|
|
|
|
+ netdev = alloc_netdev(LOWPAN_PRIV_SIZE(sizeof(struct lowpan_btle_dev)),
|
|
IFACE_NAME_TEMPLATE, NET_NAME_UNKNOWN,
|
|
IFACE_NAME_TEMPLATE, NET_NAME_UNKNOWN,
|
|
netdev_setup);
|
|
netdev_setup);
|
|
if (!netdev)
|
|
if (!netdev)
|
|
@@ -820,7 +820,7 @@ static int setup_netdev(struct l2cap_chan *chan, struct lowpan_dev **dev)
|
|
SET_NETDEV_DEV(netdev, &chan->conn->hcon->hdev->dev);
|
|
SET_NETDEV_DEV(netdev, &chan->conn->hcon->hdev->dev);
|
|
SET_NETDEV_DEVTYPE(netdev, &bt_type);
|
|
SET_NETDEV_DEVTYPE(netdev, &bt_type);
|
|
|
|
|
|
- *dev = lowpan_dev(netdev);
|
|
|
|
|
|
+ *dev = lowpan_btle_dev(netdev);
|
|
(*dev)->netdev = netdev;
|
|
(*dev)->netdev = netdev;
|
|
(*dev)->hdev = chan->conn->hcon->hdev;
|
|
(*dev)->hdev = chan->conn->hcon->hdev;
|
|
INIT_LIST_HEAD(&(*dev)->peers);
|
|
INIT_LIST_HEAD(&(*dev)->peers);
|
|
@@ -853,7 +853,7 @@ out:
|
|
|
|
|
|
static inline void chan_ready_cb(struct l2cap_chan *chan)
|
|
static inline void chan_ready_cb(struct l2cap_chan *chan)
|
|
{
|
|
{
|
|
- struct lowpan_dev *dev;
|
|
|
|
|
|
+ struct lowpan_btle_dev *dev;
|
|
|
|
|
|
dev = lookup_dev(chan->conn);
|
|
dev = lookup_dev(chan->conn);
|
|
|
|
|
|
@@ -890,8 +890,9 @@ static inline struct l2cap_chan *chan_new_conn_cb(struct l2cap_chan *pchan)
|
|
|
|
|
|
static void delete_netdev(struct work_struct *work)
|
|
static void delete_netdev(struct work_struct *work)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry = container_of(work, struct lowpan_dev,
|
|
|
|
- delete_netdev);
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry = container_of(work,
|
|
|
|
+ struct lowpan_btle_dev,
|
|
|
|
+ delete_netdev);
|
|
|
|
|
|
lowpan_unregister_netdev(entry->netdev);
|
|
lowpan_unregister_netdev(entry->netdev);
|
|
|
|
|
|
@@ -900,8 +901,8 @@ static void delete_netdev(struct work_struct *work)
|
|
|
|
|
|
static void chan_close_cb(struct l2cap_chan *chan)
|
|
static void chan_close_cb(struct l2cap_chan *chan)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry;
|
|
|
|
- struct lowpan_dev *dev = NULL;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
|
|
+ struct lowpan_btle_dev *dev = NULL;
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
int err = -ENOENT;
|
|
int err = -ENOENT;
|
|
bool last = false, remove = true;
|
|
bool last = false, remove = true;
|
|
@@ -921,7 +922,7 @@ static void chan_close_cb(struct l2cap_chan *chan)
|
|
spin_lock(&devices_lock);
|
|
spin_lock(&devices_lock);
|
|
|
|
|
|
list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) {
|
|
list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) {
|
|
- dev = lowpan_dev(entry->netdev);
|
|
|
|
|
|
+ dev = lowpan_btle_dev(entry->netdev);
|
|
peer = __peer_lookup_chan(dev, chan);
|
|
peer = __peer_lookup_chan(dev, chan);
|
|
if (peer) {
|
|
if (peer) {
|
|
last = peer_del(dev, peer);
|
|
last = peer_del(dev, peer);
|
|
@@ -1131,7 +1132,7 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
|
|
|
|
|
|
static void disconnect_all_peers(void)
|
|
static void disconnect_all_peers(void)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
struct lowpan_peer *peer, *tmp_peer, *new_peer;
|
|
struct lowpan_peer *peer, *tmp_peer, *new_peer;
|
|
struct list_head peers;
|
|
struct list_head peers;
|
|
|
|
|
|
@@ -1291,7 +1292,7 @@ static ssize_t lowpan_control_write(struct file *fp,
|
|
|
|
|
|
static int lowpan_control_show(struct seq_file *f, void *ptr)
|
|
static int lowpan_control_show(struct seq_file *f, void *ptr)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
struct lowpan_peer *peer;
|
|
struct lowpan_peer *peer;
|
|
|
|
|
|
spin_lock(&devices_lock);
|
|
spin_lock(&devices_lock);
|
|
@@ -1322,7 +1323,7 @@ static const struct file_operations lowpan_control_fops = {
|
|
|
|
|
|
static void disconnect_devices(void)
|
|
static void disconnect_devices(void)
|
|
{
|
|
{
|
|
- struct lowpan_dev *entry, *tmp, *new_dev;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry, *tmp, *new_dev;
|
|
struct list_head devices;
|
|
struct list_head devices;
|
|
|
|
|
|
INIT_LIST_HEAD(&devices);
|
|
INIT_LIST_HEAD(&devices);
|
|
@@ -1360,7 +1361,7 @@ static int device_event(struct notifier_block *unused,
|
|
unsigned long event, void *ptr)
|
|
unsigned long event, void *ptr)
|
|
{
|
|
{
|
|
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
|
|
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
|
|
- struct lowpan_dev *entry;
|
|
|
|
|
|
+ struct lowpan_btle_dev *entry;
|
|
|
|
|
|
if (netdev->type != ARPHRD_6LOWPAN)
|
|
if (netdev->type != ARPHRD_6LOWPAN)
|
|
return NOTIFY_DONE;
|
|
return NOTIFY_DONE;
|