From d8d9c698b853d67fcf55cb0e8c57cc8fbcdfe0d9 Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Fri, 6 Dec 2013 18:53:12 -0800 Subject: [PATCH] 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 Acked-by: Ben Pfaff --- lib/flow.c | 15 +++++++++++++-- lib/flow.h | 1 + ofproto/netflow.c | 3 +-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/flow.c b/lib/flow.c index 3633dffa3..8f80f88c1 100644 --- a/lib/flow.c +++ b/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'. */ void 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)) { memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); - memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); - memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); + flow_unwildcard_tp_ports(flow, wc); } wc->masks.vlan_tci |= htons(VLAN_VID_MASK | VLAN_CFI); break; diff --git a/lib/flow.h b/lib/flow.h index 44d96adc6..a828b6645 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -174,6 +174,7 @@ void flow_extract(struct ofpbuf *, uint32_t priority, uint32_t mark, struct flow *); 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 *); char *flow_to_string(const struct flow *); diff --git a/ofproto/netflow.c b/ofproto/netflow.c index 7b9e0e6c2..f79ad6ad0 100644 --- a/ofproto/netflow.c +++ b/ofproto/netflow.c @@ -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_src, 0xff, sizeof wc->masks.nw_src); memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); - memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); - memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); + flow_unwildcard_tp_ports(flow, wc); wc->masks.nw_tos |= IP_DSCP_MASK; } -- 2.45.2