* Re: [PATCH 4/4] bnep endianness bug: filtering by packet type
2006-10-15 23:51 ` Al Viro
@ 2006-10-16 0:20 ` Al Viro
2006-10-16 0:20 ` Al Viro
2006-10-16 0:21 ` Al Viro
2 siblings, 0 replies; 6+ messages in thread
From: Al Viro @ 2006-10-16 0:20 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Linus Torvalds, davem, linux-kernel
Date: Sun, 15 Oct 2006 20:13:58 -0400
Subject: [PATCH] bnep endianness bug: filtering by packet type
<= and => don't work well on net-endian...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
net/bluetooth/bnep/core.c | 16 ++++++++--------
net/bluetooth/bnep/netdev.c | 11 ++++++-----
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
index 2312d05..b3f0b2b 100644
--- a/net/bluetooth/bnep/core.c
+++ b/net/bluetooth/bnep/core.c
@@ -117,14 +117,14 @@ #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);
+ s->proto_filter[0].start = ETH_P_IP;
+ s->proto_filter[0].end = ETH_P_ARP;
/* (RARP, AppleTalk) */
- s->proto_filter[1].start = htons(0x8035);
- s->proto_filter[1].end = htons(0x80F3);
+ s->proto_filter[1].start = ETH_P_RARP;
+ s->proto_filter[1].end = ETH_P_AARP;
/* (IPX, IPv6) */
- s->proto_filter[2].start = htons(0x8137);
- s->proto_filter[2].end = htons(0x86DD);
+ s->proto_filter[2].start = ETH_P_IPX;
+ s->proto_filter[2].end = ETH_P_IPV6;
}
#endif
@@ -150,8 +150,8 @@ #ifdef CONFIG_BT_BNEP_PROTO_FILTER
int i;
for (i = 0; i < n; i++) {
- f[i].start = get_unaligned(data++);
- f[i].end = get_unaligned(data++);
+ f[i].start = ntohs(get_unaligned(data++));
+ f[i].end = ntohs(get_unaligned(data++));
BT_DBG("proto filter start %d end %d",
f[i].start, f[i].end);
diff --git a/net/bluetooth/bnep/netdev.c b/net/bluetooth/bnep/netdev.c
index 7f7b27d..67a002a 100644
--- a/net/bluetooth/bnep/netdev.c
+++ b/net/bluetooth/bnep/netdev.c
@@ -158,14 +158,15 @@ #ifdef CONFIG_BT_BNEP_PROTO_FILTER
static inline u16 bnep_net_eth_proto(struct sk_buff *skb)
{
struct ethhdr *eh = (void *) skb->data;
+ u16 proto = ntohs(eh->h_proto);
- if (ntohs(eh->h_proto) >= 1536)
- return eh->h_proto;
+ if (proto >= 1536)
+ return proto;
- if (get_unaligned((u16 *) skb->data) == 0xFFFF)
- return htons(ETH_P_802_3);
+ if (get_unaligned((__be16 *) skb->data) == htons(0xFFFF))
+ return ETH_P_802_3;
- return htons(ETH_P_802_2);
+ return ETH_P_802_2;
}
static inline int bnep_net_proto_filter(struct sk_buff *skb, struct bnep_session *s)
--
1.4.2.GIT
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] bnep endianness bug: filtering by packet type
2006-10-15 23:51 ` Al Viro
2006-10-16 0:20 ` Al Viro
@ 2006-10-16 0:20 ` Al Viro
2006-10-16 0:21 ` Al Viro
2 siblings, 0 replies; 6+ messages in thread
From: Al Viro @ 2006-10-16 0:20 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Linus Torvalds, davem, linux-kernel
Date: Thu, 16 Feb 2006 02:47:56 -0500
Subject: [PATCH] bnep endianness annotations
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
net/bluetooth/bnep/bnep.h | 4 ++--
net/bluetooth/bnep/core.c | 12 ++++++------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/net/bluetooth/bnep/bnep.h b/net/bluetooth/bnep/bnep.h
index bbb1ed7..0b6cd0e 100644
--- a/net/bluetooth/bnep/bnep.h
+++ b/net/bluetooth/bnep/bnep.h
@@ -95,14 +95,14 @@ struct bnep_setup_conn_req {
struct bnep_set_filter_req {
__u8 type;
__u8 ctrl;
- __u16 len;
+ __be16 len;
__u8 list[0];
} __attribute__((packed));
struct bnep_control_rsp {
__u8 type;
__u8 ctrl;
- __u16 resp;
+ __be16 resp;
} __attribute__((packed));
struct bnep_ext_hdr {
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
index b3f0b2b..3d8d97a 100644
--- a/net/bluetooth/bnep/core.c
+++ b/net/bluetooth/bnep/core.c
@@ -128,7 +128,7 @@ static inline void bnep_set_default_prot
}
#endif
-static int bnep_ctrl_set_netfilter(struct bnep_session *s, u16 *data, int len)
+static int bnep_ctrl_set_netfilter(struct bnep_session *s, __be16 *data, int len)
{
int n;
@@ -180,7 +180,7 @@ static int bnep_ctrl_set_mcfilter(struct
if (len < 2)
return -EILSEQ;
- n = ntohs(get_unaligned((u16 *) data));
+ n = ntohs(get_unaligned((__be16 *) data));
data += 2; len -= 2;
if (len < n)
@@ -332,7 +332,7 @@ static inline int bnep_rx_frame(struct b
if (!skb_pull(skb, __bnep_rx_hlen[type & BNEP_TYPE_MASK]))
goto badframe;
- s->eh.h_proto = get_unaligned((u16 *) (skb->data - 2));
+ s->eh.h_proto = get_unaligned((__be16 *) (skb->data - 2));
if (type & BNEP_EXT_HEADER) {
if (bnep_rx_extension(s, skb) < 0)
@@ -343,7 +343,7 @@ static inline int bnep_rx_frame(struct b
if (ntohs(s->eh.h_proto) == 0x8100) {
if (!skb_pull(skb, 4))
goto badframe;
- s->eh.h_proto = get_unaligned((u16 *) (skb->data - 2));
+ s->eh.h_proto = get_unaligned((__be16 *) (skb->data - 2));
}
/* We have to alloc new skb and copy data here :(. Because original skb
@@ -365,7 +365,7 @@ static inline int bnep_rx_frame(struct b
case BNEP_COMPRESSED_SRC_ONLY:
memcpy(__skb_put(nskb, ETH_ALEN), s->eh.h_dest, ETH_ALEN);
memcpy(__skb_put(nskb, ETH_ALEN), skb->mac.raw, ETH_ALEN);
- put_unaligned(s->eh.h_proto, (u16 *) __skb_put(nskb, 2));
+ put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2));
break;
case BNEP_COMPRESSED_DST_ONLY:
@@ -375,7 +375,7 @@ static inline int bnep_rx_frame(struct b
case BNEP_GENERAL:
memcpy(__skb_put(nskb, ETH_ALEN * 2), skb->mac.raw, ETH_ALEN * 2);
- put_unaligned(s->eh.h_proto, (u16 *) __skb_put(nskb, 2));
+ put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2));
break;
}
--
1.4.2.GIT
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 4/4] bnep endianness bug: filtering by packet type
2006-10-15 23:51 ` Al Viro
2006-10-16 0:20 ` Al Viro
2006-10-16 0:20 ` Al Viro
@ 2006-10-16 0:21 ` Al Viro
2 siblings, 0 replies; 6+ messages in thread
From: Al Viro @ 2006-10-16 0:21 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Linus Torvalds, davem, linux-kernel
On Mon, Oct 16, 2006 at 12:51:48AM +0100, Al Viro wrote:
> On Mon, Oct 16, 2006 at 01:34:13AM +0200, Marcel Holtmann wrote:
> > Hi Al,
> >
> > > <= and => don't work well on net-endian...
> >
> > can we have a clean one for the BNEP part. Not one that changes
> > something and then another one reverting it.
>
> *shrug*
>
> I can reorder, of course. FWIW, I prefer to do a patch that annotates
> existing use and provably does not change behaviour + fixes for whatever
> crap shows up once said existing use is annotated, but if you prefer it
> in opposite order...
>
> OTOH, in this case bug is obvious enough as it is, so... Will reorder
> and send.
Done.
^ permalink raw reply [flat|nested] 6+ messages in thread