* [PATCH 4/4] bnep endianness bug: filtering by packet type
@ 2006-10-15 21:31 Al Viro
2006-10-15 23:34 ` Marcel Holtmann
0 siblings, 1 reply; 6+ messages in thread
From: Al Viro @ 2006-10-15 21:31 UTC (permalink / raw)
To: Linus Torvalds; +Cc: davem, linux-kernel
<= and => don't work well on net-endian...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
net/bluetooth/bnep/bnep.h | 4 ++--
net/bluetooth/bnep/core.c | 16 ++++++++--------
net/bluetooth/bnep/netdev.c | 15 ++++++++-------
3 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/net/bluetooth/bnep/bnep.h b/net/bluetooth/bnep/bnep.h
index 9ffaf1d..0b6cd0e 100644
--- a/net/bluetooth/bnep/bnep.h
+++ b/net/bluetooth/bnep/bnep.h
@@ -143,8 +143,8 @@ struct bnep_connlist_req {
};
struct bnep_proto_filter {
- __be16 start;
- __be16 end;
+ __u16 start;
+ __u16 end;
};
int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock);
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
index f0fbee3..3d8d97a 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 916172d..4e321e3 100644
--- a/net/bluetooth/bnep/netdev.c
+++ b/net/bluetooth/bnep/netdev.c
@@ -155,22 +155,23 @@ #endif
#ifdef CONFIG_BT_BNEP_PROTO_FILTER
/* Determine ether protocol. Based on eth_type_trans. */
-static inline __be16 bnep_net_eth_proto(struct sk_buff *skb)
+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)
{
- __be16 proto = bnep_net_eth_proto(skb);
+ __u16 proto = bnep_net_eth_proto(skb);
struct bnep_proto_filter *f = s->proto_filter;
int i;
--
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 21:31 [PATCH 4/4] bnep endianness bug: filtering by packet type Al Viro
@ 2006-10-15 23:34 ` Marcel Holtmann
2006-10-15 23:51 ` Al Viro
0 siblings, 1 reply; 6+ messages in thread
From: Marcel Holtmann @ 2006-10-15 23:34 UTC (permalink / raw)
To: Al Viro; +Cc: Linus Torvalds, davem, linux-kernel
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.
Regards
Marcel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 4/4] bnep endianness bug: filtering by packet type
2006-10-15 23:34 ` Marcel Holtmann
@ 2006-10-15 23:51 ` Al Viro
2006-10-16 0:20 ` Al Viro
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Al Viro @ 2006-10-15 23:51 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Linus Torvalds, davem, linux-kernel
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.
^ permalink raw reply [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: 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
end of thread, other threads:[~2006-10-16 0:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-15 21:31 [PATCH 4/4] bnep endianness bug: filtering by packet type Al Viro
2006-10-15 23:34 ` Marcel Holtmann
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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox