Skip to content

Commit 0744ff8

Browse files
T-Xordex
authored andcommitted
batman-adv: Add hard_iface specific sysfs wrapper macros for UINT
This allows us to easily add a sysfs parameter for an unsigned int later, which is not for a batman mesh interface (e.g. bat0), but for a common interface instead. It allows reading and writing an atomic_t in hard_iface (instead of bat_priv compared to the mesh variant). Developed by Linus during a 6 months trainee study period in Ascom (Switzerland) AG. Signed-off-by: Linus Luessing <[email protected]> Signed-off-by: Marek Lindner <[email protected]> [[email protected]: rename functions and move macros] Signed-off-by: Antonio Quartulli <[email protected]>
1 parent f12d33f commit 0744ff8

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

net/batman-adv/sysfs.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,55 @@ ssize_t batadv_show_vlan_##_name(struct kobject *kobj, \
242242
static BATADV_ATTR_VLAN(_name, _mode, batadv_show_vlan_##_name, \
243243
batadv_store_vlan_##_name)
244244

245+
#define BATADV_ATTR_HIF_STORE_UINT(_name, _var, _min, _max, _post_func) \
246+
ssize_t batadv_store_##_name(struct kobject *kobj, \
247+
struct attribute *attr, char *buff, \
248+
size_t count) \
249+
{ \
250+
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \
251+
struct batadv_hard_iface *hard_iface; \
252+
ssize_t length; \
253+
\
254+
hard_iface = batadv_hardif_get_by_netdev(net_dev); \
255+
if (!hard_iface) \
256+
return 0; \
257+
\
258+
length = __batadv_store_uint_attr(buff, count, _min, _max, \
259+
_post_func, attr, \
260+
&hard_iface->_var, net_dev); \
261+
\
262+
batadv_hardif_put(hard_iface); \
263+
return length; \
264+
}
265+
266+
#define BATADV_ATTR_HIF_SHOW_UINT(_name, _var) \
267+
ssize_t batadv_show_##_name(struct kobject *kobj, \
268+
struct attribute *attr, char *buff) \
269+
{ \
270+
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \
271+
struct batadv_hard_iface *hard_iface; \
272+
ssize_t length; \
273+
\
274+
hard_iface = batadv_hardif_get_by_netdev(net_dev); \
275+
if (!hard_iface) \
276+
return 0; \
277+
\
278+
length = sprintf(buff, "%i\n", atomic_read(&hard_iface->_var)); \
279+
\
280+
batadv_hardif_put(hard_iface); \
281+
return length; \
282+
}
283+
284+
/* Use this, if you are going to set [name] in hard_iface to an
285+
* unsigned integer value
286+
*/
287+
#define BATADV_ATTR_HIF_UINT(_name, _var, _mode, _min, _max, _post_func)\
288+
static BATADV_ATTR_HIF_STORE_UINT(_name, _var, _min, \
289+
_max, _post_func) \
290+
static BATADV_ATTR_HIF_SHOW_UINT(_name, _var) \
291+
static BATADV_ATTR(_name, _mode, batadv_show_##_name, \
292+
batadv_store_##_name)
293+
245294
static int batadv_store_bool_attr(char *buff, size_t count,
246295
struct net_device *net_dev,
247296
const char *attr_name, atomic_t *attr,

0 commit comments

Comments
 (0)