Skip to content

Commit 300c191

Browse files
Michael Chandavem330
authored andcommitted
bnxt_en: Add ntuple matching flags to the bnxt_ntuple_filter structure.
aRFS filters match all 5 tuples. User defined ntuple filters may specify some of the tuples as wildcards. To support that, we add the ntuple_flags to the bnxt_ntuple_filter struct to specify which tuple fields are to be matched. The matching tuple fields will then be passed to the firmware in bnxt_hwrm_cfa_ntuple_filter_alloc() to create the proper filter. Reviewed-by: Vasundhara Volam <[email protected]> Reviewed-by: Andy Gospodarek <[email protected]> Reviewed-by: Pavan Chebbi <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4faeadf commit 300c191

File tree

3 files changed

+99
-50
lines changed

3 files changed

+99
-50
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5642,6 +5642,14 @@ int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp,
56425642
#define BNXT_NTP_TUNNEL_FLTR_FLAG \
56435643
CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_TUNNEL_TYPE
56445644

5645+
void bnxt_fill_ipv6_mask(__be32 mask[4])
5646+
{
5647+
int i;
5648+
5649+
for (i = 0; i < 4; i++)
5650+
mask[i] = cpu_to_be32(~0);
5651+
}
5652+
56455653
static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
56465654
struct bnxt_ntuple_filter *fltr)
56475655
{
@@ -5676,35 +5684,43 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
56765684
req->ip_protocol = keys->basic.ip_proto;
56775685

56785686
if (keys->basic.n_proto == htons(ETH_P_IPV6)) {
5679-
int i;
5680-
56815687
req->ethertype = htons(ETH_P_IPV6);
56825688
req->ip_addr_type =
56835689
CFA_NTUPLE_FILTER_ALLOC_REQ_IP_ADDR_TYPE_IPV6;
5684-
*(struct in6_addr *)&req->src_ipaddr[0] =
5685-
keys->addrs.v6addrs.src;
5686-
*(struct in6_addr *)&req->dst_ipaddr[0] =
5687-
keys->addrs.v6addrs.dst;
5688-
for (i = 0; i < 4; i++) {
5689-
req->src_ipaddr_mask[i] = cpu_to_be32(0xffffffff);
5690-
req->dst_ipaddr_mask[i] = cpu_to_be32(0xffffffff);
5690+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) {
5691+
*(struct in6_addr *)&req->src_ipaddr[0] =
5692+
keys->addrs.v6addrs.src;
5693+
bnxt_fill_ipv6_mask(req->src_ipaddr_mask);
5694+
}
5695+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) {
5696+
*(struct in6_addr *)&req->dst_ipaddr[0] =
5697+
keys->addrs.v6addrs.dst;
5698+
bnxt_fill_ipv6_mask(req->dst_ipaddr_mask);
56915699
}
56925700
} else {
5693-
req->src_ipaddr[0] = keys->addrs.v4addrs.src;
5694-
req->src_ipaddr_mask[0] = cpu_to_be32(0xffffffff);
5695-
req->dst_ipaddr[0] = keys->addrs.v4addrs.dst;
5696-
req->dst_ipaddr_mask[0] = cpu_to_be32(0xffffffff);
5701+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) {
5702+
req->src_ipaddr[0] = keys->addrs.v4addrs.src;
5703+
req->src_ipaddr_mask[0] = cpu_to_be32(0xffffffff);
5704+
}
5705+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) {
5706+
req->dst_ipaddr[0] = keys->addrs.v4addrs.dst;
5707+
req->dst_ipaddr_mask[0] = cpu_to_be32(0xffffffff);
5708+
}
56975709
}
56985710
if (keys->control.flags & FLOW_DIS_ENCAPSULATION) {
56995711
req->enables |= cpu_to_le32(BNXT_NTP_TUNNEL_FLTR_FLAG);
57005712
req->tunnel_type =
57015713
CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_ANYTUNNEL;
57025714
}
57035715

