Commit 6cbd05b2 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge tag 'ieee802154-for-net-next-2022-06-09' of...

Merge tag 'ieee802154-for-net-next-2022-06-09' of git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan-next

Stefan Schmidt says:

====================
pull-request: ieee802154-next 2022-06-09

This is a separate pull request for 6lowpan changes. We agreed with the
bluetooth maintainers to switch the trees these changing are going into
from bluetooth to ieee802154.

Jukka Rissanen stepped down as a co-maintainer of 6lowpan (Thanks for the
work!). Alexander is staying as maintainer.

Alexander reworked the nhc_id lookup in 6lowpan to be way simpler.
Moved the data structure from rb to an array, which is all we need in this
case.

* tag 'ieee802154-for-net-next-2022-06-09' of git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan-next:
  MAINTAINERS: Remove Jukka Rissanen as 6lowpan maintainer
  net: 6lowpan: constify lowpan_nhc structures
  net: 6lowpan: use array for find nhc id
  net: 6lowpan: remove const from scalars
====================

Link: https://lore.kernel.org/r/20220609202956.1512156-1-stefan@datenfreihafen.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 70b1f299 260b5c69
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -171,7 +171,6 @@ F: drivers/scsi/53c700*
6LOWPAN GENERIC (BTLE/IEEE 802.15.4)
M:	Alexander Aring <alex.aring@gmail.com>
M:	Jukka Rissanen <jukka.rissanen@linux.intel.com>
L:	linux-bluetooth@vger.kernel.org
L:	linux-wpan@vger.kernel.org
S:	Maintained
+19 −84
Original line number Diff line number Diff line
@@ -12,77 +12,26 @@

#include "nhc.h"

static struct rb_root rb_root = RB_ROOT;
static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1];
static const struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1];
static DEFINE_SPINLOCK(lowpan_nhc_lock);

static int lowpan_nhc_insert(struct lowpan_nhc *nhc)
static const struct lowpan_nhc *lowpan_nhc_by_nhcid(struct sk_buff *skb)
{
	struct rb_node **new = &rb_root.rb_node, *parent = NULL;

	/* Figure out where to put new node */
	while (*new) {
		struct lowpan_nhc *this = rb_entry(*new, struct lowpan_nhc,
						   node);
		int result, len_dif, len;

		len_dif = nhc->idlen - this->idlen;

		if (nhc->idlen < this->idlen)
			len = nhc->idlen;
		else
			len = this->idlen;

		result = memcmp(nhc->id, this->id, len);
		if (!result)
			result = len_dif;

		parent = *new;
		if (result < 0)
			new = &((*new)->rb_left);
		else if (result > 0)
			new = &((*new)->rb_right);
		else
			return -EEXIST;
	}

	/* Add new node and rebalance tree. */
	rb_link_node(&nhc->node, parent, new);
	rb_insert_color(&nhc->node, &rb_root);

	return 0;
}
	const struct lowpan_nhc *nhc;
	int i;
	u8 id;

static void lowpan_nhc_remove(struct lowpan_nhc *nhc)
{
	rb_erase(&nhc->node, &rb_root);
}
	if (!pskb_may_pull(skb, 1))
		return NULL;

static struct lowpan_nhc *lowpan_nhc_by_nhcid(const struct sk_buff *skb)
{
	struct rb_node *node = rb_root.rb_node;
	const u8 *nhcid_skb_ptr = skb->data;
	id = *skb->data;

