6lowpan: add private neighbour data
This patch will introduce a 6lowpan neighbour private data. Like the interface private data we handle private data for generic 6lowpan and for link-layer specific 6lowpan. The current first use case if to save the short address for a 802.15.4 6lowpan neighbour. Cc: David S. Miller <davem@davemloft.net> Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com> Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: Alexander Aring <aar@pengutronix.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6010097806
commit
8626a0c83b
|
@ -1483,8 +1483,7 @@ enum netdev_priv_flags {
|
|||
* @perm_addr: Permanent hw address
|
||||
* @addr_assign_type: Hw address assignment type
|
||||
* @addr_len: Hardware address length
|
||||
* @neigh_priv_len; Used in neigh_alloc(),
|
||||
* initialized only in atm/clip.c
|
||||
* @neigh_priv_len: Used in neigh_alloc()
|
||||
* @dev_id: Used to differentiate devices that share
|
||||
* the same link layer address
|
||||
* @dev_port: Used to differentiate devices that share
|
||||
|
|
|
@ -141,6 +141,16 @@ struct lowpan_dev {
|
|||
u8 priv[0] __aligned(sizeof(void *));
|
||||
};
|
||||
|
||||
struct lowpan_802154_neigh {
|
||||
__le16 short_addr;
|
||||
};
|
||||
|
||||
static inline
|
||||
struct lowpan_802154_neigh *lowpan_802154_neigh(void *neigh_priv)
|
||||
{
|
||||
return neigh_priv;
|
||||
}
|
||||
|
||||
static inline
|
||||
struct lowpan_dev *lowpan_dev(const struct net_device *dev)
|
||||
{
|
||||
|
|
|
@ -81,11 +81,21 @@ static int lowpan_stop(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lowpan_neigh_construct(struct neighbour *n)
|
||||
{
|
||||
struct lowpan_802154_neigh *neigh = lowpan_802154_neigh(neighbour_priv(n));
|
||||
|
||||
/* default no short_addr is available for a neighbour */
|
||||
neigh->short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct net_device_ops lowpan_netdev_ops = {
|
||||
.ndo_init = lowpan_dev_init,
|
||||
.ndo_start_xmit = lowpan_xmit,
|
||||
.ndo_open = lowpan_open,
|
||||
.ndo_stop = lowpan_stop,
|
||||
.ndo_neigh_construct = lowpan_neigh_construct,
|
||||
};
|
||||
|
||||
static void lowpan_setup(struct net_device *ldev)
|
||||
|
@ -150,6 +160,8 @@ static int lowpan_newlink(struct net *src_net, struct net_device *ldev,
|
|||
wdev->needed_headroom;
|
||||
ldev->needed_tailroom = wdev->needed_tailroom;
|
||||
|
||||
ldev->neigh_priv_len = sizeof(struct lowpan_802154_neigh);
|
||||
|
||||
ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154);
|
||||
if (ret < 0) {
|
||||
dev_put(wdev);
|
||||
|
|
Loading…
Reference in a new issue