5704-
req->src_port = keys->ports.src;
5705-
req->src_port_mask = cpu_to_be16(0xffff);
5706-
req->dst_port = keys->ports.dst;
5707-
req->dst_port_mask = cpu_to_be16(0xffff);
5716+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) {
5717+
req->src_port = keys->ports.src;
5718+
req->src_port_mask = cpu_to_be16(0xffff);
5719+
}
5720+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) {
5721+
req->dst_port = keys->ports.dst;
5722+
req->dst_port_mask = cpu_to_be16(0xffff);
5723+
}
57085724

57095725
resp = hwrm_req_hold(bp, req);
57105726
rc = hwrm_req_send(bp, req);
@@ -13886,24 +13902,38 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
1388613902
struct flow_keys *keys1 = &f1->fkeys;
1388713903
struct flow_keys *keys2 = &f2->fkeys;
1388813904

13905+
if (f1->ntuple_flags != f2->ntuple_flags)
13906+
return false;
13907+
1388913908
if (keys1->basic.n_proto != keys2->basic.n_proto ||
1389013909
keys1->basic.ip_proto != keys2->basic.ip_proto)
1389113910
return false;
1389213911

1389313912
if (keys1->basic.n_proto == htons(ETH_P_IP)) {
13894-
if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
13895-
keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst)
13913+
if (((f1->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) &&
13914+
keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src) ||
13915+
((f1->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) &&
13916+
keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst))
1389613917
return false;
1389713918
} else {
13898-
if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src,
13899-
sizeof(keys1->addrs.v6addrs.src)) ||
13900-
memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst,
13901-
sizeof(keys1->addrs.v6addrs.dst)))
13919+
if (((f1->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) &&
13920+
memcmp(&keys1->addrs.v6addrs.src,
13921+
&keys2->addrs.v6addrs.src,
13922+
sizeof(keys1->addrs.v6addrs.src))) ||
13923+
((f1->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) &&
13924+
memcmp(&keys1->addrs.v6addrs.dst,
13925+
&keys2->addrs.v6addrs.dst,
13926+
sizeof(keys1->addrs.v6addrs.dst))))
1390213927
return false;
1390313928
}
1390413929

13905-
if (keys1->ports.ports == keys2->ports.ports &&
13906-
keys1->control.flags == keys2->control.flags &&
13930+
if (((f1->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) &&
13931+
keys1->ports.src != keys2->ports.src) ||
13932+
((f1->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) &&
13933+
keys1->ports.dst != keys2->ports.dst))
13934+
return false;
13935+
13936+
if (keys1->control.flags == keys2->control.flags &&
1390713937
f1->l2_fltr == f2->l2_fltr)
1390813938
return true;
1390913939

@@ -13985,6 +14015,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
1398514015
}
1398614016

1398714017
new_fltr->l2_fltr = l2_fltr;
14018+
new_fltr->ntuple_flags = BNXT_NTUPLE_MATCH_ALL;
1398814019

1398914020
idx = bnxt_get_ntp_filter_idx(bp, fkeys, skb);
1399014021
rcu_read_lock();

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,15 @@ struct bnxt_ntuple_filter {
13581358
struct bnxt_filter_base base;
13591359
struct flow_keys fkeys;
13601360
struct bnxt_l2_filter *l2_fltr;
1361+
u32 ntuple_flags;
1362+
#define BNXT_NTUPLE_MATCH_SRC_IP 1
1363+
#define BNXT_NTUPLE_MATCH_DST_IP 2
1364+
#define BNXT_NTUPLE_MATCH_SRC_PORT 4
1365+
#define BNXT_NTUPLE_MATCH_DST_PORT 8
1366+
#define BNXT_NTUPLE_MATCH_ALL (BNXT_NTUPLE_MATCH_SRC_IP | \
1367+
BNXT_NTUPLE_MATCH_DST_IP | \
1368+
BNXT_NTUPLE_MATCH_SRC_PORT | \
1369+
BNXT_NTUPLE_MATCH_DST_PORT)
13611370
u32 flow_id;
13621371
};
13631372

@@ -2638,6 +2647,7 @@ int bnxt_hwrm_l2_filter_free(struct bnxt *bp, struct bnxt_l2_filter *fltr);
26382647
int bnxt_hwrm_l2_filter_alloc(struct bnxt *bp, struct bnxt_l2_filter *fltr);
26392648
int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp,
26402649
struct bnxt_ntuple_filter *fltr);
2650+
void bnxt_fill_ipv6_mask(__be32 mask[4]);
26412651
int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings);
26422652
int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id);
26432653
int __bnxt_hwrm_get_tx_rings(struct bnxt *bp, u16 fid, int *tx_rings);

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,40 +1100,48 @@ static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd)
11001100
else
11011101
goto fltr_err;
11021102

