diff options
author | Alexander Aring <aar@pengutronix.de> | 2016-06-15 15:20:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-15 23:41:22 -0400 |
commit | 8626a0c83b0d471d859bcd908d016874df951fc3 (patch) | |
tree | 236430b84a735662cb096da1ef1536c2dc58f614 | |
parent | 6010097806350efe3998f438959627ccf1047186 (diff) |
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>
-rw-r--r-- | include/linux/netdevice.h | 3 | ||||
-rw-r--r-- | include/net/6lowpan.h | 10 | ||||
-rw-r--r-- | net/ieee802154/6lowpan/core.c | 12 |
3 files changed, 23 insertions, 2 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d101e4d904ba..36e43bd422f8 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1483,8 +1483,7 @@ enum netdev_priv_flags { | |||
1483 | * @perm_addr: Permanent hw address | 1483 | * @perm_addr: Permanent hw address |
1484 | * @addr_assign_type: Hw address assignment type | 1484 | * @addr_assign_type: Hw address assignment type |
1485 | * @addr_len: Hardware address length | 1485 | * @addr_len: Hardware address length |
1486 | * @neigh_priv_len; Used in neigh_alloc(), | 1486 | * @neigh_priv_len: Used in neigh_alloc() |
1487 | * initialized only in atm/clip.c | ||
1488 | * @dev_id: Used to differentiate devices that share | 1487 | * @dev_id: Used to differentiate devices that share |
1489 | * the same link layer address | 1488 | * the same link layer address |
1490 | * @dev_port: Used to differentiate devices that share | 1489 | * @dev_port: Used to differentiate devices that share |
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h index da84cf920b78..2d9b9d39221e 100644 --- a/include/net/6lowpan.h +++ b/include/net/6lowpan.h | |||
@@ -141,6 +141,16 @@ struct lowpan_dev { | |||
141 | u8 priv[0] __aligned(sizeof(void *)); | 141 | u8 priv[0] __aligned(sizeof(void *)); |
142 | }; | 142 | }; |
143 | 143 | ||
144 | struct lowpan_802154_neigh { | ||
145 | __le16 short_addr; | ||
146 | }; | ||
147 | |||
148 | static inline | ||
149 | struct lowpan_802154_neigh *lowpan_802154_neigh(void *neigh_priv) | ||
150 | { | ||
151 | return neigh_priv; | ||
152 | } | ||
153 | |||
144 | static inline | 154 | static inline |
145 | struct lowpan_dev *lowpan_dev(const struct net_device *dev) | 155 | struct lowpan_dev *lowpan_dev(const struct net_device *dev) |
146 | { | 156 | { |
diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c index 4e2b30894224..8c004a0c8d64 100644 --- a/net/ieee802154/6lowpan/core.c +++ b/net/ieee802154/6lowpan/core.c | |||
@@ -81,11 +81,21 @@ static int lowpan_stop(struct net_device *dev) | |||
81 | return 0; | 81 | return 0; |
82 | } | 82 | } |
83 | 83 | ||
84 | static int lowpan_neigh_construct(struct neighbour *n) | ||
85 | { | ||
86 | struct lowpan_802154_neigh *neigh = lowpan_802154_neigh(neighbour_priv(n)); | ||
87 | |||
88 | /* default no short_addr is available for a neighbour */ | ||
89 | neigh->short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC); | ||
90 | return 0; | ||
91 | } | ||
92 | |||
84 | static const struct net_device_ops lowpan_netdev_ops = { | 93 | static const struct net_device_ops lowpan_netdev_ops = { |
85 | .ndo_init = lowpan_dev_init, | 94 | .ndo_init = lowpan_dev_init, |
86 | .ndo_start_xmit = lowpan_xmit, | 95 | .ndo_start_xmit = lowpan_xmit, |
87 | .ndo_open = lowpan_open, | 96 | .ndo_open = lowpan_open, |
88 | .ndo_stop = lowpan_stop, | 97 | .ndo_stop = lowpan_stop, |
98 | .ndo_neigh_construct = lowpan_neigh_construct, | ||
89 | }; | 99 | }; |
90 | 100 | ||
91 | static void lowpan_setup(struct net_device *ldev) | 101 | static void lowpan_setup(struct net_device *ldev) |
@@ -150,6 +160,8 @@ static int lowpan_newlink(struct net *src_net, struct net_device *ldev, | |||
150 | wdev->needed_headroom; | 160 | wdev->needed_headroom; |
151 | ldev->needed_tailroom = wdev->needed_tailroom; | 161 | ldev->needed_tailroom = wdev->needed_tailroom; |
152 | 162 | ||
163 | ldev->neigh_priv_len = sizeof(struct lowpan_802154_neigh); | ||
164 | |||
153 | ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154); | 165 | ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154); |
154 | if (ret < 0) { | 166 | if (ret < 0) { |
155 | dev_put(wdev); | 167 | dev_put(wdev); |