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