Lines Matching +full:common +full:- +full:rules

1 // SPDX-License-Identifier: GPL-2.0
12 list_for_each_entry(rule, &priv->flow_block.rules, list) in sja1105_rule_find()
13 if (rule->cookie == cookie) in sja1105_rule_find()
24 if (!priv->flow_block.l2_policer_used[i]) in sja1105_find_free_l2_policer()
27 return -1; in sja1105_find_free_l2_policer()
38 struct dsa_switch *ds = priv->ds; in sja1105_setup_bcast_policer()
46 return -ENOMEM; in sja1105_setup_bcast_policer()
48 rule->cookie = cookie; in sja1105_setup_bcast_policer()
49 rule->type = SJA1105_RULE_BCAST_POLICER; in sja1105_setup_bcast_policer()
50 rule->bcast_pol.sharindx = sja1105_find_free_l2_policer(priv); in sja1105_setup_bcast_policer()
51 rule->key.type = SJA1105_KEY_BCAST; in sja1105_setup_bcast_policer()
55 if (rule->bcast_pol.sharindx == -1) { in sja1105_setup_bcast_policer()
57 rc = -ENOSPC; in sja1105_setup_bcast_policer()
61 policing = priv->static_config.tables[BLK_IDX_L2_POLICING].entries; in sja1105_setup_bcast_policer()
63 if (policing[(ds->num_ports * SJA1105_NUM_TC) + port].sharindx != port) { in sja1105_setup_bcast_policer()
66 rc = -EEXIST; in sja1105_setup_bcast_policer()
70 rule->port_mask |= BIT(port); in sja1105_setup_bcast_policer()
75 for_each_set_bit(p, &rule->port_mask, SJA1105_MAX_NUM_PORTS) { in sja1105_setup_bcast_policer()
76 int bcast = (ds->num_ports * SJA1105_NUM_TC) + p; in sja1105_setup_bcast_policer()
78 policing[bcast].sharindx = rule->bcast_pol.sharindx; in sja1105_setup_bcast_policer()
81 policing[rule->bcast_pol.sharindx].rate = div_u64(rate_bytes_per_sec * in sja1105_setup_bcast_policer()
83 policing[rule->bcast_pol.sharindx].smax = burst; in sja1105_setup_bcast_policer()
85 /* TODO: support per-flow MTU */ in sja1105_setup_bcast_policer()
86 policing[rule->bcast_pol.sharindx].maxlen = VLAN_ETH_FRAME_LEN + in sja1105_setup_bcast_policer()
93 priv->flow_block.l2_policer_used[rule->bcast_pol.sharindx] = true; in sja1105_setup_bcast_policer()
94 list_add(&rule->list, &priv->flow_block.rules); in sja1105_setup_bcast_policer()
117 return -ENOMEM; in sja1105_setup_tc_policer()
119 rule->cookie = cookie; in sja1105_setup_tc_policer()
120 rule->type = SJA1105_RULE_TC_POLICER; in sja1105_setup_tc_policer()
121 rule->tc_pol.sharindx = sja1105_find_free_l2_policer(priv); in sja1105_setup_tc_policer()
122 rule->key.type = SJA1105_KEY_TC; in sja1105_setup_tc_policer()
123 rule->key.tc.pcp = tc; in sja1105_setup_tc_policer()
127 if (rule->tc_pol.sharindx == -1) { in sja1105_setup_tc_policer()
129 rc = -ENOSPC; in sja1105_setup_tc_policer()
133 policing = priv->static_config.tables[BLK_IDX_L2_POLICING].entries; in sja1105_setup_tc_policer()
137 "Port-TC pair already has an L2 policer"); in sja1105_setup_tc_policer()
138 rc = -EEXIST; in sja1105_setup_tc_policer()
142 rule->port_mask |= BIT(port); in sja1105_setup_tc_policer()
147 for_each_set_bit(p, &rule->port_mask, SJA1105_MAX_NUM_PORTS) { in sja1105_setup_tc_policer()
150 policing[index].sharindx = rule->tc_pol.sharindx; in sja1105_setup_tc_policer()
153 policing[rule->tc_pol.sharindx].rate = div_u64(rate_bytes_per_sec * in sja1105_setup_tc_policer()
155 policing[rule->tc_pol.sharindx].smax = burst; in sja1105_setup_tc_policer()
157 /* TODO: support per-flow MTU */ in sja1105_setup_tc_policer()
158 policing[rule->tc_pol.sharindx].maxlen = VLAN_ETH_FRAME_LEN + in sja1105_setup_tc_policer()
165 priv->flow_block.l2_policer_used[rule->tc_pol.sharindx] = true; in sja1105_setup_tc_policer()
166 list_add(&rule->list, &priv->flow_block.rules); in sja1105_setup_tc_policer()
181 switch (key->type) { in sja1105_flower_policer()
187 key->tc.pcp, rate_bytes_per_sec, in sja1105_flower_policer()
191 return -EOPNOTSUPP; in sja1105_flower_policer()
201 struct flow_dissector *dissector = rule->match.dissector; in sja1105_flower_parse_key()
207 if (dissector->used_keys & in sja1105_flower_parse_key()
214 return -EOPNOTSUPP; in sja1105_flower_parse_key()
218 return -EOPNOTSUPP; in sja1105_flower_parse_key()
224 if (match.key->n_proto) { in sja1105_flower_parse_key()
227 return -EOPNOTSUPP; in sja1105_flower_parse_key()
238 if (!ether_addr_equal_masked(match.key->src, null, in sja1105_flower_parse_key()
239 match.mask->src)) { in sja1105_flower_parse_key()
242 return -EOPNOTSUPP; in sja1105_flower_parse_key()
245 if (!ether_addr_equal(match.mask->dst, bcast)) { in sja1105_flower_parse_key()
248 return -EOPNOTSUPP; in sja1105_flower_parse_key()
251 dmac = ether_addr_to_u64(match.key->dst); in sja1105_flower_parse_key()
252 is_bcast_dmac = ether_addr_equal(match.key->dst, bcast); in sja1105_flower_parse_key()
260 if (match.mask->vlan_id && in sja1105_flower_parse_key()
261 match.mask->vlan_id != VLAN_VID_MASK) { in sja1105_flower_parse_key()
264 return -EOPNOTSUPP; in sja1105_flower_parse_key()
267 if (match.mask->vlan_priority && in sja1105_flower_parse_key()
268 match.mask->vlan_priority != 0x7) { in sja1105_flower_parse_key()
271 return -EOPNOTSUPP; in sja1105_flower_parse_key()
274 if (match.mask->vlan_id) in sja1105_flower_parse_key()
275 vid = match.key->vlan_id; in sja1105_flower_parse_key()
276 if (match.mask->vlan_priority) in sja1105_flower_parse_key()
277 pcp = match.key->vlan_priority; in sja1105_flower_parse_key()
281 key->type = SJA1105_KEY_BCAST; in sja1105_flower_parse_key()
285 key->type = SJA1105_KEY_TC; in sja1105_flower_parse_key()
286 key->tc.pcp = pcp; in sja1105_flower_parse_key()
290 key->type = SJA1105_KEY_VLAN_AWARE_VL; in sja1105_flower_parse_key()
291 key->vl.dmac = dmac; in sja1105_flower_parse_key()
292 key->vl.vid = vid; in sja1105_flower_parse_key()
293 key->vl.pcp = pcp; in sja1105_flower_parse_key()
297 key->type = SJA1105_KEY_VLAN_UNAWARE_VL; in sja1105_flower_parse_key()
298 key->vl.dmac = dmac; in sja1105_flower_parse_key()
303 return -EOPNOTSUPP; in sja1105_flower_parse_key()
310 if (act->police.exceed.act_id != FLOW_ACTION_DROP) { in sja1105_policer_validate()
313 return -EOPNOTSUPP; in sja1105_policer_validate()
316 if (act->police.notexceed.act_id != FLOW_ACTION_PIPE && in sja1105_policer_validate()
317 act->police.notexceed.act_id != FLOW_ACTION_ACCEPT) { in sja1105_policer_validate()
320 return -EOPNOTSUPP; in sja1105_policer_validate()
323 if (act->police.notexceed.act_id == FLOW_ACTION_ACCEPT && in sja1105_policer_validate()
327 return -EOPNOTSUPP; in sja1105_policer_validate()
330 if (act->police.peakrate_bytes_ps || in sja1105_policer_validate()
331 act->police.avrate || act->police.overhead) { in sja1105_policer_validate()
334 return -EOPNOTSUPP; in sja1105_policer_validate()
337 if (act->police.rate_pkt_ps) { in sja1105_policer_validate()
340 return -EOPNOTSUPP; in sja1105_policer_validate()
350 struct netlink_ext_ack *extack = cls->common.extack; in sja1105_cls_flower_add()
351 struct sja1105_private *priv = ds->priv; in sja1105_cls_flower_add()
353 unsigned long cookie = cls->cookie; in sja1105_cls_flower_add()
364 flow_action_for_each(i, act, &rule->action) { in sja1105_cls_flower_add()
365 switch (act->id) { in sja1105_cls_flower_add()
367 rc = sja1105_policer_validate(&rule->action, act, extack); in sja1105_cls_flower_add()
373 act->police.rate_bytes_ps, in sja1105_cls_flower_add()
374 act->police.burst); in sja1105_cls_flower_add()
393 to_dp = dsa_port_from_netdev(act->dev); in sja1105_cls_flower_add()
397 return -EOPNOTSUPP; in sja1105_cls_flower_add()
404 &key, BIT(to_dp->index), true); in sja1105_cls_flower_add()
422 &key, act->hw_index, in sja1105_cls_flower_add()
423 act->gate.prio, in sja1105_cls_flower_add()
424 act->gate.basetime, in sja1105_cls_flower_add()
425 act->gate.cycletime, in sja1105_cls_flower_add()
426 act->gate.cycletimeext, in sja1105_cls_flower_add()
427 act->gate.num_entries, in sja1105_cls_flower_add()
428 act->gate.entries); in sja1105_cls_flower_add()
435 rc = -EOPNOTSUPP; in sja1105_cls_flower_add()
448 return -EOPNOTSUPP; in sja1105_cls_flower_add()
465 struct sja1105_private *priv = ds->priv; in sja1105_cls_flower_del()
466 struct sja1105_rule *rule = sja1105_rule_find(priv, cls->cookie); in sja1105_cls_flower_del()
473 if (rule->type == SJA1105_RULE_VL) in sja1105_cls_flower_del()
474 return sja1105_vl_delete(priv, port, rule, cls->common.extack); in sja1105_cls_flower_del()
476 policing = priv->static_config.tables[BLK_IDX_L2_POLICING].entries; in sja1105_cls_flower_del()
478 if (rule->type == SJA1105_RULE_BCAST_POLICER) { in sja1105_cls_flower_del()
479 int bcast = (ds->num_ports * SJA1105_NUM_TC) + port; in sja1105_cls_flower_del()
483 } else if (rule->type == SJA1105_RULE_TC_POLICER) { in sja1105_cls_flower_del()
484 int index = (port * SJA1105_NUM_TC) + rule->key.tc.pcp; in sja1105_cls_flower_del()
489 return -EINVAL; in sja1105_cls_flower_del()
492 rule->port_mask &= ~BIT(port); in sja1105_cls_flower_del()
493 if (!rule->port_mask) { in sja1105_cls_flower_del()
494 priv->flow_block.l2_policer_used[old_sharindx] = false; in sja1105_cls_flower_del()
495 list_del(&rule->list); in sja1105_cls_flower_del()
505 struct sja1105_private *priv = ds->priv; in sja1105_cls_flower_stats()
506 struct sja1105_rule *rule = sja1105_rule_find(priv, cls->cookie); in sja1105_cls_flower_stats()
512 if (rule->type != SJA1105_RULE_VL) in sja1105_cls_flower_stats()
515 rc = sja1105_vl_stats(priv, port, rule, &cls->stats, in sja1105_cls_flower_stats()
516 cls->common.extack); in sja1105_cls_flower_stats()
525 struct sja1105_private *priv = ds->priv; in sja1105_flower_setup()
528 INIT_LIST_HEAD(&priv->flow_block.rules); in sja1105_flower_setup()
530 for (port = 0; port < ds->num_ports; port++) in sja1105_flower_setup()
531 priv->flow_block.l2_policer_used[port] = true; in sja1105_flower_setup()
536 struct sja1105_private *priv = ds->priv; in sja1105_flower_teardown()
540 list_for_each_safe(pos, n, &priv->flow_block.rules) { in sja1105_flower_teardown()
542 list_del(&rule->list); in sja1105_flower_teardown()