1 /* Copyright (C) 2010-2015 B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "sysfs.h"
19 #include "main.h"
20 
21 #include <linux/atomic.h>
22 #include <linux/compiler.h>
23 #include <linux/device.h>
24 #include <linux/errno.h>
25 #include <linux/fs.h>
26 #include <linux/if.h>
27 #include <linux/if_vlan.h>
28 #include <linux/kernel.h>
29 #include <linux/netdevice.h>
30 #include <linux/printk.h>
31 #include <linux/rculist.h>
32 #include <linux/rcupdate.h>
33 #include <linux/rtnetlink.h>
34 #include <linux/slab.h>
35 #include <linux/stat.h>
36 #include <linux/stddef.h>
37 #include <linux/string.h>
38 #include <linux/stringify.h>
39 
40 #include "distributed-arp-table.h"
41 #include "gateway_client.h"
42 #include "gateway_common.h"
43 #include "hard-interface.h"
44 #include "network-coding.h"
45 #include "packet.h"
46 #include "soft-interface.h"
47 
batadv_kobj_to_netdev(struct kobject * obj)48 static struct net_device *batadv_kobj_to_netdev(struct kobject *obj)
49 {
50 	struct device *dev = container_of(obj->parent, struct device, kobj);
51 
52 	return to_net_dev(dev);
53 }
54 
batadv_kobj_to_batpriv(struct kobject * obj)55 static struct batadv_priv *batadv_kobj_to_batpriv(struct kobject *obj)
56 {
57 	struct net_device *net_dev = batadv_kobj_to_netdev(obj);
58 
59 	return netdev_priv(net_dev);
60 }
61 
62 /**
63  * batadv_vlan_kobj_to_batpriv - convert a vlan kobj in the associated batpriv
64  * @obj: kobject to covert
65  *
66  * Returns the associated batadv_priv struct.
67  */
batadv_vlan_kobj_to_batpriv(struct kobject * obj)68 static struct batadv_priv *batadv_vlan_kobj_to_batpriv(struct kobject *obj)
69 {
70 	/* VLAN specific attributes are located in the root sysfs folder if they
71 	 * refer to the untagged VLAN..
72 	 */
73 	if (!strcmp(BATADV_SYSFS_IF_MESH_SUBDIR, obj->name))
74 		return batadv_kobj_to_batpriv(obj);
75 
76 	/* ..while the attributes for the tagged vlans are located in
77 	 * the in the corresponding "vlan%VID" subfolder
78 	 */
79 	return batadv_kobj_to_batpriv(obj->parent);
80 }
81 
82 /**
83  * batadv_kobj_to_vlan - convert a kobj in the associated softif_vlan struct
84  * @obj: kobject to covert
85  *
86  * Returns the associated softif_vlan struct if found, NULL otherwise.
87  */
88 static struct batadv_softif_vlan *
batadv_kobj_to_vlan(struct batadv_priv * bat_priv,struct kobject * obj)89 batadv_kobj_to_vlan(struct batadv_priv *bat_priv, struct kobject *obj)
90 {
91 	struct batadv_softif_vlan *vlan_tmp, *vlan = NULL;
92 
93 	rcu_read_lock();
94 	hlist_for_each_entry_rcu(vlan_tmp, &bat_priv->softif_vlan_list, list) {
95 		if (vlan_tmp->kobj != obj)
96 			continue;
97 
98 		if (!atomic_inc_not_zero(&vlan_tmp->refcount))
99 			continue;
100 
101 		vlan = vlan_tmp;
102 		break;
103 	}
104 	rcu_read_unlock();
105 
106 	return vlan;
107 }
108 
109 #define BATADV_UEV_TYPE_VAR	"BATTYPE="
110 #define BATADV_UEV_ACTION_VAR	"BATACTION="
111 #define BATADV_UEV_DATA_VAR	"BATDATA="
112 
113 static char *batadv_uev_action_str[] = {
114 	"add",
115 	"del",
116 	"change"
117 };
118 
119 static char *batadv_uev_type_str[] = {
120 	"gw"
121 };
122 
123 /* Use this, if you have customized show and store functions for vlan attrs */
124 #define BATADV_ATTR_VLAN(_name, _mode, _show, _store)	\
125 struct batadv_attribute batadv_attr_vlan_##_name = {	\
126 	.attr = {.name = __stringify(_name),		\
127 		 .mode = _mode },			\
128 	.show   = _show,				\
129 	.store  = _store,				\
130 }
131 
132 /* Use this, if you have customized show and store functions */
133 #define BATADV_ATTR(_name, _mode, _show, _store)	\
134 struct batadv_attribute batadv_attr_##_name = {		\
135 	.attr = {.name = __stringify(_name),		\
136 		 .mode = _mode },			\
137 	.show   = _show,				\
138 	.store  = _store,				\
139 }
140 
141 #define BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func)			\
142 ssize_t batadv_store_##_name(struct kobject *kobj,			\
143 			     struct attribute *attr, char *buff,	\
144 			     size_t count)				\
145 {									\
146 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);	\
147 	struct batadv_priv *bat_priv = netdev_priv(net_dev);		\
148 									\
149 	return __batadv_store_bool_attr(buff, count, _post_func, attr,	\
150 					&bat_priv->_name, net_dev);	\
151 }
152 
153 #define BATADV_ATTR_SIF_SHOW_BOOL(_name)				\
154 ssize_t batadv_show_##_name(struct kobject *kobj,			\
155 			    struct attribute *attr, char *buff)		\
156 {									\
157 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);	\
158 									\
159 	return sprintf(buff, "%s\n",					\
160 		       atomic_read(&bat_priv->_name) == 0 ?		\
161 		       "disabled" : "enabled");				\
162 }									\
163 
164 /* Use this, if you are going to turn a [name] in the soft-interface
165  * (bat_priv) on or off
166  */
167 #define BATADV_ATTR_SIF_BOOL(_name, _mode, _post_func)			\
168 	static BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func)		\
169 	static BATADV_ATTR_SIF_SHOW_BOOL(_name)				\
170 	static BATADV_ATTR(_name, _mode, batadv_show_##_name,		\
171 			   batadv_store_##_name)
172 
173 #define BATADV_ATTR_SIF_STORE_UINT(_name, _var, _min, _max, _post_func)	\
174 ssize_t batadv_store_##_name(struct kobject *kobj,			\
175 			     struct attribute *attr, char *buff,	\
176 			     size_t count)				\
177 {									\
178 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);	\
179 	struct batadv_priv *bat_priv = netdev_priv(net_dev);		\
180 									\
181 	return __batadv_store_uint_attr(buff, count, _min, _max,	\
182 					_post_func, attr,		\
183 					&bat_priv->_var, net_dev);	\
184 }
185 
186 #define BATADV_ATTR_SIF_SHOW_UINT(_name, _var)				\
187 ssize_t batadv_show_##_name(struct kobject *kobj,			\
188 			    struct attribute *attr, char *buff)		\
189 {									\
190 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);	\
191 									\
192 	return sprintf(buff, "%i\n", atomic_read(&bat_priv->_var));	\
193 }									\
194 
195 /* Use this, if you are going to set [name] in the soft-interface
196  * (bat_priv) to an unsigned integer value
197  */
198 #define BATADV_ATTR_SIF_UINT(_name, _var, _mode, _min, _max, _post_func)\
199 	static BATADV_ATTR_SIF_STORE_UINT(_name, _var, _min, _max, _post_func)\
200 	static BATADV_ATTR_SIF_SHOW_UINT(_name, _var)			\
201 	static BATADV_ATTR(_name, _mode, batadv_show_##_name,		\
202 			   batadv_store_##_name)
203 
204 #define BATADV_ATTR_VLAN_STORE_BOOL(_name, _post_func)			\
205 ssize_t batadv_store_vlan_##_name(struct kobject *kobj,			\
206 				  struct attribute *attr, char *buff,	\
207 				  size_t count)				\
208 {									\
209 	struct batadv_priv *bat_priv = batadv_vlan_kobj_to_batpriv(kobj);\
210 	struct batadv_softif_vlan *vlan = batadv_kobj_to_vlan(bat_priv,	\
211 							      kobj);	\
212 	size_t res = __batadv_store_bool_attr(buff, count, _post_func,	\
213 					      attr, &vlan->_name,	\
214 					      bat_priv->soft_iface);	\
215 									\
216 	batadv_softif_vlan_free_ref(vlan);				\
217 	return res;							\
218 }
219 
220 #define BATADV_ATTR_VLAN_SHOW_BOOL(_name)				\
221 ssize_t batadv_show_vlan_##_name(struct kobject *kobj,			\
222 				 struct attribute *attr, char *buff)	\
223 {									\
224 	struct batadv_priv *bat_priv = batadv_vlan_kobj_to_batpriv(kobj);\
225 	struct batadv_softif_vlan *vlan = batadv_kobj_to_vlan(bat_priv,	\
226 							      kobj);	\
227 	size_t res = sprintf(buff, "%s\n",				\
228 			     atomic_read(&vlan->_name) == 0 ?		\
229 			     "disabled" : "enabled");			\
230 									\
231 	batadv_softif_vlan_free_ref(vlan);				\
232 	return res;							\
233 }
234 
235 /* Use this, if you are going to turn a [name] in the vlan struct on or off */
236 #define BATADV_ATTR_VLAN_BOOL(_name, _mode, _post_func)			\
237 	static BATADV_ATTR_VLAN_STORE_BOOL(_name, _post_func)		\
238 	static BATADV_ATTR_VLAN_SHOW_BOOL(_name)			\
239 	static BATADV_ATTR_VLAN(_name, _mode, batadv_show_vlan_##_name,	\
240 				batadv_store_vlan_##_name)
241 
batadv_store_bool_attr(char * buff,size_t count,struct net_device * net_dev,const char * attr_name,atomic_t * attr)242 static int batadv_store_bool_attr(char *buff, size_t count,
243 				  struct net_device *net_dev,
244 				  const char *attr_name, atomic_t *attr)
245 {
246 	int enabled = -1;
247 
248 	if (buff[count - 1] == '\n')
249 		buff[count - 1] = '\0';
250 
251 	if ((strncmp(buff, "1", 2) == 0) ||
252 	    (strncmp(buff, "enable", 7) == 0) ||
253 	    (strncmp(buff, "enabled", 8) == 0))
254 		enabled = 1;
255 
256 	if ((strncmp(buff, "0", 2) == 0) ||
257 	    (strncmp(buff, "disable", 8) == 0) ||
258 	    (strncmp(buff, "disabled", 9) == 0))
259 		enabled = 0;
260 
261 	if (enabled < 0) {
262 		batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
263 			    attr_name, buff);
264 		return -EINVAL;
265 	}
266 
267 	if (atomic_read(attr) == enabled)
268 		return count;
269 
270 	batadv_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name,
271 		    atomic_read(attr) == 1 ? "enabled" : "disabled",
272 		    enabled == 1 ? "enabled" : "disabled");
273 
274 	atomic_set(attr, (unsigned int)enabled);
275 	return count;
276 }
277 
278 static inline ssize_t
__batadv_store_bool_attr(char * buff,size_t count,void (* post_func)(struct net_device *),struct attribute * attr,atomic_t * attr_store,struct net_device * net_dev)279 __batadv_store_bool_attr(char *buff, size_t count,
280 			 void (*post_func)(struct net_device *),
281 			 struct attribute *attr,
282 			 atomic_t *attr_store, struct net_device *net_dev)
283 {
284 	int ret;
285 
286 	ret = batadv_store_bool_attr(buff, count, net_dev, attr->name,
287 				     attr_store);
288 	if (post_func && ret)
289 		post_func(net_dev);
290 
291 	return ret;
292 }
293 
batadv_store_uint_attr(const char * buff,size_t count,struct net_device * net_dev,const char * attr_name,unsigned int min,unsigned int max,atomic_t * attr)294 static int batadv_store_uint_attr(const char *buff, size_t count,
295 				  struct net_device *net_dev,
296 				  const char *attr_name,
297 				  unsigned int min, unsigned int max,
298 				  atomic_t *attr)
299 {
300 	unsigned long uint_val;
301 	int ret;
302 
303 	ret = kstrtoul(buff, 10, &uint_val);
304 	if (ret) {
305 		batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
306 			    attr_name, buff);
307 		return -EINVAL;
308 	}
309 
310 	if (uint_val < min) {
311 		batadv_info(net_dev, "%s: Value is too small: %lu min: %u\n",
312 			    attr_name, uint_val, min);
313 		return -EINVAL;
314 	}
315 
316 	if (uint_val > max) {
317 		batadv_info(net_dev, "%s: Value is too big: %lu max: %u\n",
318 			    attr_name, uint_val, max);
319 		return -EINVAL;
320 	}
321 
322 	if (atomic_read(attr) == uint_val)
323 		return count;
324 
325 	batadv_info(net_dev, "%s: Changing from: %i to: %lu\n",
326 		    attr_name, atomic_read(attr), uint_val);
327 
328 	atomic_set(attr, uint_val);
329 	return count;
330 }
331 
332 static inline ssize_t
__batadv_store_uint_attr(const char * buff,size_t count,int min,int max,void (* post_func)(struct net_device *),const struct attribute * attr,atomic_t * attr_store,struct net_device * net_dev)333 __batadv_store_uint_attr(const char *buff, size_t count,
334 			 int min, int max,
335 			 void (*post_func)(struct net_device *),
336 			 const struct attribute *attr,
337 			 atomic_t *attr_store, struct net_device *net_dev)
338 {
339 	int ret;
340 
341 	ret = batadv_store_uint_attr(buff, count, net_dev, attr->name, min, max,
342 				     attr_store);
343 	if (post_func && ret)
344 		post_func(net_dev);
345 
346 	return ret;
347 }
348 
batadv_show_bat_algo(struct kobject * kobj,struct attribute * attr,char * buff)349 static ssize_t batadv_show_bat_algo(struct kobject *kobj,
350 				    struct attribute *attr, char *buff)
351 {
352 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
353 
354 	return sprintf(buff, "%s\n", bat_priv->bat_algo_ops->name);
355 }
356 
batadv_post_gw_reselect(struct net_device * net_dev)357 static void batadv_post_gw_reselect(struct net_device *net_dev)
358 {
359 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
360 
361 	batadv_gw_reselect(bat_priv);
362 }
363 
batadv_show_gw_mode(struct kobject * kobj,struct attribute * attr,char * buff)364 static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr,
365 				   char *buff)
366 {
367 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
368 	int bytes_written;
369 
370 	switch (atomic_read(&bat_priv->gw_mode)) {
371 	case BATADV_GW_MODE_CLIENT:
372 		bytes_written = sprintf(buff, "%s\n",
373 					BATADV_GW_MODE_CLIENT_NAME);
374 		break;
375 	case BATADV_GW_MODE_SERVER:
376 		bytes_written = sprintf(buff, "%s\n",
377 					BATADV_GW_MODE_SERVER_NAME);
378 		break;
379 	default:
380 		bytes_written = sprintf(buff, "%s\n",
381 					BATADV_GW_MODE_OFF_NAME);
382 		break;
383 	}
384 
385 	return bytes_written;
386 }
387 
batadv_store_gw_mode(struct kobject * kobj,struct attribute * attr,char * buff,size_t count)388 static ssize_t batadv_store_gw_mode(struct kobject *kobj,
389 				    struct attribute *attr, char *buff,
390 				    size_t count)
391 {
392 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
393 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
394 	char *curr_gw_mode_str;
395 	int gw_mode_tmp = -1;
396 
397 	if (buff[count - 1] == '\n')
398 		buff[count - 1] = '\0';
399 
400 	if (strncmp(buff, BATADV_GW_MODE_OFF_NAME,
401 		    strlen(BATADV_GW_MODE_OFF_NAME)) == 0)
402 		gw_mode_tmp = BATADV_GW_MODE_OFF;
403 
404 	if (strncmp(buff, BATADV_GW_MODE_CLIENT_NAME,
405 		    strlen(BATADV_GW_MODE_CLIENT_NAME)) == 0)
406 		gw_mode_tmp = BATADV_GW_MODE_CLIENT;
407 
408 	if (strncmp(buff, BATADV_GW_MODE_SERVER_NAME,
409 		    strlen(BATADV_GW_MODE_SERVER_NAME)) == 0)
410 		gw_mode_tmp = BATADV_GW_MODE_SERVER;
411 
412 	if (gw_mode_tmp < 0) {
413 		batadv_info(net_dev,
414 			    "Invalid parameter for 'gw mode' setting received: %s\n",
415 			    buff);
416 		return -EINVAL;
417 	}
418 
419 	if (atomic_read(&bat_priv->gw_mode) == gw_mode_tmp)
420 		return count;
421 
422 	switch (atomic_read(&bat_priv->gw_mode)) {
423 	case BATADV_GW_MODE_CLIENT:
424 		curr_gw_mode_str = BATADV_GW_MODE_CLIENT_NAME;
425 		break;
426 	case BATADV_GW_MODE_SERVER:
427 		curr_gw_mode_str = BATADV_GW_MODE_SERVER_NAME;
428 		break;
429 	default:
430 		curr_gw_mode_str = BATADV_GW_MODE_OFF_NAME;
431 		break;
432 	}
433 
434 	batadv_info(net_dev, "Changing gw mode from: %s to: %s\n",
435 		    curr_gw_mode_str, buff);
436 
437 	/* Invoking batadv_gw_reselect() is not enough to really de-select the
438 	 * current GW. It will only instruct the gateway client code to perform
439 	 * a re-election the next time that this is needed.
440 	 *
441 	 * When gw client mode is being switched off the current GW must be
442 	 * de-selected explicitly otherwise no GW_ADD uevent is thrown on
443 	 * client mode re-activation. This is operation is performed in
444 	 * batadv_gw_check_client_stop().
445 	 */
446 	batadv_gw_reselect(bat_priv);
447 	/* always call batadv_gw_check_client_stop() before changing the gateway
448 	 * state
449 	 */
450 	batadv_gw_check_client_stop(bat_priv);
451 	atomic_set(&bat_priv->gw_mode, (unsigned int)gw_mode_tmp);
452 	batadv_gw_tvlv_container_update(bat_priv);
453 	return count;
454 }
455 
batadv_show_gw_bwidth(struct kobject * kobj,struct attribute * attr,char * buff)456 static ssize_t batadv_show_gw_bwidth(struct kobject *kobj,
457 				     struct attribute *attr, char *buff)
458 {
459 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
460 	u32 down, up;
461 
462 	down = atomic_read(&bat_priv->gw.bandwidth_down);
463 	up = atomic_read(&bat_priv->gw.bandwidth_up);
464 
465 	return sprintf(buff, "%u.%u/%u.%u MBit\n", down / 10,
466 		       down % 10, up / 10, up % 10);
467 }
468 
batadv_store_gw_bwidth(struct kobject * kobj,struct attribute * attr,char * buff,size_t count)469 static ssize_t batadv_store_gw_bwidth(struct kobject *kobj,
470 				      struct attribute *attr, char *buff,
471 				      size_t count)
472 {
473 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
474 
475 	if (buff[count - 1] == '\n')
476 		buff[count - 1] = '\0';
477 
478 	return batadv_gw_bandwidth_set(net_dev, buff, count);
479 }
480 
481 /**
482  * batadv_show_isolation_mark - print the current isolation mark/mask
483  * @kobj: kobject representing the private mesh sysfs directory
484  * @attr: the batman-adv attribute the user is interacting with
485  * @buff: the buffer that will contain the data to send back to the user
486  *
487  * Returns the number of bytes written into 'buff' on success or a negative
488  * error code in case of failure
489  */
batadv_show_isolation_mark(struct kobject * kobj,struct attribute * attr,char * buff)490 static ssize_t batadv_show_isolation_mark(struct kobject *kobj,
491 					  struct attribute *attr, char *buff)
492 {
493 	struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
494 
495 	return sprintf(buff, "%#.8x/%#.8x\n", bat_priv->isolation_mark,
496 		       bat_priv->isolation_mark_mask);
497 }
498 
499 /**
500  * batadv_store_isolation_mark - parse and store the isolation mark/mask entered
501  *  by the user
502  * @kobj: kobject representing the private mesh sysfs directory
503  * @attr: the batman-adv attribute the user is interacting with
504  * @buff: the buffer containing the user data
505  * @count: number of bytes in the buffer
506  *
507  * Returns 'count' on success or a negative error code in case of failure
508  */
batadv_store_isolation_mark(struct kobject * kobj,struct attribute * attr,char * buff,size_t count)509 static ssize_t batadv_store_isolation_mark(struct kobject *kobj,
510 					   struct attribute *attr, char *buff,
511 					   size_t count)
512 {
513 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
514 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
515 	u32 mark, mask;
516 	char *mask_ptr;
517 
518 	/* parse the mask if it has been specified, otherwise assume the mask is
519 	 * the biggest possible
520 	 */
521 	mask = 0xFFFFFFFF;
522 	mask_ptr = strchr(buff, '/');
523 	if (mask_ptr) {
524 		*mask_ptr = '\0';
525 		mask_ptr++;
526 
527 		/* the mask must be entered in hex base as it is going to be a
528 		 * bitmask and not a prefix length
529 		 */
530 		if (kstrtou32(mask_ptr, 16, &mask) < 0)
531 			return -EINVAL;
532 	}
533 
534 	/* the mark can be entered in any base */
535 	if (kstrtou32(buff, 0, &mark) < 0)
536 		return -EINVAL;
537 
538 	bat_priv->isolation_mark_mask = mask;
539 	/* erase bits not covered by the mask */
540 	bat_priv->isolation_mark = mark & bat_priv->isolation_mark_mask;
541 
542 	batadv_info(net_dev,
543 		    "New skb mark for extended isolation: %#.8x/%#.8x\n",
544 		    bat_priv->isolation_mark, bat_priv->isolation_mark_mask);
545 
546 	return count;
547 }
548 
549 BATADV_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
550 BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
551 #ifdef CONFIG_BATMAN_ADV_BLA
552 BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
553 #endif
554 #ifdef CONFIG_BATMAN_ADV_DAT
555 BATADV_ATTR_SIF_BOOL(distributed_arp_table, S_IRUGO | S_IWUSR,
556 		     batadv_dat_status_update);
557 #endif
558 BATADV_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
559 static BATADV_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL);
560 static BATADV_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode,
561 		   batadv_store_gw_mode);
562 BATADV_ATTR_SIF_UINT(orig_interval, orig_interval, S_IRUGO | S_IWUSR,
563 		     2 * BATADV_JITTER, INT_MAX, NULL);
564 BATADV_ATTR_SIF_UINT(hop_penalty, hop_penalty, S_IRUGO | S_IWUSR, 0,
565 		     BATADV_TQ_MAX_VALUE, NULL);
566 BATADV_ATTR_SIF_UINT(gw_sel_class, gw_sel_class, S_IRUGO | S_IWUSR, 1,
567 		     BATADV_TQ_MAX_VALUE, batadv_post_gw_reselect);
568 static BATADV_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth,
569 		   batadv_store_gw_bwidth);
570 #ifdef CONFIG_BATMAN_ADV_MCAST
571 BATADV_ATTR_SIF_BOOL(multicast_mode, S_IRUGO | S_IWUSR, NULL);
572 #endif
573 #ifdef CONFIG_BATMAN_ADV_DEBUG
574 BATADV_ATTR_SIF_UINT(log_level, log_level, S_IRUGO | S_IWUSR, 0,
575 		     BATADV_DBG_ALL, NULL);
576 #endif
577 #ifdef CONFIG_BATMAN_ADV_NC
578 BATADV_ATTR_SIF_BOOL(network_coding, S_IRUGO | S_IWUSR,
579 		     batadv_nc_status_update);
580 #endif
581 static BATADV_ATTR(isolation_mark, S_IRUGO | S_IWUSR,
582 		   batadv_show_isolation_mark, batadv_store_isolation_mark);
583 
584 static struct batadv_attribute *batadv_mesh_attrs[] = {
585 	&batadv_attr_aggregated_ogms,
586 	&batadv_attr_bonding,
587 #ifdef CONFIG_BATMAN_ADV_BLA
588 	&batadv_attr_bridge_loop_avoidance,
589 #endif
590 #ifdef CONFIG_BATMAN_ADV_DAT
591 	&batadv_attr_distributed_arp_table,
592 #endif
593 #ifdef CONFIG_BATMAN_ADV_MCAST
594 	&batadv_attr_multicast_mode,
595 #endif
596 	&batadv_attr_fragmentation,
597 	&batadv_attr_routing_algo,
598 	&batadv_attr_gw_mode,
599 	&batadv_attr_orig_interval,
600 	&batadv_attr_hop_penalty,
601 	&batadv_attr_gw_sel_class,
602 	&batadv_attr_gw_bandwidth,
603 #ifdef CONFIG_BATMAN_ADV_DEBUG
604 	&batadv_attr_log_level,
605 #endif
606 #ifdef CONFIG_BATMAN_ADV_NC
607 	&batadv_attr_network_coding,
608 #endif
609 	&batadv_attr_isolation_mark,
610 	NULL,
611 };
612 
613 BATADV_ATTR_VLAN_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
614 
615 /**
616  * batadv_vlan_attrs - array of vlan specific sysfs attributes
617  */
618 static struct batadv_attribute *batadv_vlan_attrs[] = {
619 	&batadv_attr_vlan_ap_isolation,
620 	NULL,
621 };
622 
batadv_sysfs_add_meshif(struct net_device * dev)623 int batadv_sysfs_add_meshif(struct net_device *dev)
624 {
625 	struct kobject *batif_kobject = &dev->dev.kobj;
626 	struct batadv_priv *bat_priv = netdev_priv(dev);
627 	struct batadv_attribute **bat_attr;
628 	int err;
629 
630 	bat_priv->mesh_obj = kobject_create_and_add(BATADV_SYSFS_IF_MESH_SUBDIR,
631 						    batif_kobject);
632 	if (!bat_priv->mesh_obj) {
633 		batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
634 			   BATADV_SYSFS_IF_MESH_SUBDIR);
635 		goto out;
636 	}
637 
638 	for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr) {
639 		err = sysfs_create_file(bat_priv->mesh_obj,
640 					&((*bat_attr)->attr));
641 		if (err) {
642 			batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
643 				   dev->name, BATADV_SYSFS_IF_MESH_SUBDIR,
644 				   ((*bat_attr)->attr).name);
645 			goto rem_attr;
646 		}
647 	}
648 
649 	return 0;
650 
651 rem_attr:
652 	for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
653 		sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
654 
655 	kobject_put(bat_priv->mesh_obj);
656 	bat_priv->mesh_obj = NULL;
657 out:
658 	return -ENOMEM;
659 }
660 
batadv_sysfs_del_meshif(struct net_device * dev)661 void batadv_sysfs_del_meshif(struct net_device *dev)
662 {
663 	struct batadv_priv *bat_priv = netdev_priv(dev);
664 	struct batadv_attribute **bat_attr;
665 
666 	for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
667 		sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
668 
669 	kobject_put(bat_priv->mesh_obj);
670 	bat_priv->mesh_obj = NULL;
671 }
672 
673 /**
674  * batadv_sysfs_add_vlan - add all the needed sysfs objects for the new vlan
675  * @dev: netdev of the mesh interface
676  * @vlan: private data of the newly added VLAN interface
677  *
678  * Returns 0 on success and -ENOMEM if any of the structure allocations fails.
679  */
batadv_sysfs_add_vlan(struct net_device * dev,struct batadv_softif_vlan * vlan)680 int batadv_sysfs_add_vlan(struct net_device *dev,
681 			  struct batadv_softif_vlan *vlan)
682 {
683 	char vlan_subdir[sizeof(BATADV_SYSFS_VLAN_SUBDIR_PREFIX) + 5];
684 	struct batadv_priv *bat_priv = netdev_priv(dev);
685 	struct batadv_attribute **bat_attr;
686 	int err;
687 
688 	if (vlan->vid & BATADV_VLAN_HAS_TAG) {
689 		sprintf(vlan_subdir, BATADV_SYSFS_VLAN_SUBDIR_PREFIX "%hu",
690 			vlan->vid & VLAN_VID_MASK);
691 
692 		vlan->kobj = kobject_create_and_add(vlan_subdir,
693 						    bat_priv->mesh_obj);
694 		if (!vlan->kobj) {
695 			batadv_err(dev, "Can't add sysfs directory: %s/%s\n",
696 				   dev->name, vlan_subdir);
697 			goto out;
698 		}
699 	} else {
700 		/* the untagged LAN uses the root folder to store its "VLAN
701 		 * specific attributes"
702 		 */
703 		vlan->kobj = bat_priv->mesh_obj;
704 		kobject_get(bat_priv->mesh_obj);
705 	}
706 
707 	for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr) {
708 		err = sysfs_create_file(vlan->kobj,
709 					&((*bat_attr)->attr));
710 		if (err) {
711 			batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
712 				   dev->name, vlan_subdir,
713 				   ((*bat_attr)->attr).name);
714 			goto rem_attr;
715 		}
716 	}
717 
718 	return 0;
719 
720 rem_attr:
721 	for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
722 		sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
723 
724 	kobject_put(vlan->kobj);
725 	vlan->kobj = NULL;
726 out:
727 	return -ENOMEM;
728 }
729 
730 /**
731  * batadv_sysfs_del_vlan - remove all the sysfs objects for a given VLAN
732  * @bat_priv: the bat priv with all the soft interface information
733  * @vlan: the private data of the VLAN to destroy
734  */
batadv_sysfs_del_vlan(struct batadv_priv * bat_priv,struct batadv_softif_vlan * vlan)735 void batadv_sysfs_del_vlan(struct batadv_priv *bat_priv,
736 			   struct batadv_softif_vlan *vlan)
737 {
738 	struct batadv_attribute **bat_attr;
739 
740 	for (bat_attr = batadv_vlan_attrs; *bat_attr; ++bat_attr)
741 		sysfs_remove_file(vlan->kobj, &((*bat_attr)->attr));
742 
743 	kobject_put(vlan->kobj);
744 	vlan->kobj = NULL;
745 }
746 
batadv_show_mesh_iface(struct kobject * kobj,struct attribute * attr,char * buff)747 static ssize_t batadv_show_mesh_iface(struct kobject *kobj,
748 				      struct attribute *attr, char *buff)
749 {
750 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
751 	struct batadv_hard_iface *hard_iface;
752 	ssize_t length;
753 	const char *ifname;
754 
755 	hard_iface = batadv_hardif_get_by_netdev(net_dev);
756 	if (!hard_iface)
757 		return 0;
758 
759 	if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
760 		ifname =  "none";
761 	else
762 		ifname = hard_iface->soft_iface->name;
763 
764 	length = sprintf(buff, "%s\n", ifname);
765 
766 	batadv_hardif_free_ref(hard_iface);
767 
768 	return length;
769 }
770 
batadv_store_mesh_iface(struct kobject * kobj,struct attribute * attr,char * buff,size_t count)771 static ssize_t batadv_store_mesh_iface(struct kobject *kobj,
772 				       struct attribute *attr, char *buff,
773 				       size_t count)
774 {
775 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
776 	struct batadv_hard_iface *hard_iface;
777 	int status_tmp = -1;
778 	int ret = count;
779 
780 	hard_iface = batadv_hardif_get_by_netdev(net_dev);
781 	if (!hard_iface)
782 		return count;
783 
784 	if (buff[count - 1] == '\n')
785 		buff[count - 1] = '\0';
786 
787 	if (strlen(buff) >= IFNAMSIZ) {
788 		pr_err("Invalid parameter for 'mesh_iface' setting received: interface name too long '%s'\n",
789 		       buff);
790 		batadv_hardif_free_ref(hard_iface);
791 		return -EINVAL;
792 	}
793 
794 	if (strncmp(buff, "none", 4) == 0)
795 		status_tmp = BATADV_IF_NOT_IN_USE;
796 	else
797 		status_tmp = BATADV_IF_I_WANT_YOU;
798 
799 	if (hard_iface->if_status == status_tmp)
800 		goto out;
801 
802 	if ((hard_iface->soft_iface) &&
803 	    (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0))
804 		goto out;
805 
806 	rtnl_lock();
807 
808 	if (status_tmp == BATADV_IF_NOT_IN_USE) {
809 		batadv_hardif_disable_interface(hard_iface,
810 						BATADV_IF_CLEANUP_AUTO);
811 		goto unlock;
812 	}
813 
814 	/* if the interface already is in use */
815 	if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
816 		batadv_hardif_disable_interface(hard_iface,
817 						BATADV_IF_CLEANUP_AUTO);
818 
819 	ret = batadv_hardif_enable_interface(hard_iface, buff);
820 
821 unlock:
822 	rtnl_unlock();
823 out:
824 	batadv_hardif_free_ref(hard_iface);
825 	return ret;
826 }
827 
batadv_show_iface_status(struct kobject * kobj,struct attribute * attr,char * buff)828 static ssize_t batadv_show_iface_status(struct kobject *kobj,
829 					struct attribute *attr, char *buff)
830 {
831 	struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
832 	struct batadv_hard_iface *hard_iface;
833 	ssize_t length;
834 
835 	hard_iface = batadv_hardif_get_by_netdev(net_dev);
836 	if (!hard_iface)
837 		return 0;
838 
839 	switch (hard_iface->if_status) {
840 	case BATADV_IF_TO_BE_REMOVED:
841 		length = sprintf(buff, "disabling\n");
842 		break;
843 	case BATADV_IF_INACTIVE:
844 		length = sprintf(buff, "inactive\n");
845 		break;
846 	case BATADV_IF_ACTIVE:
847 		length = sprintf(buff, "active\n");
848 		break;
849 	case BATADV_IF_TO_BE_ACTIVATED:
850 		length = sprintf(buff, "enabling\n");
851 		break;
852 	case BATADV_IF_NOT_IN_USE:
853 	default:
854 		length = sprintf(buff, "not in use\n");
855 		break;
856 	}
857 
858 	batadv_hardif_free_ref(hard_iface);
859 
860 	return length;
861 }
862 
863 static BATADV_ATTR(mesh_iface, S_IRUGO | S_IWUSR, batadv_show_mesh_iface,
864 		   batadv_store_mesh_iface);
865 static BATADV_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL);
866 
867 static struct batadv_attribute *batadv_batman_attrs[] = {
868 	&batadv_attr_mesh_iface,
869 	&batadv_attr_iface_status,
870 	NULL,
871 };
872 
batadv_sysfs_add_hardif(struct kobject ** hardif_obj,struct net_device * dev)873 int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device *dev)
874 {
875 	struct kobject *hardif_kobject = &dev->dev.kobj;
876 	struct batadv_attribute **bat_attr;
877 	int err;
878 
879 	*hardif_obj = kobject_create_and_add(BATADV_SYSFS_IF_BAT_SUBDIR,
880 					     hardif_kobject);
881 
882 	if (!*hardif_obj) {
883 		batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
884 			   BATADV_SYSFS_IF_BAT_SUBDIR);
885 		goto out;
886 	}
887 
888 	for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr) {
889 		err = sysfs_create_file(*hardif_obj, &((*bat_attr)->attr));
890 		if (err) {
891 			batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
892 				   dev->name, BATADV_SYSFS_IF_BAT_SUBDIR,
893 				   ((*bat_attr)->attr).name);
894 			goto rem_attr;
895 		}
896 	}
897 
898 	return 0;
899 
900 rem_attr:
901 	for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr)
902 		sysfs_remove_file(*hardif_obj, &((*bat_attr)->attr));
903 out:
904 	return -ENOMEM;
905 }
906 
batadv_sysfs_del_hardif(struct kobject ** hardif_obj)907 void batadv_sysfs_del_hardif(struct kobject **hardif_obj)
908 {
909 	kobject_put(*hardif_obj);
910 	*hardif_obj = NULL;
911 }
912 
batadv_throw_uevent(struct batadv_priv * bat_priv,enum batadv_uev_type type,enum batadv_uev_action action,const char * data)913 int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type,
914 			enum batadv_uev_action action, const char *data)
915 {
916 	int ret = -ENOMEM;
917 	struct kobject *bat_kobj;
918 	char *uevent_env[4] = { NULL, NULL, NULL, NULL };
919 
920 	bat_kobj = &bat_priv->soft_iface->dev.kobj;
921 
922 	uevent_env[0] = kasprintf(GFP_ATOMIC,
923 				  "%s%s", BATADV_UEV_TYPE_VAR,
924 				  batadv_uev_type_str[type]);
925 	if (!uevent_env[0])
926 		goto out;
927 
928 	uevent_env[1] = kasprintf(GFP_ATOMIC,
929 				  "%s%s", BATADV_UEV_ACTION_VAR,
930 				  batadv_uev_action_str[action]);
931 	if (!uevent_env[1])
932 		goto out;
933 
934 	/* If the event is DEL, ignore the data field */
935 	if (action != BATADV_UEV_DEL) {
936 		uevent_env[2] = kasprintf(GFP_ATOMIC,
937 					  "%s%s", BATADV_UEV_DATA_VAR, data);
938 		if (!uevent_env[2])
939 			goto out;
940 	}
941 
942 	ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env);
943 out:
944 	kfree(uevent_env[0]);
945 	kfree(uevent_env[1]);
946 	kfree(uevent_env[2]);
947 
948 	if (ret)
949 		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
950 			   "Impossible to send uevent for (%s,%s,%s) event (err: %d)\n",
951 			   batadv_uev_type_str[type],
952 			   batadv_uev_action_str[action],
953 			   (action == BATADV_UEV_DEL ? "NULL" : data), ret);
954 	return ret;
955 }
956