1*107db7ecSMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0 2*107db7ecSMauro Carvalho Chehab 3*107db7ecSMauro Carvalho Chehab============================================== 4*107db7ecSMauro Carvalho ChehabNetdev private dataroom for 6lowpan interfaces 5*107db7ecSMauro Carvalho Chehab============================================== 6*107db7ecSMauro Carvalho Chehab 7*107db7ecSMauro Carvalho ChehabAll 6lowpan able net devices, means all interfaces with ARPHRD_6LOWPAN, 8*107db7ecSMauro Carvalho Chehabmust have "struct lowpan_priv" placed at beginning of netdev_priv. 9*107db7ecSMauro Carvalho Chehab 10*107db7ecSMauro Carvalho ChehabThe priv_size of each interface should be calculate by:: 11*107db7ecSMauro Carvalho Chehab 12*107db7ecSMauro Carvalho Chehab dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA); 13*107db7ecSMauro Carvalho Chehab 14*107db7ecSMauro Carvalho ChehabWhere LL_PRIV_6LOWPAN_DATA is sizeof linklayer 6lowpan private data struct. 15*107db7ecSMauro Carvalho ChehabTo access the LL_PRIV_6LOWPAN_DATA structure you can cast:: 16*107db7ecSMauro Carvalho Chehab 17*107db7ecSMauro Carvalho Chehab lowpan_priv(dev)-priv; 18*107db7ecSMauro Carvalho Chehab 19*107db7ecSMauro Carvalho Chehabto your LL_6LOWPAN_PRIV_DATA structure. 20*107db7ecSMauro Carvalho Chehab 21*107db7ecSMauro Carvalho ChehabBefore registering the lowpan netdev interface you must run:: 22*107db7ecSMauro Carvalho Chehab 23*107db7ecSMauro Carvalho Chehab lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR); 24*107db7ecSMauro Carvalho Chehab 25*107db7ecSMauro Carvalho Chehabwheres LOWPAN_LLTYPE_FOOBAR is a define for your 6LoWPAN linklayer type of 26*107db7ecSMauro Carvalho Chehabenum lowpan_lltypes. 27*107db7ecSMauro Carvalho Chehab 28*107db7ecSMauro Carvalho ChehabExample to evaluate the private usually you can do:: 29*107db7ecSMauro Carvalho Chehab 30*107db7ecSMauro Carvalho Chehab static inline struct lowpan_priv_foobar * 31*107db7ecSMauro Carvalho Chehab lowpan_foobar_priv(struct net_device *dev) 32*107db7ecSMauro Carvalho Chehab { 33*107db7ecSMauro Carvalho Chehab return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv; 34*107db7ecSMauro Carvalho Chehab } 35*107db7ecSMauro Carvalho Chehab 36*107db7ecSMauro Carvalho Chehab switch (dev->type) { 37*107db7ecSMauro Carvalho Chehab case ARPHRD_6LOWPAN: 38*107db7ecSMauro Carvalho Chehab lowpan_priv = lowpan_priv(dev); 39*107db7ecSMauro Carvalho Chehab /* do great stuff which is ARPHRD_6LOWPAN related */ 40*107db7ecSMauro Carvalho Chehab switch (lowpan_priv->lltype) { 41*107db7ecSMauro Carvalho Chehab case LOWPAN_LLTYPE_FOOBAR: 42*107db7ecSMauro Carvalho Chehab /* do 802.15.4 6LoWPAN handling here */ 43*107db7ecSMauro Carvalho Chehab lowpan_foobar_priv(dev)->bar = foo; 44*107db7ecSMauro Carvalho Chehab break; 45*107db7ecSMauro Carvalho Chehab ... 46*107db7ecSMauro Carvalho Chehab } 47*107db7ecSMauro Carvalho Chehab break; 48*107db7ecSMauro Carvalho Chehab ... 49*107db7ecSMauro Carvalho Chehab } 50*107db7ecSMauro Carvalho Chehab 51*107db7ecSMauro Carvalho ChehabIn case of generic 6lowpan branch ("net/6lowpan") you can remove the check 52*107db7ecSMauro Carvalho Chehabon ARPHRD_6LOWPAN, because you can be sure that these function are called 53*107db7ecSMauro Carvalho Chehabby ARPHRD_6LOWPAN interfaces. 54