prestera_switchdev.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918
  1. // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  2. /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved */
  3. #include <linux/if_bridge.h>
  4. #include <linux/if_vlan.h>
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/notifier.h>
  8. #include <net/netevent.h>
  9. #include <net/switchdev.h>
  10. #include "prestera.h"
  11. #include "prestera_hw.h"
  12. #include "prestera_switchdev.h"
  13. #define PRESTERA_VID_ALL (0xffff)
  14. #define PRESTERA_DEFAULT_AGEING_TIME_MS 300000
  15. #define PRESTERA_MAX_AGEING_TIME_MS 1000000000
  16. #define PRESTERA_MIN_AGEING_TIME_MS 32000
  17. struct prestera_fdb_event_work {
  18. struct work_struct work;
  19. struct switchdev_notifier_fdb_info fdb_info;
  20. struct net_device *dev;
  21. unsigned long event;
  22. };
  23. struct prestera_switchdev {
  24. struct prestera_switch *sw;
  25. struct list_head bridge_list;
  26. bool bridge_8021q_exists;
  27. struct notifier_block swdev_nb_blk;
  28. struct notifier_block swdev_nb;
  29. };
  30. struct prestera_bridge {
  31. struct list_head head;
  32. struct net_device *dev;
  33. struct prestera_switchdev *swdev;
  34. struct list_head port_list;
  35. struct list_head br_mdb_entry_list;
  36. bool mrouter_exist;
  37. bool vlan_enabled;
  38. bool multicast_enabled;
  39. u16 bridge_id;
  40. };
  41. struct prestera_bridge_port {
  42. struct list_head head;
  43. struct net_device *dev;
  44. struct prestera_bridge *bridge;
  45. struct list_head vlan_list;
  46. struct list_head br_mdb_port_list;
  47. refcount_t ref_count;
  48. unsigned long flags;
  49. bool mrouter;
  50. u8 stp_state;
  51. };
  52. struct prestera_bridge_vlan {
  53. struct list_head head;
  54. struct list_head port_vlan_list;
  55. u16 vid;
  56. };
  57. struct prestera_port_vlan {
  58. struct list_head br_vlan_head;
  59. struct list_head port_head;
  60. struct prestera_port *port;
  61. struct prestera_bridge_port *br_port;
  62. u16 vid;
  63. };
  64. struct prestera_br_mdb_port {
  65. struct prestera_bridge_port *br_port;
  66. struct list_head br_mdb_port_node;
  67. };
  68. /* Software representation of MDB table. */
  69. struct prestera_br_mdb_entry {
  70. struct prestera_bridge *bridge;
  71. struct prestera_mdb_entry *mdb;
  72. struct list_head br_mdb_port_list;
  73. struct list_head br_mdb_entry_node;
  74. bool enabled;
  75. };
  76. static struct workqueue_struct *swdev_wq;
  77. static void prestera_bridge_port_put(struct prestera_bridge_port *br_port);
  78. static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
  79. u8 state);
  80. static struct prestera_bridge *
  81. prestera_bridge_find(const struct prestera_switch *sw,
  82. const struct net_device *br_dev)
  83. {
  84. struct prestera_bridge *bridge;
  85. list_for_each_entry(bridge, &sw->swdev->bridge_list, head)
  86. if (bridge->dev == br_dev)
  87. return bridge;
  88. return NULL;
  89. }
  90. static struct prestera_bridge_port *
  91. __prestera_bridge_port_find(const struct prestera_bridge *bridge,
  92. const struct net_device *brport_dev)
  93. {
  94. struct prestera_bridge_port *br_port;
  95. list_for_each_entry(br_port, &bridge->port_list, head)
  96. if (br_port->dev == brport_dev)
  97. return br_port;
  98. return NULL;
  99. }
  100. static struct prestera_bridge_port *
  101. prestera_bridge_port_find(struct prestera_switch *sw,
  102. struct net_device *brport_dev)
  103. {
  104. struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
  105. struct prestera_bridge *bridge;
  106. if (!br_dev)
  107. return NULL;
  108. bridge = prestera_bridge_find(sw, br_dev);
  109. if (!bridge)
  110. return NULL;
  111. return __prestera_bridge_port_find(bridge, brport_dev);
  112. }
  113. static void
  114. prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
  115. struct prestera_port *port)
  116. {
  117. prestera_port_uc_flood_set(port, false);
  118. prestera_port_mc_flood_set(port, false);
  119. prestera_port_learning_set(port, false);
  120. prestera_port_br_locked_set(port, false);
  121. }
  122. static int prestera_br_port_flags_set(struct prestera_bridge_port *br_port,
  123. struct prestera_port *port)
  124. {
  125. int err;
  126. err = prestera_port_uc_flood_set(port, br_port->flags & BR_FLOOD);
  127. if (err)
  128. goto err_out;
  129. err = prestera_port_mc_flood_set(port, br_port->flags & BR_MCAST_FLOOD);
  130. if (err)
  131. goto err_out;
  132. err = prestera_port_learning_set(port, br_port->flags & BR_LEARNING);
  133. if (err)
  134. goto err_out;
  135. err = prestera_port_br_locked_set(port,
  136. br_port->flags & BR_PORT_LOCKED);
  137. if (err)
  138. goto err_out;
  139. return 0;
  140. err_out:
  141. prestera_br_port_flags_reset(br_port, port);
  142. return err;
  143. }
  144. static struct prestera_bridge_vlan *
  145. prestera_bridge_vlan_create(struct prestera_bridge_port *br_port, u16 vid)
  146. {
  147. struct prestera_bridge_vlan *br_vlan;
  148. br_vlan = kzalloc(sizeof(*br_vlan), GFP_KERNEL);
  149. if (!br_vlan)
  150. return NULL;
  151. INIT_LIST_HEAD(&br_vlan->port_vlan_list);
  152. br_vlan->vid = vid;
  153. list_add(&br_vlan->head, &br_port->vlan_list);
  154. return br_vlan;
  155. }
  156. static void prestera_bridge_vlan_destroy(struct prestera_bridge_vlan *br_vlan)
  157. {
  158. list_del(&br_vlan->head);
  159. WARN_ON(!list_empty(&br_vlan->port_vlan_list));
  160. kfree(br_vlan);
  161. }
  162. static struct prestera_bridge_vlan *
  163. prestera_bridge_vlan_by_vid(struct prestera_bridge_port *br_port, u16 vid)
  164. {
  165. struct prestera_bridge_vlan *br_vlan;
  166. list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
  167. if (br_vlan->vid == vid)
  168. return br_vlan;
  169. }
  170. return NULL;
  171. }
  172. static int prestera_bridge_vlan_port_count(struct prestera_bridge *bridge,
  173. u16 vid)
  174. {
  175. struct prestera_bridge_port *br_port;
  176. struct prestera_bridge_vlan *br_vlan;
  177. int count = 0;
  178. list_for_each_entry(br_port, &bridge->port_list, head) {
  179. list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
  180. if (br_vlan->vid == vid) {
  181. count += 1;
  182. break;
  183. }
  184. }
  185. }
  186. return count;
  187. }
  188. static void prestera_bridge_vlan_put(struct prestera_bridge_vlan *br_vlan)
  189. {
  190. if (list_empty(&br_vlan->port_vlan_list))
  191. prestera_bridge_vlan_destroy(br_vlan);
  192. }
  193. static struct prestera_port_vlan *
  194. prestera_port_vlan_by_vid(struct prestera_port *port, u16 vid)
  195. {
  196. struct prestera_port_vlan *port_vlan;
  197. list_for_each_entry(port_vlan, &port->vlans_list, port_head) {
  198. if (port_vlan->vid == vid)
  199. return port_vlan;
  200. }
  201. return NULL;
  202. }
  203. static struct prestera_port_vlan *
  204. prestera_port_vlan_create(struct prestera_port *port, u16 vid, bool untagged)
  205. {
  206. struct prestera_port_vlan *port_vlan;
  207. int err;
  208. port_vlan = prestera_port_vlan_by_vid(port, vid);
  209. if (port_vlan)
  210. return ERR_PTR(-EEXIST);
  211. err = prestera_hw_vlan_port_set(port, vid, true, untagged);
  212. if (err)
  213. return ERR_PTR(err);
  214. port_vlan = kzalloc(sizeof(*port_vlan), GFP_KERNEL);
  215. if (!port_vlan) {
  216. err = -ENOMEM;
  217. goto err_port_vlan_alloc;
  218. }
  219. port_vlan->port = port;
  220. port_vlan->vid = vid;
  221. list_add(&port_vlan->port_head, &port->vlans_list);
  222. return port_vlan;
  223. err_port_vlan_alloc:
  224. prestera_hw_vlan_port_set(port, vid, false, false);
  225. return ERR_PTR(err);
  226. }
  227. static int prestera_fdb_add(struct prestera_port *port,
  228. const unsigned char *mac, u16 vid, bool dynamic)
  229. {
  230. if (prestera_port_is_lag_member(port))
  231. return prestera_hw_lag_fdb_add(port->sw, prestera_port_lag_id(port),
  232. mac, vid, dynamic);
  233. return prestera_hw_fdb_add(port, mac, vid, dynamic);
  234. }
  235. static int prestera_fdb_del(struct prestera_port *port,
  236. const unsigned char *mac, u16 vid)
  237. {
  238. if (prestera_port_is_lag_member(port))
  239. return prestera_hw_lag_fdb_del(port->sw, prestera_port_lag_id(port),
  240. mac, vid);
  241. else
  242. return prestera_hw_fdb_del(port, mac, vid);
  243. }
  244. static int prestera_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
  245. u32 mode)
  246. {
  247. if (prestera_port_is_lag_member(port))
  248. return prestera_hw_fdb_flush_lag_vlan(port->sw, prestera_port_lag_id(port),
  249. vid, mode);
  250. else
  251. return prestera_hw_fdb_flush_port_vlan(port, vid, mode);
  252. }
  253. static int prestera_fdb_flush_port(struct prestera_port *port, u32 mode)
  254. {
  255. if (prestera_port_is_lag_member(port))
  256. return prestera_hw_fdb_flush_lag(port->sw, prestera_port_lag_id(port),
  257. mode);
  258. else
  259. return prestera_hw_fdb_flush_port(port, mode);
  260. }
  261. static void
  262. prestera_mdb_port_del(struct prestera_mdb_entry *mdb,
  263. struct net_device *orig_dev)
  264. {
  265. struct prestera_flood_domain *fl_domain = mdb->flood_domain;
  266. struct prestera_flood_domain_port *flood_domain_port;
  267. flood_domain_port = prestera_flood_domain_port_find(fl_domain,
  268. orig_dev,
  269. mdb->vid);
  270. if (flood_domain_port)
  271. prestera_flood_domain_port_destroy(flood_domain_port);
  272. }
  273. static void
  274. prestera_br_mdb_entry_put(struct prestera_br_mdb_entry *br_mdb)
  275. {
  276. struct prestera_bridge_port *br_port;
  277. if (list_empty(&br_mdb->br_mdb_port_list)) {
  278. list_for_each_entry(br_port, &br_mdb->bridge->port_list, head)
  279. prestera_mdb_port_del(br_mdb->mdb, br_port->dev);
  280. prestera_mdb_entry_destroy(br_mdb->mdb);
  281. list_del(&br_mdb->br_mdb_entry_node);
  282. kfree(br_mdb);
  283. }
  284. }
  285. static void
  286. prestera_br_mdb_port_del(struct prestera_br_mdb_entry *br_mdb,
  287. struct prestera_bridge_port *br_port)
  288. {
  289. struct prestera_br_mdb_port *br_mdb_port, *tmp;
  290. list_for_each_entry_safe(br_mdb_port, tmp, &br_mdb->br_mdb_port_list,
  291. br_mdb_port_node) {
  292. if (br_mdb_port->br_port == br_port) {
  293. list_del(&br_mdb_port->br_mdb_port_node);
  294. kfree(br_mdb_port);
  295. }
  296. }
  297. }
  298. static void
  299. prestera_mdb_flush_bridge_port(struct prestera_bridge_port *br_port)
  300. {
  301. struct prestera_br_mdb_port *br_mdb_port, *tmp_port;
  302. struct prestera_br_mdb_entry *br_mdb, *br_mdb_tmp;
  303. struct prestera_bridge *br_dev = br_port->bridge;
  304. list_for_each_entry_safe(br_mdb, br_mdb_tmp, &br_dev->br_mdb_entry_list,
  305. br_mdb_entry_node) {
  306. list_for_each_entry_safe(br_mdb_port, tmp_port,
  307. &br_mdb->br_mdb_port_list,
  308. br_mdb_port_node) {
  309. prestera_mdb_port_del(br_mdb->mdb,
  310. br_mdb_port->br_port->dev);
  311. prestera_br_mdb_port_del(br_mdb, br_mdb_port->br_port);
  312. }
  313. prestera_br_mdb_entry_put(br_mdb);
  314. }
  315. }
  316. static void
  317. prestera_port_vlan_bridge_leave(struct prestera_port_vlan *port_vlan)
  318. {
  319. u32 fdb_flush_mode = PRESTERA_FDB_FLUSH_MODE_DYNAMIC;
  320. struct prestera_port *port = port_vlan->port;
  321. struct prestera_bridge_vlan *br_vlan;
  322. struct prestera_bridge_port *br_port;
  323. bool last_port, last_vlan;
  324. u16 vid = port_vlan->vid;
  325. int port_count;
  326. br_port = port_vlan->br_port;
  327. port_count = prestera_bridge_vlan_port_count(br_port->bridge, vid);
  328. br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
  329. last_vlan = list_is_singular(&br_port->vlan_list);
  330. last_port = port_count == 1;
  331. if (last_vlan)
  332. prestera_fdb_flush_port(port, fdb_flush_mode);
  333. else if (last_port)
  334. prestera_hw_fdb_flush_vlan(port->sw, vid, fdb_flush_mode);
  335. else
  336. prestera_fdb_flush_port_vlan(port, vid, fdb_flush_mode);
  337. prestera_mdb_flush_bridge_port(br_port);
  338. list_del(&port_vlan->br_vlan_head);
  339. prestera_bridge_vlan_put(br_vlan);
  340. prestera_bridge_port_put(br_port);
  341. port_vlan->br_port = NULL;
  342. }
  343. static void prestera_port_vlan_destroy(struct prestera_port_vlan *port_vlan)
  344. {
  345. struct prestera_port *port = port_vlan->port;
  346. u16 vid = port_vlan->vid;
  347. if (port_vlan->br_port)
  348. prestera_port_vlan_bridge_leave(port_vlan);
  349. prestera_hw_vlan_port_set(port, vid, false, false);
  350. list_del(&port_vlan->port_head);
  351. kfree(port_vlan);
  352. }
  353. static struct prestera_bridge *
  354. prestera_bridge_create(struct prestera_switchdev *swdev, struct net_device *dev)
  355. {
  356. bool vlan_enabled = br_vlan_enabled(dev);
  357. struct prestera_bridge *bridge;
  358. u16 bridge_id;
  359. int err;
  360. if (vlan_enabled && swdev->bridge_8021q_exists) {
  361. netdev_err(dev, "Only one VLAN-aware bridge is supported\n");
  362. return ERR_PTR(-EINVAL);
  363. }
  364. bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
  365. if (!bridge)
  366. return ERR_PTR(-ENOMEM);
  367. if (vlan_enabled) {
  368. swdev->bridge_8021q_exists = true;
  369. } else {
  370. err = prestera_hw_bridge_create(swdev->sw, &bridge_id);
  371. if (err) {
  372. kfree(bridge);
  373. return ERR_PTR(err);
  374. }
  375. bridge->bridge_id = bridge_id;
  376. }
  377. bridge->vlan_enabled = vlan_enabled;
  378. bridge->swdev = swdev;
  379. bridge->dev = dev;
  380. bridge->multicast_enabled = br_multicast_enabled(dev);
  381. INIT_LIST_HEAD(&bridge->port_list);
  382. INIT_LIST_HEAD(&bridge->br_mdb_entry_list);
  383. list_add(&bridge->head, &swdev->bridge_list);
  384. return bridge;
  385. }
  386. static void prestera_bridge_destroy(struct prestera_bridge *bridge)
  387. {
  388. struct prestera_switchdev *swdev = bridge->swdev;
  389. list_del(&bridge->head);
  390. if (bridge->vlan_enabled)
  391. swdev->bridge_8021q_exists = false;
  392. else
  393. prestera_hw_bridge_delete(swdev->sw, bridge->bridge_id);
  394. WARN_ON(!list_empty(&bridge->br_mdb_entry_list));
  395. WARN_ON(!list_empty(&bridge->port_list));
  396. kfree(bridge);
  397. }
  398. static void prestera_bridge_put(struct prestera_bridge *bridge)
  399. {
  400. if (list_empty(&bridge->port_list))
  401. prestera_bridge_destroy(bridge);
  402. }
  403. static
  404. struct prestera_bridge *prestera_bridge_by_dev(struct prestera_switchdev *swdev,
  405. const struct net_device *dev)
  406. {
  407. struct prestera_bridge *bridge;
  408. list_for_each_entry(bridge, &swdev->bridge_list, head)
  409. if (bridge->dev == dev)
  410. return bridge;
  411. return NULL;
  412. }
  413. static struct prestera_bridge_port *
  414. __prestera_bridge_port_by_dev(struct prestera_bridge *bridge,
  415. struct net_device *dev)
  416. {
  417. struct prestera_bridge_port *br_port;
  418. list_for_each_entry(br_port, &bridge->port_list, head) {
  419. if (br_port->dev == dev)
  420. return br_port;
  421. }
  422. return NULL;
  423. }
  424. static int prestera_match_upper_bridge_dev(struct net_device *dev,
  425. struct netdev_nested_priv *priv)
  426. {
  427. if (netif_is_bridge_master(dev))
  428. priv->data = dev;
  429. return 0;
  430. }
  431. static struct net_device *prestera_get_upper_bridge_dev(struct net_device *dev)
  432. {
  433. struct netdev_nested_priv priv = { };
  434. netdev_walk_all_upper_dev_rcu(dev, prestera_match_upper_bridge_dev,
  435. &priv);
  436. return priv.data;
  437. }
  438. static struct prestera_bridge_port *
  439. prestera_bridge_port_by_dev(struct prestera_switchdev *swdev,
  440. struct net_device *dev)
  441. {
  442. struct net_device *br_dev = prestera_get_upper_bridge_dev(dev);
  443. struct prestera_bridge *bridge;
  444. if (!br_dev)
  445. return NULL;
  446. bridge = prestera_bridge_by_dev(swdev, br_dev);
  447. if (!bridge)
  448. return NULL;
  449. return __prestera_bridge_port_by_dev(bridge, dev);
  450. }
  451. static struct prestera_bridge_port *
  452. prestera_bridge_port_create(struct prestera_bridge *bridge,
  453. struct net_device *dev)
  454. {
  455. struct prestera_bridge_port *br_port;
  456. br_port = kzalloc(sizeof(*br_port), GFP_KERNEL);
  457. if (!br_port)
  458. return NULL;
  459. br_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC |
  460. BR_MCAST_FLOOD;
  461. br_port->stp_state = BR_STATE_DISABLED;
  462. refcount_set(&br_port->ref_count, 1);
  463. br_port->bridge = bridge;
  464. br_port->dev = dev;
  465. INIT_LIST_HEAD(&br_port->vlan_list);
  466. list_add(&br_port->head, &bridge->port_list);
  467. INIT_LIST_HEAD(&br_port->br_mdb_port_list);
  468. return br_port;
  469. }
  470. static void
  471. prestera_bridge_port_destroy(struct prestera_bridge_port *br_port)
  472. {
  473. list_del(&br_port->head);
  474. WARN_ON(!list_empty(&br_port->vlan_list));
  475. WARN_ON(!list_empty(&br_port->br_mdb_port_list));
  476. kfree(br_port);
  477. }
  478. static void prestera_bridge_port_get(struct prestera_bridge_port *br_port)
  479. {
  480. refcount_inc(&br_port->ref_count);
  481. }
  482. static void prestera_bridge_port_put(struct prestera_bridge_port *br_port)
  483. {
  484. struct prestera_bridge *bridge = br_port->bridge;
  485. if (refcount_dec_and_test(&br_port->ref_count)) {
  486. prestera_bridge_port_destroy(br_port);
  487. prestera_bridge_put(bridge);
  488. }
  489. }
  490. static struct prestera_bridge_port *
  491. prestera_bridge_port_add(struct prestera_bridge *bridge, struct net_device *dev)
  492. {
  493. struct prestera_bridge_port *br_port;
  494. br_port = __prestera_bridge_port_by_dev(bridge, dev);
  495. if (br_port) {
  496. prestera_bridge_port_get(br_port);
  497. return br_port;
  498. }
  499. br_port = prestera_bridge_port_create(bridge, dev);
  500. if (!br_port)
  501. return ERR_PTR(-ENOMEM);
  502. return br_port;
  503. }
  504. static int
  505. prestera_bridge_1d_port_join(struct prestera_bridge_port *br_port)
  506. {
  507. struct prestera_port *port = netdev_priv(br_port->dev);
  508. struct prestera_bridge *bridge = br_port->bridge;
  509. int err;
  510. err = prestera_hw_bridge_port_add(port, bridge->bridge_id);
  511. if (err)
  512. return err;
  513. err = prestera_br_port_flags_set(br_port, port);
  514. if (err)
  515. goto err_flags2port_set;
  516. return 0;
  517. err_flags2port_set:
  518. prestera_hw_bridge_port_delete(port, bridge->bridge_id);
  519. return err;
  520. }
  521. int prestera_bridge_port_join(struct net_device *br_dev,
  522. struct prestera_port *port,
  523. struct netlink_ext_ack *extack)
  524. {
  525. struct prestera_switchdev *swdev = port->sw->swdev;
  526. struct prestera_bridge_port *br_port;
  527. struct prestera_bridge *bridge;
  528. int err;
  529. bridge = prestera_bridge_by_dev(swdev, br_dev);
  530. if (!bridge) {
  531. bridge = prestera_bridge_create(swdev, br_dev);
  532. if (IS_ERR(bridge))
  533. return PTR_ERR(bridge);
  534. }
  535. br_port = prestera_bridge_port_add(bridge, port->dev);
  536. if (IS_ERR(br_port)) {
  537. prestera_bridge_put(bridge);
  538. return PTR_ERR(br_port);
  539. }
  540. err = switchdev_bridge_port_offload(br_port->dev, port->dev, NULL,
  541. NULL, NULL, false, extack);
  542. if (err)
  543. goto err_switchdev_offload;
  544. if (bridge->vlan_enabled)
  545. return 0;
  546. err = prestera_bridge_1d_port_join(br_port);
  547. if (err)
  548. goto err_port_join;
  549. return 0;
  550. err_port_join:
  551. switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
  552. err_switchdev_offload:
  553. prestera_bridge_port_put(br_port);
  554. return err;
  555. }
  556. static void prestera_bridge_1q_port_leave(struct prestera_bridge_port *br_port)
  557. {
  558. struct prestera_port *port = netdev_priv(br_port->dev);
  559. prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
  560. prestera_port_pvid_set(port, PRESTERA_DEFAULT_VID);
  561. }
  562. static void prestera_bridge_1d_port_leave(struct prestera_bridge_port *br_port)
  563. {
  564. struct prestera_port *port = netdev_priv(br_port->dev);
  565. prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
  566. prestera_hw_bridge_port_delete(port, br_port->bridge->bridge_id);
  567. }
  568. static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
  569. u8 state)
  570. {
  571. u8 hw_state = state;
  572. switch (state) {
  573. case BR_STATE_DISABLED:
  574. hw_state = PRESTERA_STP_DISABLED;
  575. break;
  576. case BR_STATE_BLOCKING:
  577. case BR_STATE_LISTENING:
  578. hw_state = PRESTERA_STP_BLOCK_LISTEN;
  579. break;
  580. case BR_STATE_LEARNING:
  581. hw_state = PRESTERA_STP_LEARN;
  582. break;
  583. case BR_STATE_FORWARDING:
  584. hw_state = PRESTERA_STP_FORWARD;
  585. break;
  586. default:
  587. return -EINVAL;
  588. }
  589. return prestera_hw_vlan_port_stp_set(port, vid, hw_state);
  590. }
  591. void prestera_bridge_port_leave(struct net_device *br_dev,
  592. struct prestera_port *port)
  593. {
  594. struct prestera_switchdev *swdev = port->sw->swdev;
  595. struct prestera_bridge_port *br_port;
  596. struct prestera_bridge *bridge;
  597. bridge = prestera_bridge_by_dev(swdev, br_dev);
  598. if (!bridge)
  599. return;
  600. br_port = __prestera_bridge_port_by_dev(bridge, port->dev);
  601. if (!br_port)
  602. return;
  603. bridge = br_port->bridge;
  604. if (bridge->vlan_enabled)
  605. prestera_bridge_1q_port_leave(br_port);
  606. else
  607. prestera_bridge_1d_port_leave(br_port);
  608. switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
  609. prestera_mdb_flush_bridge_port(br_port);
  610. prestera_br_port_flags_reset(br_port, port);
  611. prestera_port_vid_stp_set(port, PRESTERA_VID_ALL, BR_STATE_FORWARDING);
  612. prestera_bridge_port_put(br_port);
  613. }
  614. static int prestera_port_attr_br_flags_set(struct prestera_port *port,
  615. struct net_device *dev,
  616. struct switchdev_brport_flags flags)
  617. {
  618. struct prestera_bridge_port *br_port;
  619. br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
  620. if (!br_port)
  621. return 0;
  622. br_port->flags &= ~flags.mask;
  623. br_port->flags |= flags.val & flags.mask;
  624. return prestera_br_port_flags_set(br_port, port);
  625. }
  626. static int prestera_port_attr_br_ageing_set(struct prestera_port *port,
  627. unsigned long ageing_clock_t)
  628. {
  629. unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
  630. u32 ageing_time_ms = jiffies_to_msecs(ageing_jiffies);
  631. struct prestera_switch *sw = port->sw;
  632. if (ageing_time_ms < PRESTERA_MIN_AGEING_TIME_MS ||
  633. ageing_time_ms > PRESTERA_MAX_AGEING_TIME_MS)
  634. return -ERANGE;
  635. return prestera_hw_switch_ageing_set(sw, ageing_time_ms);
  636. }
  637. static int prestera_port_attr_br_vlan_set(struct prestera_port *port,
  638. struct net_device *dev,
  639. bool vlan_enabled)
  640. {
  641. struct prestera_switch *sw = port->sw;
  642. struct prestera_bridge *bridge;
  643. bridge = prestera_bridge_by_dev(sw->swdev, dev);
  644. if (WARN_ON(!bridge))
  645. return -EINVAL;
  646. if (bridge->vlan_enabled == vlan_enabled)
  647. return 0;
  648. netdev_err(bridge->dev, "VLAN filtering can't be changed for existing bridge\n");
  649. return -EINVAL;
  650. }
  651. static int prestera_port_bridge_vlan_stp_set(struct prestera_port *port,
  652. struct prestera_bridge_vlan *br_vlan,
  653. u8 state)
  654. {
  655. struct prestera_port_vlan *port_vlan;
  656. list_for_each_entry(port_vlan, &br_vlan->port_vlan_list, br_vlan_head) {
  657. if (port_vlan->port != port)
  658. continue;
  659. return prestera_port_vid_stp_set(port, br_vlan->vid, state);
  660. }
  661. return 0;
  662. }
  663. static int prestera_port_attr_stp_state_set(struct prestera_port *port,
  664. struct net_device *dev,
  665. u8 state)
  666. {
  667. struct prestera_bridge_port *br_port;
  668. struct prestera_bridge_vlan *br_vlan;
  669. int err;
  670. u16 vid;
  671. br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
  672. if (!br_port)
  673. return 0;
  674. if (!br_port->bridge->vlan_enabled) {
  675. vid = br_port->bridge->bridge_id;
  676. err = prestera_port_vid_stp_set(port, vid, state);
  677. if (err)
  678. goto err_port_stp_set;
  679. } else {
  680. list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
  681. err = prestera_port_bridge_vlan_stp_set(port, br_vlan,
  682. state);
  683. if (err)
  684. goto err_port_vlan_stp_set;
  685. }
  686. }
  687. br_port->stp_state = state;
  688. return 0;
  689. err_port_vlan_stp_set:
  690. list_for_each_entry_continue_reverse(br_vlan, &br_port->vlan_list, head)
  691. prestera_port_bridge_vlan_stp_set(port, br_vlan, br_port->stp_state);
  692. return err;
  693. err_port_stp_set:
  694. prestera_port_vid_stp_set(port, vid, br_port->stp_state);
  695. return err;
  696. }
  697. static int
  698. prestera_br_port_lag_mdb_mc_enable_sync(struct prestera_bridge_port *br_port,
  699. bool enabled)
  700. {
  701. struct prestera_port *pr_port;
  702. struct prestera_switch *sw;
  703. u16 lag_id;
  704. int err;
  705. pr_port = prestera_port_dev_lower_find(br_port->dev);
  706. if (!pr_port)
  707. return 0;
  708. sw = pr_port->sw;
  709. err = prestera_lag_id(sw, br_port->dev, &lag_id);
  710. if (err)
  711. return err;
  712. list_for_each_entry(pr_port, &sw->port_list, list) {
  713. if (pr_port->lag->lag_id == lag_id) {
  714. err = prestera_port_mc_flood_set(pr_port, enabled);
  715. if (err)
  716. return err;
  717. }
  718. }
  719. return 0;
  720. }
  721. static int prestera_br_mdb_mc_enable_sync(struct prestera_bridge *br_dev)
  722. {
  723. struct prestera_bridge_port *br_port;
  724. struct prestera_port *port;
  725. bool enabled;
  726. int err;
  727. /* if mrouter exists:
  728. * - make sure every mrouter receives unreg mcast traffic;
  729. * if mrouter doesn't exists:
  730. * - make sure every port receives unreg mcast traffic;
  731. */
  732. list_for_each_entry(br_port, &br_dev->port_list, head) {
  733. if (br_dev->multicast_enabled && br_dev->mrouter_exist)
  734. enabled = br_port->mrouter;
  735. else
  736. enabled = br_port->flags & BR_MCAST_FLOOD;
  737. if (netif_is_lag_master(br_port->dev)) {
  738. err = prestera_br_port_lag_mdb_mc_enable_sync(br_port,
  739. enabled);
  740. if (err)
  741. return err;
  742. continue;
  743. }
  744. port = prestera_port_dev_lower_find(br_port->dev);
  745. if (!port)
  746. continue;
  747. err = prestera_port_mc_flood_set(port, enabled);
  748. if (err)
  749. return err;
  750. }
  751. return 0;
  752. }
  753. static bool
  754. prestera_br_mdb_port_is_member(struct prestera_br_mdb_entry *br_mdb,
  755. struct net_device *orig_dev)
  756. {
  757. struct prestera_br_mdb_port *tmp_port;
  758. list_for_each_entry(tmp_port, &br_mdb->br_mdb_port_list,
  759. br_mdb_port_node)
  760. if (tmp_port->br_port->dev == orig_dev)
  761. return true;
  762. return false;
  763. }
  764. static int
  765. prestera_mdb_port_add(struct prestera_mdb_entry *mdb,
  766. struct net_device *orig_dev,
  767. const unsigned char addr[ETH_ALEN], u16 vid)
  768. {
  769. struct prestera_flood_domain *flood_domain = mdb->flood_domain;
  770. int err;
  771. if (!prestera_flood_domain_port_find(flood_domain,
  772. orig_dev, vid)) {
  773. err = prestera_flood_domain_port_create(flood_domain, orig_dev,
  774. vid);
  775. if (err)
  776. return err;
  777. }
  778. return 0;
  779. }
  780. /* Sync bridge mdb (software table) with HW table (if MC is enabled). */
  781. static int prestera_br_mdb_sync(struct prestera_bridge *br_dev)
  782. {
  783. struct prestera_br_mdb_port *br_mdb_port;
  784. struct prestera_bridge_port *br_port;
  785. struct prestera_br_mdb_entry *br_mdb;
  786. struct prestera_mdb_entry *mdb;
  787. struct prestera_port *pr_port;
  788. int err = 0;
  789. if (!br_dev->multicast_enabled)
  790. return 0;
  791. list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
  792. br_mdb_entry_node) {
  793. mdb = br_mdb->mdb;
  794. /* Make sure every port that explicitly been added to the mdb
  795. * joins the specified group.
  796. */
  797. list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
  798. br_mdb_port_node) {
  799. br_port = br_mdb_port->br_port;
  800. pr_port = prestera_port_dev_lower_find(br_port->dev);
  801. /* Match only mdb and br_mdb ports that belong to the
  802. * same broadcast domain.
  803. */
  804. if (br_dev->vlan_enabled &&
  805. !prestera_port_vlan_by_vid(pr_port,
  806. mdb->vid))
  807. continue;
  808. /* If port is not in MDB or there's no Mrouter
  809. * clear HW mdb.
  810. */
  811. if (prestera_br_mdb_port_is_member(br_mdb,
  812. br_mdb_port->br_port->dev) &&
  813. br_dev->mrouter_exist)
  814. err = prestera_mdb_port_add(mdb, br_port->dev,
  815. mdb->addr,
  816. mdb->vid);
  817. else
  818. prestera_mdb_port_del(mdb, br_port->dev);
  819. if (err)
  820. return err;
  821. }
  822. /* Make sure that every mrouter port joins every MC group int
  823. * broadcast domain. If it's not an mrouter - it should leave
  824. */
  825. list_for_each_entry(br_port, &br_dev->port_list, head) {
  826. pr_port = prestera_port_dev_lower_find(br_port->dev);
  827. /* Make sure mrouter woudln't receive traffci from
  828. * another broadcast domain (e.g. from a vlan, which
  829. * mrouter port is not a member of).
  830. */
  831. if (br_dev->vlan_enabled &&
  832. !prestera_port_vlan_by_vid(pr_port,
  833. mdb->vid))
  834. continue;
  835. if (br_port->mrouter) {
  836. err = prestera_mdb_port_add(mdb, br_port->dev,
  837. mdb->addr,
  838. mdb->vid);
  839. if (err)
  840. return err;
  841. } else if (!br_port->mrouter &&
  842. !prestera_br_mdb_port_is_member
  843. (br_mdb, br_port->dev)) {
  844. prestera_mdb_port_del(mdb, br_port->dev);
  845. }
  846. }
  847. }
  848. return 0;
  849. }
  850. static int
  851. prestera_mdb_enable_set(struct prestera_br_mdb_entry *br_mdb, bool enable)
  852. {
  853. int err;
  854. if (enable != br_mdb->enabled) {
  855. if (enable)
  856. err = prestera_hw_mdb_create(br_mdb->mdb);
  857. else
  858. err = prestera_hw_mdb_destroy(br_mdb->mdb);
  859. if (err)
  860. return err;
  861. br_mdb->enabled = enable;
  862. }
  863. return 0;
  864. }
  865. static int
  866. prestera_br_mdb_enable_set(struct prestera_bridge *br_dev, bool enable)
  867. {
  868. struct prestera_br_mdb_entry *br_mdb;
  869. int err;
  870. list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
  871. br_mdb_entry_node) {
  872. err = prestera_mdb_enable_set(br_mdb, enable);
  873. if (err)
  874. return err;
  875. }
  876. return 0;
  877. }
  878. static int prestera_port_attr_br_mc_disabled_set(struct prestera_port *port,
  879. struct net_device *orig_dev,
  880. bool mc_disabled)
  881. {
  882. struct prestera_switch *sw = port->sw;
  883. struct prestera_bridge *br_dev;
  884. br_dev = prestera_bridge_find(sw, orig_dev);
  885. if (!br_dev)
  886. return 0;
  887. br_dev->multicast_enabled = !mc_disabled;
  888. /* There's no point in enabling mdb back if router is missing. */
  889. WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
  890. br_dev->mrouter_exist));
  891. WARN_ON(prestera_br_mdb_sync(br_dev));
  892. WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
  893. return 0;
  894. }
  895. static bool
  896. prestera_bridge_mdb_mc_mrouter_exists(struct prestera_bridge *br_dev)
  897. {
  898. struct prestera_bridge_port *br_port;
  899. list_for_each_entry(br_port, &br_dev->port_list, head)
  900. if (br_port->mrouter)
  901. return true;
  902. return false;
  903. }
  904. static int
  905. prestera_port_attr_mrouter_set(struct prestera_port *port,
  906. struct net_device *orig_dev,
  907. bool is_port_mrouter)
  908. {
  909. struct prestera_bridge_port *br_port;
  910. struct prestera_bridge *br_dev;
  911. br_port = prestera_bridge_port_find(port->sw, orig_dev);
  912. if (!br_port)
  913. return 0;
  914. br_dev = br_port->bridge;
  915. br_port->mrouter = is_port_mrouter;
  916. br_dev->mrouter_exist = prestera_bridge_mdb_mc_mrouter_exists(br_dev);
  917. /* Enable MDB processing if both mrouter exists and mc is enabled.
  918. * In case if MC enabled, but there is no mrouter, device would flood
  919. * all multicast traffic (even if MDB table is not empty) with the use
  920. * of bridge's flood capabilities (without the use of flood_domain).
  921. */
  922. WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
  923. br_dev->mrouter_exist));
  924. WARN_ON(prestera_br_mdb_sync(br_dev));
  925. WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
  926. return 0;
  927. }
  928. static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
  929. const struct switchdev_attr *attr,
  930. struct netlink_ext_ack *extack)
  931. {
  932. struct prestera_port *port = netdev_priv(dev);
  933. int err = 0;
  934. switch (attr->id) {
  935. case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
  936. err = prestera_port_attr_stp_state_set(port, attr->orig_dev,
  937. attr->u.stp_state);
  938. break;
  939. case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
  940. if (attr->u.brport_flags.mask &
  941. ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_PORT_LOCKED))
  942. err = -EINVAL;
  943. break;
  944. case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
  945. err = prestera_port_attr_br_flags_set(port, attr->orig_dev,
  946. attr->u.brport_flags);
  947. break;
  948. case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
  949. err = prestera_port_attr_br_ageing_set(port,
  950. attr->u.ageing_time);
  951. break;
  952. case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
  953. err = prestera_port_attr_br_vlan_set(port, attr->orig_dev,
  954. attr->u.vlan_filtering);
  955. break;
  956. case SWITCHDEV_ATTR_ID_PORT_MROUTER:
  957. err = prestera_port_attr_mrouter_set(port, attr->orig_dev,
  958. attr->u.mrouter);
  959. break;
  960. case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
  961. err = prestera_port_attr_br_mc_disabled_set(port, attr->orig_dev,
  962. attr->u.mc_disabled);
  963. break;
  964. default:
  965. err = -EOPNOTSUPP;
  966. }
  967. return err;
  968. }
  969. static void
  970. prestera_fdb_offload_notify(struct prestera_port *port,
  971. struct switchdev_notifier_fdb_info *info)
  972. {
  973. struct switchdev_notifier_fdb_info send_info = {};
  974. send_info.addr = info->addr;
  975. send_info.vid = info->vid;
  976. send_info.offloaded = true;
  977. call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, port->dev,
  978. &send_info.info, NULL);
  979. }
  980. static int prestera_port_fdb_set(struct prestera_port *port,
  981. struct switchdev_notifier_fdb_info *fdb_info,
  982. bool adding)
  983. {
  984. struct prestera_switch *sw = port->sw;
  985. struct prestera_bridge_port *br_port;
  986. struct prestera_bridge *bridge;
  987. int err;
  988. u16 vid;
  989. br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
  990. if (!br_port)
  991. return -EINVAL;
  992. bridge = br_port->bridge;
  993. if (bridge->vlan_enabled)
  994. vid = fdb_info->vid;
  995. else
  996. vid = bridge->bridge_id;
  997. if (adding)
  998. err = prestera_fdb_add(port, fdb_info->addr, vid, false);
  999. else
  1000. err = prestera_fdb_del(port, fdb_info->addr, vid);
  1001. return err;
  1002. }
  1003. static void prestera_fdb_event_work(struct work_struct *work)
  1004. {
  1005. struct switchdev_notifier_fdb_info *fdb_info;
  1006. struct prestera_fdb_event_work *swdev_work;
  1007. struct prestera_port *port;
  1008. struct net_device *dev;
  1009. int err;
  1010. swdev_work = container_of(work, struct prestera_fdb_event_work, work);
  1011. dev = swdev_work->dev;
  1012. rtnl_lock();
  1013. port = prestera_port_dev_lower_find(dev);
  1014. if (!port)
  1015. goto out_unlock;
  1016. switch (swdev_work->event) {
  1017. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1018. fdb_info = &swdev_work->fdb_info;
  1019. if (!fdb_info->added_by_user || fdb_info->is_local)
  1020. break;
  1021. err = prestera_port_fdb_set(port, fdb_info, true);
  1022. if (err)
  1023. break;
  1024. prestera_fdb_offload_notify(port, fdb_info);
  1025. break;
  1026. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1027. fdb_info = &swdev_work->fdb_info;
  1028. prestera_port_fdb_set(port, fdb_info, false);
  1029. break;
  1030. }
  1031. out_unlock:
  1032. rtnl_unlock();
  1033. kfree(swdev_work->fdb_info.addr);
  1034. kfree(swdev_work);
  1035. dev_put(dev);
  1036. }
  1037. static int prestera_switchdev_event(struct notifier_block *unused,
  1038. unsigned long event, void *ptr)
  1039. {
  1040. struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
  1041. struct switchdev_notifier_fdb_info *fdb_info;
  1042. struct switchdev_notifier_info *info = ptr;
  1043. struct prestera_fdb_event_work *swdev_work;
  1044. struct net_device *upper;
  1045. int err;
  1046. if (event == SWITCHDEV_PORT_ATTR_SET) {
  1047. err = switchdev_handle_port_attr_set(dev, ptr,
  1048. prestera_netdev_check,
  1049. prestera_port_obj_attr_set);
  1050. return notifier_from_errno(err);
  1051. }
  1052. if (!prestera_netdev_check(dev))
  1053. return NOTIFY_DONE;
  1054. upper = netdev_master_upper_dev_get_rcu(dev);
  1055. if (!upper)
  1056. return NOTIFY_DONE;
  1057. if (!netif_is_bridge_master(upper))
  1058. return NOTIFY_DONE;
  1059. swdev_work = kzalloc(sizeof(*swdev_work), GFP_ATOMIC);
  1060. if (!swdev_work)
  1061. return NOTIFY_BAD;
  1062. swdev_work->event = event;
  1063. swdev_work->dev = dev;
  1064. switch (event) {
  1065. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1066. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1067. fdb_info = container_of(info,
  1068. struct switchdev_notifier_fdb_info,
  1069. info);
  1070. INIT_WORK(&swdev_work->work, prestera_fdb_event_work);
  1071. memcpy(&swdev_work->fdb_info, ptr,
  1072. sizeof(swdev_work->fdb_info));
  1073. swdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
  1074. if (!swdev_work->fdb_info.addr)
  1075. goto out_bad;
  1076. ether_addr_copy((u8 *)swdev_work->fdb_info.addr,
  1077. fdb_info->addr);
  1078. dev_hold(dev);
  1079. break;
  1080. default:
  1081. kfree(swdev_work);
  1082. return NOTIFY_DONE;
  1083. }
  1084. queue_work(swdev_wq, &swdev_work->work);
  1085. return NOTIFY_DONE;
  1086. out_bad:
  1087. kfree(swdev_work);
  1088. return NOTIFY_BAD;
  1089. }
  1090. static int
  1091. prestera_port_vlan_bridge_join(struct prestera_port_vlan *port_vlan,
  1092. struct prestera_bridge_port *br_port)
  1093. {
  1094. struct prestera_port *port = port_vlan->port;
  1095. struct prestera_bridge_vlan *br_vlan;
  1096. u16 vid = port_vlan->vid;
  1097. int err;
  1098. if (port_vlan->br_port)
  1099. return 0;
  1100. err = prestera_br_port_flags_set(br_port, port);
  1101. if (err)
  1102. goto err_flags2port_set;
  1103. err = prestera_port_vid_stp_set(port, vid, br_port->stp_state);
  1104. if (err)
  1105. goto err_port_vid_stp_set;
  1106. br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
  1107. if (!br_vlan) {
  1108. br_vlan = prestera_bridge_vlan_create(br_port, vid);
  1109. if (!br_vlan) {
  1110. err = -ENOMEM;
  1111. goto err_bridge_vlan_get;
  1112. }
  1113. }
  1114. list_add(&port_vlan->br_vlan_head, &br_vlan->port_vlan_list);
  1115. prestera_bridge_port_get(br_port);
  1116. port_vlan->br_port = br_port;
  1117. return 0;
  1118. err_bridge_vlan_get:
  1119. prestera_port_vid_stp_set(port, vid, BR_STATE_FORWARDING);
  1120. err_port_vid_stp_set:
  1121. prestera_br_port_flags_reset(br_port, port);
  1122. err_flags2port_set:
  1123. return err;
  1124. }
  1125. static int
  1126. prestera_bridge_port_vlan_add(struct prestera_port *port,
  1127. struct prestera_bridge_port *br_port,
  1128. u16 vid, bool is_untagged, bool is_pvid,
  1129. struct netlink_ext_ack *extack)
  1130. {
  1131. struct prestera_port_vlan *port_vlan;
  1132. u16 old_pvid = port->pvid;
  1133. u16 pvid;
  1134. int err;
  1135. if (is_pvid)
  1136. pvid = vid;
  1137. else
  1138. pvid = port->pvid == vid ? 0 : port->pvid;
  1139. port_vlan = prestera_port_vlan_by_vid(port, vid);
  1140. if (port_vlan && port_vlan->br_port != br_port)
  1141. return -EEXIST;
  1142. if (!port_vlan) {
  1143. port_vlan = prestera_port_vlan_create(port, vid, is_untagged);
  1144. if (IS_ERR(port_vlan))
  1145. return PTR_ERR(port_vlan);
  1146. } else {
  1147. err = prestera_hw_vlan_port_set(port, vid, true, is_untagged);
  1148. if (err)
  1149. goto err_port_vlan_set;
  1150. }
  1151. err = prestera_port_pvid_set(port, pvid);
  1152. if (err)
  1153. goto err_port_pvid_set;
  1154. err = prestera_port_vlan_bridge_join(port_vlan, br_port);
  1155. if (err)
  1156. goto err_port_vlan_bridge_join;
  1157. return 0;
  1158. err_port_vlan_bridge_join:
  1159. prestera_port_pvid_set(port, old_pvid);
  1160. err_port_pvid_set:
  1161. prestera_hw_vlan_port_set(port, vid, false, false);
  1162. err_port_vlan_set:
  1163. prestera_port_vlan_destroy(port_vlan);
  1164. return err;
  1165. }
  1166. static void
  1167. prestera_bridge_port_vlan_del(struct prestera_port *port,
  1168. struct prestera_bridge_port *br_port, u16 vid)
  1169. {
  1170. u16 pvid = port->pvid == vid ? 0 : port->pvid;
  1171. struct prestera_port_vlan *port_vlan;
  1172. port_vlan = prestera_port_vlan_by_vid(port, vid);
  1173. if (WARN_ON(!port_vlan))
  1174. return;
  1175. prestera_port_vlan_bridge_leave(port_vlan);
  1176. prestera_port_pvid_set(port, pvid);
  1177. prestera_port_vlan_destroy(port_vlan);
  1178. }
  1179. static int prestera_port_vlans_add(struct prestera_port *port,
  1180. const struct switchdev_obj_port_vlan *vlan,
  1181. struct netlink_ext_ack *extack)
  1182. {
  1183. bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
  1184. bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
  1185. struct net_device *orig_dev = vlan->obj.orig_dev;
  1186. struct prestera_bridge_port *br_port;
  1187. struct prestera_switch *sw = port->sw;
  1188. struct prestera_bridge *bridge;
  1189. if (netif_is_bridge_master(orig_dev))
  1190. return 0;
  1191. br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
  1192. if (WARN_ON(!br_port))
  1193. return -EINVAL;
  1194. bridge = br_port->bridge;
  1195. if (!bridge->vlan_enabled)
  1196. return 0;
  1197. return prestera_bridge_port_vlan_add(port, br_port,
  1198. vlan->vid, flag_untagged,
  1199. flag_pvid, extack);
  1200. }
  1201. static struct prestera_br_mdb_entry *
  1202. prestera_br_mdb_entry_create(struct prestera_switch *sw,
  1203. struct prestera_bridge *br_dev,
  1204. const unsigned char *addr, u16 vid)
  1205. {
  1206. struct prestera_br_mdb_entry *br_mdb_entry;
  1207. struct prestera_mdb_entry *mdb_entry;
  1208. br_mdb_entry = kzalloc(sizeof(*br_mdb_entry), GFP_KERNEL);
  1209. if (!br_mdb_entry)
  1210. return NULL;
  1211. mdb_entry = prestera_mdb_entry_create(sw, addr, vid);
  1212. if (!mdb_entry)
  1213. goto err_mdb_alloc;
  1214. br_mdb_entry->mdb = mdb_entry;
  1215. br_mdb_entry->bridge = br_dev;
  1216. br_mdb_entry->enabled = true;
  1217. INIT_LIST_HEAD(&br_mdb_entry->br_mdb_port_list);
  1218. list_add(&br_mdb_entry->br_mdb_entry_node, &br_dev->br_mdb_entry_list);
  1219. return br_mdb_entry;
  1220. err_mdb_alloc:
  1221. kfree(br_mdb_entry);
  1222. return NULL;
  1223. }
  1224. static int prestera_br_mdb_port_add(struct prestera_br_mdb_entry *br_mdb,
  1225. struct prestera_bridge_port *br_port)
  1226. {
  1227. struct prestera_br_mdb_port *br_mdb_port;
  1228. list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
  1229. br_mdb_port_node)
  1230. if (br_mdb_port->br_port == br_port)
  1231. return 0;
  1232. br_mdb_port = kzalloc(sizeof(*br_mdb_port), GFP_KERNEL);
  1233. if (!br_mdb_port)
  1234. return -ENOMEM;
  1235. br_mdb_port->br_port = br_port;
  1236. list_add(&br_mdb_port->br_mdb_port_node,
  1237. &br_mdb->br_mdb_port_list);
  1238. return 0;
  1239. }
  1240. static struct prestera_br_mdb_entry *
  1241. prestera_br_mdb_entry_find(struct prestera_bridge *br_dev,
  1242. const unsigned char *addr, u16 vid)
  1243. {
  1244. struct prestera_br_mdb_entry *br_mdb;
  1245. list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
  1246. br_mdb_entry_node)
  1247. if (ether_addr_equal(&br_mdb->mdb->addr[0], addr) &&
  1248. vid == br_mdb->mdb->vid)
  1249. return br_mdb;
  1250. return NULL;
  1251. }
  1252. static struct prestera_br_mdb_entry *
  1253. prestera_br_mdb_entry_get(struct prestera_switch *sw,
  1254. struct prestera_bridge *br_dev,
  1255. const unsigned char *addr, u16 vid)
  1256. {
  1257. struct prestera_br_mdb_entry *br_mdb;
  1258. br_mdb = prestera_br_mdb_entry_find(br_dev, addr, vid);
  1259. if (br_mdb)
  1260. return br_mdb;
  1261. return prestera_br_mdb_entry_create(sw, br_dev, addr, vid);
  1262. }
  1263. static int
  1264. prestera_mdb_port_addr_obj_add(const struct switchdev_obj_port_mdb *mdb)
  1265. {
  1266. struct prestera_br_mdb_entry *br_mdb;
  1267. struct prestera_bridge_port *br_port;
  1268. struct prestera_bridge *br_dev;
  1269. struct prestera_switch *sw;
  1270. struct prestera_port *port;
  1271. int err;
  1272. sw = prestera_switch_get(mdb->obj.orig_dev);
  1273. port = prestera_port_dev_lower_find(mdb->obj.orig_dev);
  1274. br_port = prestera_bridge_port_find(sw, mdb->obj.orig_dev);
  1275. if (!br_port)
  1276. return 0;
  1277. br_dev = br_port->bridge;
  1278. if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
  1279. return 0;
  1280. if (mdb->vid)
  1281. br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
  1282. mdb->vid);
  1283. else
  1284. br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
  1285. br_dev->bridge_id);
  1286. if (!br_mdb)
  1287. return -ENOMEM;
  1288. /* Make sure newly allocated MDB entry gets disabled if either MC is
  1289. * disabled, or the mrouter does not exist.
  1290. */
  1291. WARN_ON(prestera_mdb_enable_set(br_mdb, br_dev->multicast_enabled &&
  1292. br_dev->mrouter_exist));
  1293. err = prestera_br_mdb_port_add(br_mdb, br_port);
  1294. if (err) {
  1295. prestera_br_mdb_entry_put(br_mdb);
  1296. return err;
  1297. }
  1298. err = prestera_br_mdb_sync(br_dev);
  1299. if (err)
  1300. return err;
  1301. return 0;
  1302. }
  1303. static int prestera_port_obj_add(struct net_device *dev, const void *ctx,
  1304. const struct switchdev_obj *obj,
  1305. struct netlink_ext_ack *extack)
  1306. {
  1307. struct prestera_port *port = netdev_priv(dev);
  1308. const struct switchdev_obj_port_vlan *vlan;
  1309. const struct switchdev_obj_port_mdb *mdb;
  1310. int err = 0;
  1311. switch (obj->id) {
  1312. case SWITCHDEV_OBJ_ID_PORT_VLAN:
  1313. vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
  1314. return prestera_port_vlans_add(port, vlan, extack);
  1315. case SWITCHDEV_OBJ_ID_PORT_MDB:
  1316. mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
  1317. err = prestera_mdb_port_addr_obj_add(mdb);
  1318. break;
  1319. case SWITCHDEV_OBJ_ID_HOST_MDB:
  1320. fallthrough;
  1321. default:
  1322. err = -EOPNOTSUPP;
  1323. break;
  1324. }
  1325. return err;
  1326. }
  1327. static int prestera_port_vlans_del(struct prestera_port *port,
  1328. const struct switchdev_obj_port_vlan *vlan)
  1329. {
  1330. struct net_device *orig_dev = vlan->obj.orig_dev;
  1331. struct prestera_bridge_port *br_port;
  1332. struct prestera_switch *sw = port->sw;
  1333. if (netif_is_bridge_master(orig_dev))
  1334. return -EOPNOTSUPP;
  1335. br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
  1336. if (WARN_ON(!br_port))
  1337. return -EINVAL;
  1338. if (!br_port->bridge->vlan_enabled)
  1339. return 0;
  1340. prestera_bridge_port_vlan_del(port, br_port, vlan->vid);
  1341. return 0;
  1342. }
  1343. static int
  1344. prestera_mdb_port_addr_obj_del(struct prestera_port *port,
  1345. const struct switchdev_obj_port_mdb *mdb)
  1346. {
  1347. struct prestera_br_mdb_entry *br_mdb;
  1348. struct prestera_bridge_port *br_port;
  1349. struct prestera_bridge *br_dev;
  1350. int err;
  1351. /* Bridge port no longer exists - and so does this MDB entry */
  1352. br_port = prestera_bridge_port_find(port->sw, mdb->obj.orig_dev);
  1353. if (!br_port)
  1354. return 0;
  1355. /* Removing MDB with non-existing VLAN - not supported; */
  1356. if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
  1357. return 0;
  1358. br_dev = br_port->bridge;
  1359. if (br_port->bridge->vlan_enabled)
  1360. br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
  1361. mdb->vid);
  1362. else
  1363. br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
  1364. br_port->bridge->bridge_id);
  1365. if (!br_mdb)
  1366. return 0;
  1367. /* Since there might be a situation that this port was the last in the
  1368. * MDB group, we have to both remove this port from software and HW MDB,
  1369. * sync MDB table, and then destroy software MDB (if needed).
  1370. */
  1371. prestera_br_mdb_port_del(br_mdb, br_port);
  1372. prestera_br_mdb_entry_put(br_mdb);
  1373. err = prestera_br_mdb_sync(br_dev);
  1374. if (err)
  1375. return err;
  1376. return 0;
  1377. }
  1378. static int prestera_port_obj_del(struct net_device *dev, const void *ctx,
  1379. const struct switchdev_obj *obj)
  1380. {
  1381. struct prestera_port *port = netdev_priv(dev);
  1382. const struct switchdev_obj_port_mdb *mdb;
  1383. int err = 0;
  1384. switch (obj->id) {
  1385. case SWITCHDEV_OBJ_ID_PORT_VLAN:
  1386. return prestera_port_vlans_del(port, SWITCHDEV_OBJ_PORT_VLAN(obj));
  1387. case SWITCHDEV_OBJ_ID_PORT_MDB:
  1388. mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
  1389. err = prestera_mdb_port_addr_obj_del(port, mdb);
  1390. break;
  1391. default:
  1392. err = -EOPNOTSUPP;
  1393. break;
  1394. }
  1395. return err;
  1396. }
  1397. static int prestera_switchdev_blk_event(struct notifier_block *unused,
  1398. unsigned long event, void *ptr)
  1399. {
  1400. struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
  1401. int err;
  1402. switch (event) {
  1403. case SWITCHDEV_PORT_OBJ_ADD:
  1404. err = switchdev_handle_port_obj_add(dev, ptr,
  1405. prestera_netdev_check,
  1406. prestera_port_obj_add);
  1407. break;
  1408. case SWITCHDEV_PORT_OBJ_DEL:
  1409. err = switchdev_handle_port_obj_del(dev, ptr,
  1410. prestera_netdev_check,
  1411. prestera_port_obj_del);
  1412. break;
  1413. case SWITCHDEV_PORT_ATTR_SET:
  1414. err = switchdev_handle_port_attr_set(dev, ptr,
  1415. prestera_netdev_check,
  1416. prestera_port_obj_attr_set);
  1417. break;
  1418. default:
  1419. return NOTIFY_DONE;
  1420. }
  1421. return notifier_from_errno(err);
  1422. }
  1423. static void prestera_fdb_event(struct prestera_switch *sw,
  1424. struct prestera_event *evt, void *arg)
  1425. {
  1426. struct switchdev_notifier_fdb_info info = {};
  1427. struct net_device *dev = NULL;
  1428. struct prestera_port *port;
  1429. struct prestera_lag *lag;
  1430. switch (evt->fdb_evt.type) {
  1431. case PRESTERA_FDB_ENTRY_TYPE_REG_PORT:
  1432. port = prestera_find_port(sw, evt->fdb_evt.dest.port_id);
  1433. if (port)
  1434. dev = port->dev;
  1435. break;
  1436. case PRESTERA_FDB_ENTRY_TYPE_LAG:
  1437. lag = prestera_lag_by_id(sw, evt->fdb_evt.dest.lag_id);
  1438. if (lag)
  1439. dev = lag->dev;
  1440. break;
  1441. default:
  1442. return;
  1443. }
  1444. if (!dev)
  1445. return;
  1446. info.addr = evt->fdb_evt.data.mac;
  1447. info.vid = evt->fdb_evt.vid;
  1448. info.offloaded = true;
  1449. rtnl_lock();
  1450. switch (evt->id) {
  1451. case PRESTERA_FDB_EVENT_LEARNED:
  1452. call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
  1453. dev, &info.info, NULL);
  1454. break;
  1455. case PRESTERA_FDB_EVENT_AGED:
  1456. call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE,
  1457. dev, &info.info, NULL);
  1458. break;
  1459. }
  1460. rtnl_unlock();
  1461. }
  1462. static int prestera_fdb_init(struct prestera_switch *sw)
  1463. {
  1464. int err;
  1465. err = prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_FDB,
  1466. prestera_fdb_event, NULL);
  1467. if (err)
  1468. return err;
  1469. err = prestera_hw_switch_ageing_set(sw, PRESTERA_DEFAULT_AGEING_TIME_MS);
  1470. if (err)
  1471. goto err_ageing_set;
  1472. return 0;
  1473. err_ageing_set:
  1474. prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
  1475. prestera_fdb_event);
  1476. return err;
  1477. }
  1478. static void prestera_fdb_fini(struct prestera_switch *sw)
  1479. {
  1480. prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
  1481. prestera_fdb_event);
  1482. }
  1483. static int prestera_switchdev_handler_init(struct prestera_switchdev *swdev)
  1484. {
  1485. int err;
  1486. swdev->swdev_nb.notifier_call = prestera_switchdev_event;
  1487. err = register_switchdev_notifier(&swdev->swdev_nb);
  1488. if (err)
  1489. goto err_register_swdev_notifier;
  1490. swdev->swdev_nb_blk.notifier_call = prestera_switchdev_blk_event;
  1491. err = register_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
  1492. if (err)
  1493. goto err_register_blk_swdev_notifier;
  1494. return 0;
  1495. err_register_blk_swdev_notifier:
  1496. unregister_switchdev_notifier(&swdev->swdev_nb);
  1497. err_register_swdev_notifier:
  1498. destroy_workqueue(swdev_wq);
  1499. return err;
  1500. }
  1501. static void prestera_switchdev_handler_fini(struct prestera_switchdev *swdev)
  1502. {
  1503. unregister_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
  1504. unregister_switchdev_notifier(&swdev->swdev_nb);
  1505. }
  1506. int prestera_switchdev_init(struct prestera_switch *sw)
  1507. {
  1508. struct prestera_switchdev *swdev;
  1509. int err;
  1510. swdev = kzalloc(sizeof(*swdev), GFP_KERNEL);
  1511. if (!swdev)
  1512. return -ENOMEM;
  1513. sw->swdev = swdev;
  1514. swdev->sw = sw;
  1515. INIT_LIST_HEAD(&swdev->bridge_list);
  1516. swdev_wq = alloc_ordered_workqueue("%s_ordered", 0, "prestera_br");
  1517. if (!swdev_wq) {
  1518. err = -ENOMEM;
  1519. goto err_alloc_wq;
  1520. }
  1521. err = prestera_switchdev_handler_init(swdev);
  1522. if (err)
  1523. goto err_swdev_init;
  1524. err = prestera_fdb_init(sw);
  1525. if (err)
  1526. goto err_fdb_init;
  1527. return 0;
  1528. err_fdb_init:
  1529. err_swdev_init:
  1530. destroy_workqueue(swdev_wq);
  1531. err_alloc_wq:
  1532. kfree(swdev);
  1533. return err;
  1534. }
  1535. void prestera_switchdev_fini(struct prestera_switch *sw)
  1536. {
  1537. struct prestera_switchdev *swdev = sw->swdev;
  1538. prestera_fdb_fini(sw);
  1539. prestera_switchdev_handler_fini(swdev);
  1540. destroy_workqueue(swdev_wq);
  1541. kfree(swdev);
  1542. }