Commit 5a9db8d4 authored by Vlad Buslov's avatar Vlad Buslov Committed by Saeed Mahameed

net/mlx5: Bridge, extract VLAN push/pop actions creation

Following patches in series need to re-create VLAN actions when user
changes VLAN protocol. Extract the code that creates VLAN push/pop actions
into dedicated function in order to be reused in next patch.
Signed-off-by: default avatarVlad Buslov <vladbu@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent d4893978
...@@ -1025,36 +1025,58 @@ mlx5_esw_bridge_vlan_push_mark_cleanup(struct mlx5_esw_bridge_vlan *vlan, struct ...@@ -1025,36 +1025,58 @@ mlx5_esw_bridge_vlan_push_mark_cleanup(struct mlx5_esw_bridge_vlan *vlan, struct
vlan->pkt_mod_hdr_push_mark = NULL; vlan->pkt_mod_hdr_push_mark = NULL;
} }
static struct mlx5_esw_bridge_vlan * static int
mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *port, mlx5_esw_bridge_vlan_push_pop_create(u16 flags, struct mlx5_esw_bridge_vlan *vlan,
struct mlx5_eswitch *esw) struct mlx5_eswitch *esw)
{ {
struct mlx5_esw_bridge_vlan *vlan;
int err; int err;
vlan = kvzalloc(sizeof(*vlan), GFP_KERNEL);
if (!vlan)
return ERR_PTR(-ENOMEM);
vlan->vid = vid;
vlan->flags = flags;
INIT_LIST_HEAD(&vlan->fdb_list);
if (flags & BRIDGE_VLAN_INFO_PVID) { if (flags & BRIDGE_VLAN_INFO_PVID) {
err = mlx5_esw_bridge_vlan_push_create(vlan, esw); err = mlx5_esw_bridge_vlan_push_create(vlan, esw);
if (err) if (err)
goto err_vlan_push; return err;
err = mlx5_esw_bridge_vlan_push_mark_create(vlan, esw); err = mlx5_esw_bridge_vlan_push_mark_create(vlan, esw);
if (err) if (err)
goto err_vlan_push_mark; goto err_vlan_push_mark;
} }
if (flags & BRIDGE_VLAN_INFO_UNTAGGED) { if (flags & BRIDGE_VLAN_INFO_UNTAGGED) {
err = mlx5_esw_bridge_vlan_pop_create(vlan, esw); err = mlx5_esw_bridge_vlan_pop_create(vlan, esw);
if (err) if (err)
goto err_vlan_pop; goto err_vlan_pop;
} }
return 0;
err_vlan_pop:
if (vlan->pkt_mod_hdr_push_mark)
mlx5_esw_bridge_vlan_push_mark_cleanup(vlan, esw);
err_vlan_push_mark:
if (vlan->pkt_reformat_push)
mlx5_esw_bridge_vlan_push_cleanup(vlan, esw);
return err;
}
static struct mlx5_esw_bridge_vlan *
mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *port,
struct mlx5_eswitch *esw)
{
struct mlx5_esw_bridge_vlan *vlan;
int err;
vlan = kvzalloc(sizeof(*vlan), GFP_KERNEL);
if (!vlan)
return ERR_PTR(-ENOMEM);
vlan->vid = vid;
vlan->flags = flags;
INIT_LIST_HEAD(&vlan->fdb_list);
err = mlx5_esw_bridge_vlan_push_pop_create(flags, vlan, esw);
if (err)
goto err_vlan_push_pop;
err = xa_insert(&port->vlans, vid, vlan, GFP_KERNEL); err = xa_insert(&port->vlans, vid, vlan, GFP_KERNEL);
if (err) if (err)
goto err_xa_insert; goto err_xa_insert;
...@@ -1065,13 +1087,11 @@ mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *por ...@@ -1065,13 +1087,11 @@ mlx5_esw_bridge_vlan_create(u16 vid, u16 flags, struct mlx5_esw_bridge_port *por
err_xa_insert: err_xa_insert:
if (vlan->pkt_reformat_pop) if (vlan->pkt_reformat_pop)
mlx5_esw_bridge_vlan_pop_cleanup(vlan, esw); mlx5_esw_bridge_vlan_pop_cleanup(vlan, esw);
err_vlan_pop:
if (vlan->pkt_mod_hdr_push_mark) if (vlan->pkt_mod_hdr_push_mark)
mlx5_esw_bridge_vlan_push_mark_cleanup(vlan, esw); mlx5_esw_bridge_vlan_push_mark_cleanup(vlan, esw);
err_vlan_push_mark:
if (vlan->pkt_reformat_push) if (vlan->pkt_reformat_push)
mlx5_esw_bridge_vlan_push_cleanup(vlan, esw); mlx5_esw_bridge_vlan_push_cleanup(vlan, esw);
err_vlan_push: err_vlan_push_pop:
kvfree(vlan); kvfree(vlan);
return ERR_PTR(err); return ERR_PTR(err);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment