Skip to content

Commit

Permalink
lib/tc: treat vlan id and prio as independent fields
Browse files Browse the repository at this point in the history
Previously the key was used to check the presence of vlan id and
prio fields instead of using the mask. Additionally the vlan id
field was considered to be present if only the prio field was set,
and vice versa. f.e. setting the following:

ovs-ofctl -OOpenFlow13,OpenFlow15 add-flow br0 \
priority=10,cookie=1,table=0,ip,dl_vlan_pcp=2,actions=output:2

Resulted in (instead of wildcarding vlan_id, filter matches 0):
filter protocol 802.1Q pref 1 flower chain 0
filter protocol 802.1Q pref 1 flower chain 0 handle 0x1
 vlan_id 0
 vlan_prio 2
 vlan_ethtype ip
 eth_type ipv4
 ip_flags nofrag
 in_hw
       action order 1: mirred (Egress Redirect to device eth1) stolen
       index 2 ref 1 bind 1 installed 5 sec used 5 sec
       Action statistics:
       Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0
       cookie 47040ae7a94fff6afd7ed8aa04b11ba4

Signed-off-by: Pieter Jansen van Vuuren <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
Signed-off-by: Simon Horman <[email protected]>
  • Loading branch information
pjvuuren authored and shorman-netronome committed Sep 12, 2018
1 parent af8ba76 commit 7f02f26
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lib/netdev-tc-offloads.c
Original file line number Diff line number Diff line change
Expand Up @@ -1010,10 +1010,12 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
&& (vid_mask || pcp_mask)) {
if (vid_mask) {
flower.key.vlan_id[0] = vlan_tci_to_vid(key->vlans[0].tci);
flower.mask.vlan_id[0] = vlan_tci_to_vid(mask->vlans[0].tci);
VLOG_DBG_RL(&rl, "vlan_id[0]: %d\n", flower.key.vlan_id[0]);
}
if (pcp_mask) {
flower.key.vlan_prio[0] = vlan_tci_to_pcp(key->vlans[0].tci);
flower.mask.vlan_prio[0] = vlan_tci_to_pcp(mask->vlans[0].tci);
VLOG_DBG_RL(&rl, "vlan_prio[0]: %d\n",
flower.key.vlan_prio[0]);
}
Expand All @@ -1039,10 +1041,12 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
&& (vid_mask || pcp_mask)) {
if (vid_mask) {
flower.key.vlan_id[1] = vlan_tci_to_vid(key->vlans[1].tci);
flower.mask.vlan_id[1] = vlan_tci_to_vid(mask->vlans[1].tci);
VLOG_DBG_RL(&rl, "vlan_id[1]: %d", flower.key.vlan_id[1]);
}
if (pcp_mask) {
flower.key.vlan_prio[1] = vlan_tci_to_pcp(key->vlans[1].tci);
flower.mask.vlan_prio[1] = vlan_tci_to_pcp(mask->vlans[1].tci);
VLOG_DBG_RL(&rl, "vlan_prio[1]: %d", flower.key.vlan_prio[1]);
}
flower.key.encap_eth_type[1] = flower.key.encap_eth_type[0];
Expand Down
12 changes: 10 additions & 2 deletions lib/tc.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,10 +403,12 @@ nl_parse_flower_vlan(struct nlattr **attrs, struct tc_flower *flower)
if (attrs[TCA_FLOWER_KEY_VLAN_ID]) {
flower->key.vlan_id[0] =
nl_attr_get_u16(attrs[TCA_FLOWER_KEY_VLAN_ID]);
flower->mask.vlan_id[0] = 0xffff;
}
if (attrs[TCA_FLOWER_KEY_VLAN_PRIO]) {
flower->key.vlan_prio[0] =
nl_attr_get_u8(attrs[TCA_FLOWER_KEY_VLAN_PRIO]);
flower->mask.vlan_prio[0] = 0xff;
}

if (!attrs[TCA_FLOWER_KEY_VLAN_ETH_TYPE]) {
Expand All @@ -424,10 +426,12 @@ nl_parse_flower_vlan(struct nlattr **attrs, struct tc_flower *flower)
if (attrs[TCA_FLOWER_KEY_CVLAN_ID]) {
flower->key.vlan_id[1] =
nl_attr_get_u16(attrs[TCA_FLOWER_KEY_CVLAN_ID]);
flower->mask.vlan_id[1] = 0xffff;
}
if (attrs[TCA_FLOWER_KEY_CVLAN_PRIO]) {
flower->key.vlan_prio[1] =
nl_attr_get_u8(attrs[TCA_FLOWER_KEY_CVLAN_PRIO]);
flower->mask.vlan_prio[1] = 0xff;
}
}

Expand Down Expand Up @@ -1789,9 +1793,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
}

if (is_vlan) {
if (flower->key.vlan_id[0] || flower->key.vlan_prio[0]) {
if (flower->mask.vlan_id[0]) {
nl_msg_put_u16(request, TCA_FLOWER_KEY_VLAN_ID,
flower->key.vlan_id[0]);
}
if (flower->mask.vlan_prio[0]) {
nl_msg_put_u8(request, TCA_FLOWER_KEY_VLAN_PRIO,
flower->key.vlan_prio[0]);
}
Expand All @@ -1801,9 +1807,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
}

if (is_qinq) {
if (flower->key.vlan_id[1] || flower->key.vlan_prio[1]) {
if (flower->mask.vlan_id[1]) {
nl_msg_put_u16(request, TCA_FLOWER_KEY_CVLAN_ID,
flower->key.vlan_id[1]);
}
if (flower->mask.vlan_prio[1]) {
nl_msg_put_u8(request, TCA_FLOWER_KEY_CVLAN_PRIO,
flower->key.vlan_prio[1]);
}
Expand Down

0 comments on commit 7f02f26

Please sign in to comment.