mirror of
https://github.com/openvswitch/ovs
synced 2025-09-03 15:55:19 +00:00
flow: New function flow_unwildcard_tp_ports().
This patch adds a new function flow_unildcard_tp_ports() which doesn't unwildcard the upper half of tp_src and tp_dst with ICMP packets. Unfortunately, this matters in future patches when we compare masks carefully to determine if flows should be evicted from the datapath. Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
15
lib/flow.c
15
lib/flow.c
@@ -519,6 +519,18 @@ flow_zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
flow_unwildcard_tp_ports(const struct flow *flow, struct flow_wildcards *wc)
|
||||||
|
{
|
||||||
|
if (flow->nw_proto != IPPROTO_ICMP) {
|
||||||
|
memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
|
||||||
|
memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
|
||||||
|
} else {
|
||||||
|
wc->masks.tp_src = htons(0xff);
|
||||||
|
wc->masks.tp_dst = htons(0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Initializes 'fmd' with the metadata found in 'flow'. */
|
/* Initializes 'fmd' with the metadata found in 'flow'. */
|
||||||
void
|
void
|
||||||
flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
|
flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
|
||||||
@@ -922,8 +934,7 @@ flow_mask_hash_fields(const struct flow *flow, struct flow_wildcards *wc,
|
|||||||
}
|
}
|
||||||
if (is_ip_any(flow)) {
|
if (is_ip_any(flow)) {
|
||||||
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
|
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
|
||||||
memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
|
flow_unwildcard_tp_ports(flow, wc);
|
||||||
memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
|
|
||||||
}
|
}
|
||||||
wc->masks.vlan_tci |= htons(VLAN_VID_MASK | VLAN_CFI);
|
wc->masks.vlan_tci |= htons(VLAN_VID_MASK | VLAN_CFI);
|
||||||
break;
|
break;
|
||||||
|
@@ -174,6 +174,7 @@ void flow_extract(struct ofpbuf *, uint32_t priority, uint32_t mark,
|
|||||||
struct flow *);
|
struct flow *);
|
||||||
|
|
||||||
void flow_zero_wildcards(struct flow *, const struct flow_wildcards *);
|
void flow_zero_wildcards(struct flow *, const struct flow_wildcards *);
|
||||||
|
void flow_unwildcard_tp_ports(const struct flow *, struct flow_wildcards *);
|
||||||
void flow_get_metadata(const struct flow *, struct flow_metadata *);
|
void flow_get_metadata(const struct flow *, struct flow_metadata *);
|
||||||
|
|
||||||
char *flow_to_string(const struct flow *);
|
char *flow_to_string(const struct flow *);
|
||||||
|
@@ -98,8 +98,7 @@ netflow_mask_wc(struct flow *flow, struct flow_wildcards *wc)
|
|||||||
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
|
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
|
||||||
memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
|
memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
|
||||||
memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
|
memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
|
||||||
memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
|
flow_unwildcard_tp_ports(flow, wc);
|
||||||
memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
|
|
||||||
wc->masks.nw_tos |= IP_DSCP_MASK;
|
wc->masks.nw_tos |= IP_DSCP_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user