	while (node) {
		struct lowpan_nhc *nhc = rb_entry(node, struct lowpan_nhc,
						  node);
		u8 nhcid_skb_ptr_masked[LOWPAN_NHC_MAX_ID_LEN];
		int result, i;
	for (i = 0; i < NEXTHDR_MAX + 1; i++) {
		nhc = lowpan_nexthdr_nhcs[i];
		if (!nhc)
			continue;

		if (nhcid_skb_ptr + nhc->idlen > skb->data + skb->len)
			return NULL;

		/* copy and mask afterwards the nhid value from skb */
		memcpy(nhcid_skb_ptr_masked, nhcid_skb_ptr, nhc->idlen);
		for (i = 0; i < nhc->idlen; i++)
			nhcid_skb_ptr_masked[i] &= nhc->idmask[i];

		result = memcmp(nhcid_skb_ptr_masked, nhc->id, nhc->idlen);
		if (result < 0)
			node = node->rb_left;
		else if (result > 0)
			node = node->rb_right;
		else
		if ((id & nhc->idmask) == nhc->id)
			return nhc;
	}

@@ -92,7 +41,7 @@ static struct lowpan_nhc *lowpan_nhc_by_nhcid(const struct sk_buff *skb)
int lowpan_nhc_check_compression(struct sk_buff *skb,
				 const struct ipv6hdr *hdr, u8 **hc_ptr)
{
	struct lowpan_nhc *nhc;
	const struct lowpan_nhc *nhc;
	int ret = 0;

	spin_lock_bh(&lowpan_nhc_lock);
@@ -110,7 +59,7 @@ int lowpan_nhc_do_compression(struct sk_buff *skb, const struct ipv6hdr *hdr,
			      u8 **hc_ptr)
{
	int ret;
	struct lowpan_nhc *nhc;
	const struct lowpan_nhc *nhc;

	spin_lock_bh(&lowpan_nhc_lock);

@@ -153,7 +102,7 @@ int lowpan_nhc_do_uncompression(struct sk_buff *skb,
				const struct net_device *dev,
				struct ipv6hdr *hdr)
{
	struct lowpan_nhc *nhc;
	const struct lowpan_nhc *nhc;
	int ret;

	spin_lock_bh(&lowpan_nhc_lock);
@@ -189,18 +138,9 @@ int lowpan_nhc_do_uncompression(struct sk_buff *skb,
	return 0;
}

int lowpan_nhc_add(struct lowpan_nhc *nhc)
int lowpan_nhc_add(const struct lowpan_nhc *nhc)
{
	int ret;

	if (!nhc->idlen || !nhc->idsetup)
		return -EINVAL;

	WARN_ONCE(nhc->idlen > LOWPAN_NHC_MAX_ID_LEN,
		  "LOWPAN_NHC_MAX_ID_LEN should be updated to %zd.\n",
		  nhc->idlen);

	nhc->idsetup(nhc);
	int ret = 0;

	spin_lock_bh(&lowpan_nhc_lock);

@@ -209,10 +149,6 @@ int lowpan_nhc_add(struct lowpan_nhc *nhc)
		goto out;
	}

	ret = lowpan_nhc_insert(nhc);
	if (ret < 0)
		goto out;

	lowpan_nexthdr_nhcs[nhc->nexthdr] = nhc;
out:
	spin_unlock_bh(&lowpan_nhc_lock);
@@ -220,11 +156,10 @@ int lowpan_nhc_add(struct lowpan_nhc *nhc)
}
EXPORT_SYMBOL(lowpan_nhc_add);

void lowpan_nhc_del(struct lowpan_nhc *nhc)
void lowpan_nhc_del(const struct lowpan_nhc *nhc)
{
	spin_lock_bh(&lowpan_nhc_lock);

	lowpan_nhc_remove(nhc);
	lowpan_nexthdr_nhcs[nhc->nexthdr] = NULL;

	spin_unlock_bh(&lowpan_nhc_lock);
+14 −24
Original line number Diff line number Diff line
@@ -16,24 +16,20 @@
 * @_name: const char * of common header compression name.
 * @_nexthdr: ipv6 nexthdr field for the header compression.
 * @_nexthdrlen: ipv6 nexthdr len for the reserved space.
 * @_idsetup: callback to setup id and mask values.
 * @_idlen: len for the next header id and mask, should be always the same.
 * @_id: one byte nhc id value.
 * @_idmask: one byte nhc id mask value.
 * @_uncompress: callback for uncompression call.
 * @_compress: callback for compression call.
 */
#define LOWPAN_NHC(__nhc, _name, _nexthdr,	\
		   _hdrlen, _idsetup, _idlen,	\
		   _hdrlen, _id, _idmask,	\
		   _uncompress, _compress)	\
static u8 __nhc##_val[_idlen];			\
static u8 __nhc##_mask[_idlen];			\
static struct lowpan_nhc __nhc = {		\
static const struct lowpan_nhc __nhc = {	\
	.name		= _name,		\
	.nexthdr	= _nexthdr,		\
	.nexthdrlen	= _hdrlen,		\
	.id		= __nhc##_val,		\
	.idmask		= __nhc##_mask,		\
	.idlen		= _idlen,		\
	.idsetup	= _idsetup,		\
	.id		= _id,			\
	.idmask		= _idmask,		\
	.uncompress	= _uncompress,		\
	.compress	= _compress,		\
}
@@ -53,27 +49,21 @@ module_exit(__nhc##_exit);
/**
 * struct lowpan_nhc - hold 6lowpan next hdr compression ifnformation
 *
 * @node: holder for the rbtree.
 * @name: name of the specific next header compression
 * @nexthdr: next header value of the protocol which should be compressed.
 * @nexthdrlen: ipv6 nexthdr len for the reserved space.
 * @id: array for nhc id. Note this need to be in network byteorder.
 * @mask: array for nhc id mask. Note this need to be in network byteorder.
 * @len: the length of the next header id and mask.
 * @setup: callback to setup fill the next header id value and mask.
 * @id: one byte nhc id value.
 * @idmask: one byte nhc id mask value.
 * @compress: callback to do the header compression.
 * @uncompress: callback to do the header uncompression.
 */
struct lowpan_nhc {
	struct rb_node	node;
	const char	*name;
	const u8	nexthdr;
	const size_t	nexthdrlen;
	u8		*id;
	u8		*idmask;
	const size_t	idlen;
	u8		nexthdr;
	size_t		nexthdrlen;
	u8		id;
	u8		idmask;

	void		(*idsetup)(struct lowpan_nhc *nhc);
	int		(*uncompress)(struct sk_buff *skb, size_t needed);
	int		(*compress)(struct sk_buff *skb, u8 **hc_ptr);
};
@@ -126,14 +116,14 @@ int lowpan_nhc_do_uncompression(struct sk_buff *skb,
 *
 * @nhc: nhc which should be add.
 */
int lowpan_nhc_add(struct lowpan_nhc *nhc);
int lowpan_nhc_add(const struct lowpan_nhc *nhc);

/**
 * lowpan_nhc_del - delete a next header compression from framework
 *
 * @nhc: nhc which should be delete.
 */
void lowpan_nhc_del(struct lowpan_nhc *nhc);
void lowpan_nhc_del(const struct lowpan_nhc *nhc);

/**
 * lowpan_nhc_init - adding all default nhcs
+1 −8
Original line number Diff line number Diff line
@@ -6,18 +6,11 @@

#include "nhc.h"

#define LOWPAN_NHC_DEST_IDLEN	1
#define LOWPAN_NHC_DEST_ID_0	0xe6
#define LOWPAN_NHC_DEST_MASK_0	0xfe

static void dest_nhid_setup(struct lowpan_nhc *nhc)
{
	nhc->id[0] = LOWPAN_NHC_DEST_ID_0;
	nhc->idmask[0] = LOWPAN_NHC_DEST_MASK_0;
}

LOWPAN_NHC(nhc_dest, "RFC6282 Destination Options", NEXTHDR_DEST, 0,
	   dest_nhid_setup, LOWPAN_NHC_DEST_IDLEN, NULL, NULL);
	   LOWPAN_NHC_DEST_ID_0, LOWPAN_NHC_DEST_MASK_0,  NULL, NULL);

module_lowpan_nhc(nhc_dest);
MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Destination Options compression");
+1 −8
Original line number Diff line number Diff line
@@ -5,18 +5,11 @@

#include "nhc.h"

#define LOWPAN_NHC_FRAGMENT_IDLEN	1
#define LOWPAN_NHC_FRAGMENT_ID_0	0xe4
#define LOWPAN_NHC_FRAGMENT_MASK_0	0xfe

static void fragment_nhid_setup(struct lowpan_nhc *nhc)
{
	nhc->id[0] = LOWPAN_NHC_FRAGMENT_ID_0;
	nhc->idmask[0] = LOWPAN_NHC_FRAGMENT_MASK_0;
}

LOWPAN_NHC(nhc_fragment, "RFC6282 Fragment", NEXTHDR_FRAGMENT, 0,
	   fragment_nhid_setup, LOWPAN_NHC_FRAGMENT_IDLEN, NULL, NULL);
	   LOWPAN_NHC_FRAGMENT_ID_0, LOWPAN_NHC_FRAGMENT_MASK_0, NULL, NULL);

module_lowpan_nhc(nhc_fragment);
MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Fragment compression");
Loading