xref: /openbmc/linux/Documentation/networking/6lowpan.rst (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
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