> Implement the filter function to update short address, pan id and ieee
> address on change. Allowing for hardware address filtering needed for > auto ACK. This isn't directly related to this patch, but when I get this right, the way the stack handles the hardware address filtering will stop the monitoring device from receiving frames in promiscuous mode. The stack sets up the hardware address filtering in mac802154/mib.c without a previous check if there is any monitor interface configured. There is also no way I can see, how the driver could be put into promiscuous mode. Would it be a way to add a set_promiscuous() function to the ieee802154_ops struct and implement this within the drivers? Sascha. > > Signed-off-by: Stefan Schmidt <ste...@datenfreihafen.org> > --- > drivers/net/ieee802154/at86rf230.c | 45 > ++++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/drivers/net/ieee802154/at86rf230.c > b/drivers/net/ieee802154/at86rf230.c > index fc1687e..10e79a4 100644 > --- a/drivers/net/ieee802154/at86rf230.c > +++ b/drivers/net/ieee802154/at86rf230.c > @@ -619,6 +619,50 @@ err: > return -EINVAL; > } > > +static int > +at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev, > + struct ieee802154_hw_addr_filt > *filt, > + unsigned long changed) > +{ > + struct at86rf230_local *lp = dev->priv; > + > + might_sleep(); > + > + if (changed & IEEE802515_AFILT_SADDR_CHANGED) { > + dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called for > saddr\n"); > + __at86rf230_write(lp, RG_SHORT_ADDR_0, filt->short_addr & > 0xff); /* LSB */ > + __at86rf230_write(lp, RG_SHORT_ADDR_1, (filt->short_addr >> 8) > & 0xff); /* MSB */ > + } > + > + if (changed & IEEE802515_AFILT_PANID_CHANGED) { > + dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called for > pan id\n"); > + __at86rf230_write(lp, RG_PAN_ID_0, filt->pan_id & 0xff); /* LSB > */ > + __at86rf230_write(lp, RG_PAN_ID_1, (filt->pan_id >> 8) & 0xff); > /* MSB */ > + } > + > + if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) { > + dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called ieee > addr\n"); > + at86rf230_write_subreg(lp, SR_IEEE_ADDR_0, filt->ieee_addr[7]); > + at86rf230_write_subreg(lp, SR_IEEE_ADDR_1, filt->ieee_addr[6]); > + 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) { > + dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called panc > change\n"); > + if (filt->pan_coord) > + at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1); > + else > + at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0); > + } > + > + return 0; > +} > + > static struct ieee802154_ops at86rf230_ops = { > .owner = THIS_MODULE, > .xmit = at86rf230_xmit, > @@ -626,6 +670,7 @@ static struct ieee802154_ops at86rf230_ops = { > .set_channel = at86rf230_channel, > .start = at86rf230_start, > .stop = at86rf230_stop, > + .set_hw_addr_filt = at86rf230_set_hw_addr_filt, > }; > > static void at86rf230_irqwork(struct work_struct *work) -- Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread! ------------------------------------------------------------------------------ Own the Future-Intel® Level Up Game Demo Contest 2013 Rise to greatness in Intel's independent game demo contest. Compete for recognition, cash, and the chance to get your game on Steam. $5K grand prize plus 10 genre and skill prizes. Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d _______________________________________________ Linux-zigbee-devel mailing list Linux-zigbee-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel