batman-adv: Adding hard_iface specific sysfs wrapper macros for UINT
authorLinus Luessing <linus.luessing@web.de>
Sat, 10 Mar 2012 22:17:52 +0000 (06:17 +0800)
committerAntonio Quartulli <ordex@autistici.org>
Fri, 11 May 2012 11:56:03 +0000 (13:56 +0200)
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 <linus.luessing@web.de>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
net/batman-adv/bat_sysfs.c

index 913299d03f4a3d1ca0aa92f420f1b741f59e6d96..5bc7b66d32dc9936b4d3b2a827ca04378983278e 100644 (file)
@@ -117,6 +117,49 @@ ssize_t show_##_name(struct kobject *kobj,                         \
        static BAT_ATTR(_name, _mode, show_##_name, store_##_name)
 
 
+#define BAT_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func)         \
+ssize_t store_##_name(struct kobject *kobj, struct attribute *attr,    \
+                     char *buff, size_t count)                         \
+{                                                                      \
+       struct net_device *net_dev = kobj_to_netdev(kobj);              \
+       struct hard_iface *hard_iface = hardif_get_by_netdev(net_dev);  \
+       ssize_t length;                                                 \
+                                                                       \
+       if (!hard_iface)                                                \
+               return 0;                                               \
+                                                                       \
+       length = __store_uint_attr(buff, count, _min, _max, _post_func, \
+                                  attr, &hard_iface->_name, net_dev);  \
+                                                                       \
+       hardif_free_ref(hard_iface);                                    \
+       return length;                                                  \
+}
+
+#define BAT_ATTR_HIF_SHOW_UINT(_name)                                  \
+ssize_t show_##_name(struct kobject *kobj,                             \
+                    struct attribute *attr, char *buff)                \
+{                                                                      \
+       struct net_device *net_dev = kobj_to_netdev(kobj);              \
+       struct hard_iface *hard_iface = hardif_get_by_netdev(net_dev);  \
+       ssize_t length;                                                 \
+                                                                       \
+       if (!hard_iface)                                                \
+               return 0;                                               \
+                                                                       \
+       length = sprintf(buff, "%i\n", atomic_read(&hard_iface->_name));\
+                                                                       \
+       hardif_free_ref(hard_iface);                                    \
+       return length;                                                  \
+}
+
+/* Use this, if you are going to set [name] in hard_iface to an
+ * unsigned integer value*/
+#define BAT_ATTR_HIF_UINT(_name, _mode, _min, _max, _post_func)                \
+       static BAT_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func)   \
+       static BAT_ATTR_HIF_SHOW_UINT(_name)                            \
+       static BAT_ATTR(_name, _mode, show_##_name, store_##_name)
+
+
 static int store_bool_attr(char *buff, size_t count,
                           struct net_device *net_dev,
                           const char *attr_name, atomic_t *attr)