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