Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 983f5961 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'ieee802154-next'



Phoebe Buckheister says:

====================
ieee802154: fix endianness and header handling

This patch set enforces network byte order on all internal operations and
fields of the 802.15.4 stack and adds a general representation of 802.15.4
headers with operations to create and parse those headers. This reduces code
duplication in the current stack and also allows for upper layers to read
headers of packets they have just received; it is also necessary for 802.15.4
link layer security, which requires header mangling.

Changes since v1:
 * fixed lowpan packet rx after reassembly. Control blocks were used to
   retrieve source/dest addresses, but the CB is clobbered by reassembly.
   Instead, parse the header anew in lowpan.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 17794326 d1d7358e
Loading
Loading
Loading
Loading
+13 −12
Original line number Original line Diff line number Diff line
@@ -745,30 +745,31 @@ at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
	struct at86rf230_local *lp = dev->priv;
	struct at86rf230_local *lp = dev->priv;


	if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
	if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
		u16 addr = le16_to_cpu(filt->short_addr);

		dev_vdbg(&lp->spi->dev,
		dev_vdbg(&lp->spi->dev,
			"at86rf230_set_hw_addr_filt called for saddr\n");
			"at86rf230_set_hw_addr_filt called for saddr\n");
		__at86rf230_write(lp, RG_SHORT_ADDR_0, filt->short_addr);
		__at86rf230_write(lp, RG_SHORT_ADDR_0, addr);
		__at86rf230_write(lp, RG_SHORT_ADDR_1, filt->short_addr >> 8);
		__at86rf230_write(lp, RG_SHORT_ADDR_1, addr >> 8);
	}
	}


	if (changed & IEEE802515_AFILT_PANID_CHANGED) {
	if (changed & IEEE802515_AFILT_PANID_CHANGED) {
		u16 pan = le16_to_cpu(filt->pan_id);

		dev_vdbg(&lp->spi->dev,
		dev_vdbg(&lp->spi->dev,
			"at86rf230_set_hw_addr_filt called for pan id\n");
			"at86rf230_set_hw_addr_filt called for pan id\n");
		__at86rf230_write(lp, RG_PAN_ID_0, filt->pan_id);
		__at86rf230_write(lp, RG_PAN_ID_0, pan);
		__at86rf230_write(lp, RG_PAN_ID_1, filt->pan_id >> 8);
		__at86rf230_write(lp, RG_PAN_ID_1, pan >> 8);
	}
	}


	if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
	if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
		u8 i, addr[8];

		memcpy(addr, &filt->ieee_addr, 8);
		dev_vdbg(&lp->spi->dev,
		dev_vdbg(&lp->spi->dev,
			"at86rf230_set_hw_addr_filt called for IEEE addr\n");
			"at86rf230_set_hw_addr_filt called for IEEE addr\n");
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_0, filt->ieee_addr[7]);
		for (i = 0; i < 8; i++)
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_1, filt->ieee_addr[6]);
			__at86rf230_write(lp, RG_IEEE_ADDR_0 + i, addr[i]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_2, filt->ieee_addr[5]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_3, filt->ieee_addr[4]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_4, filt->ieee_addr[3]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_5, filt->ieee_addr[2]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_6, filt->ieee_addr[1]);
		at86rf230_write_subreg(lp, SR_IEEE_ADDR_7, filt->ieee_addr[0]);
	}
	}


	if (changed & IEEE802515_AFILT_PANC_CHANGED) {
	if (changed & IEEE802515_AFILT_PANC_CHANGED) {
+11 −11
Original line number Original line Diff line number Diff line
@@ -63,11 +63,11 @@ static struct wpan_phy *fake_get_phy(const struct net_device *dev)
 *
 *
 * Return the ID of the PAN from the PIB.
 * Return the ID of the PAN from the PIB.
 */
 */
static u16 fake_get_pan_id(const struct net_device *dev)
static __le16 fake_get_pan_id(const struct net_device *dev)
{
{
	BUG_ON(dev->type != ARPHRD_IEEE802154);
	BUG_ON(dev->type != ARPHRD_IEEE802154);


	return 0xeba1;
	return cpu_to_le16(0xeba1);
}
}


/**
/**
@@ -78,11 +78,11 @@ static u16 fake_get_pan_id(const struct net_device *dev)
 * device. If the device has not yet had a short address assigned
 * device. If the device has not yet had a short address assigned
 * then this should return 0xFFFF to indicate a lack of association.
 * then this should return 0xFFFF to indicate a lack of association.
 */
 */
static u16 fake_get_short_addr(const struct net_device *dev)
static __le16 fake_get_short_addr(const struct net_device *dev)
{
{
	BUG_ON(dev->type != ARPHRD_IEEE802154);
	BUG_ON(dev->type != ARPHRD_IEEE802154);


	return 0x1;
	return cpu_to_le16(0x1);
}
}


/**
/**
@@ -149,7 +149,7 @@ static int fake_assoc_req(struct net_device *dev,
 *       802.15.4-2006 document.
 *       802.15.4-2006 document.
 */
 */
static int fake_assoc_resp(struct net_device *dev,
static int fake_assoc_resp(struct net_device *dev,
		struct ieee802154_addr *addr, u16 short_addr, u8 status)
		struct ieee802154_addr *addr, __le16 short_addr, u8 status)
{
{
	return 0;
	return 0;
}
}
@@ -191,8 +191,8 @@ static int fake_disassoc_req(struct net_device *dev,
 * Note: This is in section 7.5.2.3 of the IEEE 802.15.4-2006
 * Note: This is in section 7.5.2.3 of the IEEE 802.15.4-2006
 * document, with 7.3.8 describing coordinator realignment.
 * document, with 7.3.8 describing coordinator realignment.
 */
 */
static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr,
static int fake_start_req(struct net_device *dev,
				u8 channel, u8 page,
			  struct ieee802154_addr *addr, u8 channel, u8 page,
			  u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx,
			  u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx,
			  u8 coord_realign)
			  u8 coord_realign)
{
{
@@ -281,8 +281,8 @@ static int ieee802154_fake_ioctl(struct net_device *dev, struct ifreq *ifr,
	switch (cmd) {
	switch (cmd) {
	case SIOCGIFADDR:
	case SIOCGIFADDR:
		/* FIXME: fixed here, get from device IRL */
		/* FIXME: fixed here, get from device IRL */
		pan_id = fake_get_pan_id(dev);
		pan_id = le16_to_cpu(fake_get_pan_id(dev));
		short_addr = fake_get_short_addr(dev);
		short_addr = le16_to_cpu(fake_get_short_addr(dev));
		if (pan_id == IEEE802154_PANID_BROADCAST ||
		if (pan_id == IEEE802154_PANID_BROADCAST ||
		    short_addr == IEEE802154_ADDR_BROADCAST)
		    short_addr == IEEE802154_ADDR_BROADCAST)
			return -EADDRNOTAVAIL;
			return -EADDRNOTAVAIL;
+9 −8
Original line number Original line Diff line number Diff line
@@ -465,8 +465,8 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,
	if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
	if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
		/* Short Addr */
		/* Short Addr */
		u8 addrh, addrl;
		u8 addrh, addrl;
		addrh = filt->short_addr >> 8 & 0xff;
		addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
		addrl = filt->short_addr & 0xff;
		addrl = le16_to_cpu(filt->short_addr) & 0xff;


		write_short_reg(devrec, REG_SADRH, addrh);
		write_short_reg(devrec, REG_SADRH, addrh);
		write_short_reg(devrec, REG_SADRL, addrl);
		write_short_reg(devrec, REG_SADRL, addrl);
@@ -476,15 +476,16 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,


	if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
	if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
		/* Device Address */
		/* Device Address */
		int i;
		u8 i, addr[8];

		memcpy(addr, &filt->ieee_addr, 8);
		for (i = 0; i < 8; i++)
		for (i = 0; i < 8; i++)
			write_short_reg(devrec, REG_EADR0+i,
			write_short_reg(devrec, REG_EADR0 + i, addr[i]);
					filt->ieee_addr[7-i]);


#ifdef DEBUG
#ifdef DEBUG
		printk(KERN_DEBUG "Set long addr to: ");
		printk(KERN_DEBUG "Set long addr to: ");
		for (i = 0; i < 8; i++)
		for (i = 0; i < 8; i++)
			printk("%02hhx ", filt->ieee_addr[i]);
			printk("%02hhx ", addr[7 - i]);
		printk(KERN_DEBUG "\n");
		printk(KERN_DEBUG "\n");
#endif
#endif
	}
	}
@@ -492,8 +493,8 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,
	if (changed & IEEE802515_AFILT_PANID_CHANGED) {
	if (changed & IEEE802515_AFILT_PANID_CHANGED) {
		/* PAN ID */
		/* PAN ID */
		u8 panidl, panidh;
		u8 panidl, panidh;
		panidh = filt->pan_id >> 8 & 0xff;
		panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
		panidl = filt->pan_id & 0xff;
		panidl = le16_to_cpu(filt->pan_id) & 0xff;
		write_short_reg(devrec, REG_PANIDH, panidh);
		write_short_reg(devrec, REG_PANIDH, panidh);
		write_short_reg(devrec, REG_PANIDL, panidl);
		write_short_reg(devrec, REG_PANIDL, panidl);


+2 −2
Original line number Original line Diff line number Diff line
@@ -36,7 +36,7 @@ enum {
/* address length, octets */
/* address length, octets */
#define IEEE802154_ADDR_LEN	8
#define IEEE802154_ADDR_LEN	8


struct ieee802154_addr {
struct ieee802154_addr_sa {
	int addr_type;
	int addr_type;
	u16 pan_id;
	u16 pan_id;
	union {
	union {
@@ -51,7 +51,7 @@ struct ieee802154_addr {


struct sockaddr_ieee802154 {
struct sockaddr_ieee802154 {
	sa_family_t family; /* AF_IEEE802154 */
	sa_family_t family; /* AF_IEEE802154 */
	struct ieee802154_addr addr;
	struct ieee802154_addr_sa addr;
};
};


/* get/setsockopt */
/* get/setsockopt */
+24 −4
Original line number Original line Diff line number Diff line
@@ -42,22 +42,42 @@
	    (((x) << IEEE802154_FC_TYPE_SHIFT) & IEEE802154_FC_TYPE_MASK)); \
	    (((x) << IEEE802154_FC_TYPE_SHIFT) & IEEE802154_FC_TYPE_MASK)); \
	} while (0)
	} while (0)


#define IEEE802154_FC_SECEN		(1 << 3)
#define IEEE802154_FC_SECEN_SHIFT	3
#define IEEE802154_FC_FRPEND		(1 << 4)
#define IEEE802154_FC_SECEN		(1 << IEEE802154_FC_SECEN_SHIFT)
#define IEEE802154_FC_ACK_REQ		(1 << 5)
#define IEEE802154_FC_FRPEND_SHIFT	4
#define IEEE802154_FC_INTRA_PAN		(1 << 6)
#define IEEE802154_FC_FRPEND		(1 << IEEE802154_FC_FRPEND_SHIFT)
#define IEEE802154_FC_ACK_REQ_SHIFT	5
#define IEEE802154_FC_ACK_REQ		(1 << IEEE802154_FC_ACK_REQ_SHIFT)
#define IEEE802154_FC_INTRA_PAN_SHIFT	6
#define IEEE802154_FC_INTRA_PAN		(1 << IEEE802154_FC_INTRA_PAN_SHIFT)


#define IEEE802154_FC_SAMODE_SHIFT	14
#define IEEE802154_FC_SAMODE_SHIFT	14
#define IEEE802154_FC_SAMODE_MASK	(3 << IEEE802154_FC_SAMODE_SHIFT)
#define IEEE802154_FC_SAMODE_MASK	(3 << IEEE802154_FC_SAMODE_SHIFT)
#define IEEE802154_FC_DAMODE_SHIFT	10
#define IEEE802154_FC_DAMODE_SHIFT	10
#define IEEE802154_FC_DAMODE_MASK	(3 << IEEE802154_FC_DAMODE_SHIFT)
#define IEEE802154_FC_DAMODE_MASK	(3 << IEEE802154_FC_DAMODE_SHIFT)


#define IEEE802154_FC_VERSION_SHIFT	12
#define IEEE802154_FC_VERSION_MASK	(3 << IEEE802154_FC_VERSION_SHIFT)
#define IEEE802154_FC_VERSION(x)	((x & IEEE802154_FC_VERSION_MASK) >> IEEE802154_FC_VERSION_SHIFT)

#define IEEE802154_FC_SAMODE(x)		\
#define IEEE802154_FC_SAMODE(x)		\
	(((x) & IEEE802154_FC_SAMODE_MASK) >> IEEE802154_FC_SAMODE_SHIFT)
	(((x) & IEEE802154_FC_SAMODE_MASK) >> IEEE802154_FC_SAMODE_SHIFT)


#define IEEE802154_FC_DAMODE(x)		\
#define IEEE802154_FC_DAMODE(x)		\
	(((x) & IEEE802154_FC_DAMODE_MASK) >> IEEE802154_FC_DAMODE_SHIFT)
	(((x) & IEEE802154_FC_DAMODE_MASK) >> IEEE802154_FC_DAMODE_SHIFT)


#define IEEE802154_SCF_SECLEVEL_MASK		7
#define IEEE802154_SCF_SECLEVEL_SHIFT		0
#define IEEE802154_SCF_SECLEVEL(x)		(x & IEEE802154_SCF_SECLEVEL_MASK)
#define IEEE802154_SCF_KEY_ID_MODE_SHIFT	3
#define IEEE802154_SCF_KEY_ID_MODE_MASK		(3 << IEEE802154_SCF_KEY_ID_MODE_SHIFT)
#define IEEE802154_SCF_KEY_ID_MODE(x)		\
	((x & IEEE802154_SCF_KEY_ID_MODE_MASK) >> IEEE802154_SCF_KEY_ID_MODE_SHIFT)

#define IEEE802154_SCF_KEY_IMPLICIT		0
#define IEEE802154_SCF_KEY_INDEX		1
#define IEEE802154_SCF_KEY_SHORT_INDEX		2
#define IEEE802154_SCF_KEY_HW_INDEX		3


/* MAC footer size */
/* MAC footer size */
#define IEEE802154_MFR_SIZE	2 /* 2 octets */
#define IEEE802154_MFR_SIZE	2 /* 2 octets */
Loading