switchdev.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. /*
  2. * net/switchdev/switchdev.c - Switch device API
  3. * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
  4. * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/types.h>
  13. #include <linux/init.h>
  14. #include <linux/mutex.h>
  15. #include <linux/notifier.h>
  16. #include <linux/netdevice.h>
  17. #include <linux/if_bridge.h>
  18. #include <linux/list.h>
  19. #include <net/ip_fib.h>
  20. #include <net/switchdev.h>
  21. /**
  22. * switchdev_trans_item_enqueue - Enqueue data item to transaction queue
  23. *
  24. * @trans: transaction
  25. * @data: pointer to data being queued
  26. * @destructor: data destructor
  27. * @tritem: transaction item being queued
  28. *
  29. * Enqeueue data item to transaction queue. tritem is typically placed in
  30. * cointainter pointed at by data pointer. Destructor is called on
  31. * transaction abort and after successful commit phase in case
  32. * the caller did not dequeue the item before.
  33. */
  34. void switchdev_trans_item_enqueue(struct switchdev_trans *trans,
  35. void *data, void (*destructor)(void const *),
  36. struct switchdev_trans_item *tritem)
  37. {
  38. tritem->data = data;
  39. tritem->destructor = destructor;
  40. list_add_tail(&tritem->list, &trans->item_list);
  41. }
  42. EXPORT_SYMBOL_GPL(switchdev_trans_item_enqueue);
  43. static struct switchdev_trans_item *
  44. __switchdev_trans_item_dequeue(struct switchdev_trans *trans)
  45. {
  46. struct switchdev_trans_item *tritem;
  47. if (list_empty(&trans->item_list))
  48. return NULL;
  49. tritem = list_first_entry(&trans->item_list,
  50. struct switchdev_trans_item, list);
  51. list_del(&tritem->list);
  52. return tritem;
  53. }
  54. /**
  55. * switchdev_trans_item_dequeue - Dequeue data item from transaction queue
  56. *
  57. * @trans: transaction
  58. */
  59. void *switchdev_trans_item_dequeue(struct switchdev_trans *trans)
  60. {
  61. struct switchdev_trans_item *tritem;
  62. tritem = __switchdev_trans_item_dequeue(trans);
  63. BUG_ON(!tritem);
  64. return tritem->data;
  65. }
  66. EXPORT_SYMBOL_GPL(switchdev_trans_item_dequeue);
  67. static void switchdev_trans_init(struct switchdev_trans *trans)
  68. {
  69. INIT_LIST_HEAD(&trans->item_list);
  70. }
  71. static void switchdev_trans_items_destroy(struct switchdev_trans *trans)
  72. {
  73. struct switchdev_trans_item *tritem;
  74. while ((tritem = __switchdev_trans_item_dequeue(trans)))
  75. tritem->destructor(tritem->data);
  76. }
  77. static void switchdev_trans_items_warn_destroy(struct net_device *dev,
  78. struct switchdev_trans *trans)
  79. {
  80. WARN(!list_empty(&trans->item_list), "%s: transaction item queue is not empty.\n",
  81. dev->name);
  82. switchdev_trans_items_destroy(trans);
  83. }
  84. /**
  85. * switchdev_port_attr_get - Get port attribute
  86. *
  87. * @dev: port device
  88. * @attr: attribute to get
  89. */
  90. int switchdev_port_attr_get(struct net_device *dev, struct switchdev_attr *attr)
  91. {
  92. const struct switchdev_ops *ops = dev->switchdev_ops;
  93. struct net_device *lower_dev;
  94. struct list_head *iter;
  95. struct switchdev_attr first = {
  96. .id = SWITCHDEV_ATTR_ID_UNDEFINED
  97. };
  98. int err = -EOPNOTSUPP;
  99. if (ops && ops->switchdev_port_attr_get)
  100. return ops->switchdev_port_attr_get(dev, attr);
  101. if (attr->flags & SWITCHDEV_F_NO_RECURSE)
  102. return err;
  103. /* Switch device port(s) may be stacked under
  104. * bond/team/vlan dev, so recurse down to get attr on
  105. * each port. Return -ENODATA if attr values don't
  106. * compare across ports.
  107. */
  108. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  109. err = switchdev_port_attr_get(lower_dev, attr);
  110. if (err)
  111. break;
  112. if (first.id == SWITCHDEV_ATTR_ID_UNDEFINED)
  113. first = *attr;
  114. else if (memcmp(&first, attr, sizeof(*attr)))
  115. return -ENODATA;
  116. }
  117. return err;
  118. }
  119. EXPORT_SYMBOL_GPL(switchdev_port_attr_get);
  120. static int __switchdev_port_attr_set(struct net_device *dev,
  121. struct switchdev_attr *attr,
  122. struct switchdev_trans *trans)
  123. {
  124. const struct switchdev_ops *ops = dev->switchdev_ops;
  125. struct net_device *lower_dev;
  126. struct list_head *iter;
  127. int err = -EOPNOTSUPP;
  128. if (ops && ops->switchdev_port_attr_set)
  129. return ops->switchdev_port_attr_set(dev, attr, trans);
  130. if (attr->flags & SWITCHDEV_F_NO_RECURSE)
  131. return err;
  132. /* Switch device port(s) may be stacked under
  133. * bond/team/vlan dev, so recurse down to set attr on
  134. * each port.
  135. */
  136. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  137. err = __switchdev_port_attr_set(lower_dev, attr, trans);
  138. if (err)
  139. break;
  140. }
  141. return err;
  142. }
  143. struct switchdev_attr_set_work {
  144. struct work_struct work;
  145. struct net_device *dev;
  146. struct switchdev_attr attr;
  147. };
  148. static void switchdev_port_attr_set_work(struct work_struct *work)
  149. {
  150. struct switchdev_attr_set_work *asw =
  151. container_of(work, struct switchdev_attr_set_work, work);
  152. int err;
  153. rtnl_lock();
  154. err = switchdev_port_attr_set(asw->dev, &asw->attr);
  155. if (err && err != -EOPNOTSUPP)
  156. netdev_err(asw->dev, "failed (err=%d) to set attribute (id=%d)\n",
  157. err, asw->attr.id);
  158. rtnl_unlock();
  159. dev_put(asw->dev);
  160. kfree(work);
  161. }
  162. static int switchdev_port_attr_set_defer(struct net_device *dev,
  163. struct switchdev_attr *attr)
  164. {
  165. struct switchdev_attr_set_work *asw;
  166. asw = kmalloc(sizeof(*asw), GFP_ATOMIC);
  167. if (!asw)
  168. return -ENOMEM;
  169. INIT_WORK(&asw->work, switchdev_port_attr_set_work);
  170. dev_hold(dev);
  171. asw->dev = dev;
  172. memcpy(&asw->attr, attr, sizeof(asw->attr));
  173. schedule_work(&asw->work);
  174. return 0;
  175. }
  176. /**
  177. * switchdev_port_attr_set - Set port attribute
  178. *
  179. * @dev: port device
  180. * @attr: attribute to set
  181. *
  182. * Use a 2-phase prepare-commit transaction model to ensure
  183. * system is not left in a partially updated state due to
  184. * failure from driver/device.
  185. */
  186. int switchdev_port_attr_set(struct net_device *dev, struct switchdev_attr *attr)
  187. {
  188. struct switchdev_trans trans;
  189. int err;
  190. if (!rtnl_is_locked()) {
  191. /* Running prepare-commit transaction across stacked
  192. * devices requires nothing moves, so if rtnl_lock is
  193. * not held, schedule a worker thread to hold rtnl_lock
  194. * while setting attr.
  195. */
  196. return switchdev_port_attr_set_defer(dev, attr);
  197. }
  198. switchdev_trans_init(&trans);
  199. /* Phase I: prepare for attr set. Driver/device should fail
  200. * here if there are going to be issues in the commit phase,
  201. * such as lack of resources or support. The driver/device
  202. * should reserve resources needed for the commit phase here,
  203. * but should not commit the attr.
  204. */
  205. trans.ph_prepare = true;
  206. err = __switchdev_port_attr_set(dev, attr, &trans);
  207. if (err) {
  208. /* Prepare phase failed: abort the transaction. Any
  209. * resources reserved in the prepare phase are
  210. * released.
  211. */
  212. if (err != -EOPNOTSUPP)
  213. switchdev_trans_items_destroy(&trans);
  214. return err;
  215. }
  216. /* Phase II: commit attr set. This cannot fail as a fault
  217. * of driver/device. If it does, it's a bug in the driver/device
  218. * because the driver said everythings was OK in phase I.
  219. */
  220. trans.ph_prepare = false;
  221. err = __switchdev_port_attr_set(dev, attr, &trans);
  222. WARN(err, "%s: Commit of attribute (id=%d) failed.\n",
  223. dev->name, attr->id);
  224. switchdev_trans_items_warn_destroy(dev, &trans);
  225. return err;
  226. }
  227. EXPORT_SYMBOL_GPL(switchdev_port_attr_set);
  228. static int __switchdev_port_obj_add(struct net_device *dev,
  229. enum switchdev_obj_id id,
  230. const struct switchdev_obj *obj,
  231. struct switchdev_trans *trans)
  232. {
  233. const struct switchdev_ops *ops = dev->switchdev_ops;
  234. struct net_device *lower_dev;
  235. struct list_head *iter;
  236. int err = -EOPNOTSUPP;
  237. if (ops && ops->switchdev_port_obj_add)
  238. return ops->switchdev_port_obj_add(dev, id, obj, trans);
  239. /* Switch device port(s) may be stacked under
  240. * bond/team/vlan dev, so recurse down to add object on
  241. * each port.
  242. */
  243. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  244. err = __switchdev_port_obj_add(lower_dev, id, obj, trans);
  245. if (err)
  246. break;
  247. }
  248. return err;
  249. }
  250. /**
  251. * switchdev_port_obj_add - Add port object
  252. *
  253. * @dev: port device
  254. * @id: object ID
  255. * @obj: object to add
  256. *
  257. * Use a 2-phase prepare-commit transaction model to ensure
  258. * system is not left in a partially updated state due to
  259. * failure from driver/device.
  260. *
  261. * rtnl_lock must be held.
  262. */
  263. int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id,
  264. const struct switchdev_obj *obj)
  265. {
  266. struct switchdev_trans trans;
  267. int err;
  268. ASSERT_RTNL();
  269. switchdev_trans_init(&trans);
  270. /* Phase I: prepare for obj add. Driver/device should fail
  271. * here if there are going to be issues in the commit phase,
  272. * such as lack of resources or support. The driver/device
  273. * should reserve resources needed for the commit phase here,
  274. * but should not commit the obj.
  275. */
  276. trans.ph_prepare = true;
  277. err = __switchdev_port_obj_add(dev, id, obj, &trans);
  278. if (err) {
  279. /* Prepare phase failed: abort the transaction. Any
  280. * resources reserved in the prepare phase are
  281. * released.
  282. */
  283. if (err != -EOPNOTSUPP)
  284. switchdev_trans_items_destroy(&trans);
  285. return err;
  286. }
  287. /* Phase II: commit obj add. This cannot fail as a fault
  288. * of driver/device. If it does, it's a bug in the driver/device
  289. * because the driver said everythings was OK in phase I.
  290. */
  291. trans.ph_prepare = false;
  292. err = __switchdev_port_obj_add(dev, id, obj, &trans);
  293. WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, id);
  294. switchdev_trans_items_warn_destroy(dev, &trans);
  295. return err;
  296. }
  297. EXPORT_SYMBOL_GPL(switchdev_port_obj_add);
  298. /**
  299. * switchdev_port_obj_del - Delete port object
  300. *
  301. * @dev: port device
  302. * @id: object ID
  303. * @obj: object to delete
  304. */
  305. int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id,
  306. const struct switchdev_obj *obj)
  307. {
  308. const struct switchdev_ops *ops = dev->switchdev_ops;
  309. struct net_device *lower_dev;
  310. struct list_head *iter;
  311. int err = -EOPNOTSUPP;
  312. if (ops && ops->switchdev_port_obj_del)
  313. return ops->switchdev_port_obj_del(dev, id, obj);
  314. /* Switch device port(s) may be stacked under
  315. * bond/team/vlan dev, so recurse down to delete object on
  316. * each port.
  317. */
  318. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  319. err = switchdev_port_obj_del(lower_dev, id, obj);
  320. if (err)
  321. break;
  322. }
  323. return err;
  324. }
  325. EXPORT_SYMBOL_GPL(switchdev_port_obj_del);
  326. /**
  327. * switchdev_port_obj_dump - Dump port objects
  328. *
  329. * @dev: port device
  330. * @id: object ID
  331. * @obj: object to dump
  332. * @cb: function to call with a filled object
  333. */
  334. int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id,
  335. struct switchdev_obj *obj,
  336. switchdev_obj_dump_cb_t *cb)
  337. {
  338. const struct switchdev_ops *ops = dev->switchdev_ops;
  339. struct net_device *lower_dev;
  340. struct list_head *iter;
  341. int err = -EOPNOTSUPP;
  342. if (ops && ops->switchdev_port_obj_dump)
  343. return ops->switchdev_port_obj_dump(dev, id, obj, cb);
  344. /* Switch device port(s) may be stacked under
  345. * bond/team/vlan dev, so recurse down to dump objects on
  346. * first port at bottom of stack.
  347. */
  348. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  349. err = switchdev_port_obj_dump(lower_dev, id, obj, cb);
  350. break;
  351. }
  352. return err;
  353. }
  354. EXPORT_SYMBOL_GPL(switchdev_port_obj_dump);
  355. static DEFINE_MUTEX(switchdev_mutex);
  356. static RAW_NOTIFIER_HEAD(switchdev_notif_chain);
  357. /**
  358. * register_switchdev_notifier - Register notifier
  359. * @nb: notifier_block
  360. *
  361. * Register switch device notifier. This should be used by code
  362. * which needs to monitor events happening in particular device.
  363. * Return values are same as for atomic_notifier_chain_register().
  364. */
  365. int register_switchdev_notifier(struct notifier_block *nb)
  366. {
  367. int err;
  368. mutex_lock(&switchdev_mutex);
  369. err = raw_notifier_chain_register(&switchdev_notif_chain, nb);
  370. mutex_unlock(&switchdev_mutex);
  371. return err;
  372. }
  373. EXPORT_SYMBOL_GPL(register_switchdev_notifier);
  374. /**
  375. * unregister_switchdev_notifier - Unregister notifier
  376. * @nb: notifier_block
  377. *
  378. * Unregister switch device notifier.
  379. * Return values are same as for atomic_notifier_chain_unregister().
  380. */
  381. int unregister_switchdev_notifier(struct notifier_block *nb)
  382. {
  383. int err;
  384. mutex_lock(&switchdev_mutex);
  385. err = raw_notifier_chain_unregister(&switchdev_notif_chain, nb);
  386. mutex_unlock(&switchdev_mutex);
  387. return err;
  388. }
  389. EXPORT_SYMBOL_GPL(unregister_switchdev_notifier);
  390. /**
  391. * call_switchdev_notifiers - Call notifiers
  392. * @val: value passed unmodified to notifier function
  393. * @dev: port device
  394. * @info: notifier information data
  395. *
  396. * Call all network notifier blocks. This should be called by driver
  397. * when it needs to propagate hardware event.
  398. * Return values are same as for atomic_notifier_call_chain().
  399. */
  400. int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
  401. struct switchdev_notifier_info *info)
  402. {
  403. int err;
  404. info->dev = dev;
  405. mutex_lock(&switchdev_mutex);
  406. err = raw_notifier_call_chain(&switchdev_notif_chain, val, info);
  407. mutex_unlock(&switchdev_mutex);
  408. return err;
  409. }
  410. EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
  411. struct switchdev_vlan_dump {
  412. struct switchdev_obj_port_vlan vlan;
  413. struct sk_buff *skb;
  414. u32 filter_mask;
  415. u16 flags;
  416. u16 begin;
  417. u16 end;
  418. };
  419. static int switchdev_port_vlan_dump_put(struct switchdev_vlan_dump *dump)
  420. {
  421. struct bridge_vlan_info vinfo;
  422. vinfo.flags = dump->flags;
  423. if (dump->begin == 0 && dump->end == 0) {
  424. return 0;
  425. } else if (dump->begin == dump->end) {
  426. vinfo.vid = dump->begin;
  427. if (nla_put(dump->skb, IFLA_BRIDGE_VLAN_INFO,
  428. sizeof(vinfo), &vinfo))
  429. return -EMSGSIZE;
  430. } else {
  431. vinfo.vid = dump->begin;
  432. vinfo.flags |= BRIDGE_VLAN_INFO_RANGE_BEGIN;
  433. if (nla_put(dump->skb, IFLA_BRIDGE_VLAN_INFO,
  434. sizeof(vinfo), &vinfo))
  435. return -EMSGSIZE;
  436. vinfo.vid = dump->end;
  437. vinfo.flags &= ~BRIDGE_VLAN_INFO_RANGE_BEGIN;
  438. vinfo.flags |= BRIDGE_VLAN_INFO_RANGE_END;
  439. if (nla_put(dump->skb, IFLA_BRIDGE_VLAN_INFO,
  440. sizeof(vinfo), &vinfo))
  441. return -EMSGSIZE;
  442. }
  443. return 0;
  444. }
  445. static int switchdev_port_vlan_dump_cb(struct switchdev_obj *obj)
  446. {
  447. struct switchdev_obj_port_vlan *vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
  448. struct switchdev_vlan_dump *dump =
  449. container_of(vlan, struct switchdev_vlan_dump, vlan);
  450. int err = 0;
  451. if (vlan->vid_begin > vlan->vid_end)
  452. return -EINVAL;
  453. if (dump->filter_mask & RTEXT_FILTER_BRVLAN) {
  454. dump->flags = vlan->flags;
  455. for (dump->begin = dump->end = vlan->vid_begin;
  456. dump->begin <= vlan->vid_end;
  457. dump->begin++, dump->end++) {
  458. err = switchdev_port_vlan_dump_put(dump);
  459. if (err)
  460. return err;
  461. }
  462. } else if (dump->filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED) {
  463. if (dump->begin > vlan->vid_begin &&
  464. dump->begin >= vlan->vid_end) {
  465. if ((dump->begin - 1) == vlan->vid_end &&
  466. dump->flags == vlan->flags) {
  467. /* prepend */
  468. dump->begin = vlan->vid_begin;
  469. } else {
  470. err = switchdev_port_vlan_dump_put(dump);
  471. dump->flags = vlan->flags;
  472. dump->begin = vlan->vid_begin;
  473. dump->end = vlan->vid_end;
  474. }
  475. } else if (dump->end <= vlan->vid_begin &&
  476. dump->end < vlan->vid_end) {
  477. if ((dump->end + 1) == vlan->vid_begin &&
  478. dump->flags == vlan->flags) {
  479. /* append */
  480. dump->end = vlan->vid_end;
  481. } else {
  482. err = switchdev_port_vlan_dump_put(dump);
  483. dump->flags = vlan->flags;
  484. dump->begin = vlan->vid_begin;
  485. dump->end = vlan->vid_end;
  486. }
  487. } else {
  488. err = -EINVAL;
  489. }
  490. }
  491. return err;
  492. }
  493. static int switchdev_port_vlan_fill(struct sk_buff *skb, struct net_device *dev,
  494. u32 filter_mask)
  495. {
  496. struct switchdev_vlan_dump dump = {
  497. .skb = skb,
  498. .filter_mask = filter_mask,
  499. };
  500. int err = 0;
  501. if ((filter_mask & RTEXT_FILTER_BRVLAN) ||
  502. (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) {
  503. err = switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_ID_PORT_VLAN,
  504. &dump.vlan.obj,
  505. switchdev_port_vlan_dump_cb);
  506. if (err)
  507. goto err_out;
  508. if (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)
  509. /* last one */
  510. err = switchdev_port_vlan_dump_put(&dump);
  511. }
  512. err_out:
  513. return err == -EOPNOTSUPP ? 0 : err;
  514. }
  515. /**
  516. * switchdev_port_bridge_getlink - Get bridge port attributes
  517. *
  518. * @dev: port device
  519. *
  520. * Called for SELF on rtnl_bridge_getlink to get bridge port
  521. * attributes.
  522. */
  523. int switchdev_port_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
  524. struct net_device *dev, u32 filter_mask,
  525. int nlflags)
  526. {
  527. struct switchdev_attr attr = {
  528. .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
  529. };
  530. u16 mode = BRIDGE_MODE_UNDEF;
  531. u32 mask = BR_LEARNING | BR_LEARNING_SYNC;
  532. int err;
  533. err = switchdev_port_attr_get(dev, &attr);
  534. if (err && err != -EOPNOTSUPP)
  535. return err;
  536. return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode,
  537. attr.u.brport_flags, mask, nlflags,
  538. filter_mask, switchdev_port_vlan_fill);
  539. }
  540. EXPORT_SYMBOL_GPL(switchdev_port_bridge_getlink);
  541. static int switchdev_port_br_setflag(struct net_device *dev,
  542. struct nlattr *nlattr,
  543. unsigned long brport_flag)
  544. {
  545. struct switchdev_attr attr = {
  546. .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
  547. };
  548. u8 flag = nla_get_u8(nlattr);
  549. int err;
  550. err = switchdev_port_attr_get(dev, &attr);
  551. if (err)
  552. return err;
  553. if (flag)
  554. attr.u.brport_flags |= brport_flag;
  555. else
  556. attr.u.brport_flags &= ~brport_flag;
  557. return switchdev_port_attr_set(dev, &attr);
  558. }
  559. static const struct nla_policy
  560. switchdev_port_bridge_policy[IFLA_BRPORT_MAX + 1] = {
  561. [IFLA_BRPORT_STATE] = { .type = NLA_U8 },
  562. [IFLA_BRPORT_COST] = { .type = NLA_U32 },
  563. [IFLA_BRPORT_PRIORITY] = { .type = NLA_U16 },
  564. [IFLA_BRPORT_MODE] = { .type = NLA_U8 },
  565. [IFLA_BRPORT_GUARD] = { .type = NLA_U8 },
  566. [IFLA_BRPORT_PROTECT] = { .type = NLA_U8 },
  567. [IFLA_BRPORT_FAST_LEAVE] = { .type = NLA_U8 },
  568. [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 },
  569. [IFLA_BRPORT_LEARNING_SYNC] = { .type = NLA_U8 },
  570. [IFLA_BRPORT_UNICAST_FLOOD] = { .type = NLA_U8 },
  571. };
  572. static int switchdev_port_br_setlink_protinfo(struct net_device *dev,
  573. struct nlattr *protinfo)
  574. {
  575. struct nlattr *attr;
  576. int rem;
  577. int err;
  578. err = nla_validate_nested(protinfo, IFLA_BRPORT_MAX,
  579. switchdev_port_bridge_policy);
  580. if (err)
  581. return err;
  582. nla_for_each_nested(attr, protinfo, rem) {
  583. switch (nla_type(attr)) {
  584. case IFLA_BRPORT_LEARNING:
  585. err = switchdev_port_br_setflag(dev, attr,
  586. BR_LEARNING);
  587. break;
  588. case IFLA_BRPORT_LEARNING_SYNC:
  589. err = switchdev_port_br_setflag(dev, attr,
  590. BR_LEARNING_SYNC);
  591. break;
  592. default:
  593. err = -EOPNOTSUPP;
  594. break;
  595. }
  596. if (err)
  597. return err;
  598. }
  599. return 0;
  600. }
  601. static int switchdev_port_br_afspec(struct net_device *dev,
  602. struct nlattr *afspec,
  603. int (*f)(struct net_device *dev,
  604. enum switchdev_obj_id id,
  605. const struct switchdev_obj *obj))
  606. {
  607. struct nlattr *attr;
  608. struct bridge_vlan_info *vinfo;
  609. struct switchdev_obj_port_vlan vlan = { {}, 0 };
  610. int rem;
  611. int err;
  612. nla_for_each_nested(attr, afspec, rem) {
  613. if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
  614. continue;
  615. if (nla_len(attr) != sizeof(struct bridge_vlan_info))
  616. return -EINVAL;
  617. vinfo = nla_data(attr);
  618. vlan.flags = vinfo->flags;
  619. if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
  620. if (vlan.vid_begin)
  621. return -EINVAL;
  622. vlan.vid_begin = vinfo->vid;
  623. } else if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END) {
  624. if (!vlan.vid_begin)
  625. return -EINVAL;
  626. vlan.vid_end = vinfo->vid;
  627. if (vlan.vid_end <= vlan.vid_begin)
  628. return -EINVAL;
  629. err = f(dev, SWITCHDEV_OBJ_ID_PORT_VLAN, &vlan.obj);
  630. if (err)
  631. return err;
  632. memset(&vlan, 0, sizeof(vlan));
  633. } else {
  634. if (vlan.vid_begin)
  635. return -EINVAL;
  636. vlan.vid_begin = vinfo->vid;
  637. vlan.vid_end = vinfo->vid;
  638. err = f(dev, SWITCHDEV_OBJ_ID_PORT_VLAN, &vlan.obj);
  639. if (err)
  640. return err;
  641. memset(&vlan, 0, sizeof(vlan));
  642. }
  643. }
  644. return 0;
  645. }
  646. /**
  647. * switchdev_port_bridge_setlink - Set bridge port attributes
  648. *
  649. * @dev: port device
  650. * @nlh: netlink header
  651. * @flags: netlink flags
  652. *
  653. * Called for SELF on rtnl_bridge_setlink to set bridge port
  654. * attributes.
  655. */
  656. int switchdev_port_bridge_setlink(struct net_device *dev,
  657. struct nlmsghdr *nlh, u16 flags)
  658. {
  659. struct nlattr *protinfo;
  660. struct nlattr *afspec;
  661. int err = 0;
  662. protinfo = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg),
  663. IFLA_PROTINFO);
  664. if (protinfo) {
  665. err = switchdev_port_br_setlink_protinfo(dev, protinfo);
  666. if (err)
  667. return err;
  668. }
  669. afspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg),
  670. IFLA_AF_SPEC);
  671. if (afspec)
  672. err = switchdev_port_br_afspec(dev, afspec,
  673. switchdev_port_obj_add);
  674. return err;
  675. }
  676. EXPORT_SYMBOL_GPL(switchdev_port_bridge_setlink);
  677. /**
  678. * switchdev_port_bridge_dellink - Set bridge port attributes
  679. *
  680. * @dev: port device
  681. * @nlh: netlink header
  682. * @flags: netlink flags
  683. *
  684. * Called for SELF on rtnl_bridge_dellink to set bridge port
  685. * attributes.
  686. */
  687. int switchdev_port_bridge_dellink(struct net_device *dev,
  688. struct nlmsghdr *nlh, u16 flags)
  689. {
  690. struct nlattr *afspec;
  691. afspec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg),
  692. IFLA_AF_SPEC);
  693. if (afspec)
  694. return switchdev_port_br_afspec(dev, afspec,
  695. switchdev_port_obj_del);
  696. return 0;
  697. }
  698. EXPORT_SYMBOL_GPL(switchdev_port_bridge_dellink);
  699. /**
  700. * switchdev_port_fdb_add - Add FDB (MAC/VLAN) entry to port
  701. *
  702. * @ndmsg: netlink hdr
  703. * @nlattr: netlink attributes
  704. * @dev: port device
  705. * @addr: MAC address to add
  706. * @vid: VLAN to add
  707. *
  708. * Add FDB entry to switch device.
  709. */
  710. int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
  711. struct net_device *dev, const unsigned char *addr,
  712. u16 vid, u16 nlm_flags)
  713. {
  714. struct switchdev_obj_port_fdb fdb = {
  715. .addr = addr,
  716. .vid = vid,
  717. };
  718. return switchdev_port_obj_add(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &fdb.obj);
  719. }
  720. EXPORT_SYMBOL_GPL(switchdev_port_fdb_add);
  721. /**
  722. * switchdev_port_fdb_del - Delete FDB (MAC/VLAN) entry from port
  723. *
  724. * @ndmsg: netlink hdr
  725. * @nlattr: netlink attributes
  726. * @dev: port device
  727. * @addr: MAC address to delete
  728. * @vid: VLAN to delete
  729. *
  730. * Delete FDB entry from switch device.
  731. */
  732. int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
  733. struct net_device *dev, const unsigned char *addr,
  734. u16 vid)
  735. {
  736. struct switchdev_obj_port_fdb fdb = {
  737. .addr = addr,
  738. .vid = vid,
  739. };
  740. return switchdev_port_obj_del(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &fdb.obj);
  741. }
  742. EXPORT_SYMBOL_GPL(switchdev_port_fdb_del);
  743. struct switchdev_fdb_dump {
  744. struct switchdev_obj_port_fdb fdb;
  745. struct net_device *dev;
  746. struct sk_buff *skb;
  747. struct netlink_callback *cb;
  748. int idx;
  749. };
  750. static int switchdev_port_fdb_dump_cb(struct switchdev_obj *obj)
  751. {
  752. struct switchdev_obj_port_fdb *fdb = SWITCHDEV_OBJ_PORT_FDB(obj);
  753. struct switchdev_fdb_dump *dump =
  754. container_of(fdb, struct switchdev_fdb_dump, fdb);
  755. u32 portid = NETLINK_CB(dump->cb->skb).portid;
  756. u32 seq = dump->cb->nlh->nlmsg_seq;
  757. struct nlmsghdr *nlh;
  758. struct ndmsg *ndm;
  759. if (dump->idx < dump->cb->args[0])
  760. goto skip;
  761. nlh = nlmsg_put(dump->skb, portid, seq, RTM_NEWNEIGH,
  762. sizeof(*ndm), NLM_F_MULTI);
  763. if (!nlh)
  764. return -EMSGSIZE;
  765. ndm = nlmsg_data(nlh);
  766. ndm->ndm_family = AF_BRIDGE;
  767. ndm->ndm_pad1 = 0;
  768. ndm->ndm_pad2 = 0;
  769. ndm->ndm_flags = NTF_SELF;
  770. ndm->ndm_type = 0;
  771. ndm->ndm_ifindex = dump->dev->ifindex;
  772. ndm->ndm_state = fdb->ndm_state;
  773. if (nla_put(dump->skb, NDA_LLADDR, ETH_ALEN, fdb->addr))
  774. goto nla_put_failure;
  775. if (fdb->vid && nla_put_u16(dump->skb, NDA_VLAN, fdb->vid))
  776. goto nla_put_failure;
  777. nlmsg_end(dump->skb, nlh);
  778. skip:
  779. dump->idx++;
  780. return 0;
  781. nla_put_failure:
  782. nlmsg_cancel(dump->skb, nlh);
  783. return -EMSGSIZE;
  784. }
  785. /**
  786. * switchdev_port_fdb_dump - Dump port FDB (MAC/VLAN) entries
  787. *
  788. * @skb: netlink skb
  789. * @cb: netlink callback
  790. * @dev: port device
  791. * @filter_dev: filter device
  792. * @idx:
  793. *
  794. * Delete FDB entry from switch device.
  795. */
  796. int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
  797. struct net_device *dev,
  798. struct net_device *filter_dev, int idx)
  799. {
  800. struct switchdev_fdb_dump dump = {
  801. .dev = dev,
  802. .skb = skb,
  803. .cb = cb,
  804. .idx = idx,
  805. };
  806. switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_ID_PORT_FDB, &dump.fdb.obj,
  807. switchdev_port_fdb_dump_cb);
  808. return dump.idx;
  809. }
  810. EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump);
  811. static struct net_device *switchdev_get_lowest_dev(struct net_device *dev)
  812. {
  813. const struct switchdev_ops *ops = dev->switchdev_ops;
  814. struct net_device *lower_dev;
  815. struct net_device *port_dev;
  816. struct list_head *iter;
  817. /* Recusively search down until we find a sw port dev.
  818. * (A sw port dev supports switchdev_port_attr_get).
  819. */
  820. if (ops && ops->switchdev_port_attr_get)
  821. return dev;
  822. netdev_for_each_lower_dev(dev, lower_dev, iter) {
  823. port_dev = switchdev_get_lowest_dev(lower_dev);
  824. if (port_dev)
  825. return port_dev;
  826. }
  827. return NULL;
  828. }
  829. static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi)
  830. {
  831. struct switchdev_attr attr = {
  832. .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
  833. };
  834. struct switchdev_attr prev_attr;
  835. struct net_device *dev = NULL;
  836. int nhsel;
  837. /* For this route, all nexthop devs must be on the same switch. */
  838. for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
  839. const struct fib_nh *nh = &fi->fib_nh[nhsel];
  840. if (!nh->nh_dev)
  841. return NULL;
  842. dev = switchdev_get_lowest_dev(nh->nh_dev);
  843. if (!dev)
  844. return NULL;
  845. if (switchdev_port_attr_get(dev, &attr))
  846. return NULL;
  847. if (nhsel > 0 &&
  848. !netdev_phys_item_id_same(&prev_attr.u.ppid, &attr.u.ppid))
  849. return NULL;
  850. prev_attr = attr;
  851. }
  852. return dev;
  853. }
  854. /**
  855. * switchdev_fib_ipv4_add - Add/modify switch IPv4 route entry
  856. *
  857. * @dst: route's IPv4 destination address
  858. * @dst_len: destination address length (prefix length)
  859. * @fi: route FIB info structure
  860. * @tos: route TOS
  861. * @type: route type
  862. * @nlflags: netlink flags passed in (NLM_F_*)
  863. * @tb_id: route table ID
  864. *
  865. * Add/modify switch IPv4 route entry.
  866. */
  867. int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
  868. u8 tos, u8 type, u32 nlflags, u32 tb_id)
  869. {
  870. struct switchdev_obj_ipv4_fib ipv4_fib = {
  871. .dst = dst,
  872. .dst_len = dst_len,
  873. .fi = fi,
  874. .tos = tos,
  875. .type = type,
  876. .nlflags = nlflags,
  877. .tb_id = tb_id,
  878. };
  879. struct net_device *dev;
  880. int err = 0;
  881. /* Don't offload route if using custom ip rules or if
  882. * IPv4 FIB offloading has been disabled completely.
  883. */
  884. #ifdef CONFIG_IP_MULTIPLE_TABLES
  885. if (fi->fib_net->ipv4.fib_has_custom_rules)
  886. return 0;
  887. #endif
  888. if (fi->fib_net->ipv4.fib_offload_disabled)
  889. return 0;
  890. dev = switchdev_get_dev_by_nhs(fi);
  891. if (!dev)
  892. return 0;
  893. err = switchdev_port_obj_add(dev, SWITCHDEV_OBJ_ID_IPV4_FIB,
  894. &ipv4_fib.obj);
  895. if (!err)
  896. fi->fib_flags |= RTNH_F_OFFLOAD;
  897. return err == -EOPNOTSUPP ? 0 : err;
  898. }
  899. EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_add);
  900. /**
  901. * switchdev_fib_ipv4_del - Delete IPv4 route entry from switch
  902. *
  903. * @dst: route's IPv4 destination address
  904. * @dst_len: destination address length (prefix length)
  905. * @fi: route FIB info structure
  906. * @tos: route TOS
  907. * @type: route type
  908. * @tb_id: route table ID
  909. *
  910. * Delete IPv4 route entry from switch device.
  911. */
  912. int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
  913. u8 tos, u8 type, u32 tb_id)
  914. {
  915. struct switchdev_obj_ipv4_fib ipv4_fib = {
  916. .dst = dst,
  917. .dst_len = dst_len,
  918. .fi = fi,
  919. .tos = tos,
  920. .type = type,
  921. .nlflags = 0,
  922. .tb_id = tb_id,
  923. };
  924. struct net_device *dev;
  925. int err = 0;
  926. if (!(fi->fib_flags & RTNH_F_OFFLOAD))
  927. return 0;
  928. dev = switchdev_get_dev_by_nhs(fi);
  929. if (!dev)
  930. return 0;
  931. err = switchdev_port_obj_del(dev, SWITCHDEV_OBJ_ID_IPV4_FIB,
  932. &ipv4_fib.obj);
  933. if (!err)
  934. fi->fib_flags &= ~RTNH_F_OFFLOAD;
  935. return err == -EOPNOTSUPP ? 0 : err;
  936. }
  937. EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_del);
  938. /**
  939. * switchdev_fib_ipv4_abort - Abort an IPv4 FIB operation
  940. *
  941. * @fi: route FIB info structure
  942. */
  943. void switchdev_fib_ipv4_abort(struct fib_info *fi)
  944. {
  945. /* There was a problem installing this route to the offload
  946. * device. For now, until we come up with more refined
  947. * policy handling, abruptly end IPv4 fib offloading for
  948. * for entire net by flushing offload device(s) of all
  949. * IPv4 routes, and mark IPv4 fib offloading broken from
  950. * this point forward.
  951. */
  952. fib_flush_external(fi->fib_net);
  953. fi->fib_net->ipv4.fib_offload_disabled = true;
  954. }
  955. EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_abort);
  956. static bool switchdev_port_same_parent_id(struct net_device *a,
  957. struct net_device *b)
  958. {
  959. struct switchdev_attr a_attr = {
  960. .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
  961. .flags = SWITCHDEV_F_NO_RECURSE,
  962. };
  963. struct switchdev_attr b_attr = {
  964. .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
  965. .flags = SWITCHDEV_F_NO_RECURSE,
  966. };
  967. if (switchdev_port_attr_get(a, &a_attr) ||
  968. switchdev_port_attr_get(b, &b_attr))
  969. return false;
  970. return netdev_phys_item_id_same(&a_attr.u.ppid, &b_attr.u.ppid);
  971. }
  972. static u32 switchdev_port_fwd_mark_get(struct net_device *dev,
  973. struct net_device *group_dev)
  974. {
  975. struct net_device *lower_dev;
  976. struct list_head *iter;
  977. netdev_for_each_lower_dev(group_dev, lower_dev, iter) {
  978. if (lower_dev == dev)
  979. continue;
  980. if (switchdev_port_same_parent_id(dev, lower_dev))
  981. return lower_dev->offload_fwd_mark;
  982. return switchdev_port_fwd_mark_get(dev, lower_dev);
  983. }
  984. return dev->ifindex;
  985. }
  986. static void switchdev_port_fwd_mark_reset(struct net_device *group_dev,
  987. u32 old_mark, u32 *reset_mark)
  988. {
  989. struct net_device *lower_dev;
  990. struct list_head *iter;
  991. netdev_for_each_lower_dev(group_dev, lower_dev, iter) {
  992. if (lower_dev->offload_fwd_mark == old_mark) {
  993. if (!*reset_mark)
  994. *reset_mark = lower_dev->ifindex;
  995. lower_dev->offload_fwd_mark = *reset_mark;
  996. }
  997. switchdev_port_fwd_mark_reset(lower_dev, old_mark, reset_mark);
  998. }
  999. }
  1000. /**
  1001. * switchdev_port_fwd_mark_set - Set port offload forwarding mark
  1002. *
  1003. * @dev: port device
  1004. * @group_dev: containing device
  1005. * @joining: true if dev is joining group; false if leaving group
  1006. *
  1007. * An ungrouped port's offload mark is just its ifindex. A grouped
  1008. * port's (member of a bridge, for example) offload mark is the ifindex
  1009. * of one of the ports in the group with the same parent (switch) ID.
  1010. * Ports on the same device in the same group will have the same mark.
  1011. *
  1012. * Example:
  1013. *
  1014. * br0 ifindex=9
  1015. * sw1p1 ifindex=2 mark=2
  1016. * sw1p2 ifindex=3 mark=2
  1017. * sw2p1 ifindex=4 mark=5
  1018. * sw2p2 ifindex=5 mark=5
  1019. *
  1020. * If sw2p2 leaves the bridge, we'll have:
  1021. *
  1022. * br0 ifindex=9
  1023. * sw1p1 ifindex=2 mark=2
  1024. * sw1p2 ifindex=3 mark=2
  1025. * sw2p1 ifindex=4 mark=4
  1026. * sw2p2 ifindex=5 mark=5
  1027. */
  1028. void switchdev_port_fwd_mark_set(struct net_device *dev,
  1029. struct net_device *group_dev,
  1030. bool joining)
  1031. {
  1032. u32 mark = dev->ifindex;
  1033. u32 reset_mark = 0;
  1034. if (group_dev && joining) {
  1035. mark = switchdev_port_fwd_mark_get(dev, group_dev);
  1036. } else if (group_dev && !joining) {
  1037. if (dev->offload_fwd_mark == mark)
  1038. /* Ohoh, this port was the mark reference port,
  1039. * but it's leaving the group, so reset the
  1040. * mark for the remaining ports in the group.
  1041. */
  1042. switchdev_port_fwd_mark_reset(group_dev, mark,
  1043. &reset_mark);
  1044. }
  1045. dev->offload_fwd_mark = mark;
  1046. }
  1047. EXPORT_SYMBOL_GPL(switchdev_port_fwd_mark_set);