aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-11-17 00:09:36 -0500
committerDavid S. Miller <davem@davemloft.net>2017-11-17 00:09:36 -0500
commit58fedcade126c16cf466a0dd1bc59312e1a6b6f1 (patch)
treeb70df4e2d983437ce1e0a44721d0ac1dea2e6007
parenta52b04bcd2acff95ffbec19d5fc32016bb365aa0 (diff)
parent0115552eac14a2d6db66da5f26bd67d0f2a5d79b (diff)
Merge branch 'nfp-flower-fixes-and-typo-in-ethtool-stats-name'
Jakub Kicinski says: ==================== nfp: flower fixes and typo in ethtool stats name This set comes from the flower offload team. From Pieter we have a fix to the semantics of the flag telling FW whether to allocate or free a mask and correction of a typo in name of one of the MAC statistics (reveive -> received, we use past participle to match HW docs). Dirk fixes propagation of max MTU to representors. John improves VXLAN offload. The old code was not using egress_dev at all, so Jiri missed it in his conversion. The validation of ingress port is still not perfect, we will have to wait for shared block dust to settle to tackle it. This is how John explains the cases: The following example rule is now correctly offloaded in net-next kernel: tc filter add dev vxlan0 ... enc_dst_port 4789 ... skip_sw \ action redirect dev nfp_p0 The following rule will not be offloaded to the NFP (previously it incorrectly matched vxlan packets - it shouldn't as ingress dev is not a vxlan netdev): tc filter add dev nfp_p0 ... enc_dst_port 4789 ... skip_sw \ action redirect dev nfp_p0 Rules that are not matching on tunnels and are an egress offload are rejected. The standard match code assumes the offloaded repr is the ingress port. Rejecting egress offloads removes the chances of false interpretation of the rules on the NFP. A know issue is that the following rule example could still be offloaded and incorrectly match tunnel data: tc filter add dev dummy ... enc_dst_port 4789 ... skip_sw \ action redirect dev nfp_p0 Because the egress register callback does not give information on the ingress netdev, the patch assumes that if it is not a repr then it is the correct tunnel netdev. This may not be the case. The chances of this happening is reduced as it is enforced that the rule match on the well known vxlan port but it is still possible. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/main.c18
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/main.h5
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/metadata.c7
-rw-r--r--drivers/net/ethernet/netronome/nfp/flower/offload.c36
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_app.h20
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c2
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_repr.c11
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_port.h2
8 files changed, 88 insertions, 13 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
index e0283bb24f06..8fcc90c0d2d3 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
@@ -125,6 +125,21 @@ nfp_flower_repr_netdev_stop(struct nfp_app *app, struct nfp_repr *repr)
125 return nfp_flower_cmsg_portmod(repr, false); 125 return nfp_flower_cmsg_portmod(repr, false);
126} 126}
127 127
128static int
129nfp_flower_repr_netdev_init(struct nfp_app *app, struct net_device *netdev)
130{
131 return tc_setup_cb_egdev_register(netdev,
132 nfp_flower_setup_tc_egress_cb,
133 netdev_priv(netdev));
134}
135
136static void
137nfp_flower_repr_netdev_clean(struct nfp_app *app, struct net_device *netdev)
138{
139 tc_setup_cb_egdev_unregister(netdev, nfp_flower_setup_tc_egress_cb,
140 netdev_priv(netdev));
141}
142
128static void nfp_flower_sriov_disable(struct nfp_app *app) 143static void nfp_flower_sriov_disable(struct nfp_app *app)
129{ 144{
130 struct nfp_flower_priv *priv = app->priv; 145 struct nfp_flower_priv *priv = app->priv;
@@ -452,6 +467,9 @@ const struct nfp_app_type app_flower = {
452 .vnic_init = nfp_flower_vnic_init, 467 .vnic_init = nfp_flower_vnic_init,
453 .vnic_clean = nfp_flower_vnic_clean, 468 .vnic_clean = nfp_flower_vnic_clean,
454 469
470 .repr_init = nfp_flower_repr_netdev_init,
471 .repr_clean = nfp_flower_repr_netdev_clean,
472
455 .repr_open = nfp_flower_repr_netdev_open, 473 .repr_open = nfp_flower_repr_netdev_open,
456 .repr_stop = nfp_flower_repr_netdev_stop, 474 .repr_stop = nfp_flower_repr_netdev_stop,
457 475
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.h b/drivers/net/ethernet/netronome/nfp/flower/main.h
index c90e72b7ff5a..e6b26c5ae6e0 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/main.h
+++ b/drivers/net/ethernet/netronome/nfp/flower/main.h
@@ -52,8 +52,7 @@ struct nfp_app;
52#define NFP_FLOWER_MASK_ELEMENT_RS 1 52#define NFP_FLOWER_MASK_ELEMENT_RS 1
53#define NFP_FLOWER_MASK_HASH_BITS 10 53#define NFP_FLOWER_MASK_HASH_BITS 10
54 54
55#define NFP_FL_META_FLAG_NEW_MASK 128 55#define NFP_FL_META_FLAG_MANAGE_MASK BIT(7)
56#define NFP_FL_META_FLAG_LAST_MASK 1
57 56
58#define NFP_FL_MASK_REUSE_TIME_NS 40000 57#define NFP_FL_MASK_REUSE_TIME_NS 40000
59#define NFP_FL_MASK_ID_LOCATION 1 58#define NFP_FL_MASK_ID_LOCATION 1
@@ -197,5 +196,7 @@ void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
197void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4); 196void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
198void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb); 197void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb);
199void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb); 198void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb);
199int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
200 void *cb_priv);
200 201
201#endif 202#endif
diff --git a/drivers/net/ethernet/netronome/nfp/flower/metadata.c b/drivers/net/ethernet/netronome/nfp/flower/metadata.c
index 193520ef23f0..db977cf8e933 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/metadata.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/metadata.c
@@ -282,7 +282,7 @@ nfp_check_mask_add(struct nfp_app *app, char *mask_data, u32 mask_len,
282 id = nfp_add_mask_table(app, mask_data, mask_len); 282 id = nfp_add_mask_table(app, mask_data, mask_len);
283 if (id < 0) 283 if (id < 0)
284 return false; 284 return false;
285 *meta_flags |= NFP_FL_META_FLAG_NEW_MASK; 285 *meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;
286 } 286 }
287 *mask_id = id; 287 *mask_id = id;
288 288
@@ -299,6 +299,9 @@ nfp_check_mask_remove(struct nfp_app *app, char *mask_data, u32 mask_len,
299 if (!mask_entry) 299 if (!mask_entry)
300 return false; 300 return false;
301 301
302 if (meta_flags)
303 *meta_flags &= ~NFP_FL_META_FLAG_MANAGE_MASK;
304
302 *mask_id = mask_entry->mask_id; 305 *mask_id = mask_entry->mask_id;
303 mask_entry->ref_cnt--; 306 mask_entry->ref_cnt--;
304 if (!mask_entry->ref_cnt) { 307 if (!mask_entry->ref_cnt) {
@@ -306,7 +309,7 @@ nfp_check_mask_remove(struct nfp_app *app, char *mask_data, u32 mask_len,
306 nfp_release_mask_id(app, *mask_id); 309 nfp_release_mask_id(app, *mask_id);
307 kfree(mask_entry); 310 kfree(mask_entry);
308 if (meta_flags) 311 if (meta_flags)
309 *meta_flags |= NFP_FL_META_FLAG_LAST_MASK; 312 *meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;
310 } 313 }
311 314
312 return true; 315 return true;
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c
index cdbb5464b790..f5d73b83dcc2 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c
@@ -131,7 +131,8 @@ static bool nfp_flower_check_higher_than_mac(struct tc_cls_flower_offload *f)
131 131
132static int 132static int
133nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, 133nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
134 struct tc_cls_flower_offload *flow) 134 struct tc_cls_flower_offload *flow,
135 bool egress)
135{ 136{
136 struct flow_dissector_key_basic *mask_basic = NULL; 137 struct flow_dissector_key_basic *mask_basic = NULL;
137 struct flow_dissector_key_basic *key_basic = NULL; 138 struct flow_dissector_key_basic *key_basic = NULL;
@@ -167,6 +168,9 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
167 skb_flow_dissector_target(flow->dissector, 168 skb_flow_dissector_target(flow->dissector,
168 FLOW_DISSECTOR_KEY_ENC_CONTROL, 169 FLOW_DISSECTOR_KEY_ENC_CONTROL,
169 flow->key); 170 flow->key);
171 if (!egress)
172 return -EOPNOTSUPP;
173
170 if (mask_enc_ctl->addr_type != 0xffff || 174 if (mask_enc_ctl->addr_type != 0xffff ||
171 enc_ctl->addr_type != FLOW_DISSECTOR_KEY_IPV4_ADDRS) 175 enc_ctl->addr_type != FLOW_DISSECTOR_KEY_IPV4_ADDRS)
172 return -EOPNOTSUPP; 176 return -EOPNOTSUPP;
@@ -194,6 +198,9 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls,
194 198
195 key_layer |= NFP_FLOWER_LAYER_VXLAN; 199 key_layer |= NFP_FLOWER_LAYER_VXLAN;
196 key_size += sizeof(struct nfp_flower_vxlan); 200 key_size += sizeof(struct nfp_flower_vxlan);
201 } else if (egress) {
202 /* Reject non tunnel matches offloaded to egress repr. */
203 return -EOPNOTSUPP;
197 } 204 }
198 205
199 if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) { 206 if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
@@ -315,7 +322,7 @@ err_free_flow:
315 */ 322 */
316static int 323static int
317nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev, 324nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
318 struct tc_cls_flower_offload *flow) 325 struct tc_cls_flower_offload *flow, bool egress)
319{ 326{
320 struct nfp_flower_priv *priv = app->priv; 327 struct nfp_flower_priv *priv = app->priv;
321 struct nfp_fl_payload *flow_pay; 328 struct nfp_fl_payload *flow_pay;
@@ -326,7 +333,7 @@ nfp_flower_add_offload(struct nfp_app *app, struct net_device *netdev,
326 if (!key_layer) 333 if (!key_layer)
327 return -ENOMEM; 334 return -ENOMEM;
328 335
329 err = nfp_flower_calculate_key_layers(key_layer, flow); 336 err = nfp_flower_calculate_key_layers(key_layer, flow, egress);
330 if (err) 337 if (err)
331 goto err_free_key_ls; 338 goto err_free_key_ls;
332 339
@@ -447,7 +454,7 @@ nfp_flower_get_stats(struct nfp_app *app, struct tc_cls_flower_offload *flow)
447 454
448static int 455static int
449nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev, 456