Skip to content

Commit

Permalink
net: marvell: prestera: Add router ipv6 ABI
Browse files Browse the repository at this point in the history
There are only lpm add/del for ipv6 needed.
Nexthops indexes shared with ipv4.

Limitations:
- Only "local" and "main" tables supported
- Only generic interfaces supported for router (no bridges or vlans)

Co-developed-by: Taras Chornyi <taras.chornyi@plvision.eu>
Signed-off-by: Taras Chornyi <taras.chornyi@plvision.eu>
Co-developed-by: Elad Nachman <enachman@marvell.com>
Signed-off-by: Elad Nachman <enachman@marvell.com>
Signed-off-by: Yevhen Orlov <yevhen.orlov@plvision.eu>
  • Loading branch information
OrlovEI authored and intel-lab-lkp committed Dec 19, 2022
1 parent 9054b41 commit 97d5847
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 6 deletions.
34 changes: 34 additions & 0 deletions drivers/net/ethernet/marvell/prestera/prestera_hw.c
Expand Up @@ -540,6 +540,11 @@ struct prestera_msg_iface {
u8 __pad[3];
};

enum prestera_msg_ip_addr_v {
PRESTERA_MSG_IPV4 = 0,
PRESTERA_MSG_IPV6
};

struct prestera_msg_ip_addr {
union {
__be32 ipv4;
Expand Down Expand Up @@ -2088,6 +2093,35 @@ int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id,
sizeof(req));
}

int prestera_hw_lpm6_add(struct prestera_switch *sw, u16 vr_id,
__u8 *dst, u32 dst_len, u32 grp_id)
{
struct prestera_msg_lpm_req req;

req.dst.v = PRESTERA_MSG_IPV6;
memcpy(&req.dst.u.ipv6, dst, 16);
req.dst_len = __cpu_to_le32(dst_len);
req.vr_id = __cpu_to_le16(vr_id);
req.grp_id = __cpu_to_le32(grp_id);

return prestera_cmd(sw, PRESTERA_CMD_TYPE_ROUTER_LPM_ADD, &req.cmd,
sizeof(req));
}

int prestera_hw_lpm6_del(struct prestera_switch *sw, u16 vr_id,
__u8 *dst, u32 dst_len)
{
struct prestera_msg_lpm_req req;

req.dst.v = PRESTERA_MSG_IPV6;
memcpy(&req.dst.u.ipv6, dst, 16);
req.dst_len = __cpu_to_le32(dst_len);
req.vr_id = __cpu_to_le16(vr_id);

return prestera_cmd(sw, PRESTERA_CMD_TYPE_ROUTER_LPM_DELETE, &req.cmd,
sizeof(req));
}

int prestera_hw_nh_entries_set(struct prestera_switch *sw, int count,
struct prestera_neigh_info *nhs, u32 grp_id)
{
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/ethernet/marvell/prestera/prestera_hw.h
Expand Up @@ -266,6 +266,10 @@ int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id,
__be32 dst, u32 dst_len, u32 grp_id);
int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id,
__be32 dst, u32 dst_len);
int prestera_hw_lpm6_add(struct prestera_switch *sw, u16 vr_id,
__u8 *dst, u32 dst_len, u32 grp_id);
int prestera_hw_lpm6_del(struct prestera_switch *sw, u16 vr_id,
__u8 *dst, u32 dst_len);

/* NH API */
int prestera_hw_nh_entries_set(struct prestera_switch *sw, int count,
Expand Down
33 changes: 27 additions & 6 deletions drivers/net/ethernet/marvell/prestera/prestera_router_hw.c
Expand Up @@ -581,8 +581,16 @@ static void __prestera_fib_node_destruct(struct prestera_switch *sw,
struct prestera_vr *vr;

vr = fib_node->info.vr;
prestera_hw_lpm_del(sw, vr->hw_vr_id, fib_node->key.addr.u.ipv4,
fib_node->key.prefix_len);
if (fib_node->key.addr.v == PRESTERA_IPV4)
prestera_hw_lpm_del(sw, vr->hw_vr_id, fib_node->key.addr.u.ipv4,
fib_node->key.prefix_len);
else if (fib_node->key.addr.v == PRESTERA_IPV6)
prestera_hw_lpm6_del(sw, vr->hw_vr_id,
(u8 *)&fib_node->key.addr.u.ipv6.s6_addr,
fib_node->key.prefix_len);
else
WARN(1, "Invalid address version. Memory corrupted?");

switch (fib_node->info.type) {
case PRESTERA_FIB_TYPE_UC_NH:
prestera_nexthop_group_put(sw, fib_node->info.nh_grp);
Expand Down Expand Up @@ -661,8 +669,16 @@ prestera_fib_node_create(struct prestera_switch *sw,
goto err_nh_grp_get;
}

err = prestera_hw_lpm_add(sw, vr->hw_vr_id, key->addr.u.ipv4,
key->prefix_len, grp_id);
if (key->addr.v == PRESTERA_IPV4)
err = prestera_hw_lpm_add(sw, vr->hw_vr_id, key->addr.u.ipv4,
key->prefix_len, grp_id);
else if (key->addr.v == PRESTERA_IPV6)
err = prestera_hw_lpm6_add(sw, vr->hw_vr_id,
(u8 *)&key->addr.u.ipv6.s6_addr,
key->prefix_len, grp_id);
else
WARN(1, "Invalid address version. Memory corrupted?");

if (err)
goto err_lpm_add;

Expand All @@ -674,8 +690,13 @@ prestera_fib_node_create(struct prestera_switch *sw,
return fib_node;

err_ht_insert:
prestera_hw_lpm_del(sw, vr->hw_vr_id, key->addr.u.ipv4,
key->prefix_len);
if (key->addr.v == PRESTERA_IPV4)
prestera_hw_lpm_del(sw, vr->hw_vr_id, key->addr.u.ipv4,
key->prefix_len);
else if (key->addr.v == PRESTERA_IPV6)
prestera_hw_lpm6_del(sw, vr->hw_vr_id,
(u8 *)&key->addr.u.ipv6.s6_addr,
key->prefix_len);
err_lpm_add:
if (fib_type == PRESTERA_FIB_TYPE_UC_NH)
prestera_nexthop_group_put(sw, fib_node->info.nh_grp);
Expand Down

0 comments on commit 97d5847

Please sign in to comment.