Lines Matching refs:bridge

468 				  struct mlx5_esw_bridge *bridge)  in mlx5_esw_bridge_egress_table_init()  argument
537 bridge->egress_ft = egress_ft; in mlx5_esw_bridge_egress_table_init()
538 bridge->egress_vlan_fg = vlan_fg; in mlx5_esw_bridge_egress_table_init()
539 bridge->egress_qinq_fg = qinq_fg; in mlx5_esw_bridge_egress_table_init()
540 bridge->egress_mac_fg = mac_fg; in mlx5_esw_bridge_egress_table_init()
541 bridge->egress_miss_fg = miss_fg; in mlx5_esw_bridge_egress_table_init()
542 bridge->egress_miss_pkt_reformat = miss_pkt_reformat; in mlx5_esw_bridge_egress_table_init()
543 bridge->egress_miss_handle = miss_handle; in mlx5_esw_bridge_egress_table_init()
556 mlx5_esw_bridge_egress_table_cleanup(struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_egress_table_cleanup() argument
558 if (bridge->egress_miss_handle) in mlx5_esw_bridge_egress_table_cleanup()
559 mlx5_del_flow_rules(bridge->egress_miss_handle); in mlx5_esw_bridge_egress_table_cleanup()
560 if (bridge->egress_miss_pkt_reformat) in mlx5_esw_bridge_egress_table_cleanup()
561 mlx5_packet_reformat_dealloc(bridge->br_offloads->esw->dev, in mlx5_esw_bridge_egress_table_cleanup()
562 bridge->egress_miss_pkt_reformat); in mlx5_esw_bridge_egress_table_cleanup()
563 if (bridge->egress_miss_fg) in mlx5_esw_bridge_egress_table_cleanup()
564 mlx5_destroy_flow_group(bridge->egress_miss_fg); in mlx5_esw_bridge_egress_table_cleanup()
565 mlx5_destroy_flow_group(bridge->egress_mac_fg); in mlx5_esw_bridge_egress_table_cleanup()
566 mlx5_destroy_flow_group(bridge->egress_qinq_fg); in mlx5_esw_bridge_egress_table_cleanup()
567 mlx5_destroy_flow_group(bridge->egress_vlan_fg); in mlx5_esw_bridge_egress_table_cleanup()
568 mlx5_destroy_flow_table(bridge->egress_ft); in mlx5_esw_bridge_egress_table_cleanup()
574 struct mlx5_esw_bridge *bridge, in mlx5_esw_bridge_ingress_flow_with_esw_create() argument
577 struct mlx5_esw_bridge_offloads *br_offloads = bridge->br_offloads; in mlx5_esw_bridge_ingress_flow_with_esw_create()
611 if (bridge->vlan_proto == ETH_P_8021Q) { in mlx5_esw_bridge_ingress_flow_with_esw_create()
616 } else if (bridge->vlan_proto == ETH_P_8021AD) { in mlx5_esw_bridge_ingress_flow_with_esw_create()
629 dests[0].ft = bridge->egress_ft; in mlx5_esw_bridge_ingress_flow_with_esw_create()
643 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_ingress_flow_create() argument
646 bridge, bridge->br_offloads->esw); in mlx5_esw_bridge_ingress_flow_create()
653 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_ingress_flow_peer_create() argument
655 struct mlx5_devcom_comp_dev *devcom = bridge->br_offloads->esw->devcom, *pos; in mlx5_esw_bridge_ingress_flow_peer_create()
675 bridge, peer_esw); in mlx5_esw_bridge_ingress_flow_peer_create()
684 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_ingress_filter_flow_create() argument
686 struct mlx5_esw_bridge_offloads *br_offloads = bridge->br_offloads; in mlx5_esw_bridge_ingress_filter_flow_create()
717 if (bridge->vlan_proto == ETH_P_8021Q) { in mlx5_esw_bridge_ingress_filter_flow_create()
722 } else if (bridge->vlan_proto == ETH_P_8021AD) { in mlx5_esw_bridge_ingress_filter_flow_create()
738 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_egress_flow_create() argument
756 if (MLX5_CAP_ESW_FLOWTABLE(bridge->br_offloads->esw->dev, flow_source) && in mlx5_esw_bridge_egress_flow_create()
775 if (bridge->vlan_proto == ETH_P_8021Q) { in mlx5_esw_bridge_egress_flow_create()
780 } else if (bridge->vlan_proto == ETH_P_8021AD) { in mlx5_esw_bridge_egress_flow_create()
792 if (MLX5_CAP_ESW(bridge->br_offloads->esw->dev, merged_eswitch)) { in mlx5_esw_bridge_egress_flow_create()
796 handle = mlx5_add_flow_rules(bridge->egress_ft, rule_spec, &flow_act, &dest, 1); in mlx5_esw_bridge_egress_flow_create()
840 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_create() local
843 bridge = kvzalloc(sizeof(*bridge), GFP_KERNEL); in mlx5_esw_bridge_create()
844 if (!bridge) in mlx5_esw_bridge_create()
847 bridge->br_offloads = br_offloads; in mlx5_esw_bridge_create()
848 err = mlx5_esw_bridge_egress_table_init(br_offloads, bridge); in mlx5_esw_bridge_create()
852 err = rhashtable_init(&bridge->fdb_ht, &fdb_ht_params); in mlx5_esw_bridge_create()
856 err = mlx5_esw_bridge_mdb_init(bridge); in mlx5_esw_bridge_create()
860 INIT_LIST_HEAD(&bridge->fdb_list); in mlx5_esw_bridge_create()
861 bridge->ifindex = br_netdev->ifindex; in mlx5_esw_bridge_create()
862 bridge->refcnt = 1; in mlx5_esw_bridge_create()
863 bridge->ageing_time = clock_t_to_jiffies(BR_DEFAULT_AGEING_TIME); in mlx5_esw_bridge_create()
864 bridge->vlan_proto = ETH_P_8021Q; in mlx5_esw_bridge_create()
865 list_add(&bridge->list, &br_offloads->bridges); in mlx5_esw_bridge_create()
866 mlx5_esw_bridge_debugfs_init(br_netdev, bridge); in mlx5_esw_bridge_create()
868 return bridge; in mlx5_esw_bridge_create()
871 rhashtable_destroy(&bridge->fdb_ht); in mlx5_esw_bridge_create()
873 mlx5_esw_bridge_egress_table_cleanup(bridge); in mlx5_esw_bridge_create()
875 kvfree(bridge); in mlx5_esw_bridge_create()
879 static void mlx5_esw_bridge_get(struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_get() argument
881 bridge->refcnt++; in mlx5_esw_bridge_get()
885 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_put() argument
887 if (--bridge->refcnt) in mlx5_esw_bridge_put()
890 mlx5_esw_bridge_debugfs_cleanup(bridge); in mlx5_esw_bridge_put()
891 mlx5_esw_bridge_egress_table_cleanup(bridge); in mlx5_esw_bridge_put()
892 mlx5_esw_bridge_mcast_disable(bridge); in mlx5_esw_bridge_put()
893 list_del(&bridge->list); in mlx5_esw_bridge_put()
894 mlx5_esw_bridge_mdb_cleanup(bridge); in mlx5_esw_bridge_put()
895 rhashtable_destroy(&bridge->fdb_ht); in mlx5_esw_bridge_put()
896 kvfree(bridge); in mlx5_esw_bridge_put()
905 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_lookup() local
909 list_for_each_entry(bridge, &br_offloads->bridges, list) { in mlx5_esw_bridge_lookup()
910 if (bridge->ifindex == br_netdev->ifindex) { in mlx5_esw_bridge_lookup()
911 mlx5_esw_bridge_get(bridge); in mlx5_esw_bridge_lookup()
912 return bridge; in mlx5_esw_bridge_lookup()
923 bridge = mlx5_esw_bridge_create(br_netdev, br_offloads); in mlx5_esw_bridge_lookup()
924 if (IS_ERR(bridge) && list_empty(&br_offloads->bridges)) in mlx5_esw_bridge_lookup()
926 return bridge; in mlx5_esw_bridge_lookup()
969 return port->bridge; in mlx5_esw_bridge_from_port_lookup()
983 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_fdb_entry_cleanup() argument
987 rhashtable_remove_fast(&bridge->fdb_ht, &entry->ht_node, fdb_ht_params); in mlx5_esw_bridge_fdb_entry_cleanup()
992 mlx5_fc_destroy(bridge->br_offloads->esw->dev, entry->ingress_counter); in mlx5_esw_bridge_fdb_entry_cleanup()
1000 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_fdb_entry_notify_and_cleanup() argument
1003 mlx5_esw_bridge_fdb_entry_cleanup(entry, bridge); in mlx5_esw_bridge_fdb_entry_notify_and_cleanup()
1006 static void mlx5_esw_bridge_fdb_flush(struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_fdb_flush() argument
1010 list_for_each_entry_safe(entry, tmp, &bridge->fdb_list, list) in mlx5_esw_bridge_fdb_flush()
1011 mlx5_esw_bridge_fdb_entry_notify_and_cleanup(entry, bridge); in mlx5_esw_bridge_fdb_flush()
1219 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_vlan_flush() argument
1221 struct mlx5_eswitch *esw = bridge->br_offloads->esw; in mlx5_esw_bridge_vlan_flush()
1225 mlx5_esw_bridge_fdb_entry_notify_and_cleanup(entry, bridge); in mlx5_esw_bridge_vlan_flush()
1240 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_vlan_cleanup() argument
1243 mlx5_esw_bridge_vlan_flush(port, vlan, bridge); in mlx5_esw_bridge_vlan_cleanup()
1249 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_port_vlans_flush() argument
1255 mlx5_esw_bridge_vlan_cleanup(port, vlan, bridge); in mlx5_esw_bridge_port_vlans_flush()
1259 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_port_vlans_recreate() argument
1261 struct mlx5_esw_bridge_offloads *br_offloads = bridge->br_offloads; in mlx5_esw_bridge_port_vlans_recreate()
1267 mlx5_esw_bridge_vlan_flush(port, vlan, bridge); in mlx5_esw_bridge_port_vlans_recreate()
1268 err = mlx5_esw_bridge_vlan_push_pop_create(bridge->vlan_proto, vlan->flags, port, in mlx5_esw_bridge_port_vlans_recreate()
1273 vlan->vid, bridge->vlan_proto, port->vport_num, in mlx5_esw_bridge_port_vlans_recreate()
1283 mlx5_esw_bridge_vlans_recreate(struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_vlans_recreate() argument
1285 struct mlx5_esw_bridge_offloads *br_offloads = bridge->br_offloads; in mlx5_esw_bridge_vlans_recreate()
1291 if (port->bridge != bridge) in mlx5_esw_bridge_vlans_recreate()
1294 err = mlx5_esw_bridge_port_vlans_recreate(port, bridge); in mlx5_esw_bridge_vlans_recreate()
1304 struct mlx5_esw_bridge *bridge, struct mlx5_eswitch *esw) in mlx5_esw_bridge_port_vlan_lookup() argument
1309 port = mlx5_esw_bridge_port_lookup(vport_num, esw_owner_vhca_id, bridge->br_offloads); in mlx5_esw_bridge_port_vlan_lookup()
1332 mlx5_esw_bridge_fdb_lookup(struct mlx5_esw_bridge *bridge, in mlx5_esw_bridge_fdb_lookup() argument
1339 return rhashtable_lookup_fast(&bridge->fdb_ht, &key, fdb_ht_params); in mlx5_esw_bridge_fdb_lookup()
1345 struct mlx5_eswitch *esw, struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_fdb_entry_init() argument
1353 if (bridge->flags & MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG && vid) { in mlx5_esw_bridge_fdb_entry_init()
1354 vlan = mlx5_esw_bridge_port_vlan_lookup(vid, vport_num, esw_owner_vhca_id, bridge, in mlx5_esw_bridge_fdb_entry_init()
1360 entry = mlx5_esw_bridge_fdb_lookup(bridge, addr, vid); in mlx5_esw_bridge_fdb_entry_init()
1362 mlx5_esw_bridge_fdb_entry_notify_and_cleanup(entry, bridge); in mlx5_esw_bridge_fdb_entry_init()
1389 bridge) : in mlx5_esw_bridge_fdb_entry_init()
1391 mlx5_fc_id(counter), bridge); in mlx5_esw_bridge_fdb_entry_init()
1400 if (bridge->flags & MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG) { in mlx5_esw_bridge_fdb_entry_init()
1401 handle = mlx5_esw_bridge_ingress_filter_flow_create(vport_num, addr, bridge); in mlx5_esw_bridge_fdb_entry_init()
1412 bridge); in mlx5_esw_bridge_fdb_entry_init()
1421 err = rhashtable_insert_fast(&bridge->fdb_ht, &entry->ht_node, fdb_ht_params); in mlx5_esw_bridge_fdb_entry_init()
1431 list_add(&entry->list, &bridge->fdb_list); in mlx5_esw_bridge_fdb_entry_init()
1453 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_ageing_time_set() local
1455 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_ageing_time_set()
1456 if (!bridge) in mlx5_esw_bridge_ageing_time_set()
1459 bridge->ageing_time = clock_t_to_jiffies(ageing_time); in mlx5_esw_bridge_ageing_time_set()
1466 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_vlan_filtering_set() local
1469 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_vlan_filtering_set()
1470 if (!bridge) in mlx5_esw_bridge_vlan_filtering_set()
1473 filtering = bridge->flags & MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG; in mlx5_esw_bridge_vlan_filtering_set()
1477 mlx5_esw_bridge_fdb_flush(bridge); in mlx5_esw_bridge_vlan_filtering_set()
1478 mlx5_esw_bridge_mdb_flush(bridge); in mlx5_esw_bridge_vlan_filtering_set()
1480 bridge->flags |= MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG; in mlx5_esw_bridge_vlan_filtering_set()
1482 bridge->flags &= ~MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG; in mlx5_esw_bridge_vlan_filtering_set()
1490 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_vlan_proto_set() local
1492 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, in mlx5_esw_bridge_vlan_proto_set()
1494 if (!bridge) in mlx5_esw_bridge_vlan_proto_set()
1497 if (bridge->vlan_proto == proto) in mlx5_esw_bridge_vlan_proto_set()
1504 mlx5_esw_bridge_fdb_flush(bridge); in mlx5_esw_bridge_vlan_proto_set()
1505 mlx5_esw_bridge_mdb_flush(bridge); in mlx5_esw_bridge_vlan_proto_set()
1506 bridge->vlan_proto = proto; in mlx5_esw_bridge_vlan_proto_set()
1507 mlx5_esw_bridge_vlans_recreate(bridge); in mlx5_esw_bridge_vlan_proto_set()
1516 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_mcast_set() local
1526 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_mcast_set()
1527 if (!bridge) in mlx5_esw_bridge_mcast_set()
1530 mcast = bridge->flags & MLX5_ESW_BRIDGE_MCAST_FLAG; in mlx5_esw_bridge_mcast_set()
1535 err = mlx5_esw_bridge_mcast_enable(bridge); in mlx5_esw_bridge_mcast_set()
1537 mlx5_esw_bridge_mcast_disable(bridge); in mlx5_esw_bridge_mcast_set()
1544 struct mlx5_esw_bridge *bridge) in mlx5_esw_bridge_vport_init() argument
1556 port->bridge = bridge; in mlx5_esw_bridge_vport_init()
1590 struct mlx5_esw_bridge *bridge = port->bridge; in mlx5_esw_bridge_vport_cleanup() local
1593 list_for_each_entry_safe(entry, tmp, &bridge->fdb_list, list) in mlx5_esw_bridge_vport_cleanup()
1595 mlx5_esw_bridge_fdb_entry_cleanup(entry, bridge); in mlx5_esw_bridge_vport_cleanup()
1598 mlx5_esw_bridge_port_vlans_flush(port, bridge); in mlx5_esw_bridge_vport_cleanup()
1602 mlx5_esw_bridge_put(br_offloads, bridge); in mlx5_esw_bridge_vport_cleanup()
1611 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_vport_link_with_flags() local
1614 bridge = mlx5_esw_bridge_lookup(br_netdev, br_offloads); in mlx5_esw_bridge_vport_link_with_flags()
1615 if (IS_ERR(bridge)) { in mlx5_esw_bridge_vport_link_with_flags()
1617 return PTR_ERR(bridge); in mlx5_esw_bridge_vport_link_with_flags()
1620 err = mlx5_esw_bridge_vport_init(vport_num, esw_owner_vhca_id, flags, br_offloads, bridge); in mlx5_esw_bridge_vport_link_with_flags()
1628 mlx5_esw_bridge_put(br_offloads, bridge); in mlx5_esw_bridge_vport_link_with_flags()
1653 if (port->bridge->ifindex != br_netdev->ifindex) { in mlx5_esw_bridge_vport_unlink()
1701 mlx5_esw_bridge_vlan_cleanup(port, vlan, port->bridge); in mlx5_esw_bridge_port_vlan_add()
1704 vlan = mlx5_esw_bridge_vlan_create(port->bridge->vlan_proto, vid, flags, port, in mlx5_esw_bridge_port_vlan_add()
1726 mlx5_esw_bridge_vlan_cleanup(port, vlan, port->bridge); in mlx5_esw_bridge_port_vlan_del()
1734 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_fdb_update_used() local
1736 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_fdb_update_used()
1737 if (!bridge) in mlx5_esw_bridge_fdb_update_used()
1740 entry = mlx5_esw_bridge_fdb_lookup(bridge, fdb_info->addr, fdb_info->vid); in mlx5_esw_bridge_fdb_update_used()
1756 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_fdb_mark_deleted() local
1758 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_fdb_mark_deleted()
1759 if (!bridge) in mlx5_esw_bridge_fdb_mark_deleted()
1762 entry = mlx5_esw_bridge_fdb_lookup(bridge, fdb_info->addr, fdb_info->vid); in mlx5_esw_bridge_fdb_mark_deleted()
1779 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_fdb_create() local
1785 bridge = port->bridge; in mlx5_esw_bridge_fdb_create()
1789 br_offloads->esw, bridge); in mlx5_esw_bridge_fdb_create()
1808 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_fdb_remove() local
1810 bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads); in mlx5_esw_bridge_fdb_remove()
1811 if (!bridge) in mlx5_esw_bridge_fdb_remove()
1814 entry = mlx5_esw_bridge_fdb_lookup(bridge, fdb_info->addr, fdb_info->vid); in mlx5_esw_bridge_fdb_remove()
1822 mlx5_esw_bridge_fdb_entry_notify_and_cleanup(entry, bridge); in mlx5_esw_bridge_fdb_remove()
1828 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_update() local
1830 list_for_each_entry(bridge, &br_offloads->bridges, list) { in mlx5_esw_bridge_update()
1831 list_for_each_entry_safe(entry, tmp, &bridge->fdb_list, list) { in mlx5_esw_bridge_update()
1842 time_is_before_jiffies(entry->lastuse + bridge->ageing_time)) in mlx5_esw_bridge_update()
1843 mlx5_esw_bridge_fdb_entry_notify_and_cleanup(entry, bridge); in mlx5_esw_bridge_update()
1855 struct mlx5_esw_bridge *bridge; in mlx5_esw_bridge_port_mdb_add() local
1869 bridge = port->bridge; in mlx5_esw_bridge_port_mdb_add()
1870 if (bridge->flags & MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG && vid) { in mlx5_esw_bridge_port_mdb_add()