This source file includes following definitions.
- bnep_net_open
- bnep_net_close
- bnep_net_set_mc_list
- bnep_net_set_mac_addr
- bnep_net_timeout
- bnep_net_mc_filter
- bnep_net_eth_proto
- bnep_net_proto_filter
- bnep_net_xmit
- bnep_net_setup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <linux/etherdevice.h>
29
30 #include <net/bluetooth/bluetooth.h>
31 #include <net/bluetooth/hci_core.h>
32 #include <net/bluetooth/l2cap.h>
33
34 #include "bnep.h"
35
36 #define BNEP_TX_QUEUE_LEN 20
37
38 static int bnep_net_open(struct net_device *dev)
39 {
40 netif_start_queue(dev);
41 return 0;
42 }
43
44 static int bnep_net_close(struct net_device *dev)
45 {
46 netif_stop_queue(dev);
47 return 0;
48 }
49
50 static void bnep_net_set_mc_list(struct net_device *dev)
51 {
52 #ifdef CONFIG_BT_BNEP_MC_FILTER
53 struct bnep_session *s = netdev_priv(dev);
54 struct sock *sk = s->sock->sk;
55 struct bnep_set_filter_req *r;
56 struct sk_buff *skb;
57 int size;
58
59 BT_DBG("%s mc_count %d", dev->name, netdev_mc_count(dev));
60
61 size = sizeof(*r) + (BNEP_MAX_MULTICAST_FILTERS + 1) * ETH_ALEN * 2;
62 skb = alloc_skb(size, GFP_ATOMIC);
63 if (!skb) {
64 BT_ERR("%s Multicast list allocation failed", dev->name);
65 return;
66 }
67
68 r = (void *) skb->data;
69 __skb_put(skb, sizeof(*r));
70
71 r->type = BNEP_CONTROL;
72 r->ctrl = BNEP_FILTER_MULTI_ADDR_SET;
73
74 if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
75 u8 start[ETH_ALEN] = { 0x01 };
76
77
78 __skb_put_data(skb, start, ETH_ALEN);
79 __skb_put_data(skb, dev->broadcast, ETH_ALEN);
80 r->len = htons(ETH_ALEN * 2);
81 } else {
82 struct netdev_hw_addr *ha;
83 int i, len = skb->len;
84
85 if (dev->flags & IFF_BROADCAST) {
86 __skb_put_data(skb, dev->broadcast, ETH_ALEN);
87 __skb_put_data(skb, dev->broadcast, ETH_ALEN);
88 }
89
90
91
92 i = 0;
93 netdev_for_each_mc_addr(ha, dev) {
94 if (i == BNEP_MAX_MULTICAST_FILTERS)
95 break;
96 __skb_put_data(skb, ha->addr, ETH_ALEN);
97 __skb_put_data(skb, ha->addr, ETH_ALEN);
98
99 i++;
100 }
101 r->len = htons(skb->len - len);
102 }
103
104 skb_queue_tail(&sk->sk_write_queue, skb);
105 wake_up_interruptible(sk_sleep(sk));
106 #endif
107 }
108
109 static int bnep_net_set_mac_addr(struct net_device *dev, void *arg)
110 {
111 BT_DBG("%s", dev->name);
112 return 0;
113 }
114
115 static void bnep_net_timeout(struct net_device *dev)
116 {
117 BT_DBG("net_timeout");
118 netif_wake_queue(dev);
119 }
120
121 #ifdef CONFIG_BT_BNEP_MC_FILTER
122 static int bnep_net_mc_filter(struct sk_buff *skb, struct bnep_session *s)
123 {
124 struct ethhdr *eh = (void *) skb->data;
125
126 if ((eh->h_dest[0] & 1) && !test_bit(bnep_mc_hash(eh->h_dest), (ulong *) &s->mc_filter))
127 return 1;
128 return 0;
129 }
130 #endif
131
132 #ifdef CONFIG_BT_BNEP_PROTO_FILTER
133
134 static u16 bnep_net_eth_proto(struct sk_buff *skb)
135 {
136 struct ethhdr *eh = (void *) skb->data;
137 u16 proto = ntohs(eh->h_proto);
138
139 if (proto >= ETH_P_802_3_MIN)
140 return proto;
141
142 if (get_unaligned((__be16 *) skb->data) == htons(0xFFFF))
143 return ETH_P_802_3;
144
145 return ETH_P_802_2;
146 }
147
148 static int bnep_net_proto_filter(struct sk_buff *skb, struct bnep_session *s)
149 {
150 u16 proto = bnep_net_eth_proto(skb);
151 struct bnep_proto_filter *f = s->proto_filter;
152 int i;
153
154 for (i = 0; i < BNEP_MAX_PROTO_FILTERS && f[i].end; i++) {
155 if (proto >= f[i].start && proto <= f[i].end)
156 return 0;
157 }
158
159 BT_DBG("BNEP: filtered skb %p, proto 0x%.4x", skb, proto);
160 return 1;
161 }
162 #endif
163
164 static netdev_tx_t bnep_net_xmit(struct sk_buff *skb,
165 struct net_device *dev)
166 {
167 struct bnep_session *s = netdev_priv(dev);
168 struct sock *sk = s->sock->sk;
169
170 BT_DBG("skb %p, dev %p", skb, dev);
171
172 #ifdef CONFIG_BT_BNEP_MC_FILTER
173 if (bnep_net_mc_filter(skb, s)) {
174 kfree_skb(skb);
175 return NETDEV_TX_OK;
176 }
177 #endif
178
179 #ifdef CONFIG_BT_BNEP_PROTO_FILTER
180 if (bnep_net_proto_filter(skb, s)) {
181 kfree_skb(skb);
182 return NETDEV_TX_OK;
183 }
184 #endif
185
186
187
188
189
190
191 netif_trans_update(dev);
192 skb_queue_tail(&sk->sk_write_queue, skb);
193 wake_up_interruptible(sk_sleep(sk));
194
195 if (skb_queue_len(&sk->sk_write_queue) >= BNEP_TX_QUEUE_LEN) {
196 BT_DBG("tx queue is full");
197
198
199
200 netif_stop_queue(dev);
201 }
202
203 return NETDEV_TX_OK;
204 }
205
206 static const struct net_device_ops bnep_netdev_ops = {
207 .ndo_open = bnep_net_open,
208 .ndo_stop = bnep_net_close,
209 .ndo_start_xmit = bnep_net_xmit,
210 .ndo_validate_addr = eth_validate_addr,
211 .ndo_set_rx_mode = bnep_net_set_mc_list,
212 .ndo_set_mac_address = bnep_net_set_mac_addr,
213 .ndo_tx_timeout = bnep_net_timeout,
214
215 };
216
217 void bnep_net_setup(struct net_device *dev)
218 {
219
220 eth_broadcast_addr(dev->broadcast);
221 dev->addr_len = ETH_ALEN;
222
223 ether_setup(dev);
224 dev->min_mtu = 0;
225 dev->max_mtu = ETH_MAX_MTU;
226 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
227 dev->netdev_ops = &bnep_netdev_ops;
228
229 dev->watchdog_timeo = HZ * 2;
230 }