X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fbluetooth%2Fbnep%2Fcore.c;h=ce7b9a51934c6aa380a37e1f6312cd0ab820922f;hb=052710fcf296f48df03c0e248eface251a7ab22c;hp=a87cc64e9bafbc03363f8d29ac96cadcf8dd329f;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index a87cc64e9..ce7b9a519 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c @@ -61,7 +61,7 @@ #define BT_DBG(D...) #endif -#define VERSION "1.2" +#define VERSION "1.0" static LIST_HEAD(bnep_session_list); static DECLARE_RWSEM(bnep_session_sem); @@ -99,9 +99,11 @@ static void __bnep_unlink_session(struct bnep_session *s) static int bnep_send(struct bnep_session *s, void *data, size_t len) { struct socket *sock = s->sock; - struct kvec iv = { data, len }; + struct iovec iv = { data, len }; - return kernel_sendmsg(sock, &s->msg, &iv, 1, len); + s->msg.msg_iov = &iv; + s->msg.msg_iovlen = 1; + return sock_sendmsg(sock, &s->msg, len); } static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp) @@ -113,21 +115,6 @@ static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp) return bnep_send(s, &rsp, sizeof(rsp)); } -#ifdef CONFIG_BT_BNEP_PROTO_FILTER -static inline void bnep_set_default_proto_filter(struct bnep_session *s) -{ - /* (IPv4, ARP) */ - s->proto_filter[0].start = htons(0x0800); - s->proto_filter[0].end = htons(0x0806); - /* (RARP, AppleTalk) */ - s->proto_filter[1].start = htons(0x8035); - s->proto_filter[1].end = htons(0x80F3); - /* (IPX, IPv6) */ - s->proto_filter[2].start = htons(0x8137); - s->proto_filter[2].end = htons(0x86DD); -} -#endif - static int bnep_ctrl_set_netfilter(struct bnep_session *s, u16 *data, int len) { int n; @@ -156,13 +143,9 @@ static int bnep_ctrl_set_netfilter(struct bnep_session *s, u16 *data, int len) BT_DBG("proto filter start %d end %d", f[i].start, f[i].end); } - if (i < BNEP_MAX_PROTO_FILTERS) memset(f + i, 0, sizeof(*f)); - if (n == 0) - bnep_set_default_proto_filter(s); - bnep_send_rsp(s, BNEP_FILTER_NET_TYPE_RSP, BNEP_SUCCESS); } else { bnep_send_rsp(s, BNEP_FILTER_NET_TYPE_RSP, BNEP_FILTER_LIMIT_REACHED); @@ -406,7 +389,7 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb) { struct ethhdr *eh = (void *) skb->data; struct socket *sock = s->sock; - struct kvec iv[3]; + struct iovec iv[3]; int len = 0, il = 0; u8 type = 0; @@ -417,7 +400,7 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb) goto send; } - iv[il++] = (struct kvec) { &type, 1 }; + iv[il++] = (struct iovec) { &type, 1 }; len++; if (!memcmp(eh->h_dest, s->eh.h_source, ETH_ALEN)) @@ -432,23 +415,25 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb) type = __bnep_tx_types[type]; switch (type) { case BNEP_COMPRESSED_SRC_ONLY: - iv[il++] = (struct kvec) { eh->h_source, ETH_ALEN }; + iv[il++] = (struct iovec) { eh->h_source, ETH_ALEN }; len += ETH_ALEN; break; case BNEP_COMPRESSED_DST_ONLY: - iv[il++] = (struct kvec) { eh->h_dest, ETH_ALEN }; + iv[il++] = (struct iovec) { eh->h_dest, ETH_ALEN }; len += ETH_ALEN; break; } send: - iv[il++] = (struct kvec) { skb->data, skb->len }; + iv[il++] = (struct iovec) { skb->data, skb->len }; len += skb->len; /* FIXME: linearize skb */ { - len = kernel_sendmsg(sock, &s->msg, iv, il, len); + s->msg.msg_iov = iv; + s->msg.msg_iovlen = il; + len = sock_sendmsg(sock, &s->msg, len); } kfree_skb(skb); @@ -475,6 +460,8 @@ static int bnep_session(void *arg) set_user_nice(current, -15); current->flags |= PF_NOFREEZE; + set_fs(KERNEL_DS); + init_waitqueue_entry(&wait, current); add_wait_queue(sk->sk_sleep, &wait); while (!atomic_read(&s->killed)) { @@ -563,12 +550,21 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) /* Set default mc filter */ set_bit(bnep_mc_hash(dev->broadcast), (ulong *) &s->mc_filter); #endif - + #ifdef CONFIG_BT_BNEP_PROTO_FILTER /* Set default protocol filter */ - bnep_set_default_proto_filter(s); -#endif + /* (IPv4, ARP) */ + s->proto_filter[0].start = htons(0x0800); + s->proto_filter[0].end = htons(0x0806); + /* (RARP, AppleTalk) */ + s->proto_filter[1].start = htons(0x8035); + s->proto_filter[1].end = htons(0x80F3); + /* (IPX, IPv6) */ + s->proto_filter[2].start = htons(0x8137); + s->proto_filter[2].end = htons(0x86DD); +#endif + err = register_netdev(dev); if (err) { goto failed;