Commit 8ef95947 authored by Roopa Prabhu's avatar Roopa Prabhu Committed by David S. Miller

bridge: vlan tunnel id info range fill size calc cleanups

This fixes a bug and cleans up tunnelid range size
calculation code by using consistent variable names
and checks in size calculation and fill functions.

tested for a few cases of vlan-vni range mappings:
(output from patched iproute2):
$bridge vlan showtunnel
port     vid        tunid
vxlan0   100-105    1000-1005
         200        2000
         210        2100
         211-213    2100-2102
         214        2104
         216-217    2108-2109
         219        2119

Fixes: efa5356b ("bridge: per vlan dst_metadata netlink support")
Reported-by: default avatarColin Ian King <colin.king@canonical.com>
Signed-off-by: default avatarRoopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 97e219b7
...@@ -30,18 +30,18 @@ static size_t __get_vlan_tinfo_size(void) ...@@ -30,18 +30,18 @@ static size_t __get_vlan_tinfo_size(void)
nla_total_size(sizeof(u16)); /* IFLA_BRIDGE_VLAN_TUNNEL_FLAGS */ nla_total_size(sizeof(u16)); /* IFLA_BRIDGE_VLAN_TUNNEL_FLAGS */
} }
static bool vlan_tunnel_id_isrange(struct net_bridge_vlan *v, static bool vlan_tunid_inrange(struct net_bridge_vlan *v_curr,
struct net_bridge_vlan *v_end) struct net_bridge_vlan *v_last)
{ {
__be32 tunid_curr = tunnel_id_to_key32(v->tinfo.tunnel_id); __be32 tunid_curr = tunnel_id_to_key32(v_curr->tinfo.tunnel_id);
__be32 tunid_end = tunnel_id_to_key32(v_end->tinfo.tunnel_id); __be32 tunid_last = tunnel_id_to_key32(v_last->tinfo.tunnel_id);
return (be32_to_cpu(tunid_curr) - be32_to_cpu(tunid_end)) == 1; return (be32_to_cpu(tunid_curr) - be32_to_cpu(tunid_last)) == 1;
} }
static int __get_num_vlan_tunnel_infos(struct net_bridge_vlan_group *vg) static int __get_num_vlan_tunnel_infos(struct net_bridge_vlan_group *vg)
{ {
struct net_bridge_vlan *v, *v_start = NULL, *v_end = NULL; struct net_bridge_vlan *v, *vtbegin = NULL, *vtend = NULL;
int num_tinfos = 0; int num_tinfos = 0;
/* Count number of vlan infos */ /* Count number of vlan infos */
...@@ -50,27 +50,25 @@ static int __get_num_vlan_tunnel_infos(struct net_bridge_vlan_group *vg) ...@@ -50,27 +50,25 @@ static int __get_num_vlan_tunnel_infos(struct net_bridge_vlan_group *vg)
if (!br_vlan_should_use(v) || !v->tinfo.tunnel_id) if (!br_vlan_should_use(v) || !v->tinfo.tunnel_id)
continue; continue;
if (!v_start) { if (!vtbegin) {
goto initvars; goto initvars;
} else if ((v->vid - v_end->vid) == 1 && } else if ((v->vid - vtend->vid) == 1 &&
vlan_tunnel_id_isrange(v_end, v) == 1) { vlan_tunid_inrange(v, vtend)) {
v_end = v; vtend = v;
continue; continue;
} else { } else {
if ((v_end->vid - v->vid) > 0 && if ((vtend->vid - vtbegin->vid) > 0)
vlan_tunnel_id_isrange(v_end, v) > 0)
num_tinfos += 2; num_tinfos += 2;
else else
num_tinfos += 1; num_tinfos += 1;
} }
initvars: initvars:
v_start = v; vtbegin = v;
v_end = v; vtend = v;
} }
if (v_start) { if (vtbegin && vtend) {
if ((v_end->vid - v->vid) > 0 && if ((vtend->vid - vtbegin->vid) > 0)
vlan_tunnel_id_isrange(v_end, v) > 0)
num_tinfos += 2; num_tinfos += 2;
else else
num_tinfos += 1; num_tinfos += 1;
...@@ -171,7 +169,7 @@ int br_fill_vlan_tunnel_info(struct sk_buff *skb, ...@@ -171,7 +169,7 @@ int br_fill_vlan_tunnel_info(struct sk_buff *skb,
if (!vtbegin) { if (!vtbegin) {
goto initvars; goto initvars;
} else if ((v->vid - vtend->vid) == 1 && } else if ((v->vid - vtend->vid) == 1 &&
vlan_tunnel_id_isrange(v, vtend)) { vlan_tunid_inrange(v, vtend)) {
vtend = v; vtend = v;
continue; continue;
} else { } else {
......
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