1103-
fs->h_u.tcp_ip4_spec.ip4src = fkeys->addrs.v4addrs.src;
1104-
fs->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(~0);
1105-
1106-
fs->h_u.tcp_ip4_spec.ip4dst = fkeys->addrs.v4addrs.dst;
1107-
fs->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(~0);
1108-
1109-
fs->h_u.tcp_ip4_spec.psrc = fkeys->ports.src;
1110-
fs->m_u.tcp_ip4_spec.psrc = cpu_to_be16(~0);
1111-
1112-
fs->h_u.tcp_ip4_spec.pdst = fkeys->ports.dst;
1113-
fs->m_u.tcp_ip4_spec.pdst = cpu_to_be16(~0);
1103+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) {
1104+
fs->h_u.tcp_ip4_spec.ip4src = fkeys->addrs.v4addrs.src;
1105+
fs->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(~0);
1106+
}
1107+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) {
1108+
fs->h_u.tcp_ip4_spec.ip4dst = fkeys->addrs.v4addrs.dst;
1109+
fs->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(~0);
1110+
}
1111+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) {
1112+
fs->h_u.tcp_ip4_spec.psrc = fkeys->ports.src;
1113+
fs->m_u.tcp_ip4_spec.psrc = cpu_to_be16(~0);
1114+
}
1115+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) {
1116+
fs->h_u.tcp_ip4_spec.pdst = fkeys->ports.dst;
1117+
fs->m_u.tcp_ip4_spec.pdst = cpu_to_be16(~0);
1118+
}
11141119
} else {
1115-
int i;
1116-
11171120
if (fkeys->basic.ip_proto == IPPROTO_TCP)
11181121
fs->flow_type = TCP_V6_FLOW;
11191122
else if (fkeys->basic.ip_proto == IPPROTO_UDP)
11201123
fs->flow_type = UDP_V6_FLOW;
11211124
else
11221125
goto fltr_err;
11231126

1124-
*(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6src[0] =
1125-
fkeys->addrs.v6addrs.src;
1126-
*(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6dst[0] =
1127-
fkeys->addrs.v6addrs.dst;
1128-
for (i = 0; i < 4; i++) {
1129-
fs->m_u.tcp_ip6_spec.ip6src[i] = cpu_to_be32(~0);
1130-
fs->m_u.tcp_ip6_spec.ip6dst[i] = cpu_to_be32(~0);
1127+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) {
1128+
*(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6src[0] =
1129+
fkeys->addrs.v6addrs.src;
1130+
bnxt_fill_ipv6_mask(fs->m_u.tcp_ip6_spec.ip6src);
1131+
}
1132+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) {
1133+
*(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6dst[0] =
1134+
fkeys->addrs.v6addrs.dst;
1135+
bnxt_fill_ipv6_mask(fs->m_u.tcp_ip6_spec.ip6dst);
1136+
}
1137+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) {
1138+
fs->h_u.tcp_ip6_spec.psrc = fkeys->ports.src;
1139+
fs->m_u.tcp_ip6_spec.psrc = cpu_to_be16(~0);
1140+
}
1141+
if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) {
1142+
fs->h_u.tcp_ip6_spec.pdst = fkeys->ports.dst;
1143+
fs->m_u.tcp_ip6_spec.pdst = cpu_to_be16(~0);
11311144
}
1132-
fs->h_u.tcp_ip6_spec.psrc = fkeys->ports.src;
1133-
fs->m_u.tcp_ip6_spec.psrc = cpu_to_be16(~0);
1134-
1135-
fs->h_u.tcp_ip6_spec.pdst = fkeys->ports.dst;
1136-
fs->m_u.tcp_ip6_spec.pdst = cpu_to_be16(~0);
11371145
}
11381146

11391147
fs->ring_cookie = fltr->base.rxq;

0 commit comments

Comments
 (0)