0001
0002
0003
0004 #include <linux/if_bridge.h>
0005 #include <linux/if_vlan.h>
0006 #include <linux/kernel.h>
0007 #include <linux/module.h>
0008 #include <linux/notifier.h>
0009 #include <net/netevent.h>
0010 #include <net/switchdev.h>
0011
0012 #include "prestera.h"
0013 #include "prestera_hw.h"
0014 #include "prestera_switchdev.h"
0015
0016 #define PRESTERA_VID_ALL (0xffff)
0017
0018 #define PRESTERA_DEFAULT_AGEING_TIME_MS 300000
0019 #define PRESTERA_MAX_AGEING_TIME_MS 1000000000
0020 #define PRESTERA_MIN_AGEING_TIME_MS 32000
0021
0022 struct prestera_fdb_event_work {
0023 struct work_struct work;
0024 struct switchdev_notifier_fdb_info fdb_info;
0025 struct net_device *dev;
0026 unsigned long event;
0027 };
0028
0029 struct prestera_switchdev {
0030 struct prestera_switch *sw;
0031 struct list_head bridge_list;
0032 bool bridge_8021q_exists;
0033 struct notifier_block swdev_nb_blk;
0034 struct notifier_block swdev_nb;
0035 };
0036
0037 struct prestera_bridge {
0038 struct list_head head;
0039 struct net_device *dev;
0040 struct prestera_switchdev *swdev;
0041 struct list_head port_list;
0042 struct list_head br_mdb_entry_list;
0043 bool mrouter_exist;
0044 bool vlan_enabled;
0045 bool multicast_enabled;
0046 u16 bridge_id;
0047 };
0048
0049 struct prestera_bridge_port {
0050 struct list_head head;
0051 struct net_device *dev;
0052 struct prestera_bridge *bridge;
0053 struct list_head vlan_list;
0054 struct list_head br_mdb_port_list;
0055 refcount_t ref_count;
0056 unsigned long flags;
0057 bool mrouter;
0058 u8 stp_state;
0059 };
0060
0061 struct prestera_bridge_vlan {
0062 struct list_head head;
0063 struct list_head port_vlan_list;
0064 u16 vid;
0065 };
0066
0067 struct prestera_port_vlan {
0068 struct list_head br_vlan_head;
0069 struct list_head port_head;
0070 struct prestera_port *port;
0071 struct prestera_bridge_port *br_port;
0072 u16 vid;
0073 };
0074
0075 struct prestera_br_mdb_port {
0076 struct prestera_bridge_port *br_port;
0077 struct list_head br_mdb_port_node;
0078 };
0079
0080
0081 struct prestera_br_mdb_entry {
0082 struct prestera_bridge *bridge;
0083 struct prestera_mdb_entry *mdb;
0084 struct list_head br_mdb_port_list;
0085 struct list_head br_mdb_entry_node;
0086 bool enabled;
0087 };
0088
0089 static struct workqueue_struct *swdev_wq;
0090
0091 static void prestera_bridge_port_put(struct prestera_bridge_port *br_port);
0092
0093 static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
0094 u8 state);
0095
0096 static struct prestera_bridge *
0097 prestera_bridge_find(const struct prestera_switch *sw,
0098 const struct net_device *br_dev)
0099 {
0100 struct prestera_bridge *bridge;
0101
0102 list_for_each_entry(bridge, &sw->swdev->bridge_list, head)
0103 if (bridge->dev == br_dev)
0104 return bridge;
0105
0106 return NULL;
0107 }
0108
0109 static struct prestera_bridge_port *
0110 __prestera_bridge_port_find(const struct prestera_bridge *bridge,
0111 const struct net_device *brport_dev)
0112 {
0113 struct prestera_bridge_port *br_port;
0114
0115 list_for_each_entry(br_port, &bridge->port_list, head)
0116 if (br_port->dev == brport_dev)
0117 return br_port;
0118
0119 return NULL;
0120 }
0121
0122 static struct prestera_bridge_port *
0123 prestera_bridge_port_find(struct prestera_switch *sw,
0124 struct net_device *brport_dev)
0125 {
0126 struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
0127 struct prestera_bridge *bridge;
0128
0129 if (!br_dev)
0130 return NULL;
0131
0132 bridge = prestera_bridge_find(sw, br_dev);
0133 if (!bridge)
0134 return NULL;
0135
0136 return __prestera_bridge_port_find(bridge, brport_dev);
0137 }
0138
0139 static void
0140 prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
0141 struct prestera_port *port)
0142 {
0143 prestera_port_uc_flood_set(port, false);
0144 prestera_port_mc_flood_set(port, false);
0145 prestera_port_learning_set(port, false);
0146 }
0147
0148 static int prestera_br_port_flags_set(struct prestera_bridge_port *br_port,
0149 struct prestera_port *port)
0150 {
0151 int err;
0152
0153 err = prestera_port_uc_flood_set(port, br_port->flags & BR_FLOOD);
0154 if (err)
0155 goto err_out;
0156
0157 err = prestera_port_mc_flood_set(port, br_port->flags & BR_MCAST_FLOOD);
0158 if (err)
0159 goto err_out;
0160
0161 err = prestera_port_learning_set(port, br_port->flags & BR_LEARNING);
0162 if (err)
0163 goto err_out;
0164
0165 return 0;
0166
0167 err_out:
0168 prestera_br_port_flags_reset(br_port, port);
0169 return err;
0170 }
0171
0172 static struct prestera_bridge_vlan *
0173 prestera_bridge_vlan_create(struct prestera_bridge_port *br_port, u16 vid)
0174 {
0175 struct prestera_bridge_vlan *br_vlan;
0176
0177 br_vlan = kzalloc(sizeof(*br_vlan), GFP_KERNEL);
0178 if (!br_vlan)
0179 return NULL;
0180
0181 INIT_LIST_HEAD(&br_vlan->port_vlan_list);
0182 br_vlan->vid = vid;
0183 list_add(&br_vlan->head, &br_port->vlan_list);
0184
0185 return br_vlan;
0186 }
0187
0188 static void prestera_bridge_vlan_destroy(struct prestera_bridge_vlan *br_vlan)
0189 {
0190 list_del(&br_vlan->head);
0191 WARN_ON(!list_empty(&br_vlan->port_vlan_list));
0192 kfree(br_vlan);
0193 }
0194
0195 static struct prestera_bridge_vlan *
0196 prestera_bridge_vlan_by_vid(struct prestera_bridge_port *br_port, u16 vid)
0197 {
0198 struct prestera_bridge_vlan *br_vlan;
0199
0200 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
0201 if (br_vlan->vid == vid)
0202 return br_vlan;
0203 }
0204
0205 return NULL;
0206 }
0207
0208 static int prestera_bridge_vlan_port_count(struct prestera_bridge *bridge,
0209 u16 vid)
0210 {
0211 struct prestera_bridge_port *br_port;
0212 struct prestera_bridge_vlan *br_vlan;
0213 int count = 0;
0214
0215 list_for_each_entry(br_port, &bridge->port_list, head) {
0216 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
0217 if (br_vlan->vid == vid) {
0218 count += 1;
0219 break;
0220 }
0221 }
0222 }
0223
0224 return count;
0225 }
0226
0227 static void prestera_bridge_vlan_put(struct prestera_bridge_vlan *br_vlan)
0228 {
0229 if (list_empty(&br_vlan->port_vlan_list))
0230 prestera_bridge_vlan_destroy(br_vlan);
0231 }
0232
0233 static struct prestera_port_vlan *
0234 prestera_port_vlan_by_vid(struct prestera_port *port, u16 vid)
0235 {
0236 struct prestera_port_vlan *port_vlan;
0237
0238 list_for_each_entry(port_vlan, &port->vlans_list, port_head) {
0239 if (port_vlan->vid == vid)
0240 return port_vlan;
0241 }
0242
0243 return NULL;
0244 }
0245
0246 static struct prestera_port_vlan *
0247 prestera_port_vlan_create(struct prestera_port *port, u16 vid, bool untagged)
0248 {
0249 struct prestera_port_vlan *port_vlan;
0250 int err;
0251
0252 port_vlan = prestera_port_vlan_by_vid(port, vid);
0253 if (port_vlan)
0254 return ERR_PTR(-EEXIST);
0255
0256 err = prestera_hw_vlan_port_set(port, vid, true, untagged);
0257 if (err)
0258 return ERR_PTR(err);
0259
0260 port_vlan = kzalloc(sizeof(*port_vlan), GFP_KERNEL);
0261 if (!port_vlan) {
0262 err = -ENOMEM;
0263 goto err_port_vlan_alloc;
0264 }
0265
0266 port_vlan->port = port;
0267 port_vlan->vid = vid;
0268
0269 list_add(&port_vlan->port_head, &port->vlans_list);
0270
0271 return port_vlan;
0272
0273 err_port_vlan_alloc:
0274 prestera_hw_vlan_port_set(port, vid, false, false);
0275 return ERR_PTR(err);
0276 }
0277
0278 static int prestera_fdb_add(struct prestera_port *port,
0279 const unsigned char *mac, u16 vid, bool dynamic)
0280 {
0281 if (prestera_port_is_lag_member(port))
0282 return prestera_hw_lag_fdb_add(port->sw, prestera_port_lag_id(port),
0283 mac, vid, dynamic);
0284
0285 return prestera_hw_fdb_add(port, mac, vid, dynamic);
0286 }
0287
0288 static int prestera_fdb_del(struct prestera_port *port,
0289 const unsigned char *mac, u16 vid)
0290 {
0291 if (prestera_port_is_lag_member(port))
0292 return prestera_hw_lag_fdb_del(port->sw, prestera_port_lag_id(port),
0293 mac, vid);
0294 else
0295 return prestera_hw_fdb_del(port, mac, vid);
0296 }
0297
0298 static int prestera_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
0299 u32 mode)
0300 {
0301 if (prestera_port_is_lag_member(port))
0302 return prestera_hw_fdb_flush_lag_vlan(port->sw, prestera_port_lag_id(port),
0303 vid, mode);
0304 else
0305 return prestera_hw_fdb_flush_port_vlan(port, vid, mode);
0306 }
0307
0308 static int prestera_fdb_flush_port(struct prestera_port *port, u32 mode)
0309 {
0310 if (prestera_port_is_lag_member(port))
0311 return prestera_hw_fdb_flush_lag(port->sw, prestera_port_lag_id(port),
0312 mode);
0313 else
0314 return prestera_hw_fdb_flush_port(port, mode);
0315 }
0316
0317 static void
0318 prestera_mdb_port_del(struct prestera_mdb_entry *mdb,
0319 struct net_device *orig_dev)
0320 {
0321 struct prestera_flood_domain *fl_domain = mdb->flood_domain;
0322 struct prestera_flood_domain_port *flood_domain_port;
0323
0324 flood_domain_port = prestera_flood_domain_port_find(fl_domain,
0325 orig_dev,
0326 mdb->vid);
0327 if (flood_domain_port)
0328 prestera_flood_domain_port_destroy(flood_domain_port);
0329 }
0330
0331 static void
0332 prestera_br_mdb_entry_put(struct prestera_br_mdb_entry *br_mdb)
0333 {
0334 struct prestera_bridge_port *br_port;
0335
0336 if (list_empty(&br_mdb->br_mdb_port_list)) {
0337 list_for_each_entry(br_port, &br_mdb->bridge->port_list, head)
0338 prestera_mdb_port_del(br_mdb->mdb, br_port->dev);
0339
0340 prestera_mdb_entry_destroy(br_mdb->mdb);
0341 list_del(&br_mdb->br_mdb_entry_node);
0342 kfree(br_mdb);
0343 }
0344 }
0345
0346 static void
0347 prestera_br_mdb_port_del(struct prestera_br_mdb_entry *br_mdb,
0348 struct prestera_bridge_port *br_port)
0349 {
0350 struct prestera_br_mdb_port *br_mdb_port, *tmp;
0351
0352 list_for_each_entry_safe(br_mdb_port, tmp, &br_mdb->br_mdb_port_list,
0353 br_mdb_port_node) {
0354 if (br_mdb_port->br_port == br_port) {
0355 list_del(&br_mdb_port->br_mdb_port_node);
0356 kfree(br_mdb_port);
0357 }
0358 }
0359 }
0360
0361 static void
0362 prestera_mdb_flush_bridge_port(struct prestera_bridge_port *br_port)
0363 {
0364 struct prestera_br_mdb_port *br_mdb_port, *tmp_port;
0365 struct prestera_br_mdb_entry *br_mdb, *br_mdb_tmp;
0366 struct prestera_bridge *br_dev = br_port->bridge;
0367
0368 list_for_each_entry_safe(br_mdb, br_mdb_tmp, &br_dev->br_mdb_entry_list,
0369 br_mdb_entry_node) {
0370 list_for_each_entry_safe(br_mdb_port, tmp_port,
0371 &br_mdb->br_mdb_port_list,
0372 br_mdb_port_node) {
0373 prestera_mdb_port_del(br_mdb->mdb,
0374 br_mdb_port->br_port->dev);
0375 prestera_br_mdb_port_del(br_mdb, br_mdb_port->br_port);
0376 }
0377 prestera_br_mdb_entry_put(br_mdb);
0378 }
0379 }
0380
0381 static void
0382 prestera_port_vlan_bridge_leave(struct prestera_port_vlan *port_vlan)
0383 {
0384 u32 fdb_flush_mode = PRESTERA_FDB_FLUSH_MODE_DYNAMIC;
0385 struct prestera_port *port = port_vlan->port;
0386 struct prestera_bridge_vlan *br_vlan;
0387 struct prestera_bridge_port *br_port;
0388 bool last_port, last_vlan;
0389 u16 vid = port_vlan->vid;
0390 int port_count;
0391
0392 br_port = port_vlan->br_port;
0393 port_count = prestera_bridge_vlan_port_count(br_port->bridge, vid);
0394 br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
0395
0396 last_vlan = list_is_singular(&br_port->vlan_list);
0397 last_port = port_count == 1;
0398
0399 if (last_vlan)
0400 prestera_fdb_flush_port(port, fdb_flush_mode);
0401 else if (last_port)
0402 prestera_hw_fdb_flush_vlan(port->sw, vid, fdb_flush_mode);
0403 else
0404 prestera_fdb_flush_port_vlan(port, vid, fdb_flush_mode);
0405
0406 prestera_mdb_flush_bridge_port(br_port);
0407
0408 list_del(&port_vlan->br_vlan_head);
0409 prestera_bridge_vlan_put(br_vlan);
0410 prestera_bridge_port_put(br_port);
0411 port_vlan->br_port = NULL;
0412 }
0413
0414 static void prestera_port_vlan_destroy(struct prestera_port_vlan *port_vlan)
0415 {
0416 struct prestera_port *port = port_vlan->port;
0417 u16 vid = port_vlan->vid;
0418
0419 if (port_vlan->br_port)
0420 prestera_port_vlan_bridge_leave(port_vlan);
0421
0422 prestera_hw_vlan_port_set(port, vid, false, false);
0423 list_del(&port_vlan->port_head);
0424 kfree(port_vlan);
0425 }
0426
0427 static struct prestera_bridge *
0428 prestera_bridge_create(struct prestera_switchdev *swdev, struct net_device *dev)
0429 {
0430 bool vlan_enabled = br_vlan_enabled(dev);
0431 struct prestera_bridge *bridge;
0432 u16 bridge_id;
0433 int err;
0434
0435 if (vlan_enabled && swdev->bridge_8021q_exists) {
0436 netdev_err(dev, "Only one VLAN-aware bridge is supported\n");
0437 return ERR_PTR(-EINVAL);
0438 }
0439
0440 bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
0441 if (!bridge)
0442 return ERR_PTR(-ENOMEM);
0443
0444 if (vlan_enabled) {
0445 swdev->bridge_8021q_exists = true;
0446 } else {
0447 err = prestera_hw_bridge_create(swdev->sw, &bridge_id);
0448 if (err) {
0449 kfree(bridge);
0450 return ERR_PTR(err);
0451 }
0452
0453 bridge->bridge_id = bridge_id;
0454 }
0455
0456 bridge->vlan_enabled = vlan_enabled;
0457 bridge->swdev = swdev;
0458 bridge->dev = dev;
0459 bridge->multicast_enabled = br_multicast_enabled(dev);
0460
0461 INIT_LIST_HEAD(&bridge->port_list);
0462 INIT_LIST_HEAD(&bridge->br_mdb_entry_list);
0463
0464 list_add(&bridge->head, &swdev->bridge_list);
0465
0466 return bridge;
0467 }
0468
0469 static void prestera_bridge_destroy(struct prestera_bridge *bridge)
0470 {
0471 struct prestera_switchdev *swdev = bridge->swdev;
0472
0473 list_del(&bridge->head);
0474
0475 if (bridge->vlan_enabled)
0476 swdev->bridge_8021q_exists = false;
0477 else
0478 prestera_hw_bridge_delete(swdev->sw, bridge->bridge_id);
0479
0480 WARN_ON(!list_empty(&bridge->br_mdb_entry_list));
0481 WARN_ON(!list_empty(&bridge->port_list));
0482 kfree(bridge);
0483 }
0484
0485 static void prestera_bridge_put(struct prestera_bridge *bridge)
0486 {
0487 if (list_empty(&bridge->port_list))
0488 prestera_bridge_destroy(bridge);
0489 }
0490
0491 static
0492 struct prestera_bridge *prestera_bridge_by_dev(struct prestera_switchdev *swdev,
0493 const struct net_device *dev)
0494 {
0495 struct prestera_bridge *bridge;
0496
0497 list_for_each_entry(bridge, &swdev->bridge_list, head)
0498 if (bridge->dev == dev)
0499 return bridge;
0500
0501 return NULL;
0502 }
0503
0504 static struct prestera_bridge_port *
0505 __prestera_bridge_port_by_dev(struct prestera_bridge *bridge,
0506 struct net_device *dev)
0507 {
0508 struct prestera_bridge_port *br_port;
0509
0510 list_for_each_entry(br_port, &bridge->port_list, head) {
0511 if (br_port->dev == dev)
0512 return br_port;
0513 }
0514
0515 return NULL;
0516 }
0517
0518 static int prestera_match_upper_bridge_dev(struct net_device *dev,
0519 struct netdev_nested_priv *priv)
0520 {
0521 if (netif_is_bridge_master(dev))
0522 priv->data = dev;
0523
0524 return 0;
0525 }
0526
0527 static struct net_device *prestera_get_upper_bridge_dev(struct net_device *dev)
0528 {
0529 struct netdev_nested_priv priv = { };
0530
0531 netdev_walk_all_upper_dev_rcu(dev, prestera_match_upper_bridge_dev,
0532 &priv);
0533 return priv.data;
0534 }
0535
0536 static struct prestera_bridge_port *
0537 prestera_bridge_port_by_dev(struct prestera_switchdev *swdev,
0538 struct net_device *dev)
0539 {
0540 struct net_device *br_dev = prestera_get_upper_bridge_dev(dev);
0541 struct prestera_bridge *bridge;
0542
0543 if (!br_dev)
0544 return NULL;
0545
0546 bridge = prestera_bridge_by_dev(swdev, br_dev);
0547 if (!bridge)
0548 return NULL;
0549
0550 return __prestera_bridge_port_by_dev(bridge, dev);
0551 }
0552
0553 static struct prestera_bridge_port *
0554 prestera_bridge_port_create(struct prestera_bridge *bridge,
0555 struct net_device *dev)
0556 {
0557 struct prestera_bridge_port *br_port;
0558
0559 br_port = kzalloc(sizeof(*br_port), GFP_KERNEL);
0560 if (!br_port)
0561 return NULL;
0562
0563 br_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC |
0564 BR_MCAST_FLOOD;
0565 br_port->stp_state = BR_STATE_DISABLED;
0566 refcount_set(&br_port->ref_count, 1);
0567 br_port->bridge = bridge;
0568 br_port->dev = dev;
0569
0570 INIT_LIST_HEAD(&br_port->vlan_list);
0571 list_add(&br_port->head, &bridge->port_list);
0572 INIT_LIST_HEAD(&br_port->br_mdb_port_list);
0573
0574 return br_port;
0575 }
0576
0577 static void
0578 prestera_bridge_port_destroy(struct prestera_bridge_port *br_port)
0579 {
0580 list_del(&br_port->head);
0581 WARN_ON(!list_empty(&br_port->vlan_list));
0582 WARN_ON(!list_empty(&br_port->br_mdb_port_list));
0583 kfree(br_port);
0584 }
0585
0586 static void prestera_bridge_port_get(struct prestera_bridge_port *br_port)
0587 {
0588 refcount_inc(&br_port->ref_count);
0589 }
0590
0591 static void prestera_bridge_port_put(struct prestera_bridge_port *br_port)
0592 {
0593 struct prestera_bridge *bridge = br_port->bridge;
0594
0595 if (refcount_dec_and_test(&br_port->ref_count)) {
0596 prestera_bridge_port_destroy(br_port);
0597 prestera_bridge_put(bridge);
0598 }
0599 }
0600
0601 static struct prestera_bridge_port *
0602 prestera_bridge_port_add(struct prestera_bridge *bridge, struct net_device *dev)
0603 {
0604 struct prestera_bridge_port *br_port;
0605
0606 br_port = __prestera_bridge_port_by_dev(bridge, dev);
0607 if (br_port) {
0608 prestera_bridge_port_get(br_port);
0609 return br_port;
0610 }
0611
0612 br_port = prestera_bridge_port_create(bridge, dev);
0613 if (!br_port)
0614 return ERR_PTR(-ENOMEM);
0615
0616 return br_port;
0617 }
0618
0619 static int
0620 prestera_bridge_1d_port_join(struct prestera_bridge_port *br_port)
0621 {
0622 struct prestera_port *port = netdev_priv(br_port->dev);
0623 struct prestera_bridge *bridge = br_port->bridge;
0624 int err;
0625
0626 err = prestera_hw_bridge_port_add(port, bridge->bridge_id);
0627 if (err)
0628 return err;
0629
0630 err = prestera_br_port_flags_set(br_port, port);
0631 if (err)
0632 goto err_flags2port_set;
0633
0634 return 0;
0635
0636 err_flags2port_set:
0637 prestera_hw_bridge_port_delete(port, bridge->bridge_id);
0638
0639 return err;
0640 }
0641
0642 int prestera_bridge_port_join(struct net_device *br_dev,
0643 struct prestera_port *port,
0644 struct netlink_ext_ack *extack)
0645 {
0646 struct prestera_switchdev *swdev = port->sw->swdev;
0647 struct prestera_bridge_port *br_port;
0648 struct prestera_bridge *bridge;
0649 int err;
0650
0651 bridge = prestera_bridge_by_dev(swdev, br_dev);
0652 if (!bridge) {
0653 bridge = prestera_bridge_create(swdev, br_dev);
0654 if (IS_ERR(bridge))
0655 return PTR_ERR(bridge);
0656 }
0657
0658 br_port = prestera_bridge_port_add(bridge, port->dev);
0659 if (IS_ERR(br_port)) {
0660 prestera_bridge_put(bridge);
0661 return PTR_ERR(br_port);
0662 }
0663
0664 err = switchdev_bridge_port_offload(br_port->dev, port->dev, NULL,
0665 NULL, NULL, false, extack);
0666 if (err)
0667 goto err_switchdev_offload;
0668
0669 if (bridge->vlan_enabled)
0670 return 0;
0671
0672 err = prestera_bridge_1d_port_join(br_port);
0673 if (err)
0674 goto err_port_join;
0675
0676 return 0;
0677
0678 err_port_join:
0679 switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
0680 err_switchdev_offload:
0681 prestera_bridge_port_put(br_port);
0682 return err;
0683 }
0684
0685 static void prestera_bridge_1q_port_leave(struct prestera_bridge_port *br_port)
0686 {
0687 struct prestera_port *port = netdev_priv(br_port->dev);
0688
0689 prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
0690 prestera_port_pvid_set(port, PRESTERA_DEFAULT_VID);
0691 }
0692
0693 static void prestera_bridge_1d_port_leave(struct prestera_bridge_port *br_port)
0694 {
0695 struct prestera_port *port = netdev_priv(br_port->dev);
0696
0697 prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
0698 prestera_hw_bridge_port_delete(port, br_port->bridge->bridge_id);
0699 }
0700
0701 static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
0702 u8 state)
0703 {
0704 u8 hw_state = state;
0705
0706 switch (state) {
0707 case BR_STATE_DISABLED:
0708 hw_state = PRESTERA_STP_DISABLED;
0709 break;
0710
0711 case BR_STATE_BLOCKING:
0712 case BR_STATE_LISTENING:
0713 hw_state = PRESTERA_STP_BLOCK_LISTEN;
0714 break;
0715
0716 case BR_STATE_LEARNING:
0717 hw_state = PRESTERA_STP_LEARN;
0718 break;
0719
0720 case BR_STATE_FORWARDING:
0721 hw_state = PRESTERA_STP_FORWARD;
0722 break;
0723
0724 default:
0725 return -EINVAL;
0726 }
0727
0728 return prestera_hw_vlan_port_stp_set(port, vid, hw_state);
0729 }
0730
0731 void prestera_bridge_port_leave(struct net_device *br_dev,
0732 struct prestera_port *port)
0733 {
0734 struct prestera_switchdev *swdev = port->sw->swdev;
0735 struct prestera_bridge_port *br_port;
0736 struct prestera_bridge *bridge;
0737
0738 bridge = prestera_bridge_by_dev(swdev, br_dev);
0739 if (!bridge)
0740 return;
0741
0742 br_port = __prestera_bridge_port_by_dev(bridge, port->dev);
0743 if (!br_port)
0744 return;
0745
0746 bridge = br_port->bridge;
0747
0748 if (bridge->vlan_enabled)
0749 prestera_bridge_1q_port_leave(br_port);
0750 else
0751 prestera_bridge_1d_port_leave(br_port);
0752
0753 switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
0754
0755 prestera_mdb_flush_bridge_port(br_port);
0756
0757 prestera_br_port_flags_reset(br_port, port);
0758 prestera_port_vid_stp_set(port, PRESTERA_VID_ALL, BR_STATE_FORWARDING);
0759 prestera_bridge_port_put(br_port);
0760 }
0761
0762 static int prestera_port_attr_br_flags_set(struct prestera_port *port,
0763 struct net_device *dev,
0764 struct switchdev_brport_flags flags)
0765 {
0766 struct prestera_bridge_port *br_port;
0767
0768 br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
0769 if (!br_port)
0770 return 0;
0771
0772 br_port->flags &= ~flags.mask;
0773 br_port->flags |= flags.val & flags.mask;
0774 return prestera_br_port_flags_set(br_port, port);
0775 }
0776
0777 static int prestera_port_attr_br_ageing_set(struct prestera_port *port,
0778 unsigned long ageing_clock_t)
0779 {
0780 unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
0781 u32 ageing_time_ms = jiffies_to_msecs(ageing_jiffies);
0782 struct prestera_switch *sw = port->sw;
0783
0784 if (ageing_time_ms < PRESTERA_MIN_AGEING_TIME_MS ||
0785 ageing_time_ms > PRESTERA_MAX_AGEING_TIME_MS)
0786 return -ERANGE;
0787
0788 return prestera_hw_switch_ageing_set(sw, ageing_time_ms);
0789 }
0790
0791 static int prestera_port_attr_br_vlan_set(struct prestera_port *port,
0792 struct net_device *dev,
0793 bool vlan_enabled)
0794 {
0795 struct prestera_switch *sw = port->sw;
0796 struct prestera_bridge *bridge;
0797
0798 bridge = prestera_bridge_by_dev(sw->swdev, dev);
0799 if (WARN_ON(!bridge))
0800 return -EINVAL;
0801
0802 if (bridge->vlan_enabled == vlan_enabled)
0803 return 0;
0804
0805 netdev_err(bridge->dev, "VLAN filtering can't be changed for existing bridge\n");
0806
0807 return -EINVAL;
0808 }
0809
0810 static int prestera_port_bridge_vlan_stp_set(struct prestera_port *port,
0811 struct prestera_bridge_vlan *br_vlan,
0812 u8 state)
0813 {
0814 struct prestera_port_vlan *port_vlan;
0815
0816 list_for_each_entry(port_vlan, &br_vlan->port_vlan_list, br_vlan_head) {
0817 if (port_vlan->port != port)
0818 continue;
0819
0820 return prestera_port_vid_stp_set(port, br_vlan->vid, state);
0821 }
0822
0823 return 0;
0824 }
0825
0826 static int prestera_port_attr_stp_state_set(struct prestera_port *port,
0827 struct net_device *dev,
0828 u8 state)
0829 {
0830 struct prestera_bridge_port *br_port;
0831 struct prestera_bridge_vlan *br_vlan;
0832 int err;
0833 u16 vid;
0834
0835 br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
0836 if (!br_port)
0837 return 0;
0838
0839 if (!br_port->bridge->vlan_enabled) {
0840 vid = br_port->bridge->bridge_id;
0841 err = prestera_port_vid_stp_set(port, vid, state);
0842 if (err)
0843 goto err_port_stp_set;
0844 } else {
0845 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
0846 err = prestera_port_bridge_vlan_stp_set(port, br_vlan,
0847 state);
0848 if (err)
0849 goto err_port_vlan_stp_set;
0850 }
0851 }
0852
0853 br_port->stp_state = state;
0854
0855 return 0;
0856
0857 err_port_vlan_stp_set:
0858 list_for_each_entry_continue_reverse(br_vlan, &br_port->vlan_list, head)
0859 prestera_port_bridge_vlan_stp_set(port, br_vlan, br_port->stp_state);
0860 return err;
0861
0862 err_port_stp_set:
0863 prestera_port_vid_stp_set(port, vid, br_port->stp_state);
0864
0865 return err;
0866 }
0867
0868 static int
0869 prestera_br_port_lag_mdb_mc_enable_sync(struct prestera_bridge_port *br_port,
0870 bool enabled)
0871 {
0872 struct prestera_port *pr_port;
0873 struct prestera_switch *sw;
0874 u16 lag_id;
0875 int err;
0876
0877 pr_port = prestera_port_dev_lower_find(br_port->dev);
0878 if (!pr_port)
0879 return 0;
0880
0881 sw = pr_port->sw;
0882 err = prestera_lag_id(sw, br_port->dev, &lag_id);
0883 if (err)
0884 return err;
0885
0886 list_for_each_entry(pr_port, &sw->port_list, list) {
0887 if (pr_port->lag->lag_id == lag_id) {
0888 err = prestera_port_mc_flood_set(pr_port, enabled);
0889 if (err)
0890 return err;
0891 }
0892 }
0893
0894 return 0;
0895 }
0896
0897 static int prestera_br_mdb_mc_enable_sync(struct prestera_bridge *br_dev)
0898 {
0899 struct prestera_bridge_port *br_port;
0900 struct prestera_port *port;
0901 bool enabled;
0902 int err;
0903
0904
0905
0906
0907
0908
0909 list_for_each_entry(br_port, &br_dev->port_list, head) {
0910 if (br_dev->multicast_enabled && br_dev->mrouter_exist)
0911 enabled = br_port->mrouter;
0912 else
0913 enabled = br_port->flags & BR_MCAST_FLOOD;
0914
0915 if (netif_is_lag_master(br_port->dev)) {
0916 err = prestera_br_port_lag_mdb_mc_enable_sync(br_port,
0917 enabled);
0918 if (err)
0919 return err;
0920 continue;
0921 }
0922
0923 port = prestera_port_dev_lower_find(br_port->dev);
0924 if (!port)
0925 continue;
0926
0927 err = prestera_port_mc_flood_set(port, enabled);
0928 if (err)
0929 return err;
0930 }
0931
0932 return 0;
0933 }
0934
0935 static bool
0936 prestera_br_mdb_port_is_member(struct prestera_br_mdb_entry *br_mdb,
0937 struct net_device *orig_dev)
0938 {
0939 struct prestera_br_mdb_port *tmp_port;
0940
0941 list_for_each_entry(tmp_port, &br_mdb->br_mdb_port_list,
0942 br_mdb_port_node)
0943 if (tmp_port->br_port->dev == orig_dev)
0944 return true;
0945
0946 return false;
0947 }
0948
0949 static int
0950 prestera_mdb_port_add(struct prestera_mdb_entry *mdb,
0951 struct net_device *orig_dev,
0952 const unsigned char addr[ETH_ALEN], u16 vid)
0953 {
0954 struct prestera_flood_domain *flood_domain = mdb->flood_domain;
0955 int err;
0956
0957 if (!prestera_flood_domain_port_find(flood_domain,
0958 orig_dev, vid)) {
0959 err = prestera_flood_domain_port_create(flood_domain, orig_dev,
0960 vid);
0961 if (err)
0962 return err;
0963 }
0964
0965 return 0;
0966 }
0967
0968
0969 static int prestera_br_mdb_sync(struct prestera_bridge *br_dev)
0970 {
0971 struct prestera_br_mdb_port *br_mdb_port;
0972 struct prestera_bridge_port *br_port;
0973 struct prestera_br_mdb_entry *br_mdb;
0974 struct prestera_mdb_entry *mdb;
0975 struct prestera_port *pr_port;
0976 int err = 0;
0977
0978 if (!br_dev->multicast_enabled)
0979 return 0;
0980
0981 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
0982 br_mdb_entry_node) {
0983 mdb = br_mdb->mdb;
0984
0985
0986
0987 list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
0988 br_mdb_port_node) {
0989 br_port = br_mdb_port->br_port;
0990 pr_port = prestera_port_dev_lower_find(br_port->dev);
0991
0992
0993
0994
0995 if (br_dev->vlan_enabled &&
0996 !prestera_port_vlan_by_vid(pr_port,
0997 mdb->vid))
0998 continue;
0999
1000
1001
1002
1003 if (prestera_br_mdb_port_is_member(br_mdb,
1004 br_mdb_port->br_port->dev) &&
1005 br_dev->mrouter_exist)
1006 err = prestera_mdb_port_add(mdb, br_port->dev,
1007 mdb->addr,
1008 mdb->vid);
1009 else
1010 prestera_mdb_port_del(mdb, br_port->dev);
1011
1012 if (err)
1013 return err;
1014 }
1015
1016
1017
1018
1019 list_for_each_entry(br_port, &br_dev->port_list, head) {
1020 pr_port = prestera_port_dev_lower_find(br_port->dev);
1021
1022
1023
1024
1025
1026 if (br_dev->vlan_enabled &&
1027 !prestera_port_vlan_by_vid(pr_port,
1028 mdb->vid))
1029 continue;
1030
1031 if (br_port->mrouter) {
1032 err = prestera_mdb_port_add(mdb, br_port->dev,
1033 mdb->addr,
1034 mdb->vid);
1035 if (err)
1036 return err;
1037 } else if (!br_port->mrouter &&
1038 !prestera_br_mdb_port_is_member
1039 (br_mdb, br_port->dev)) {
1040 prestera_mdb_port_del(mdb, br_port->dev);
1041 }
1042 }
1043 }
1044
1045 return 0;
1046 }
1047
1048 static int
1049 prestera_mdb_enable_set(struct prestera_br_mdb_entry *br_mdb, bool enable)
1050 {
1051 int err;
1052
1053 if (enable != br_mdb->enabled) {
1054 if (enable)
1055 err = prestera_hw_mdb_create(br_mdb->mdb);
1056 else
1057 err = prestera_hw_mdb_destroy(br_mdb->mdb);
1058
1059 if (err)
1060 return err;
1061
1062 br_mdb->enabled = enable;
1063 }
1064
1065 return 0;
1066 }
1067
1068 static int
1069 prestera_br_mdb_enable_set(struct prestera_bridge *br_dev, bool enable)
1070 {
1071 struct prestera_br_mdb_entry *br_mdb;
1072 int err;
1073
1074 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
1075 br_mdb_entry_node) {
1076 err = prestera_mdb_enable_set(br_mdb, enable);
1077 if (err)
1078 return err;
1079 }
1080
1081 return 0;
1082 }
1083
1084 static int prestera_port_attr_br_mc_disabled_set(struct prestera_port *port,
1085 struct net_device *orig_dev,
1086 bool mc_disabled)
1087 {
1088 struct prestera_switch *sw = port->sw;
1089 struct prestera_bridge *br_dev;
1090
1091 br_dev = prestera_bridge_find(sw, orig_dev);
1092 if (!br_dev)
1093 return 0;
1094
1095 br_dev->multicast_enabled = !mc_disabled;
1096
1097
1098 WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
1099 br_dev->mrouter_exist));
1100
1101 WARN_ON(prestera_br_mdb_sync(br_dev));
1102
1103 WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
1104
1105 return 0;
1106 }
1107
1108 static bool
1109 prestera_bridge_mdb_mc_mrouter_exists(struct prestera_bridge *br_dev)
1110 {
1111 struct prestera_bridge_port *br_port;
1112
1113 list_for_each_entry(br_port, &br_dev->port_list, head)
1114 if (br_port->mrouter)
1115 return true;
1116
1117 return false;
1118 }
1119
1120 static int
1121 prestera_port_attr_mrouter_set(struct prestera_port *port,
1122 struct net_device *orig_dev,
1123 bool is_port_mrouter)
1124 {
1125 struct prestera_bridge_port *br_port;
1126 struct prestera_bridge *br_dev;
1127
1128 br_port = prestera_bridge_port_find(port->sw, orig_dev);
1129 if (!br_port)
1130 return 0;
1131
1132 br_dev = br_port->bridge;
1133 br_port->mrouter = is_port_mrouter;
1134
1135 br_dev->mrouter_exist = prestera_bridge_mdb_mc_mrouter_exists(br_dev);
1136
1137
1138
1139
1140
1141
1142 WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
1143 br_dev->mrouter_exist));
1144
1145 WARN_ON(prestera_br_mdb_sync(br_dev));
1146
1147 WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
1148
1149 return 0;
1150 }
1151
1152 static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
1153 const struct switchdev_attr *attr,
1154 struct netlink_ext_ack *extack)
1155 {
1156 struct prestera_port *port = netdev_priv(dev);
1157 int err = 0;
1158
1159 switch (attr->id) {
1160 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1161 err = prestera_port_attr_stp_state_set(port, attr->orig_dev,
1162 attr->u.stp_state);
1163 break;
1164 case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
1165 if (attr->u.brport_flags.mask &
1166 ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD))
1167 err = -EINVAL;
1168 break;
1169 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
1170 err = prestera_port_attr_br_flags_set(port, attr->orig_dev,
1171 attr->u.brport_flags);
1172 break;
1173 case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
1174 err = prestera_port_attr_br_ageing_set(port,
1175 attr->u.ageing_time);
1176 break;
1177 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
1178 err = prestera_port_attr_br_vlan_set(port, attr->orig_dev,
1179 attr->u.vlan_filtering);
1180 break;
1181 case SWITCHDEV_ATTR_ID_PORT_MROUTER:
1182 err = prestera_port_attr_mrouter_set(port, attr->orig_dev,
1183 attr->u.mrouter);
1184 break;
1185 case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
1186 err = prestera_port_attr_br_mc_disabled_set(port, attr->orig_dev,
1187 attr->u.mc_disabled);
1188 break;
1189 default:
1190 err = -EOPNOTSUPP;
1191 }
1192
1193 return err;
1194 }
1195
1196 static void
1197 prestera_fdb_offload_notify(struct prestera_port *port,
1198 struct switchdev_notifier_fdb_info *info)
1199 {
1200 struct switchdev_notifier_fdb_info send_info = {};
1201
1202 send_info.addr = info->addr;
1203 send_info.vid = info->vid;
1204 send_info.offloaded = true;
1205
1206 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, port->dev,
1207 &send_info.info, NULL);
1208 }
1209
1210 static int prestera_port_fdb_set(struct prestera_port *port,
1211 struct switchdev_notifier_fdb_info *fdb_info,
1212 bool adding)
1213 {
1214 struct prestera_switch *sw = port->sw;
1215 struct prestera_bridge_port *br_port;
1216 struct prestera_bridge *bridge;
1217 int err;
1218 u16 vid;
1219
1220 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1221 if (!br_port)
1222 return -EINVAL;
1223
1224 bridge = br_port->bridge;
1225
1226 if (bridge->vlan_enabled)
1227 vid = fdb_info->vid;
1228 else
1229 vid = bridge->bridge_id;
1230
1231 if (adding)
1232 err = prestera_fdb_add(port, fdb_info->addr, vid, false);
1233 else
1234 err = prestera_fdb_del(port, fdb_info->addr, vid);
1235
1236 return err;
1237 }
1238
1239 static void prestera_fdb_event_work(struct work_struct *work)
1240 {
1241 struct switchdev_notifier_fdb_info *fdb_info;
1242 struct prestera_fdb_event_work *swdev_work;
1243 struct prestera_port *port;
1244 struct net_device *dev;
1245 int err;
1246
1247 swdev_work = container_of(work, struct prestera_fdb_event_work, work);
1248 dev = swdev_work->dev;
1249
1250 rtnl_lock();
1251
1252 port = prestera_port_dev_lower_find(dev);
1253 if (!port)
1254 goto out_unlock;
1255
1256 switch (swdev_work->event) {
1257 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1258 fdb_info = &swdev_work->fdb_info;
1259 if (!fdb_info->added_by_user || fdb_info->is_local)
1260 break;
1261
1262 err = prestera_port_fdb_set(port, fdb_info, true);
1263 if (err)
1264 break;
1265
1266 prestera_fdb_offload_notify(port, fdb_info);
1267 break;
1268
1269 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1270 fdb_info = &swdev_work->fdb_info;
1271 prestera_port_fdb_set(port, fdb_info, false);
1272 break;
1273 }
1274
1275 out_unlock:
1276 rtnl_unlock();
1277
1278 kfree(swdev_work->fdb_info.addr);
1279 kfree(swdev_work);
1280 dev_put(dev);
1281 }
1282
1283 static int prestera_switchdev_event(struct notifier_block *unused,
1284 unsigned long event, void *ptr)
1285 {
1286 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1287 struct switchdev_notifier_fdb_info *fdb_info;
1288 struct switchdev_notifier_info *info = ptr;
1289 struct prestera_fdb_event_work *swdev_work;
1290 struct net_device *upper;
1291 int err;
1292
1293 if (event == SWITCHDEV_PORT_ATTR_SET) {
1294 err = switchdev_handle_port_attr_set(dev, ptr,
1295 prestera_netdev_check,
1296 prestera_port_obj_attr_set);
1297 return notifier_from_errno(err);
1298 }
1299
1300 if (!prestera_netdev_check(dev))
1301 return NOTIFY_DONE;
1302
1303 upper = netdev_master_upper_dev_get_rcu(dev);
1304 if (!upper)
1305 return NOTIFY_DONE;
1306
1307 if (!netif_is_bridge_master(upper))
1308 return NOTIFY_DONE;
1309
1310 swdev_work = kzalloc(sizeof(*swdev_work), GFP_ATOMIC);
1311 if (!swdev_work)
1312 return NOTIFY_BAD;
1313
1314 swdev_work->event = event;
1315 swdev_work->dev = dev;
1316
1317 switch (event) {
1318 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1319 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1320 fdb_info = container_of(info,
1321 struct switchdev_notifier_fdb_info,
1322 info);
1323
1324 INIT_WORK(&swdev_work->work, prestera_fdb_event_work);
1325 memcpy(&swdev_work->fdb_info, ptr,
1326 sizeof(swdev_work->fdb_info));
1327
1328 swdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1329 if (!swdev_work->fdb_info.addr)
1330 goto out_bad;
1331
1332 ether_addr_copy((u8 *)swdev_work->fdb_info.addr,
1333 fdb_info->addr);
1334 dev_hold(dev);
1335 break;
1336
1337 default:
1338 kfree(swdev_work);
1339 return NOTIFY_DONE;
1340 }
1341
1342 queue_work(swdev_wq, &swdev_work->work);
1343 return NOTIFY_DONE;
1344
1345 out_bad:
1346 kfree(swdev_work);
1347 return NOTIFY_BAD;
1348 }
1349
1350 static int
1351 prestera_port_vlan_bridge_join(struct prestera_port_vlan *port_vlan,
1352 struct prestera_bridge_port *br_port)
1353 {
1354 struct prestera_port *port = port_vlan->port;
1355 struct prestera_bridge_vlan *br_vlan;
1356 u16 vid = port_vlan->vid;
1357 int err;
1358
1359 if (port_vlan->br_port)
1360 return 0;
1361
1362 err = prestera_br_port_flags_set(br_port, port);
1363 if (err)
1364 goto err_flags2port_set;
1365
1366 err = prestera_port_vid_stp_set(port, vid, br_port->stp_state);
1367 if (err)
1368 goto err_port_vid_stp_set;
1369
1370 br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
1371 if (!br_vlan) {
1372 br_vlan = prestera_bridge_vlan_create(br_port, vid);
1373 if (!br_vlan) {
1374 err = -ENOMEM;
1375 goto err_bridge_vlan_get;
1376 }
1377 }
1378
1379 list_add(&port_vlan->br_vlan_head, &br_vlan->port_vlan_list);
1380
1381 prestera_bridge_port_get(br_port);
1382 port_vlan->br_port = br_port;
1383
1384 return 0;
1385
1386 err_bridge_vlan_get:
1387 prestera_port_vid_stp_set(port, vid, BR_STATE_FORWARDING);
1388 err_port_vid_stp_set:
1389 prestera_br_port_flags_reset(br_port, port);
1390 err_flags2port_set:
1391 return err;
1392 }
1393
1394 static int
1395 prestera_bridge_port_vlan_add(struct prestera_port *port,
1396 struct prestera_bridge_port *br_port,
1397 u16 vid, bool is_untagged, bool is_pvid,
1398 struct netlink_ext_ack *extack)
1399 {
1400 struct prestera_port_vlan *port_vlan;
1401 u16 old_pvid = port->pvid;
1402 u16 pvid;
1403 int err;
1404
1405 if (is_pvid)
1406 pvid = vid;
1407 else
1408 pvid = port->pvid == vid ? 0 : port->pvid;
1409
1410 port_vlan = prestera_port_vlan_by_vid(port, vid);
1411 if (port_vlan && port_vlan->br_port != br_port)
1412 return -EEXIST;
1413
1414 if (!port_vlan) {
1415 port_vlan = prestera_port_vlan_create(port, vid, is_untagged);
1416 if (IS_ERR(port_vlan))
1417 return PTR_ERR(port_vlan);
1418 } else {
1419 err = prestera_hw_vlan_port_set(port, vid, true, is_untagged);
1420 if (err)
1421 goto err_port_vlan_set;
1422 }
1423
1424 err = prestera_port_pvid_set(port, pvid);
1425 if (err)
1426 goto err_port_pvid_set;
1427
1428 err = prestera_port_vlan_bridge_join(port_vlan, br_port);
1429 if (err)
1430 goto err_port_vlan_bridge_join;
1431
1432 return 0;
1433
1434 err_port_vlan_bridge_join:
1435 prestera_port_pvid_set(port, old_pvid);
1436 err_port_pvid_set:
1437 prestera_hw_vlan_port_set(port, vid, false, false);
1438 err_port_vlan_set:
1439 prestera_port_vlan_destroy(port_vlan);
1440
1441 return err;
1442 }
1443
1444 static void
1445 prestera_bridge_port_vlan_del(struct prestera_port *port,
1446 struct prestera_bridge_port *br_port, u16 vid)
1447 {
1448 u16 pvid = port->pvid == vid ? 0 : port->pvid;
1449 struct prestera_port_vlan *port_vlan;
1450
1451 port_vlan = prestera_port_vlan_by_vid(port, vid);
1452 if (WARN_ON(!port_vlan))
1453 return;
1454
1455 prestera_port_vlan_bridge_leave(port_vlan);
1456 prestera_port_pvid_set(port, pvid);
1457 prestera_port_vlan_destroy(port_vlan);
1458 }
1459
1460 static int prestera_port_vlans_add(struct prestera_port *port,
1461 const struct switchdev_obj_port_vlan *vlan,
1462 struct netlink_ext_ack *extack)
1463 {
1464 bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1465 bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1466 struct net_device *orig_dev = vlan->obj.orig_dev;
1467 struct prestera_bridge_port *br_port;
1468 struct prestera_switch *sw = port->sw;
1469 struct prestera_bridge *bridge;
1470
1471 if (netif_is_bridge_master(orig_dev))
1472 return 0;
1473
1474 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1475 if (WARN_ON(!br_port))
1476 return -EINVAL;
1477
1478 bridge = br_port->bridge;
1479 if (!bridge->vlan_enabled)
1480 return 0;
1481
1482 return prestera_bridge_port_vlan_add(port, br_port,
1483 vlan->vid, flag_untagged,
1484 flag_pvid, extack);
1485 }
1486
1487 static struct prestera_br_mdb_entry *
1488 prestera_br_mdb_entry_create(struct prestera_switch *sw,
1489 struct prestera_bridge *br_dev,
1490 const unsigned char *addr, u16 vid)
1491 {
1492 struct prestera_br_mdb_entry *br_mdb_entry;
1493 struct prestera_mdb_entry *mdb_entry;
1494
1495 br_mdb_entry = kzalloc(sizeof(*br_mdb_entry), GFP_KERNEL);
1496 if (!br_mdb_entry)
1497 return NULL;
1498
1499 mdb_entry = prestera_mdb_entry_create(sw, addr, vid);
1500 if (!mdb_entry)
1501 goto err_mdb_alloc;
1502
1503 br_mdb_entry->mdb = mdb_entry;
1504 br_mdb_entry->bridge = br_dev;
1505 br_mdb_entry->enabled = true;
1506 INIT_LIST_HEAD(&br_mdb_entry->br_mdb_port_list);
1507
1508 list_add(&br_mdb_entry->br_mdb_entry_node, &br_dev->br_mdb_entry_list);
1509
1510 return br_mdb_entry;
1511
1512 err_mdb_alloc:
1513 kfree(br_mdb_entry);
1514 return NULL;
1515 }
1516
1517 static int prestera_br_mdb_port_add(struct prestera_br_mdb_entry *br_mdb,
1518 struct prestera_bridge_port *br_port)
1519 {
1520 struct prestera_br_mdb_port *br_mdb_port;
1521
1522 list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
1523 br_mdb_port_node)
1524 if (br_mdb_port->br_port == br_port)
1525 return 0;
1526
1527 br_mdb_port = kzalloc(sizeof(*br_mdb_port), GFP_KERNEL);
1528 if (!br_mdb_port)
1529 return -ENOMEM;
1530
1531 br_mdb_port->br_port = br_port;
1532 list_add(&br_mdb_port->br_mdb_port_node,
1533 &br_mdb->br_mdb_port_list);
1534
1535 return 0;
1536 }
1537
1538 static struct prestera_br_mdb_entry *
1539 prestera_br_mdb_entry_find(struct prestera_bridge *br_dev,
1540 const unsigned char *addr, u16 vid)
1541 {
1542 struct prestera_br_mdb_entry *br_mdb;
1543
1544 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
1545 br_mdb_entry_node)
1546 if (ether_addr_equal(&br_mdb->mdb->addr[0], addr) &&
1547 vid == br_mdb->mdb->vid)
1548 return br_mdb;
1549
1550 return NULL;
1551 }
1552
1553 static struct prestera_br_mdb_entry *
1554 prestera_br_mdb_entry_get(struct prestera_switch *sw,
1555 struct prestera_bridge *br_dev,
1556 const unsigned char *addr, u16 vid)
1557 {
1558 struct prestera_br_mdb_entry *br_mdb;
1559
1560 br_mdb = prestera_br_mdb_entry_find(br_dev, addr, vid);
1561 if (br_mdb)
1562 return br_mdb;
1563
1564 return prestera_br_mdb_entry_create(sw, br_dev, addr, vid);
1565 }
1566
1567 static int
1568 prestera_mdb_port_addr_obj_add(const struct switchdev_obj_port_mdb *mdb)
1569 {
1570 struct prestera_br_mdb_entry *br_mdb;
1571 struct prestera_bridge_port *br_port;
1572 struct prestera_bridge *br_dev;
1573 struct prestera_switch *sw;
1574 struct prestera_port *port;
1575 int err;
1576
1577 sw = prestera_switch_get(mdb->obj.orig_dev);
1578 port = prestera_port_dev_lower_find(mdb->obj.orig_dev);
1579
1580 br_port = prestera_bridge_port_find(sw, mdb->obj.orig_dev);
1581 if (!br_port)
1582 return 0;
1583
1584 br_dev = br_port->bridge;
1585
1586 if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
1587 return 0;
1588
1589 if (mdb->vid)
1590 br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
1591 mdb->vid);
1592 else
1593 br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
1594 br_dev->bridge_id);
1595
1596 if (!br_mdb)
1597 return -ENOMEM;
1598
1599
1600
1601
1602 WARN_ON(prestera_mdb_enable_set(br_mdb, br_dev->multicast_enabled &&
1603 br_dev->mrouter_exist));
1604
1605 err = prestera_br_mdb_port_add(br_mdb, br_port);
1606 if (err) {
1607 prestera_br_mdb_entry_put(br_mdb);
1608 return err;
1609 }
1610
1611 err = prestera_br_mdb_sync(br_dev);
1612 if (err)
1613 return err;
1614
1615 return 0;
1616 }
1617
1618 static int prestera_port_obj_add(struct net_device *dev, const void *ctx,
1619 const struct switchdev_obj *obj,
1620 struct netlink_ext_ack *extack)
1621 {
1622 struct prestera_port *port = netdev_priv(dev);
1623 const struct switchdev_obj_port_vlan *vlan;
1624 const struct switchdev_obj_port_mdb *mdb;
1625 int err = 0;
1626
1627 switch (obj->id) {
1628 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1629 vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
1630 return prestera_port_vlans_add(port, vlan, extack);
1631 case SWITCHDEV_OBJ_ID_PORT_MDB:
1632 mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
1633 err = prestera_mdb_port_addr_obj_add(mdb);
1634 break;
1635 case SWITCHDEV_OBJ_ID_HOST_MDB:
1636 fallthrough;
1637 default:
1638 err = -EOPNOTSUPP;
1639 break;
1640 }
1641
1642 return err;
1643 }
1644
1645 static int prestera_port_vlans_del(struct prestera_port *port,
1646 const struct switchdev_obj_port_vlan *vlan)
1647 {
1648 struct net_device *orig_dev = vlan->obj.orig_dev;
1649 struct prestera_bridge_port *br_port;
1650 struct prestera_switch *sw = port->sw;
1651
1652 if (netif_is_bridge_master(orig_dev))
1653 return -EOPNOTSUPP;
1654
1655 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1656 if (WARN_ON(!br_port))
1657 return -EINVAL;
1658
1659 if (!br_port->bridge->vlan_enabled)
1660 return 0;
1661
1662 prestera_bridge_port_vlan_del(port, br_port, vlan->vid);
1663
1664 return 0;
1665 }
1666
1667 static int
1668 prestera_mdb_port_addr_obj_del(struct prestera_port *port,
1669 const struct switchdev_obj_port_mdb *mdb)
1670 {
1671 struct prestera_br_mdb_entry *br_mdb;
1672 struct prestera_bridge_port *br_port;
1673 struct prestera_bridge *br_dev;
1674 int err;
1675
1676
1677 br_port = prestera_bridge_port_find(port->sw, mdb->obj.orig_dev);
1678 if (!br_port)
1679 return 0;
1680
1681
1682 if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
1683 return 0;
1684
1685 br_dev = br_port->bridge;
1686
1687 if (br_port->bridge->vlan_enabled)
1688 br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
1689 mdb->vid);
1690 else
1691 br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
1692 br_port->bridge->bridge_id);
1693
1694 if (!br_mdb)
1695 return 0;
1696
1697
1698
1699
1700
1701 prestera_br_mdb_port_del(br_mdb, br_port);
1702
1703 prestera_br_mdb_entry_put(br_mdb);
1704
1705 err = prestera_br_mdb_sync(br_dev);
1706 if (err)
1707 return err;
1708
1709 return 0;
1710 }
1711
1712 static int prestera_port_obj_del(struct net_device *dev, const void *ctx,
1713 const struct switchdev_obj *obj)
1714 {
1715 struct prestera_port *port = netdev_priv(dev);
1716 const struct switchdev_obj_port_mdb *mdb;
1717 int err = 0;
1718
1719 switch (obj->id) {
1720 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1721 return prestera_port_vlans_del(port, SWITCHDEV_OBJ_PORT_VLAN(obj));
1722 case SWITCHDEV_OBJ_ID_PORT_MDB:
1723 mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
1724 err = prestera_mdb_port_addr_obj_del(port, mdb);
1725 break;
1726 default:
1727 err = -EOPNOTSUPP;
1728 break;
1729 }
1730
1731 return err;
1732 }
1733
1734 static int prestera_switchdev_blk_event(struct notifier_block *unused,
1735 unsigned long event, void *ptr)
1736 {
1737 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1738 int err;
1739
1740 switch (event) {
1741 case SWITCHDEV_PORT_OBJ_ADD:
1742 err = switchdev_handle_port_obj_add(dev, ptr,
1743 prestera_netdev_check,
1744 prestera_port_obj_add);
1745 break;
1746 case SWITCHDEV_PORT_OBJ_DEL:
1747 err = switchdev_handle_port_obj_del(dev, ptr,
1748 prestera_netdev_check,
1749 prestera_port_obj_del);
1750 break;
1751 case SWITCHDEV_PORT_ATTR_SET:
1752 err = switchdev_handle_port_attr_set(dev, ptr,
1753 prestera_netdev_check,
1754 prestera_port_obj_attr_set);
1755 break;
1756 default:
1757 return NOTIFY_DONE;
1758 }
1759
1760 return notifier_from_errno(err);
1761 }
1762
1763 static void prestera_fdb_event(struct prestera_switch *sw,
1764 struct prestera_event *evt, void *arg)
1765 {
1766 struct switchdev_notifier_fdb_info info = {};
1767 struct net_device *dev = NULL;
1768 struct prestera_port *port;
1769 struct prestera_lag *lag;
1770
1771 switch (evt->fdb_evt.type) {
1772 case PRESTERA_FDB_ENTRY_TYPE_REG_PORT:
1773 port = prestera_find_port(sw, evt->fdb_evt.dest.port_id);
1774 if (port)
1775 dev = port->dev;
1776 break;
1777 case PRESTERA_FDB_ENTRY_TYPE_LAG:
1778 lag = prestera_lag_by_id(sw, evt->fdb_evt.dest.lag_id);
1779 if (lag)
1780 dev = lag->dev;
1781 break;
1782 default:
1783 return;
1784 }
1785
1786 if (!dev)
1787 return;
1788
1789 info.addr = evt->fdb_evt.data.mac;
1790 info.vid = evt->fdb_evt.vid;
1791 info.offloaded = true;
1792
1793 rtnl_lock();
1794
1795 switch (evt->id) {
1796 case PRESTERA_FDB_EVENT_LEARNED:
1797 call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
1798 dev, &info.info, NULL);
1799 break;
1800 case PRESTERA_FDB_EVENT_AGED:
1801 call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE,
1802 dev, &info.info, NULL);
1803 break;
1804 }
1805
1806 rtnl_unlock();
1807 }
1808
1809 static int prestera_fdb_init(struct prestera_switch *sw)
1810 {
1811 int err;
1812
1813 err = prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_FDB,
1814 prestera_fdb_event, NULL);
1815 if (err)
1816 return err;
1817
1818 err = prestera_hw_switch_ageing_set(sw, PRESTERA_DEFAULT_AGEING_TIME_MS);
1819 if (err)
1820 goto err_ageing_set;
1821
1822 return 0;
1823
1824 err_ageing_set:
1825 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
1826 prestera_fdb_event);
1827 return err;
1828 }
1829
1830 static void prestera_fdb_fini(struct prestera_switch *sw)
1831 {
1832 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
1833 prestera_fdb_event);
1834 }
1835
1836 static int prestera_switchdev_handler_init(struct prestera_switchdev *swdev)
1837 {
1838 int err;
1839
1840 swdev->swdev_nb.notifier_call = prestera_switchdev_event;
1841 err = register_switchdev_notifier(&swdev->swdev_nb);
1842 if (err)
1843 goto err_register_swdev_notifier;
1844
1845 swdev->swdev_nb_blk.notifier_call = prestera_switchdev_blk_event;
1846 err = register_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
1847 if (err)
1848 goto err_register_blk_swdev_notifier;
1849
1850 return 0;
1851
1852 err_register_blk_swdev_notifier:
1853 unregister_switchdev_notifier(&swdev->swdev_nb);
1854 err_register_swdev_notifier:
1855 destroy_workqueue(swdev_wq);
1856 return err;
1857 }
1858
1859 static void prestera_switchdev_handler_fini(struct prestera_switchdev *swdev)
1860 {
1861 unregister_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
1862 unregister_switchdev_notifier(&swdev->swdev_nb);
1863 }
1864
1865 int prestera_switchdev_init(struct prestera_switch *sw)
1866 {
1867 struct prestera_switchdev *swdev;
1868 int err;
1869
1870 swdev = kzalloc(sizeof(*swdev), GFP_KERNEL);
1871 if (!swdev)
1872 return -ENOMEM;
1873
1874 sw->swdev = swdev;
1875 swdev->sw = sw;
1876
1877 INIT_LIST_HEAD(&swdev->bridge_list);
1878
1879 swdev_wq = alloc_ordered_workqueue("%s_ordered", 0, "prestera_br");
1880 if (!swdev_wq) {
1881 err = -ENOMEM;
1882 goto err_alloc_wq;
1883 }
1884
1885 err = prestera_switchdev_handler_init(swdev);
1886 if (err)
1887 goto err_swdev_init;
1888
1889 err = prestera_fdb_init(sw);
1890 if (err)
1891 goto err_fdb_init;
1892
1893 return 0;
1894
1895 err_fdb_init:
1896 err_swdev_init:
1897 destroy_workqueue(swdev_wq);
1898 err_alloc_wq:
1899 kfree(swdev);
1900
1901 return err;
1902 }
1903
1904 void prestera_switchdev_fini(struct prestera_switch *sw)
1905 {
1906 struct prestera_switchdev *swdev = sw->swdev;
1907
1908 prestera_fdb_fini(sw);
1909 prestera_switchdev_handler_fini(swdev);
1910 destroy_workqueue(swdev_wq);
1911 kfree(swdev);
1912 }