Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-06 Thread Alexander Aring
Hi,

On Sun, Oct 05, 2014 at 10:00:59PM +0100, Martin Townsend wrote:
 Hi Alex
 On 05/10/14 18:50, Alexander Aring wrote:
 Hi Martin,
 
 On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.
 
 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 I think we should split the movement of passing skb to higher layer
 into a separate patch.
 Wasn't it separated in v1 patch series and you asked me to combine into one
 patch??

yea, I know but it's hard to review and we need some bisectable git history.

 
 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.
 
 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.
 
 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
   include/net/6lowpan.h |  9 +++--
   net/6lowpan/iphc.c| 92 
  ---
   net/bluetooth/6lowpan.c   | 52 
   net/ieee802154/6lowpan_rtnl.c | 66 ---
   4 files changed, 117 insertions(+), 102 deletions(-)
 
 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..05ff67e 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 
 *dgram_offset)
   typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device 
  *dev);
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -   const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 -   const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 -   u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +   const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +   const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +   u8 iphc0, u8 iphc1);
   int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 unsigned short type, const void *_daddr,
 const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..3888357 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
 return 0;
   }
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 -  struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 -   struct sk_buff *new;
 -   int stat;
 -
 -   new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 - GFP_ATOMIC);
 -   kfree_skb(skb);
 -
 -   if (!new)
 -   return -ENOMEM;
 -
 -   skb_push(new, sizeof(struct ipv6hdr));
 -   skb_reset_network_header(new);
 -   skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 -   new-protocol = htons(ETH_P_IPV6);
 -   new-pkt_type = PACKET_HOST;
 -   new-dev = dev;
 -
 -   raw_dump_table(__func__, raw skb data dump before receiving,
 -  new-data, new-len);
 -
 -   stat = deliver_skb(new, dev);
 -
 -   kfree_skb(new);
 -
 -   return stat;
 -}
 -
   /* Uncompress function for multicast destination address,
* when M bit is set.
*/
 @@ -332,10 +301,11 @@ err:
   /* TTL uncompression values */
   static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -   const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 -   const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 -   u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +   const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +   const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +   u8 iphc0, u8 iphc1)
   {
 struct ipv6hdr hdr = {};
 u8 tmp, num_context = 0;
 @@ -348,7 +318,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
 if (iphc1  LOWPAN_IPHC_CID) {
 pr_debug(CID flag is set, increase header with one\n);
 if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 -   goto drop;
 +   return -EINVAL;
 }
 hdr.version = 6;
 @@ -360,7 +330,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
  */
 case 0: /* 00b */
 if (lowpan_fetch_skb(skb, tmp, sizeof(tmp)))
 -   goto drop;
 +   return 

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-06 Thread Martin Townsend
Hi Marcel,

Are you ok with me breaking this down into separate patches and submitting them 
individually to bluetooth-next?

- Martin.

On 06/10/14 08:12, Alexander Aring wrote:
 Hi,

 On Sun, Oct 05, 2014 at 10:00:59PM +0100, Martin Townsend wrote:
 Hi Alex
 On 05/10/14 18:50, Alexander Aring wrote:
 Hi Martin,

 On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.

 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 I think we should split the movement of passing skb to higher layer
 into a separate patch.
 Wasn't it separated in v1 patch series and you asked me to combine into one
 patch??
 yea, I know but it's hard to review and we need some bisectable git history.

 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.

 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.

 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 92 
 ---
  net/bluetooth/6lowpan.c   | 52 
  net/ieee802154/6lowpan_rtnl.c | 66 ---
  4 files changed, 117 insertions(+), 102 deletions(-)

 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..05ff67e 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, 
 u16 *dgram_offset)
  typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device 
 *dev);
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 -  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 -  u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +  u8 iphc0, u8 iphc1);
  int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
unsigned short type, const void *_daddr,
const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..3888357 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
return 0;
  }
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 - struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 -  struct sk_buff *new;
 -  int stat;
 -
 -  new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 -GFP_ATOMIC);
 -  kfree_skb(skb);
 -
 -  if (!new)
 -  return -ENOMEM;
 -
 -  skb_push(new, sizeof(struct ipv6hdr));
 -  skb_reset_network_header(new);
 -  skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 -  new-protocol = htons(ETH_P_IPV6);
 -  new-pkt_type = PACKET_HOST;
 -  new-dev = dev;
 -
 -  raw_dump_table(__func__, raw skb data dump before receiving,
 - new-data, new-len);
 -
 -  stat = deliver_skb(new, dev);
 -
 -  kfree_skb(new);
 -
 -  return stat;
 -}
 -
  /* Uncompress function for multicast destination address,
   * when M bit is set.
   */
 @@ -332,10 +301,11 @@ err:
  /* TTL uncompression values */
  static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -  const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 -  const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 -  u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +  u8 iphc0, u8 iphc1)
  {
struct ipv6hdr hdr = {};
u8 tmp, num_context = 0;
 @@ -348,7 +318,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
if (iphc1  LOWPAN_IPHC_CID) {
pr_debug(CID flag is set, increase header with one\n);
if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 -  goto drop;
 +  return -EINVAL;
}
hdr.version = 6;
 @@ -360,7 +330,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
 */
case 0: /* 00b */
 

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-06 Thread Martin Townsend
Hi Alex,

On 06/10/14 08:12, Alexander Aring wrote:
 Hi,

 On Sun, Oct 05, 2014 at 10:00:59PM +0100, Martin Townsend wrote:
 Hi Alex
 On 05/10/14 18:50, Alexander Aring wrote:
 Hi Martin,

 On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.

 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 I think we should split the movement of passing skb to higher layer
 into a separate patch.
 Wasn't it separated in v1 patch series and you asked me to combine into one
 patch??
 yea, I know but it's hard to review and we need some bisectable git history.

 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.

 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.

 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 92 
 ---
  net/bluetooth/6lowpan.c   | 52 
  net/ieee802154/6lowpan_rtnl.c | 66 ---
  4 files changed, 117 insertions(+), 102 deletions(-)

 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..05ff67e 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, 
 u16 *dgram_offset)
  typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device 
 *dev);
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 -  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 -  u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +  u8 iphc0, u8 iphc1);
  int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
