162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci==============================================
462306a36Sopenharmony_ciNetdev private dataroom for 6lowpan interfaces
562306a36Sopenharmony_ci==============================================
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciAll 6lowpan able net devices, means all interfaces with ARPHRD_6LOWPAN,
862306a36Sopenharmony_cimust have "struct lowpan_priv" placed at beginning of netdev_priv.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciThe priv_size of each interface should be calculate by::
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA);
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciWhere LL_PRIV_6LOWPAN_DATA is sizeof linklayer 6lowpan private data struct.
1562306a36Sopenharmony_ciTo access the LL_PRIV_6LOWPAN_DATA structure you can cast::
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci lowpan_priv(dev)-priv;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cito your LL_6LOWPAN_PRIV_DATA structure.
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciBefore registering the lowpan netdev interface you must run::
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciwheres LOWPAN_LLTYPE_FOOBAR is a define for your 6LoWPAN linklayer type of
2662306a36Sopenharmony_cienum lowpan_lltypes.
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciExample to evaluate the private usually you can do::
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci static inline struct lowpan_priv_foobar *
3162306a36Sopenharmony_ci lowpan_foobar_priv(struct net_device *dev)
3262306a36Sopenharmony_ci {
3362306a36Sopenharmony_ci	return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv;
3462306a36Sopenharmony_ci }
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci switch (dev->type) {
3762306a36Sopenharmony_ci case ARPHRD_6LOWPAN:
3862306a36Sopenharmony_ci	lowpan_priv = lowpan_priv(dev);
3962306a36Sopenharmony_ci	/* do great stuff which is ARPHRD_6LOWPAN related */
4062306a36Sopenharmony_ci	switch (lowpan_priv->lltype) {
4162306a36Sopenharmony_ci	case LOWPAN_LLTYPE_FOOBAR:
4262306a36Sopenharmony_ci		/* do 802.15.4 6LoWPAN handling here */
4362306a36Sopenharmony_ci		lowpan_foobar_priv(dev)->bar = foo;
4462306a36Sopenharmony_ci		break;
4562306a36Sopenharmony_ci	...
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci	break;
4862306a36Sopenharmony_ci ...
4962306a36Sopenharmony_ci }
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciIn case of generic 6lowpan branch ("net/6lowpan") you can remove the check
5262306a36Sopenharmony_cion ARPHRD_6LOWPAN, because you can be sure that these function are called
5362306a36Sopenharmony_ciby ARPHRD_6LOWPAN interfaces.
54