br_sysfs_br.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. /*
  2. * Sysfs attributes of bridge
  3. * Linux ethernet bridge
  4. *
  5. * Authors:
  6. * Stephen Hemminger <shemminger@osdl.org>
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version
  11. * 2 of the License, or (at your option) any later version.
  12. */
  13. #include <linux/capability.h>
  14. #include <linux/kernel.h>
  15. #include <linux/netdevice.h>
  16. #include <linux/etherdevice.h>
  17. #include <linux/if_bridge.h>
  18. #include <linux/rtnetlink.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/times.h>
  21. #include "br_private.h"
  22. #define to_dev(obj) container_of(obj, struct device, kobj)
  23. #define to_bridge(cd) ((struct net_bridge *)netdev_priv(to_net_dev(cd)))
  24. /*
  25. * Common code for storing bridge parameters.
  26. */
  27. static ssize_t store_bridge_parm(struct device *d,
  28. const char *buf, size_t len,
  29. int (*set)(struct net_bridge *, unsigned long))
  30. {
  31. struct net_bridge *br = to_bridge(d);
  32. char *endp;
  33. unsigned long val;
  34. int err;
  35. if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
  36. return -EPERM;
  37. val = simple_strtoul(buf, &endp, 0);
  38. if (endp == buf)
  39. return -EINVAL;
  40. err = (*set)(br, val);
  41. return err ? err : len;
  42. }
  43. static ssize_t forward_delay_show(struct device *d,
  44. struct device_attribute *attr, char *buf)
  45. {
  46. struct net_bridge *br = to_bridge(d);
  47. return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->forward_delay));
  48. }
  49. static ssize_t forward_delay_store(struct device *d,
  50. struct device_attribute *attr,
  51. const char *buf, size_t len)
  52. {
  53. return store_bridge_parm(d, buf, len, br_set_forward_delay);
  54. }
  55. static DEVICE_ATTR_RW(forward_delay);
  56. static ssize_t hello_time_show(struct device *d, struct device_attribute *attr,
  57. char *buf)
  58. {
  59. return sprintf(buf, "%lu\n",
  60. jiffies_to_clock_t(to_bridge(d)->hello_time));
  61. }
  62. static ssize_t hello_time_store(struct device *d,
  63. struct device_attribute *attr, const char *buf,
  64. size_t len)
  65. {
  66. return store_bridge_parm(d, buf, len, br_set_hello_time);
  67. }
  68. static DEVICE_ATTR_RW(hello_time);
  69. static ssize_t max_age_show(struct device *d, struct device_attribute *attr,
  70. char *buf)
  71. {
  72. return sprintf(buf, "%lu\n",
  73. jiffies_to_clock_t(to_bridge(d)->max_age));
  74. }
  75. static ssize_t max_age_store(struct device *d, struct device_attribute *attr,
  76. const char *buf, size_t len)
  77. {
  78. return store_bridge_parm(d, buf, len, br_set_max_age);
  79. }
  80. static DEVICE_ATTR_RW(max_age);
  81. static ssize_t ageing_time_show(struct device *d,
  82. struct device_attribute *attr, char *buf)
  83. {
  84. struct net_bridge *br = to_bridge(d);
  85. return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->ageing_time));
  86. }
  87. static int set_ageing_time(struct net_bridge *br, unsigned long val)
  88. {
  89. int ret;
  90. if (!rtnl_trylock())
  91. return restart_syscall();
  92. ret = br_set_ageing_time(br, val);
  93. rtnl_unlock();
  94. return ret;
  95. }
  96. static ssize_t ageing_time_store(struct device *d,
  97. struct device_attribute *attr,
  98. const char *buf, size_t len)
  99. {
  100. return store_bridge_parm(d, buf, len, set_ageing_time);
  101. }
  102. static DEVICE_ATTR_RW(ageing_time);
  103. static ssize_t stp_state_show(struct device *d,
  104. struct device_attribute *attr, char *buf)
  105. {
  106. struct net_bridge *br = to_bridge(d);
  107. return sprintf(buf, "%d\n", br->stp_enabled);
  108. }
  109. static ssize_t stp_state_store(struct device *d,
  110. struct device_attribute *attr, const char *buf,
  111. size_t len)
  112. {
  113. struct net_bridge *br = to_bridge(d);
  114. char *endp;
  115. unsigned long val;
  116. if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
  117. return -EPERM;
  118. val = simple_strtoul(buf, &endp, 0);
  119. if (endp == buf)
  120. return -EINVAL;
  121. if (!rtnl_trylock())
  122. return restart_syscall();
  123. br_stp_set_enabled(br, val);
  124. rtnl_unlock();
  125. return len;
  126. }
  127. static DEVICE_ATTR_RW(stp_state);
  128. static ssize_t group_fwd_mask_show(struct device *d,
  129. struct device_attribute *attr,
  130. char *buf)
  131. {
  132. struct net_bridge *br = to_bridge(d);
  133. return sprintf(buf, "%#x\n", br->group_fwd_mask);
  134. }
  135. static ssize_t group_fwd_mask_store(struct device *d,
  136. struct device_attribute *attr,
  137. const char *buf,
  138. size_t len)
  139. {
  140. struct net_bridge *br = to_bridge(d);
  141. char *endp;
  142. unsigned long val;
  143. if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
  144. return -EPERM;
  145. val = simple_strtoul(buf, &endp, 0);
  146. if (endp == buf)
  147. return -EINVAL;
  148. if (val & BR_GROUPFWD_RESTRICTED)
  149. return -EINVAL;
  150. br->group_fwd_mask = val;
  151. return len;
  152. }
  153. static DEVICE_ATTR_RW(group_fwd_mask);
  154. static ssize_t priority_show(struct device *d, struct device_attribute *attr,
  155. char *buf)
  156. {
  157. struct net_bridge *br = to_bridge(d);
  158. return sprintf(buf, "%d\n",
  159. (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1]);
  160. }
  161. static int set_priority(struct net_bridge *br, unsigned long val)
  162. {
  163. br_stp_set_bridge_priority(br, (u16) val);
  164. return 0;
  165. }
  166. static ssize_t priority_store(struct device *d, struct device_attribute *attr,
  167. const char *buf, size_t len)
  168. {
  169. return store_bridge_parm(d, buf, len, set_priority);
  170. }
  171. static DEVICE_ATTR_RW(priority);
  172. static ssize_t root_id_show(struct device *d, struct device_attribute *attr,
  173. char *buf)
  174. {
  175. return br_show_bridge_id(buf, &to_bridge(d)->designated_root);
  176. }
  177. static DEVICE_ATTR_RO(root_id);
  178. static ssize_t bridge_id_show(struct device *d, struct device_attribute *attr,
  179. char *buf)
  180. {
  181. return br_show_bridge_id(buf, &to_bridge(d)->bridge_id);
  182. }
  183. static DEVICE_ATTR_RO(bridge_id);
  184. static ssize_t root_port_show(struct device *d, struct device_attribute *attr,
  185. char *buf)
  186. {
  187. return sprintf(buf, "%d\n", to_bridge(d)->root_port);
  188. }
  189. static DEVICE_ATTR_RO(root_port);
  190. static ssize_t root_path_cost_show(struct device *d,
  191. struct device_attribute *attr, char *buf)
  192. {
  193. return sprintf(buf, "%d\n", to_bridge(d)->root_path_cost);
  194. }
  195. static DEVICE_ATTR_RO(root_path_cost);
  196. static ssize_t topology_change_show(struct device *d,
  197. struct device_attribute *attr, char *buf)
  198. {
  199. return sprintf(buf, "%d\n", to_bridge(d)->topology_change);
  200. }
  201. static DEVICE_ATTR_RO(topology_change);
  202. static ssize_t topology_change_detected_show(struct device *d,
  203. struct device_attribute *attr,
  204. char *buf)
  205. {
  206. struct net_bridge *br = to_bridge(d);
  207. return sprintf(buf, "%d\n", br->topology_change_detected);
  208. }
  209. static DEVICE_ATTR_RO(topology_change_detected);
  210. static ssize_t hello_timer_show(struct device *d,
  211. struct device_attribute *attr, char *buf)
  212. {
  213. struct net_bridge *br = to_bridge(d);
  214. return sprintf(buf, "%ld\n", br_timer_value(&br->hello_timer));
  215. }
  216. static DEVICE_ATTR_RO(hello_timer);
  217. static ssize_t tcn_timer_show(struct device *d, struct device_attribute *attr,
  218. char *buf)
  219. {
  220. struct net_bridge *br = to_bridge(d);
  221. return sprintf(buf, "%ld\n", br_timer_value(&br->tcn_timer));
  222. }
  223. static DEVICE_ATTR_RO(tcn_timer);
  224. static ssize_t topology_change_timer_show(struct device *d,
  225. struct device_attribute *attr,
  226. char *buf)
  227. {
  228. struct net_bridge *br = to_bridge(d);
  229. return sprintf(buf, "%ld\n", br_timer_value(&br->topology_change_timer));
  230. }
  231. static DEVICE_ATTR_RO(topology_change_timer);
  232. static ssize_t gc_timer_show(struct device *d, struct device_attribute *attr,
  233. char *buf)
  234. {
  235. struct net_bridge *br = to_bridge(d);
  236. return sprintf(buf, "%ld\n", br_timer_value(&br->gc_timer));
  237. }
  238. static DEVICE_ATTR_RO(gc_timer);
  239. static ssize_t group_addr_show(struct device *d,
  240. struct device_attribute *attr, char *buf)
  241. {
  242. struct net_bridge *br = to_bridge(d);
  243. return sprintf(buf, "%x:%x:%x:%x:%x:%x\n",
  244. br->group_addr[0], br->group_addr[1],
  245. br->group_addr[2], br->group_addr[3],
  246. br->group_addr[4], br->group_addr[5]);
  247. }
  248. static ssize_t group_addr_store(struct device *d,
  249. struct device_attribute *attr,
  250. const char *buf, size_t len)
  251. {
  252. struct net_bridge *br = to_bridge(d);
  253. u8 new_addr[6];
  254. int i;
  255. if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
  256. return -EPERM;
  257. if (sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
  258. &new_addr[0], &new_addr[1], &new_addr[2],
  259. &new_addr[3], &new_addr[4], &new_addr[5]) != 6)
  260. return -EINVAL;
  261. if (!is_link_local_ether_addr(new_addr))
  262. return -EINVAL;
  263. if (new_addr[5] == 1 || /* 802.3x Pause address */
  264. new_addr[5] == 2 || /* 802.3ad Slow protocols */
  265. new_addr[5] == 3) /* 802.1X PAE address */
  266. return -EINVAL;
  267. if (!rtnl_trylock())
  268. return restart_syscall();
  269. spin_lock_bh(&br->lock);
  270. for (i = 0; i < 6; i++)
  271. br->group_addr[i] = new_addr[i];
  272. spin_unlock_bh(&br->lock);
  273. br->group_addr_set = true;
  274. br_recalculate_fwd_mask(br);
  275. rtnl_unlock();
  276. return len;
  277. }
  278. static DEVICE_ATTR_RW(group_addr);
  279. static ssize_t flush_store(struct device *d,
  280. struct device_attribute *attr,
  281. const char *buf, size_t len)
  282. {
  283. struct net_bridge *br = to_bridge(d);
  284. if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
  285. return -EPERM;
  286. br_fdb_flush(br);
  287. return len;
  288. }
  289. static DEVICE_ATTR_WO(flush);
  290. #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  291. static ssize_t multicast_router_show(struct device *d,
  292. struct device_attribute *attr, char *buf)
  293. {
  294. struct net_bridge *br = to_bridge(d);
  295. return sprintf(buf, "%d\n", br->multicast_router);
  296. }
  297. static ssize_t multicast_router_store(struct device *d,
  298. struct device_attribute *attr,
  299. const char *buf, size_t len)
  300. {
  301. return store_bridge_parm(d, buf, len, br_multicast_set_router);
  302. }
  303. static DEVICE_ATTR_RW(multicast_router);
  304. static ssize_t multicast_snooping_show(struct device *d,
  305. struct device_attribute *attr,
  306. char *buf)
  307. {
  308. struct net_bridge *br = to_bridge(d);
  309. return sprintf(buf, "%d\n", !br->multicast_disabled);
  310. }
  311. static ssize_t multicast_snooping_store(struct device *d,
  312. struct device_attribute *attr,
  313. const char *buf, size_t len)
  314. {
  315. return store_bridge_parm(d, buf, len, br_multicast_toggle);
  316. }
  317. static DEVICE_ATTR_RW(multicast_snooping);
  318. static ssize_t multicast_query_use_ifaddr_show(struct device *d,
  319. struct device_attribute *attr,
  320. char *buf)
  321. {
  322. struct net_bridge *br = to_bridge(d);
  323. return sprintf(buf, "%d\n", br->multicast_query_use_ifaddr);
  324. }
  325. static int set_query_use_ifaddr(struct net_bridge *br, unsigned long val)
  326. {
  327. br->multicast_query_use_ifaddr = !!val;
  328. return 0;
  329. }
  330. static ssize_t
  331. multicast_query_use_ifaddr_store(struct device *d,
  332. struct device_attribute *attr,
  333. const char *buf, size_t len)
  334. {
  335. return store_bridge_parm(d, buf, len, set_query_use_ifaddr);
  336. }
  337. static DEVICE_ATTR_RW(multicast_query_use_ifaddr);
  338. static ssize_t multicast_querier_show(struct device *d,
  339. struct device_attribute *attr,
  340. char *buf)
  341. {
  342. struct net_bridge *br = to_bridge(d);
  343. return sprintf(buf, "%d\n", br->multicast_querier);
  344. }
  345. static ssize_t multicast_querier_store(struct device *d,
  346. struct device_attribute *attr,
  347. const char *buf, size_t len)
  348. {
  349. return store_bridge_parm(d, buf, len, br_multicast_set_querier);
  350. }
  351. static DEVICE_ATTR_RW(multicast_querier);
  352. static ssize_t hash_elasticity_show(struct device *d,
  353. struct device_attribute *attr, char *buf)
  354. {
  355. struct net_bridge *br = to_bridge(d);
  356. return sprintf(buf, "%u\n", br->hash_elasticity);
  357. }
  358. static int set_elasticity(struct net_bridge *br, unsigned long val)
  359. {
  360. br->hash_elasticity = val;
  361. return 0;
  362. }
  363. static ssize_t hash_elasticity_store(struct device *d,
  364. struct device_attribute *attr,
  365. const char *buf, size_t len)
  366. {
  367. return store_bridge_parm(d, buf, len, set_elasticity);
  368. }
  369. static DEVICE_ATTR_RW(hash_elasticity);
  370. static ssize_t hash_max_show(struct device *d, struct device_attribute *attr,
  371. char *buf)
  372. {
  373. struct net_bridge *br = to_bridge(d);
  374. return sprintf(buf, "%u\n", br->hash_max);
  375. }
  376. static ssize_t hash_max_store(struct device *d, struct device_attribute *attr,
  377. const char *buf, size_t len)
  378. {
  379. return store_bridge_parm(d, buf, len, br_multicast_set_hash_max);
  380. }
  381. static DEVICE_ATTR_RW(hash_max);
  382. static ssize_t multicast_last_member_count_show(struct device *d,
  383. struct device_attribute *attr,
  384. char *buf)
  385. {
  386. struct net_bridge *br = to_bridge(d);
  387. return sprintf(buf, "%u\n", br->multicast_last_member_count);
  388. }
  389. static int set_last_member_count(struct net_bridge *br, unsigned long val)
  390. {
  391. br->multicast_last_member_count = val;
  392. return 0;
  393. }
  394. static ssize_t multicast_last_member_count_store(struct device *d,
  395. struct device_attribute *attr,
  396. const char *buf, size_t len)
  397. {
  398. return store_bridge_parm(d, buf, len, set_last_member_count);
  399. }
  400. static DEVICE_ATTR_RW(multicast_last_member_count);
  401. static ssize_t multicast_startup_query_count_show(
  402. struct device *d, struct device_attribute *attr, char *buf)
  403. {
  404. struct net_bridge *br = to_bridge(d);
  405. return sprintf(buf, "%u\n", br->multicast_startup_query_count);
  406. }
  407. static int set_startup_query_count(struct net_bridge *br, unsigned long val)
  408. {
  409. br->multicast_startup_query_count = val;
  410. return 0;
  411. }
  412. static ssize_t multicast_startup_query_count_store(
  413. struct device *d, struct device_attribute *attr, const char *buf,
  414. size_t len)
  415. {
  416. return store_bridge_parm(d, buf, len, set_startup_query_count);
  417. }
  418. static DEVICE_ATTR_RW(multicast_startup_query_count);
  419. static ssize_t multicast_last_member_interval_show(
  420. struct device *d, struct device_attribute *attr, char *buf)
  421. {
  422. struct net_bridge *br = to_bridge(d);
  423. return sprintf(buf, "%lu\n",
  424. jiffies_to_clock_t(br->multicast_last_member_interval));
  425. }
  426. static int set_last_member_interval(struct net_bridge *br, unsigned long val)
  427. {
  428. br->multicast_last_member_interval = clock_t_to_jiffies(val);
  429. return 0;
  430. }
  431. static ssize_t multicast_last_member_interval_store(
  432. struct device *d, struct device_attribute *attr, const char *buf,
  433. size_t len)
  434. {
  435. return store_bridge_parm(d, buf, len, set_last_member_interval);
  436. }
  437. static DEVICE_ATTR_RW(multicast_last_member_interval);
  438. static ssize_t multicast_membership_interval_show(
  439. struct device *d, struct device_attribute *attr, char *buf)
  440. {
  441. struct net_bridge *br = to_bridge(d);
  442. return sprintf(buf, "%lu\n",
  443. jiffies_to_clock_t(br->multicast_membership_interval));
  444. }
  445. static int set_membership_interval(struct net_bridge *br, unsigned long val)
  446. {
  447. br->multicast_membership_interval = clock_t_to_jiffies(val);
  448. return 0;
  449. }
  450. static ssize_t multicast_membership_interval_store(
  451. struct device *d, struct device_attribute *attr, const char *buf,
  452. size_t len)
  453. {
  454. return store_bridge_parm(d, buf, len, set_membership_interval);
  455. }
  456. static DEVICE_ATTR_RW(multicast_membership_interval);
  457. static ssize_t multicast_querier_interval_show(struct device *d,
  458. struct device_attribute *attr,
  459. char *buf)
  460. {
  461. struct net_bridge *br = to_bridge(d);
  462. return sprintf(buf, "%lu\n",
  463. jiffies_to_clock_t(br->multicast_querier_interval));
  464. }
  465. static int set_querier_interval(struct net_bridge *br, unsigned long val)
  466. {
  467. br->multicast_querier_interval = clock_t_to_jiffies(val);
  468. return 0;
  469. }
  470. static ssize_t multicast_querier_interval_store(struct device *d,
  471. struct device_attribute *attr,
  472. const char *buf, size_t len)
  473. {
  474. return store_bridge_parm(d, buf, len, set_querier_interval);
  475. }
  476. static DEVICE_ATTR_RW(multicast_querier_interval);
  477. static ssize_t multicast_query_interval_show(struct device *d,
  478. struct device_attribute *attr,
  479. char *buf)
  480. {
  481. struct net_bridge *br = to_bridge(d);
  482. return sprintf(buf, "%lu\n",
  483. jiffies_to_clock_t(br->multicast_query_interval));
  484. }
  485. static int set_query_interval(struct net_bridge *br, unsigned long val)
  486. {
  487. br->multicast_query_interval = clock_t_to_jiffies(val);
  488. return 0;
  489. }
  490. static ssize_t multicast_query_interval_store(struct device *d,
  491. struct device_attribute *attr,
  492. const char *buf, size_t len)
  493. {
  494. return store_bridge_parm(d, buf, len, set_query_interval);
  495. }
  496. static DEVICE_ATTR_RW(multicast_query_interval);
  497. static ssize_t multicast_query_response_interval_show(
  498. struct device *d, struct device_attribute *attr, char *buf)
  499. {
  500. struct net_bridge *br = to_bridge(d);
  501. return sprintf(
  502. buf, "%lu\n",
  503. jiffies_to_clock_t(br->multicast_query_response_interval));
  504. }
  505. static int set_query_response_interval(struct net_bridge *br, unsigned long val)
  506. {
  507. br->multicast_query_response_interval = clock_t_to_jiffies(val);
  508. return 0;
  509. }
  510. static ssize_t multicast_query_response_interval_store(
  511. struct device *d, struct device_attribute *attr, const char *buf,
  512. size_t len)
  513. {
  514. return store_bridge_parm(d, buf, len, set_query_response_interval);
  515. }
  516. static DEVICE_ATTR_RW(multicast_query_response_interval);
  517. static ssize_t multicast_startup_query_interval_show(
  518. struct device *d, struct device_attribute *attr, char *buf)
  519. {
  520. struct net_bridge *br = to_bridge(d);
  521. return sprintf(
  522. buf, "%lu\n",
  523. jiffies_to_clock_t(br->multicast_startup_query_interval));
  524. }
  525. static int set_startup_query_interval(struct net_bridge *br, unsigned long val)
  526. {
  527. br->multicast_startup_query_interval = clock_t_to_jiffies(val);
  528. return 0;
  529. }
  530. static ssize_t multicast_startup_query_interval_store(
  531. struct device *d, struct device_attribute *attr, const char *buf,
  532. size_t len)
  533. {
  534. return store_bridge_parm(d, buf, len, set_startup_query_interval);
  535. }
  536. static DEVICE_ATTR_RW(multicast_startup_query_interval);
  537. #endif
  538. #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
  539. static ssize_t nf_call_iptables_show(
  540. struct device *d, struct device_attribute *attr, char *buf)
  541. {
  542. struct net_bridge *br = to_bridge(d);
  543. return sprintf(buf, "%u\n", br->nf_call_iptables);
  544. }
  545. static int set_nf_call_iptables(struct net_bridge *br, unsigned long val)
  546. {
  547. br->nf_call_iptables = val ? true : false;
  548. return 0;
  549. }
  550. static ssize_t nf_call_iptables_store(
  551. struct device *d, struct device_attribute *attr, const char *buf,
  552. size_t len)
  553. {
  554. return store_bridge_parm(d, buf, len, set_nf_call_iptables);
  555. }
  556. static DEVICE_ATTR_RW(nf_call_iptables);
  557. static ssize_t nf_call_ip6tables_show(
  558. struct device *d, struct device_attribute *attr, char *buf)
  559. {
  560. struct net_bridge *br = to_bridge(d);
  561. return sprintf(buf, "%u\n", br->nf_call_ip6tables);
  562. }
  563. static int set_nf_call_ip6tables(struct net_bridge *br, unsigned long val)
  564. {
  565. br->nf_call_ip6tables = val ? true : false;
  566. return 0;
  567. }
  568. static ssize_t nf_call_ip6tables_store(
  569. struct device *d, struct device_attribute *attr, const char *buf,
  570. size_t len)
  571. {
  572. return store_bridge_parm(d, buf, len, set_nf_call_ip6tables);
  573. }
  574. static DEVICE_ATTR_RW(nf_call_ip6tables);
  575. static ssize_t nf_call_arptables_show(
  576. struct device *d, struct device_attribute *attr, char *buf)
  577. {
  578. struct net_bridge *br = to_bridge(d);
  579. return sprintf(buf, "%u\n", br->nf_call_arptables);
  580. }
  581. static int set_nf_call_arptables(struct net_bridge *br, unsigned long val)
  582. {
  583. br->nf_call_arptables = val ? true : false;
  584. return 0;
  585. }
  586. static ssize_t nf_call_arptables_store(
  587. struct device *d, struct device_attribute *attr, const char *buf,
  588. size_t len)
  589. {
  590. return store_bridge_parm(d, buf, len, set_nf_call_arptables);
  591. }
  592. static DEVICE_ATTR_RW(nf_call_arptables);
  593. #endif
  594. #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  595. static ssize_t vlan_filtering_show(struct device *d,
  596. struct device_attribute *attr,
  597. char *buf)
  598. {
  599. struct net_bridge *br = to_bridge(d);
  600. return sprintf(buf, "%d\n", br->vlan_enabled);
  601. }
  602. static ssize_t vlan_filtering_store(struct device *d,
  603. struct device_attribute *attr,
  604. const char *buf, size_t len)
  605. {
  606. return store_bridge_parm(d, buf, len, br_vlan_filter_toggle);
  607. }
  608. static DEVICE_ATTR_RW(vlan_filtering);
  609. static ssize_t vlan_protocol_show(struct device *d,
  610. struct device_attribute *attr,
  611. char *buf)
  612. {
  613. struct net_bridge *br = to_bridge(d);
  614. return sprintf(buf, "%#06x\n", ntohs(br->vlan_proto));
  615. }
  616. static ssize_t vlan_protocol_store(struct device *d,
  617. struct device_attribute *attr,
  618. const char *buf, size_t len)
  619. {
  620. return store_bridge_parm(d, buf, len, br_vlan_set_proto);
  621. }
  622. static DEVICE_ATTR_RW(vlan_protocol);
  623. static ssize_t default_pvid_show(struct device *d,
  624. struct device_attribute *attr,
  625. char *buf)
  626. {
  627. struct net_bridge *br = to_bridge(d);
  628. return sprintf(buf, "%d\n", br->default_pvid);
  629. }
  630. static ssize_t default_pvid_store(struct device *d,
  631. struct device_attribute *attr,
  632. const char *buf, size_t len)
  633. {
  634. return store_bridge_parm(d, buf, len, br_vlan_set_default_pvid);
  635. }
  636. static DEVICE_ATTR_RW(default_pvid);
  637. #endif
  638. static struct attribute *bridge_attrs[] = {
  639. &dev_attr_forward_delay.attr,
  640. &dev_attr_hello_time.attr,
  641. &dev_attr_max_age.attr,
  642. &dev_attr_ageing_time.attr,
  643. &dev_attr_stp_state.attr,
  644. &dev_attr_group_fwd_mask.attr,
  645. &dev_attr_priority.attr,
  646. &dev_attr_bridge_id.attr,
  647. &dev_attr_root_id.attr,
  648. &dev_attr_root_path_cost.attr,
  649. &dev_attr_root_port.attr,
  650. &dev_attr_topology_change.attr,
  651. &dev_attr_topology_change_detected.attr,
  652. &dev_attr_hello_timer.attr,
  653. &dev_attr_tcn_timer.attr,
  654. &dev_attr_topology_change_timer.attr,
  655. &dev_attr_gc_timer.attr,
  656. &dev_attr_group_addr.attr,
  657. &dev_attr_flush.attr,
  658. #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  659. &dev_attr_multicast_router.attr,
  660. &dev_attr_multicast_snooping.attr,
  661. &dev_attr_multicast_querier.attr,
  662. &dev_attr_multicast_query_use_ifaddr.attr,
  663. &dev_attr_hash_elasticity.attr,
  664. &dev_attr_hash_max.attr,
  665. &dev_attr_multicast_last_member_count.attr,
  666. &dev_attr_multicast_startup_query_count.attr,
  667. &dev_attr_multicast_last_member_interval.attr,
  668. &dev_attr_multicast_membership_interval.attr,
  669. &dev_attr_multicast_querier_interval.attr,
  670. &dev_attr_multicast_query_interval.attr,
  671. &dev_attr_multicast_query_response_interval.attr,
  672. &dev_attr_multicast_startup_query_interval.attr,
  673. #endif
  674. #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
  675. &dev_attr_nf_call_iptables.attr,
  676. &dev_attr_nf_call_ip6tables.attr,
  677. &dev_attr_nf_call_arptables.attr,
  678. #endif
  679. #ifdef CONFIG_BRIDGE_VLAN_FILTERING
  680. &dev_attr_vlan_filtering.attr,
  681. &dev_attr_vlan_protocol.attr,
  682. &dev_attr_default_pvid.attr,
  683. #endif
  684. NULL
  685. };
  686. static struct attribute_group bridge_group = {
  687. .name = SYSFS_BRIDGE_ATTR,
  688. .attrs = bridge_attrs,
  689. };
  690. /*
  691. * Export the forwarding information table as a binary file
  692. * The records are struct __fdb_entry.
  693. *
  694. * Returns the number of bytes read.
  695. */
  696. static ssize_t brforward_read(struct file *filp, struct kobject *kobj,
  697. struct bin_attribute *bin_attr,
  698. char *buf, loff_t off, size_t count)
  699. {
  700. struct device *dev = to_dev(kobj);
  701. struct net_bridge *br = to_bridge(dev);
  702. int n;
  703. /* must read whole records */
  704. if (off % sizeof(struct __fdb_entry) != 0)
  705. return -EINVAL;
  706. n = br_fdb_fillbuf(br, buf,
  707. count / sizeof(struct __fdb_entry),
  708. off / sizeof(struct __fdb_entry));
  709. if (n > 0)
  710. n *= sizeof(struct __fdb_entry);
  711. return n;
  712. }
  713. static struct bin_attribute bridge_forward = {
  714. .attr = { .name = SYSFS_BRIDGE_FDB,
  715. .mode = S_IRUGO, },
  716. .read = brforward_read,
  717. };
  718. /*
  719. * Add entries in sysfs onto the existing network class device
  720. * for the bridge.
  721. * Adds a attribute group "bridge" containing tuning parameters.
  722. * Binary attribute containing the forward table
  723. * Sub directory to hold links to interfaces.
  724. *
  725. * Note: the ifobj exists only to be a subdirectory
  726. * to hold links. The ifobj exists in same data structure
  727. * as it's parent the bridge so reference counting works.
  728. */
  729. int br_sysfs_addbr(struct net_device *dev)
  730. {
  731. struct kobject *brobj = &dev->dev.kobj;
  732. struct net_bridge *br = netdev_priv(dev);
  733. int err;
  734. err = sysfs_create_group(brobj, &bridge_group);
  735. if (err) {
  736. pr_info("%s: can't create group %s/%s\n",
  737. __func__, dev->name, bridge_group.name);
  738. goto out1;
  739. }
  740. err = sysfs_create_bin_file(brobj, &bridge_forward);
  741. if (err) {
  742. pr_info("%s: can't create attribute file %s/%s\n",
  743. __func__, dev->name, bridge_forward.attr.name);
  744. goto out2;
  745. }
  746. br->ifobj = kobject_create_and_add(SYSFS_BRIDGE_PORT_SUBDIR, brobj);
  747. if (!br->ifobj) {
  748. pr_info("%s: can't add kobject (directory) %s/%s\n",
  749. __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR);
  750. goto out3;
  751. }
  752. return 0;
  753. out3:
  754. sysfs_remove_bin_file(&dev->dev.kobj, &bridge_forward);
  755. out2:
  756. sysfs_remove_group(&dev->dev.kobj, &bridge_group);
  757. out1:
  758. return err;
  759. }
  760. void br_sysfs_delbr(struct net_device *dev)
  761. {
  762. struct kobject *kobj = &dev->dev.kobj;
  763. struct net_bridge *br = netdev_priv(dev);
  764. kobject_put(br->ifobj);
  765. sysfs_remove_bin_file(kobj, &bridge_forward);
  766. sysfs_remove_group(kobj, &bridge_group);
  767. }