unsigned short type, const void *_daddr,
const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..3888357 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
return 0;
  }
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 - struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 -  struct sk_buff *new;
 -  int stat;
 -
 -  new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 -GFP_ATOMIC);
 -  kfree_skb(skb);
 -
 -  if (!new)
 -  return -ENOMEM;
 -
 -  skb_push(new, sizeof(struct ipv6hdr));
 -  skb_reset_network_header(new);
 -  skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 -  new-protocol = htons(ETH_P_IPV6);
 -  new-pkt_type = PACKET_HOST;
 -  new-dev = dev;
 -
 -  raw_dump_table(__func__, raw skb data dump before receiving,
 - new-data, new-len);
 -
 -  stat = deliver_skb(new, dev);
 -
 -  kfree_skb(new);
 -
 -  return stat;
 -}
 -
  /* Uncompress function for multicast destination address,
   * when M bit is set.
   */
 @@ -332,10 +301,11 @@ err:
  /* TTL uncompression values */
  static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -  const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 -  const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 -  u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +  const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +  const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +  u8 iphc0, u8 iphc1)
  {
struct ipv6hdr hdr = {};
u8 tmp, num_context = 0;
 @@ -348,7 +318,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
if (iphc1  LOWPAN_IPHC_CID) {
pr_debug(CID flag is set, increase header with one\n);
if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 -  goto drop;
 +  return -EINVAL;
}
hdr.version = 6;
 @@ -360,7 +330,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
 */
case 0: /* 00b */
if (lowpan_fetch_skb(skb, tmp, sizeof(tmp)))
 -  goto drop;
 +  return -EINVAL;

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-06 Thread Marcel Holtmann
Hi Martin,

 Are you ok with me breaking this down into separate patches and submitting 
 them individually to bluetooth-next?

yes, just break it down into smaller logical patches.

Regards

Marcel


--
Slashdot TV.  Videos for Nerds.  Stuff that Matters.
http://pubads.g.doubleclick.net/gampad/clk?id=160591471iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-05 Thread Alexander Aring
Hi Martin,

On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.
 
 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.

I think we should split the movement of passing skb to higher layer
into a separate patch.

 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.
 
 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.
 
 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 92 
 ---
  net/bluetooth/6lowpan.c   | 52 
  net/ieee802154/6lowpan_rtnl.c | 66 ---
  4 files changed, 117 insertions(+), 102 deletions(-)
 
 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..05ff67e 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 
 *dgram_offset)
  
  typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device *dev);
  
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 - const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 - const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 - u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 + const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 + const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 + u8 iphc0, u8 iphc1);
  int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
   unsigned short type, const void *_daddr,
   const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..3888357 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
   return 0;
  }
  
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 -struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 - struct sk_buff *new;
 - int stat;
 -
 - new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 -   GFP_ATOMIC);
 - kfree_skb(skb);
 -
 - if (!new)
 - return -ENOMEM;
 -
 - skb_push(new, sizeof(struct ipv6hdr));
 - skb_reset_network_header(new);
 - skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 - new-protocol = htons(ETH_P_IPV6);
 - new-pkt_type = PACKET_HOST;
 - new-dev = dev;
 -
 - raw_dump_table(__func__, raw skb data dump before receiving,
 -new-data, new-len);
 -
 - stat = deliver_skb(new, dev);
 -
 - kfree_skb(new);
 -
 - return stat;
 -}
 -
  /* Uncompress function for multicast destination address,
   * when M bit is set.
   */
 @@ -332,10 +301,11 @@ err:
  /* TTL uncompression values */
  static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
  
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 - const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 - const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 - u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 + const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 + const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 + u8 iphc0, u8 iphc1)
  {
   struct ipv6hdr hdr = {};
   u8 tmp, num_context = 0;
 @@ -348,7 +318,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
   if (iphc1  LOWPAN_IPHC_CID) {
   pr_debug(CID flag is set, increase header with one\n);
   if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 - goto drop;
 + return -EINVAL;
   }
  
   hdr.version = 6;
 @@ -360,7 +330,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
*/
   case 0: /* 00b */
   if (lowpan_fetch_skb(skb, tmp, sizeof(tmp)))
 - goto drop;
 + return -EINVAL;
  
   memcpy(hdr.flow_lbl, skb-data[0], 3);
   skb_pull(skb, 3);
 @@ -373,7 +343,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
*/
  

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-05 Thread Alexander Aring
On Sun, Oct 05, 2014 at 07:50:49PM +0200, Alexander Aring wrote:
 Hi Martin,
 
 On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
  Currently there are a number of error paths in the lowpan_rcv function that
  free the skb before returning, the patch simplifies the receive path by
  ensuring that the skb is only freed from this function.
  
  Passing the skb from 6lowpan up to the higher layers is not a
  function of IPHC.  By moving it out of IPHC we also remove the
  need to support error code returns with NET_RX codes.
 
 I think we should split the movement of passing skb to higher layer
 into a separate patch.
 

and now I realized that we had this also in some other mail, because the
netif call drops the skb, if passing skb to higher layer failed...

Maybe try to return 0; then instead an error if failed at this point.
I know I said, just merge these patches... but this is really much changes
here. I only want some clean patches which only fix the error handling
at first without any other changes - KISS.

Sorry Martin.

- Alex

--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-05 Thread Martin Townsend
Hi Alex
On 05/10/14 18:50, Alexander Aring wrote:
 Hi Martin,

 On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.

 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 I think we should split the movement of passing skb to higher layer
 into a separate patch.
Wasn't it separated in v1 patch series and you asked me to combine into 
one patch??

 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.

 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.

 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
   include/net/6lowpan.h |  9 +++--
   net/6lowpan/iphc.c| 92 
 ---
   net/bluetooth/6lowpan.c   | 52 
   net/ieee802154/6lowpan_rtnl.c | 66 ---
   4 files changed, 117 insertions(+), 102 deletions(-)

 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..05ff67e 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 
 *dgram_offset)
   
   typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device 
 *dev);
   
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 -const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 -u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +u8 iphc0, u8 iphc1);
   int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
  unsigned short type, const void *_daddr,
  const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..3888357 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
  return 0;
   }
   
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 -   struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 -struct sk_buff *new;
 -int stat;
 -
 -new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 -  GFP_ATOMIC);
 -kfree_skb(skb);
 -
 -if (!new)
 -return -ENOMEM;
 -
 -skb_push(new, sizeof(struct ipv6hdr));
 -skb_reset_network_header(new);
 -skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 -new-protocol = htons(ETH_P_IPV6);
 -new-pkt_type = PACKET_HOST;
 -new-dev = dev;
 -
 -raw_dump_table(__func__, raw skb data dump before receiving,
 -   new-data, new-len);
 -
 -stat = deliver_skb(new, dev);
 -
 -kfree_skb(new);
 -
 -return stat;
 -}
 -
   /* Uncompress function for multicast destination address,
* when M bit is set.
*/
 @@ -332,10 +301,11 @@ err:
   /* TTL uncompression values */
   static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
   
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 -const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 -const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 -u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +int
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 +const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 +const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 +u8 iphc0, u8 iphc1)
   {
  struct ipv6hdr hdr = {};
  u8 tmp, num_context = 0;
 @@ -348,7 +318,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
  if (iphc1  LOWPAN_IPHC_CID) {
  pr_debug(CID flag is set, increase header with one\n);
  if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 -goto drop;
 +return -EINVAL;
  }
   
  hdr.version = 6;
 @@ -360,7 +330,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
   */
  case 0: /* 00b */
  if (lowpan_fetch_skb(skb, tmp, sizeof(tmp)))
 -goto drop;
 +return -EINVAL;
   
  memcpy(hdr.flow_lbl, skb-data[0], 3);
  skb_pull(skb, 

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-10-01 Thread Alexander Aring
Hi Martin,

On Wed, Oct 01, 2014 at 01:10:22PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.
 
 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.
 
 With the above 2 lowpan_rcv is refactored so eliminate incorrect return 
 values.

I notice this patch and I need some time to take review of this. Also
Jukka should ack these changes, so we don't break anything of 6lowpan bluetooth 
branch.

Thanks for your work Martin.


Marcel, please wait until this patch will get Acked-by you, Jukka, others who 
like to give
review notes and me.

It's a terrible issue and we need a longer audit for this one.

- Alex

--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-25 Thread Martin Townsend
Hi Alex,

I'm not keen on handling kfree_skb inside of lowpan_process_data for reasons 
already stated in a previous email.  I'll have a rethink to see if there's 
another way of handling this.  One idea I'm investigating is pskb_expand_head, 
this doesn't create a new sk_buff but adds room to the head and/or tail which 
seems perfect for decompression.  There must only be a reference count of 1, so 
we would need to make a copy if this is the case before passing to 
decompression, I can't think why there would be more than 1 reference as the 
packet will only have passed through the 802.15.4 layer and only 6LoWPAN can 
decompress it.   If it's cloned for monitoring then this would be a problem.
Any thoughts on this?

- Martin.

On 25/09/14 06:55, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 10:30:32PM +0200, Alexander Aring wrote:
 ...
 Maybe simple do that what Jukka said, to handle the kfree_skb inside of
 lowpan_process_data. What's wrong now with that?

 ping. Really bad issue, what's about the state to fix it?

 - Alex
 --
 To unsubscribe from this list: send the line unsubscribe linux-wpan in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-25 Thread Alexander Aring
On Thu, Sep 25, 2014 at 08:25:33AM +0100, Martin Townsend wrote:
 Hi Alex,
 
 I'm not keen on handling kfree_skb inside of lowpan_process_data for reasons 
 already stated in a previous email.  I'll have a rethink to see if there's 
 another way of handling this.  One idea I'm investigating is 
 pskb_expand_head, this doesn't create a new sk_buff but adds room to the head 
 and/or tail which seems perfect for decompression.  There must only be a 
 reference count of 1, so we would need to make a copy if this is the case 
 before passing to decompression, I can't think why there would be more than 1 
 reference as the packet will only have passed through the 802.15.4 layer and 
 only 6LoWPAN can decompress it.   If it's cloned for monitoring then this 
 would be a problem.
 Any thoughts on this?
 

For me it doesn't matter if kfree_skb is inside of lowpan_process_data
or not. Go ahead and send fixes for this, I will only review if there
are still issues which are not solved by your patch.

Don't know what you exactly mean with monitoring now.

- Alex

--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-25 Thread Alexander Aring
Martin,

On Thu, Sep 25, 2014 at 09:31:43AM +0200, Alexander Aring wrote:
 On Thu, Sep 25, 2014 at 08:25:33AM +0100, Martin Townsend wrote:
  Hi Alex,
  
  I'm not keen on handling kfree_skb inside of lowpan_process_data for 
  reasons already stated in a previous email.  I'll have a rethink to see if 
  there's another way of handling this.  One idea I'm investigating is 
  pskb_expand_head, this doesn't create a new sk_buff but adds room to the 
  head and/or tail which seems perfect for decompression.  There must only be 
  a reference count of 1, so we would need to make a copy if this is the case 
  before passing to decompression, I can't think why there would be more than 
  1 reference as the packet will only have passed through the 802.15.4 layer 
  and only 6LoWPAN can decompress it.   If it's cloned for monitoring then 
  this would be a problem.
  Any thoughts on this?
  
 
 For me it doesn't matter if kfree_skb is inside of lowpan_process_data
 or not. Go ahead and send fixes for this, I will only review if there
 are still issues which are not solved by your patch.
 
 Don't know what you exactly mean with monitoring now.
 
For me it's only important to know that you still working on this issue.
If you still working on it, all seems to be fine.

Thanks, for your effort.

- Alex

--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-24 Thread Alexander Aring
On Tue, Sep 16, 2014 at 10:30:32PM +0200, Alexander Aring wrote:
...
 
 Maybe simple do that what Jukka said, to handle the kfree_skb inside of
 lowpan_process_data. What's wrong now with that?
 

ping. Really bad issue, what's about the state to fix it?

- Alex

--
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Just noticed a typo in the commit msg, refacored != refactored.  I'll fix in v5 
after further comments.

- Martin.

On 16/09/14 12:01, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.

 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.

 With the above 2 lowpan_rcv is refacored so eliminate incorrect return values.

 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 88 
 +--
  net/bluetooth/6lowpan.c   | 38 ++-
  net/ieee802154/6lowpan_rtnl.c | 61 --
  4 files changed, 94 insertions(+), 102 deletions(-)

 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..c28fadb 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 @@ -374,10 +374,11 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 
 *dgram_offset)
  
  typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device *dev);
  
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 - const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 - const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 - u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver);
 +struct sk_buff *
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 + const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 + const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 + u8 iphc0, u8 iphc1);
  int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
   unsigned short type, const void *_daddr,
   const void *_saddr, unsigned int len);
 diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
 index 142eef5..6ac7765 100644
 --- a/net/6lowpan/iphc.c
 +++ b/net/6lowpan/iphc.c
 @@ -171,37 +171,6 @@ static int uncompress_context_based_src_addr(struct 
 sk_buff *skb,
   return 0;
  }
  
 -static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
 -struct net_device *dev, skb_delivery_cb deliver_skb)
 -{
 - struct sk_buff *new;
 - int stat;
 -
 - new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
 -   GFP_ATOMIC);
 - kfree_skb(skb);
 -
 - if (!new)
 - return -ENOMEM;
 -
 - skb_push(new, sizeof(struct ipv6hdr));
 - skb_reset_network_header(new);
 - skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
 -
 - new-protocol = htons(ETH_P_IPV6);
 - new-pkt_type = PACKET_HOST;
 - new-dev = dev;
 -
 - raw_dump_table(__func__, raw skb data dump before receiving,
 -new-data, new-len);
 -
 - stat = deliver_skb(new, dev);
 -
 - kfree_skb(new);
 -
 - return stat;
 -}
 -
  /* Uncompress function for multicast destination address,
   * when M bit is set.
   */
 @@ -332,14 +301,16 @@ err:
  /* TTL uncompression values */
  static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
  
 -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 - const u8 *saddr, const u8 saddr_type, const u8 
 saddr_len,
 - const u8 *daddr, const u8 daddr_type, const u8 
 daddr_len,
 - u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
 +struct sk_buff *
 +lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 + const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
 + const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
 + u8 iphc0, u8 iphc1)
  {
   struct ipv6hdr hdr = {};
   u8 tmp, num_context = 0;
   int err;
 + struct sk_buff *new;
  
   raw_dump_table(__func__, raw skb data dump uncompressed,
  skb-data, skb-len);
 @@ -348,7 +319,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
   if (iphc1  LOWPAN_IPHC_CID) {
   pr_debug(CID flag is set, increase header with one\n);
   if (lowpan_fetch_skb(skb, num_context, sizeof(num_context)))
 - goto drop;
 + return ERR_PTR(-EINVAL);
   }
  
   hdr.version = 6;
 @@ -360,7 +331,7 @@ int lowpan_process_data(struct sk_buff *skb, struct 
 net_device *dev,
*/
   case 0: /* 00b */
   if (lowpan_fetch_skb(skb, tmp, sizeof(tmp)))
 - goto drop;
 + return ERR_PTR(-EINVAL);
  
   

Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.
 
 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.
 
 With the above 2 lowpan_rcv is refacored so eliminate incorrect return values.
 
 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 88 
 +--
  net/bluetooth/6lowpan.c   | 38 ++-
  net/ieee802154/6lowpan_rtnl.c | 61 --
  4 files changed, 94 insertions(+), 102 deletions(-)
 
 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..c28fadb 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
...
 -static int process_data(struct sk_buff *skb, struct net_device *netdev,
 - struct l2cap_chan *chan)
 +static struct sk_buff *
 +process_data(struct sk_buff *skb, struct net_device *netdev,
 +  struct l2cap_chan *chan)
  {
   const u8 *saddr, *daddr;
   u8 iphc0, iphc1;
 @@ -230,36 +231,31 @@ static int process_data(struct sk_buff *skb, struct 
 net_device *netdev,
   peer = peer_lookup_chan(dev, chan);
   read_unlock_irqrestore(devices_lock, flags);
   if (!peer)
 - goto drop;
 + return ERR_PTR(-EINVAL);
  
   saddr = peer-eui64_addr;
   daddr = dev-netdev-dev_addr;
  
   /* at least two bytes will be used for the encoding */
   if (skb-len  2)
 - goto drop;
 + return ERR_PTR(-EINVAL);
  
   if (lowpan_fetch_skb_u8(skb, iphc0))
 - goto drop;
 + return ERR_PTR(-EINVAL);
  
   if (lowpan_fetch_skb_u8(skb, iphc1))
 - goto drop;
 + return ERR_PTR(-EINVAL);
  
   return lowpan_process_data(skb, netdev,
  saddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
  daddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
 -iphc0, iphc1, give_skb_to_upper);
 -
 -drop:
 - kfree_skb(skb);
 - return -EINVAL;
 +iphc0, iphc1);
  }
  
  static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
   struct l2cap_chan *chan)
  {
   struct sk_buff *local_skb;
 - int ret;
  
   if (!netif_running(dev))
   goto drop;
 @@ -280,9 +276,6 @@ static int recv_pkt(struct sk_buff *skb, struct 
 net_device *dev,
   local_skb-protocol = htons(ETH_P_IPV6);
   local_skb-pkt_type = PACKET_HOST;
  
 - skb_reset_network_header(local_skb);
 - skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
 -
   if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) {
   kfree_skb(local_skb);
   goto drop;
 @@ -300,9 +293,20 @@ static int recv_pkt(struct sk_buff *skb, struct 
 net_device *dev,
   if (!local_skb)
   goto drop;
  
 - ret = process_data(local_skb, dev, chan);
 - if (ret != NET_RX_SUCCESS)
 + skb = process_data(local_skb, dev, chan);
 + if (IS_ERR(skb)) {
 + kfree_skb(local_skb);
   goto drop;
 + }
 +
 + local_skb-protocol = htons(ETH_P_IPV6);
 + local_skb-pkt_type = PACKET_HOST;

this is the wrong skb here, the new one is skb. I don't know maybe there
is some optimization to call skb = process_data(skb, ...);

 +
 + if (give_skb_to_upper(local_skb, dev)

also here local_skb should be skb, or?

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Hi Alex,
On 16/09/14 12:36, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
 Currently there are a number of error paths in the lowpan_rcv function that
 free the skb before returning, the patch simplifies the receive path by
 ensuring that the skb is only freed from this function.

 Passing the skb from 6lowpan up to the higher layers is not a
 function of IPHC.  By moving it out of IPHC we also remove the
 need to support error code returns with NET_RX codes.
 It also makes the lowpan_rcv function more extendable as we
 can support more compression schemes.

 With the above 2 lowpan_rcv is refacored so eliminate incorrect return 
 values.

 Signed-off-by: Martin Townsend martin.towns...@xsilon.com
 ---
  include/net/6lowpan.h |  9 +++--
  net/6lowpan/iphc.c| 88 
 +--
  net/bluetooth/6lowpan.c   | 38 ++-
  net/ieee802154/6lowpan_rtnl.c | 61 --
  4 files changed, 94 insertions(+), 102 deletions(-)

 diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
 index d184df1..c28fadb 100644
 --- a/include/net/6lowpan.h
 +++ b/include/net/6lowpan.h
 ...
 -static int process_data(struct sk_buff *skb, struct net_device *netdev,
 -struct l2cap_chan *chan)
 +static struct sk_buff *
 +process_data(struct sk_buff *skb, struct net_device *netdev,
 + struct l2cap_chan *chan)
  {
  const u8 *saddr, *daddr;
  u8 iphc0, iphc1;
 @@ -230,36 +231,31 @@ static int process_data(struct sk_buff *skb, struct 
 net_device *netdev,
  peer = peer_lookup_chan(dev, chan);
  read_unlock_irqrestore(devices_lock, flags);
  if (!peer)
 -goto drop;
 +return ERR_PTR(-EINVAL);
  
  saddr = peer-eui64_addr;
  daddr = dev-netdev-dev_addr;
  
  /* at least two bytes will be used for the encoding */
  if (skb-len  2)
 -goto drop;
 +return ERR_PTR(-EINVAL);
  
  if (lowpan_fetch_skb_u8(skb, iphc0))
 -goto drop;
 +return ERR_PTR(-EINVAL);
  
  if (lowpan_fetch_skb_u8(skb, iphc1))
 -goto drop;
 +return ERR_PTR(-EINVAL);
  
  return lowpan_process_data(skb, netdev,
 saddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
 daddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
 -   iphc0, iphc1, give_skb_to_upper);
 -
 -drop:
 -kfree_skb(skb);
 -return -EINVAL;
 +   iphc0, iphc1);
  }
  
  static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
  struct l2cap_chan *chan)
  {
  struct sk_buff *local_skb;
 -int ret;
  
  if (!netif_running(dev))
  goto drop;
 @@ -280,9 +276,6 @@ static int recv_pkt(struct sk_buff *skb, struct 
 net_device *dev,
  local_skb-protocol = htons(ETH_P_IPV6);
  local_skb-pkt_type = PACKET_HOST;
  
 -skb_reset_network_header(local_skb);
 -skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
 -
  if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) {
  kfree_skb(local_skb);
  goto drop;
 @@ -300,9 +293,20 @@ static int recv_pkt(struct sk_buff *skb, struct 
 net_device *dev,
  if (!local_skb)
  goto drop;
  
 -ret = process_data(local_skb, dev, chan);
 -if (ret != NET_RX_SUCCESS)
 +skb = process_data(local_skb, dev, chan);
 +if (IS_ERR(skb)) {
 +kfree_skb(local_skb);
  goto drop;
 +}
 +
 +local_skb-protocol = htons(ETH_P_IPV6);
 +local_skb-pkt_type = PACKET_HOST;
 this is the wrong skb here, the new one is skb. I don't know maybe there
 is some optimization to call skb = process_data(skb, ...);
yes you are right, my mistake, I'll fix in next series.

 +
 +if (give_skb_to_upper(local_skb, dev)
 also here local_skb should be skb, or?

 - Alex

- Martin.

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
 Hi Alex,
 On 16/09/14 12:36, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
  Currently there are a number of error paths in the lowpan_rcv function that
  free the skb before returning, the patch simplifies the receive path by
  ensuring that the skb is only freed from this function.
 
  Passing the skb from 6lowpan up to the higher layers is not a
  function of IPHC.  By moving it out of IPHC we also remove the
  need to support error code returns with NET_RX codes.
  It also makes the lowpan_rcv function more extendable as we
  can support more compression schemes.
 
  With the above 2 lowpan_rcv is refacored so eliminate incorrect return 
  values.
 
  Signed-off-by: Martin Townsend martin.towns...@xsilon.com
  ---
   include/net/6lowpan.h |  9 +++--
   net/6lowpan/iphc.c| 88 
  +--
   net/bluetooth/6lowpan.c   | 38 ++-
   net/ieee802154/6lowpan_rtnl.c | 61 --
   4 files changed, 94 insertions(+), 102 deletions(-)
 
  diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
  index d184df1..c28fadb 100644
  --- a/include/net/6lowpan.h
  +++ b/include/net/6lowpan.h
  ...
  -static int process_data(struct sk_buff *skb, struct net_device *netdev,
  -  struct l2cap_chan *chan)
  +static struct sk_buff *
  +process_data(struct sk_buff *skb, struct net_device *netdev,
  +   struct l2cap_chan *chan)
   {
 const u8 *saddr, *daddr;
 u8 iphc0, iphc1;
  @@ -230,36 +231,31 @@ static int process_data(struct sk_buff *skb, struct 
  net_device *netdev,
 peer = peer_lookup_chan(dev, chan);
 read_unlock_irqrestore(devices_lock, flags);
 if (!peer)
  -  goto drop;
  +  return ERR_PTR(-EINVAL);
   
 saddr = peer-eui64_addr;
 daddr = dev-netdev-dev_addr;
   
 /* at least two bytes will be used for the encoding */
 if (skb-len  2)
  -  goto drop;
  +  return ERR_PTR(-EINVAL);
   
 if (lowpan_fetch_skb_u8(skb, iphc0))
  -  goto drop;
  +  return ERR_PTR(-EINVAL);
   
 if (lowpan_fetch_skb_u8(skb, iphc1))
  -  goto drop;
  +  return ERR_PTR(-EINVAL);
   
 return lowpan_process_data(skb, netdev,
saddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
daddr, IEEE802154_ADDR_LONG, EUI64_ADDR_LEN,
  - iphc0, iphc1, give_skb_to_upper);
  -
  -drop:
  -  kfree_skb(skb);
  -  return -EINVAL;
  + iphc0, iphc1);
   }
   
   static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
 struct l2cap_chan *chan)
   {
 struct sk_buff *local_skb;
  -  int ret;
   
 if (!netif_running(dev))
 goto drop;
  @@ -280,9 +276,6 @@ static int recv_pkt(struct sk_buff *skb, struct 
  net_device *dev,
 local_skb-protocol = htons(ETH_P_IPV6);
 local_skb-pkt_type = PACKET_HOST;
   
  -  skb_reset_network_header(local_skb);
  -  skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
  -
 if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) {
 kfree_skb(local_skb);
 goto drop;
  @@ -300,9 +293,20 @@ static int recv_pkt(struct sk_buff *skb, struct 
  net_device *dev,
 if (!local_skb)
 goto drop;
   
  -  ret = process_data(local_skb, dev, chan);
  -  if (ret != NET_RX_SUCCESS)
  +  skb = process_data(local_skb, dev, chan);
  +  if (IS_ERR(skb)) {
  +  kfree_skb(local_skb);
 goto drop;
  +  }
  +
  +  local_skb-protocol = htons(ETH_P_IPV6);
  +  local_skb-pkt_type = PACKET_HOST;
  this is the wrong skb here, the new one is skb. I don't know maybe there
  is some optimization to call skb = process_data(skb, ...);

and this also smells like side effects for me, because we have the
local_skb which is sometimes freed inside of lowpan_process_data and
returning skb. Then we don't know which we should kfree_skb now, the skb
or local_skb now. Need to thing more about this to offer some solution,
somebody agree here with me?

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
  Hi Alex,
  On 16/09/14 12:36, Alexander Aring wrote:
   On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
...
 
 and this also smells like side effects for me, because we have the
 local_skb which is sometimes freed inside of lowpan_process_data and
 returning skb. Then we don't know which we should kfree_skb now, the skb
 or local_skb now. Need to thing more about this to offer some solution,
 somebody agree here with me?
 

I mean sometimes we do this *skb = *new and skb is the parameter and before we
did a consume_skb(skb); then local_skb is already freed after this and
returning an errno and we make kfree_skb(local_skb) will crash something,
I suppose.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 01:53:57PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
   Hi Alex,
   On 16/09/14 12:36, Alexander Aring wrote:
On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
 ...
  
  and this also smells like side effects for me, because we have the
  local_skb which is sometimes freed inside of lowpan_process_data and
  returning skb. Then we don't know which we should kfree_skb now, the skb
  or local_skb now. Need to thing more about this to offer some solution,
  somebody agree here with me?
  
 
 I mean sometimes we do this *skb = *new and skb is the parameter and before we
 did a consume_skb(skb); then local_skb is already freed after this and
 returning an errno and we make kfree_skb(local_skb) will crash something,
 I suppose.

I meant skb = new for the expand skb thing. And we can't never free
kfree_skb(skb) here if (IS_ERR(skb) is true, but we can't decide if
we need a kfree_skb(local_skb) or not, because we do a
consume_skb($SKB_FROM_PARAMTER) in lowpan_process_data.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 02:02:47PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:53:57PM +0200, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
   On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
Hi Alex,
On 16/09/14 12:36, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
  ...
   
   and this also smells like side effects for me, because we have the
   local_skb which is sometimes freed inside of lowpan_process_data and
   returning skb. Then we don't know which we should kfree_skb now, the skb
   or local_skb now. Need to thing more about this to offer some solution,
   somebody agree here with me?
   
  
  I mean sometimes we do this *skb = *new and skb is the parameter and before 
  we
  did a consume_skb(skb); then local_skb is already freed after this and
  returning an errno and we make kfree_skb(local_skb) will crash something,
  I suppose.
 
 I meant skb = new for the expand skb thing. And we can't never free
 kfree_skb(skb) here if (IS_ERR(skb) is true, but we can't decide if
 we need a kfree_skb(local_skb) or not, because we do a
 consume_skb($SKB_FROM_PARAMTER) in lowpan_process_data.
 

This all comes now in, because the ERR_PTR conversion. So we have two
choices:

 - drop the ERR_PTR convertsion and make old behaviour
 - handle consume_skb/kfree_skb inside lowpan_process_data

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Hi Alex,

On 16/09/14 13:18, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 02:02:47PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:53:57PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
 Hi Alex,
 On 16/09/14 12:36, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
 ...
 and this also smells like side effects for me, because we have the
 local_skb which is sometimes freed inside of lowpan_process_data and
 returning skb. Then we don't know which we should kfree_skb now, the skb
 or local_skb now. Need to thing more about this to offer some solution,
 somebody agree here with me?

 I mean sometimes we do this *skb = *new and skb is the parameter and before 
 we
 did a consume_skb(skb); then local_skb is already freed after this and
 returning an errno and we make kfree_skb(local_skb) will crash something,
 I suppose.
 I meant skb = new for the expand skb thing. And we can't never free
 kfree_skb(skb) here if (IS_ERR(skb) is true, but we can't decide if
 we need a kfree_skb(local_skb) or not, because we do a
 consume_skb($SKB_FROM_PARAMTER) in lowpan_process_data.

 This all comes now in, because the ERR_PTR conversion. So we have two
 choices:

  - drop the ERR_PTR convertsion and make old behaviour
  - handle consume_skb/kfree_skb inside lowpan_process_data

 - Alex

How about a label for drop_local_skb?

switch (skb-data[0]  0xe0) {
case LOWPAN_DISPATCH_IPHC:  /* ipv6 datagram */
local_skb = skb_clone(skb, GFP_ATOMIC);
if (!local_skb)
goto drop;

local_skb = process_data(local_skb, dev, chan);
if (IS_ERR(local_skb))
goto drop_local_skb;

local_skb-protocol = htons(ETH_P_IPV6);
local_skb-pkt_type = PACKET_HOST;

if (give_skb_to_upper(local_skb, dev)
!= NET_RX_SUCCESS) {
kfree_skb(local_skb);
goto drop;
}

dev-stats.rx_bytes += skb-len;
dev-stats.rx_packets++;

kfree_skb(skb);
break;
default:
break;
}
}

return NET_RX_SUCCESS;

drop_local_skb:
kfree_skb(local_skb);
drop:
dev-stats.rx_dropped++;
kfree_skb(skb);
return NET_RX_DROP;
}


- Martin.




--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 01:26:19PM +0100, Martin Townsend wrote:
 Hi Alex,
 
 On 16/09/14 13:18, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 02:02:47PM +0200, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 01:53:57PM +0200, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
  Hi Alex,
  On 16/09/14 12:36, Alexander Aring wrote:
  On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
  ...
  and this also smells like side effects for me, because we have the
  local_skb which is sometimes freed inside of lowpan_process_data and
  returning skb. Then we don't know which we should kfree_skb now, the skb
  or local_skb now. Need to thing more about this to offer some solution,
  somebody agree here with me?
 
  I mean sometimes we do this *skb = *new and skb is the parameter and 
  before we
  did a consume_skb(skb); then local_skb is already freed after this and
  returning an errno and we make kfree_skb(local_skb) will crash something,
  I suppose.
  I meant skb = new for the expand skb thing. And we can't never free
  kfree_skb(skb) here if (IS_ERR(skb) is true, but we can't decide if
  we need a kfree_skb(local_skb) or not, because we do a
  consume_skb($SKB_FROM_PARAMTER) in lowpan_process_data.
 
  This all comes now in, because the ERR_PTR conversion. So we have two
  choices:
 
   - drop the ERR_PTR convertsion and make old behaviour
   - handle consume_skb/kfree_skb inside lowpan_process_data
 
  - Alex
 
 How about a label for drop_local_skb?
 
   switch (skb-data[0]  0xe0) {
   case LOWPAN_DISPATCH_IPHC:  /* ipv6 datagram */
   local_skb = skb_clone(skb, GFP_ATOMIC);
   if (!local_skb)
   goto drop;
 
   local_skb = process_data(local_skb, dev, chan);
   if (IS_ERR(local_skb))
   goto drop_local_skb;
 
   local_skb-protocol = htons(ETH_P_IPV6);
   local_skb-pkt_type = PACKET_HOST;
 
   if (give_skb_to_upper(local_skb, dev)
   != NET_RX_SUCCESS) {
   kfree_skb(local_skb);
   goto drop;
   }
 
   dev-stats.rx_bytes += skb-len;
   dev-stats.rx_packets++;
 
   kfree_skb(skb);
   break;
   default:
   break;
   }
   }
 
   return NET_RX_SUCCESS;
 
 drop_local_skb:
   kfree_skb(local_skb);

no this can't work, when IS_ERR(local_skb) is true, local_skb is an
invalid pointer some ((void *) -errno), you can rescue it with if
(!IS_ERR(local_skb)), but... I don't know it looks complicated. :-)

What I mean is in lowpan_process_data you have a paramater skb and a skb
as return value.

Sometimes we need a consume_skb($PARAMETER_SKB), because we make the
copy_expand. After this the $PARAMETER_SKB is invalid and we have the
$RETURN_SKB as our new skb.

We don't know here if we need a kfree_skb($PARAMETER_SKB) or not because
we don't know if we did a consume_skb($PARAMETER_SKB). I think the error
handling need to be in lowpan_process_data again or make something which
handle this case.


I hope it was understandable what I mean here.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend

On 16/09/14 13:34, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:26:19PM +0100, Martin Townsend wrote:
 Hi Alex,

 On 16/09/14 13:18, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 02:02:47PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:53:57PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 01:47:59PM +0200, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:39:11PM +0100, Martin Townsend wrote:
 Hi Alex,
 On 16/09/14 12:36, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 12:01:59PM +0100, Martin Townsend wrote:
 ...
 and this also smells like side effects for me, because we have the
 local_skb which is sometimes freed inside of lowpan_process_data and
 returning skb. Then we don't know which we should kfree_skb now, the skb
 or local_skb now. Need to thing more about this to offer some solution,
 somebody agree here with me?

 I mean sometimes we do this *skb = *new and skb is the parameter and 
 before we
 did a consume_skb(skb); then local_skb is already freed after this and
 returning an errno and we make kfree_skb(local_skb) will crash something,
 I suppose.
 I meant skb = new for the expand skb thing. And we can't never free
 kfree_skb(skb) here if (IS_ERR(skb) is true, but we can't decide if
 we need a kfree_skb(local_skb) or not, because we do a
 consume_skb($SKB_FROM_PARAMTER) in lowpan_process_data.

 This all comes now in, because the ERR_PTR conversion. So we have two
 choices:

  - drop the ERR_PTR convertsion and make old behaviour
  - handle consume_skb/kfree_skb inside lowpan_process_data

 - Alex

 How about a label for drop_local_skb?

  switch (skb-data[0]  0xe0) {
  case LOWPAN_DISPATCH_IPHC:  /* ipv6 datagram */
  local_skb = skb_clone(skb, GFP_ATOMIC);
  if (!local_skb)
  goto drop;

  local_skb = process_data(local_skb, dev, chan);
  if (IS_ERR(local_skb))
  goto drop_local_skb;

  local_skb-protocol = htons(ETH_P_IPV6);
  local_skb-pkt_type = PACKET_HOST;

  if (give_skb_to_upper(local_skb, dev)
  != NET_RX_SUCCESS) {
  kfree_skb(local_skb);
  goto drop;
  }

  dev-stats.rx_bytes += skb-len;
  dev-stats.rx_packets++;

  kfree_skb(skb);
  break;
  default:
  break;
  }
  }

  return NET_RX_SUCCESS;

 drop_local_skb:
  kfree_skb(local_skb);
 no this can't work, when IS_ERR(local_skb) is true, local_skb is an
 invalid pointer some ((void *) -errno), you can rescue it with if
 (!IS_ERR(local_skb)), but... I don't know it looks complicated. :-)

 What I mean is in lowpan_process_data you have a paramater skb and a skb
 as return value.

 Sometimes we need a consume_skb($PARAMETER_SKB), because we make the
 copy_expand. After this the $PARAMETER_SKB is invalid and we have the
 $RETURN_SKB as our new skb.

 We don't know here if we need a kfree_skb($PARAMETER_SKB) or not because
 we don't know if we did a consume_skb($PARAMETER_SKB). I think the error
 handling need to be in lowpan_process_data again or make something which
 handle this case.


 I hope it was understandable what I mean here.

 - Alex

Yes I see the problem now, maybe it's better to revert back to skb_inout, less 
chance of introducing bugs and then we have a well defined return value.

- Martin.

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
Hi Martin,

On Tue, Sep 16, 2014 at 01:40:24PM +0100, Martin Townsend wrote:
...
 
 Yes I see the problem now, maybe it's better to revert back to skb_inout, 
 less chance of introducing bugs and then we have a well defined return value.
 

No problem, for me it's okay, if this is okay for Jukka, we can change
it later to a better behaviour. Jukka please answer what you think about this.

I also did a small c example because this now:

char *foo(char *buf)
{
char *new;

if (some_error)
return NULL;

if (some_error)
return NULL;

new = expand(buf, 23);
if (!new)
return NULL;

free(buf);
buf = new;

/* buf is now different than the parameter buf */
if (some_error)
return NULL;
 
return buf;
} 
  
int main(int argc, const char *argv[])
{ 
char *local_buf = malloc(42);
char *buf;
 
buf = foo(local_buf);
if (!buf) {
/* BUG */
/* we don't know if local_buf is still valid. */
free(local_buf);
}
 
return 0;
}

I think if you do buf = foo(buf) you can rescue it but this doesn't
look like a clean solution for me.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Jukka Rissanen
Hi Alex,

On ti, 2014-09-16 at 14:48 +0200, Alexander Aring wrote:
 Hi Martin,
 
 On Tue, Sep 16, 2014 at 01:40:24PM +0100, Martin Townsend wrote:
 ...
  
  Yes I see the problem now, maybe it's better to revert back to skb_inout, 
  less chance of introducing bugs and then we have a well defined return 
  value.
  
 
 No problem, for me it's okay, if this is okay for Jukka, we can change
 it later to a better behaviour. Jukka please answer what you think about this.
 

What about doing things like this in your example?

 I also did a small c example because this now:
 
 char *foo(char *buf)
 {
 char *new;
 
 if (some_error)
 return NULL;

In this case you should probably not return NULL but something like
-EINVAL

if (some_error) {
free(buf);
return -EINVAL;
}

 
 if (some_error)
 return NULL;

Ditto

 
 new = expand(buf, 23);
 if (!new)
 return NULL;

if (!new) {
free(buf);
return -ENOMEM;
}

 
 free(buf);
 buf = new;
 
   /* buf is now different than the parameter buf */
 if (some_error)
 return NULL;

if (some_error) {
free(buf);
return -EFOOBAR;
}

  
 return buf;
 } 
   
 int main(int argc, const char *argv[])
 { 
 char *local_buf = malloc(42);
 char *buf;
  
 buf = foo(local_buf);
 if (!buf) {
 /* BUG */
 /* we don't know if local_buf is still valid. */
 free(local_buf);
 }

if (IS_ERR_OR_NULL(buf)) {
fail();
} else
free(buf);

  
 return 0;
 }
 
 I think if you do buf = foo(buf) you can rescue it but this doesn't
 look like a clean solution for me.
 
 - Alex


In this simplified example, the subroutine frees the buf which does not
look nice I have to admit.



Cheers,
Jukka




--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Jukka Rissanen
Hi Alex,

On ti, 2014-09-16 at 15:32 +0200, Alexander Aring wrote:
 Hi Jukka,
 
 On Tue, Sep 16, 2014 at 04:20:19PM +0300, Jukka Rissanen wrote:
  Hi Alex,
  
  On ti, 2014-09-16 at 14:48 +0200, Alexander Aring wrote:
   Hi Martin,
   
   On Tue, Sep 16, 2014 at 01:40:24PM +0100, Martin Townsend wrote:
   ...

Yes I see the problem now, maybe it's better to revert back to 
skb_inout, less chance of introducing bugs and then we have a well 
defined return value.

   
   No problem, for me it's okay, if this is okay for Jukka, we can change
   it later to a better behaviour. Jukka please answer what you think about 
   this.
   
  
  What about doing things like this in your example?
  
 
 ehm yes, the example is only there to describe the current situation.
 
   I also did a small c example because this now:
   
   char *foo(char *buf)
   {
   char *new;
   
   if (some_error)
   return NULL;
  
  In this case you should probably not return NULL but something like
  -EINVAL
  
  if (some_error) {
  free(buf);
  return -EINVAL;
  }
 
 yes, that's the second choice, let do consume_skb/kfree_skb inside
 lowpan_process_data function.
 
  
   
   if (some_error)
   return NULL;
  
  Ditto
  
   
   new = expand(buf, 23);
   if (!new)
   return NULL;
  
  if (!new) {
  free(buf);
  return -ENOMEM;
  }
  
   
   free(buf);
   buf = new;
   
 /* buf is now different than the parameter buf */
   if (some_error)
   return NULL;
  
  if (some_error) {
  free(buf);
  return -EFOOBAR;
  }
  

   return buf;
   } 
 
   int main(int argc, const char *argv[])
   { 
   char *local_buf = malloc(42);
   char *buf;

   buf = foo(local_buf);
   if (!buf) {
   /* BUG */
   /* we don't know if local_buf is still valid. */
   free(local_buf);
   }
  
  if (IS_ERR_OR_NULL(buf)) {
  fail();
  } else
  free(buf);
  

   return 0;
   }
   
   I think if you do buf = foo(buf) you can rescue it but this doesn't
   look like a clean solution for me.
   
   - Alex
  
  
  In this simplified example, the subroutine frees the buf which does not
  look nice I have to admit.
  
 
 I am also fine with this solution. Make something I will review it and
 look if we run into trouble.
 
 In my last mails stands, that we have two choices:
 
 - make the skb_inout thingy
 - handle error freeing into lowpan_process_data function.
 
 You described the last one now. :-)

Great, your example clarified the issue nicely :)

I would vote for option 2) but if it makes the code too ugly then 1) is
ok too.


Cheers,
Jukka



--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
Hi Jukka and Martin,

On Tue, Sep 16, 2014 at 04:52:50PM +0300, Jukka Rissanen wrote:
...
 Great, your example clarified the issue nicely :)
 
 I would vote for option 2) but if it makes the code too ugly then 1) is
 ok too.
 
I begin to have the feeling like there is a reason because there are
different indicators for consume_skb, kfree_skb. Error or not error,
because it's hard to implement it in some way to make a correct handling
without using a pointer of pointer. A pointer of pointer always means also
a unnecessary dereferencing (netdev people doesn't like unnecessary
dereferencing stuff, takes too much time).

That's why I vote also for option 2)... but we can also clarify this on
the netdev mailinglist and ask other networking kernel hackers.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
I would like to keep freeing skb's out of process_data as process_data will 
become something like iphc_decompress_hdr and it would be good if that's all it 
did.  Otherwise I feel we are going to put a constraint on all future header 
decompression routines in that they must free the skb on error.  I think it 
would be better to defer this so on error you might want to try something else 
with the skb, maybe not but at least the option is there.
So how about

struct sk_buff * ret_skb;
switch (skb-data[0]  0xe0) {
case LOWPAN_DISPATCH_IPHC:/* ipv6 datagram */
ret_skb = process_data(skb, hdr);
if (IS_ERR(ret_skb))
goto drop_skb;
else
skb = ret_skb;
break;

I know we currently have 3 calls to process_data so it will look fairly ugly in 
this patch but in my next patch to fix lowpan_rcv to handle uncompressed IPv6 
packets that are fragmented there will only be one call to process_data so it 
won't look so bad.  You could even wrap it in a macro but I'm not a fan of this 
as they can obfuscate the code a bit.

Thoughts?

- Martin.



On 16/09/14 15:05, Alexander Aring wrote:
 Hi Jukka and Martin,

 On Tue, Sep 16, 2014 at 04:52:50PM +0300, Jukka Rissanen wrote:
 ...
 Great, your example clarified the issue nicely :)

 I would vote for option 2) but if it makes the code too ugly then 1) is
 ok too.

 I begin to have the feeling like there is a reason because there are
 different indicators for consume_skb, kfree_skb. Error or not error,
 because it's hard to implement it in some way to make a correct handling
 without using a pointer of pointer. A pointer of pointer always means also
 a unnecessary dereferencing (netdev people doesn't like unnecessary
 dereferencing stuff, takes too much time).

 That's why I vote also for option 2)... but we can also clarify this on
 the netdev mailinglist and ask other networking kernel hackers.

 - Alex
 --
 To unsubscribe from this list: send the line unsubscribe linux-wpan in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
Hi Martin,

On Tue, Sep 16, 2014 at 03:44:43PM +0100, Martin Townsend wrote:
 I would like to keep freeing skb's out of process_data as process_data will 
 become something like iphc_decompress_hdr and it would be good if that's all 
 it did.  Otherwise I feel we are going to put a constraint on all future 
 header decompression routines in that they must free the skb on error.  I 
 think it would be better to defer this so on error you might want to try 
 something else with the skb, maybe not but at least the option is there.
 So how about
 
 struct sk_buff * ret_skb;
 switch (skb-data[0]  0xe0) {
 case LOWPAN_DISPATCH_IPHC:/* ipv6 datagram */
 ret_skb = process_data(skb, hdr);
 if (IS_ERR(ret_skb))
 goto drop_skb;
 else
 skb = ret_skb;
 break;
 
 I know we currently have 3 calls to process_data so it will look fairly ugly 
 in this patch but in my next patch to fix lowpan_rcv to handle uncompressed 
 IPv6 packets that are fragmented there will only be one call to process_data 
 so it won't look so bad.  You could even wrap it in a macro but I'm not a fan 
 of this as they can obfuscate the code a bit.
 
 Thoughts?
 

sorry, I can't follow how this solve the issue if the parameter skb is
already consumed or not. If process_data returns a error before
parameter consume, then we should run kfree_skb(parameter_skb), if it's
afterwards we should do nothing. Point is we don't know that there. I
suppose if we do consume_skb and refcount reach 0 the parameter_skb
becomes a dangling pointer.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 07:57:27PM +0100, Martin Townsend wrote:
 Hi Alex,
 
 On 16/09/14 18:38, Alexander Aring wrote:
 Hi Martin,
 
 On Tue, Sep 16, 2014 at 03:44:43PM +0100, Martin Townsend wrote:
 I would like to keep freeing skb's out of process_data as process_data will 
 become something like iphc_decompress_hdr and it would be good if that's 
 all it did.  Otherwise I feel we are going to put a constraint on all 
 future header decompression routines in that they must free the skb on 
 error.  I think it would be better to defer this so on error you might want 
 to try something else with the skb, maybe not but at least the option is 
 there.
 So how about
 
  struct sk_buff * ret_skb;
  switch (skb-data[0]  0xe0) {
  case LOWPAN_DISPATCH_IPHC:/* ipv6 datagram */
  ret_skb = process_data(skb, hdr);
  if (IS_ERR(ret_skb))
  goto drop_skb;
  else
  skb = ret_skb;
  break;
 
 I know we currently have 3 calls to process_data so it will look fairly 
 ugly in this patch but in my next patch to fix lowpan_rcv to handle 
 uncompressed IPv6 packets that are fragmented there will only be one call 
 to process_data so it won't look so bad.  You could even wrap it in a macro 
 but I'm not a fan of this as they can obfuscate the code a bit.
 
 Thoughts?
 
 sorry, I can't follow how this solve the issue if the parameter skb is
 already consumed or not. If process_data returns a error before
 parameter consume, then we should run kfree_skb(parameter_skb), if it's
 afterwards we should do nothing. Point is we don't know that there. I
 suppose if we do consume_skb and refcount reach 0 the parameter_skb
 becomes a dangling pointer.
 
 - Alex
 
 process_data never consumes the skb, it may copy_expand and then consume the
 old one so it will either return an error or an skb that contains the
 uncompressed ipv6 header.  By calling process_data using a different sk_buff
 pointer (ret_skb) that the parameter we can check this for an error and if
 so goto drop_skb which will kfree_skb(skb) which is fine as skb is still

are you sure it's still valid? I don't get it. :-(

 valid.   if ret_skb is good and we assign to skb and carry on to the
 function that  passes the skb up the stack, lowpan_give_skb_to_devices,
 which deals with either consuming or kfreeing.
 
 Or am I missing something?
 

I make another c example, hopeful more correct than the last one:

char *foo(char *skb)
{
char *new;

if (some_error_before_consume)
return ERR_PTR(-EINVAL); /* here we need to do a free(skb) */

/* UDP expand */
new = expand(skb, 16);
if (!new)
return ERR_PTR(-ENOMEM);
consume(skb); /* parameter skb becomes dangling pointer */
skb = new; /* doesn't rescue it, it is different than skb from caller 
function
  at this point, the skb_inout had rescue it, because it 
was a pointer
  of pointer */

/* IPv6 expand */
new = expand(skb, 40);
if (!new) /* some error after a consume(skb), will crash at drop_skb 
label */
return ERR_PTR(-ENOMEM);
consume(skb);
skb = new;

return skb;
}

int main(int argc, const char *argv[])
{
char *local_buf = malloc(42);
char *skb;

local_skb = foo(skb);
if (IS_ERR(local_skb))
goto drop_skb;
else
skb = local_skb; /* ??? */

return NET_RX_SUCCESS;

drop_skb:
free(skb); /* dangling pointer will be freed if foo called consume(skb)
  it's correct when foo returned on 
some_error_before_consume
  condition. */
drop:
return NET_RX_DROP;
}

I don't know what skb = local_skb did now there.

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Hi Alex,

Another idea that just occured to me is to use the control buffer (cb) 
in the skb to store the (de)compress_status variable.  This should be 
possible as it is only valid for this layer.  Then process_data (or 
iphc_header_decompress as I like to think of it now) will only ever 
return an skb pointer; either the same one passed in (no copy_expand) or 
more likely a new one (as we will skb_copy_expand to make room for 
decompression).  On failure process_data or functions called by this set 
the decompress status variable in skb-cb for lowpan_rcv to check.

- Martin.

On 16/09/14 18:38, Alexander Aring wrote:
 Hi Martin,

 On Tue, Sep 16, 2014 at 03:44:43PM +0100, Martin Townsend wrote:
 I would like to keep freeing skb's out of process_data as process_data will 
 become something like iphc_decompress_hdr and it would be good if that's all 
 it did.  Otherwise I feel we are going to put a constraint on all future 
 header decompression routines in that they must free the skb on error.  I 
 think it would be better to defer this so on error you might want to try 
 something else with the skb, maybe not but at least the option is there.
 So how about

  struct sk_buff * ret_skb;
  switch (skb-data[0]  0xe0) {
  case LOWPAN_DISPATCH_IPHC:/* ipv6 datagram */
  ret_skb = process_data(skb, hdr);
  if (IS_ERR(ret_skb))
  goto drop_skb;
  else
  skb = ret_skb;
  break;

 I know we currently have 3 calls to process_data so it will look fairly ugly 
 in this patch but in my next patch to fix lowpan_rcv to handle uncompressed 
 IPv6 packets that are fragmented there will only be one call to process_data 
 so it won't look so bad.  You could even wrap it in a macro but I'm not a 
 fan of this as they can obfuscate the code a bit.

 Thoughts?

 sorry, I can't follow how this solve the issue if the parameter skb is
 already consumed or not. If process_data returns a error before
 parameter consume, then we should run kfree_skb(parameter_skb), if it's
 afterwards we should do nothing. Point is we don't know that there. I
 suppose if we do consume_skb and refcount reach 0 the parameter_skb
 becomes a dangling pointer.

 - Alex
 --
 To unsubscribe from this list: send the line unsubscribe linux-wpan in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Hi Alex,

On 16/09/14 20:37, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 07:57:27PM +0100, Martin Townsend wrote:
 Hi Alex,

 On 16/09/14 18:38, Alexander Aring wrote:
 Hi Martin,

 On Tue, Sep 16, 2014 at 03:44:43PM +0100, Martin Townsend wrote:
 I would like to keep freeing skb's out of process_data as process_data 
 will become something like iphc_decompress_hdr and it would be good if 
 that's all it did.  Otherwise I feel we are going to put a constraint on 
 all future header decompression routines in that they must free the skb on 
 error.  I think it would be better to defer this so on error you might 
 want to try something else with the skb, maybe not but at least the option 
 is there.
 So how about

  struct sk_buff * ret_skb;
  switch (skb-data[0]  0xe0) {
  case LOWPAN_DISPATCH_IPHC:/* ipv6 datagram */
  ret_skb = process_data(skb, hdr);
  if (IS_ERR(ret_skb))
  goto drop_skb;
  else
  skb = ret_skb;
  break;

 I know we currently have 3 calls to process_data so it will look fairly 
 ugly in this patch but in my next patch to fix lowpan_rcv to handle 
 uncompressed IPv6 packets that are fragmented there will only be one call 
 to process_data so it won't look so bad.  You could even wrap it in a 
 macro but I'm not a fan of this as they can obfuscate the code a bit.

 Thoughts?

 sorry, I can't follow how this solve the issue if the parameter skb is
 already consumed or not. If process_data returns a error before
 parameter consume, then we should run kfree_skb(parameter_skb), if it's
 afterwards we should do nothing. Point is we don't know that there. I
 suppose if we do consume_skb and refcount reach 0 the parameter_skb
 becomes a dangling pointer.

 - Alex
 process_data never consumes the skb, it may copy_expand and then consume the
 old one so it will either return an error or an skb that contains the
 uncompressed ipv6 header.  By calling process_data using a different sk_buff
 pointer (ret_skb) that the parameter we can check this for an error and if
 so goto drop_skb which will kfree_skb(skb) which is fine as skb is still
 are you sure it's still valid? I don't get it. :-(

 valid.   if ret_skb is good and we assign to skb and carry on to the
 function that  passes the skb up the stack, lowpan_give_skb_to_devices,
 which deals with either consuming or kfreeing.

 Or am I missing something?

 I make another c example, hopeful more correct than the last one:

 char *foo(char *skb)
 {
  char *new;

  if (some_error_before_consume)
  return ERR_PTR(-EINVAL); /* here we need to do a free(skb) */

  /* UDP expand */
  new = expand(skb, 16);
  if (!new)
  return ERR_PTR(-ENOMEM);
  consume(skb); /* parameter skb becomes dangling pointer */
  skb = new; /* doesn't rescue it, it is different than skb from 
 caller function
at this point, the skb_inout had rescue it, because it 
 was a pointer
of pointer */

  /* IPv6 expand */
  new = expand(skb, 40);
  if (!new) /* some error after a consume(skb), will crash at drop_skb 
 label */
  return ERR_PTR(-ENOMEM);
  consume(skb);
  skb = new;

  return skb;
 }
I see the problem now, once the skb has been copied and then an error 
occurs you have to return the error and the skb has been lost.  Would 
using the skb-cb to store decompress status get around this problem?
 int main(int argc, const char *argv[])
 {
  char *local_buf = malloc(42);
  char *skb;

  local_skb = foo(skb);
  if (IS_ERR(local_skb))
  goto drop_skb;
  else
  skb = local_skb; /* ??? */

  return NET_RX_SUCCESS;

 drop_skb:
  free(skb); /* dangling pointer will be freed if foo called 
 consume(skb)
it's correct when foo returned on 
 some_error_before_consume
condition. */
 drop:
  return NET_RX_DROP;
 }

 I don't know what skb = local_skb did now there.

 - Alex
 --
 To unsubscribe from this list: send the line unsubscribe linux-wpan in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
- Martin.

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Alexander Aring
On Tue, Sep 16, 2014 at 08:53:06PM +0100, Martin Townsend wrote:
...
 I make another c example, hopeful more correct than the last one:
 
 char *foo(char *skb)
 {
  char *new;
 
  if (some_error_before_consume)
  return ERR_PTR(-EINVAL); /* here we need to do a free(skb) 
  */
 
  /* UDP expand */
  new = expand(skb, 16);
s/16/8 , argl, doesn't matter was only an example. :-)

  if (!new)
  return ERR_PTR(-ENOMEM);
  consume(skb); /* parameter skb becomes dangling pointer */
  skb = new; /* doesn't rescue it, it is different than skb from 
  caller function
at this point, the skb_inout had rescue it, because 
  it was a pointer
of pointer */
 
  /* IPv6 expand */
  new = expand(skb, 40);
  if (!new) /* some error after a consume(skb), will crash at 
  drop_skb label */
  return ERR_PTR(-ENOMEM);
  consume(skb);
  skb = new;
 
  return skb;
 }
 I see the problem now, once the skb has been copied and then an error occurs
 you have to return the error and the skb has been lost.  Would using the
 skb-cb to store decompress status get around this problem?

mhhh, complicated... on 802.15.4 6LoWPAN we use the control block
information for fragmentation information. I don't know right now if we
get trouble when we add the uncompression on the fly when FRAG1 was
received.

What exactly do you mean with decompress status?

- Alex

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


Re: [Linux-zigbee-devel] [PATCH v4 bluetooth] 6lowpan: fix incorrect return values in lowpan_rcv

2014-09-16 Thread Martin Townsend
Hi Alex,

On 16/09/14 21:07, Alexander Aring wrote:
 On Tue, Sep 16, 2014 at 08:53:06PM +0100, Martin Townsend wrote:
 ...
 I make another c example, hopeful more correct than the last one:

 char *foo(char *skb)
 {
  char *new;

  if (some_error_before_consume)
  return ERR_PTR(-EINVAL); /* here we need to do a free(skb) 
 */

  /* UDP expand */
  new = expand(skb, 16);
 s/16/8 , argl, doesn't matter was only an example. :-)

  if (!new)
  return ERR_PTR(-ENOMEM);
  consume(skb); /* parameter skb becomes dangling pointer */
  skb = new; /* doesn't rescue it, it is different than skb from 
 caller function
at this point, the skb_inout had rescue it, because 
 it was a pointer
of pointer */

  /* IPv6 expand */
  new = expand(skb, 40);
  if (!new) /* some error after a consume(skb), will crash at 
 drop_skb label */
  return ERR_PTR(-ENOMEM);
  consume(skb);
  skb = new;

  return skb;
 }
 I see the problem now, once the skb has been copied and then an error occurs
 you have to return the error and the skb has been lost.  Would using the
 skb-cb to store decompress status get around this problem?
 mhhh, complicated... on 802.15.4 6LoWPAN we use the control block
 information for fragmentation information. I don't know right now if we
 get trouble when we add the uncompression on the fly when FRAG1 was
 received.

 What exactly do you mean with decompress status?
An integer that either contains an error code or 0 that process_data 
would set as process_data is now IPHC decompression.
 - Alex
- Martin.

--
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce.
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel