1749SN/A.. SPDX-License-Identifier: GPL-2.0 2749SN/A 3749SN/A============================================== 4749SN/ANetdev private dataroom for 6lowpan interfaces 5749SN/A============================================== 6749SN/A 7749SN/AAll 6lowpan able net devices, means all interfaces with ARPHRD_6LOWPAN, 8749SN/Amust have "struct lowpan_priv" placed at beginning of netdev_priv. 9749SN/A 10749SN/AThe priv_size of each interface should be calculate by:: 11749SN/A 12749SN/A dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA); 13749SN/A 14749SN/AWhere LL_PRIV_6LOWPAN_DATA is sizeof linklayer 6lowpan private data struct. 15749SN/ATo access the LL_PRIV_6LOWPAN_DATA structure you can cast:: 16749SN/A 17749SN/A lowpan_priv(dev)-priv; 18749SN/A 19749SN/Ato your LL_6LOWPAN_PRIV_DATA structure. 20749SN/A 21749SN/ABefore registering the lowpan netdev interface you must run:: 22749SN/A 23749SN/A lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR); 24749SN/A 25749SN/Awheres LOWPAN_LLTYPE_FOOBAR is a define for your 6LoWPAN linklayer type of 26749SN/Aenum lowpan_lltypes. 27749SN/A 28749SN/AExample to evaluate the private usually you can do:: 29749SN/A 30749SN/A static inline struct lowpan_priv_foobar * 31749SN/A lowpan_foobar_priv(struct net_device *dev) 32749SN/A { 33749SN/A return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv; 34749SN/A } 35749SN/A 36749SN/A switch (dev->type) { 37749SN/A case ARPHRD_6LOWPAN: 38749SN/A lowpan_priv = lowpan_priv(dev); 39749SN/A /* do great stuff which is ARPHRD_6LOWPAN related */ 40749SN/A switch (lowpan_priv->lltype) { 41749SN/A case LOWPAN_LLTYPE_FOOBAR: 42749SN/A /* do 802.15.4 6LoWPAN handling here */ 43749SN/A lowpan_foobar_priv(dev)->bar = foo; 44749SN/A break; 45749SN/A ... 46749SN/A } 47749SN/A break; 48749SN/A ... 49749SN/A } 50749SN/A 51749SN/AIn case of generic 6lowpan branch ("net/6lowpan") you can remove the check 52749SN/Aon ARPHRD_6LOWPAN, because you can be sure that these function are called 53749SN/Aby ARPHRD_6LOWPAN interfaces. 54749SN/A